Browse Source

Bits of tidying up for SMS validation

 * Add libphonenumber parsing (accept raw number input & country rather than msisdn)
 * Remove print debugging
 * Fix error text
David Baker 7 years ago
parent
commit
f348aa5d32
4 changed files with 23 additions and 20 deletions
  1. 1 0
      setup.py
  2. 0 2
      sydent/http/httpclient.py
  3. 22 16
      sydent/http/servlets/msisdnservlet.py
  4. 0 2
      sydent/sms/openmarket.py

+ 1 - 0
setup.py

@@ -38,6 +38,7 @@ setup(
         "pyasn1",
         "pynacl",
         "daemonize",
+        "phonenumbers",
     ],
     setup_requires=[
         "setuptools_trial",

+ 0 - 2
sydent/http/httpclient.py

@@ -43,11 +43,9 @@ class SimpleHttpClient(object):
     def post_json_get_nothing(self, uri, post_json, opts):
         json_str = json.dumps(post_json)
 
-        print "opts: %r" % (opts,)
         headers = opts.get('headers', Headers({
             b"Content-Type": [b"application/json"],
         }))
-        print "headers: %r" % (headers,)
 
         logger.debug("HTTP POST %s -> %s", json_str, uri)
 

+ 22 - 16
sydent/http/servlets/msisdnservlet.py

@@ -15,6 +15,7 @@
 # limitations under the License.
 
 from twisted.web.resource import Resource
+import phonenumbers
 
 from sydent.validators.msisdnvalidator import SessionExpiredException
 from sydent.validators.msisdnvalidator import IncorrectClientSecretException
@@ -32,31 +33,36 @@ class MsisdnRequestCodeServlet(Resource):
     def render_POST(self, request):
         send_cors(request)
 
-        error = require_args(request, ('msisdn', 'client_secret', 'send_attempt'))
+        error = require_args(request, ('phone_number', 'country', 'client_secret', 'send_attempt'))
         if error:
             request.setResponseCode(400)
             return error
 
-        msisdn = request.args['msisdn'][0]
+        raw_phone_number = request.args['phone_number'][0]
+        country = request.args['country'][0]
         clientSecret = request.args['client_secret'][0]
         sendAttempt = request.args['send_attempt'][0]
 
-        #nextLink = None
-        #if 'next_link' in request.args:
-        #    nextLink = request.args['next_link'][0]
+        try:
+            phone_number_object = phonenumbers.parse(raw_phone_number, None)
+        except e:
+            request.setResponseCode(400)
+            return {'errcode': 'M_INVALID_PHONE_NUMBER', 'error': "Invalid phone number" }
+
+        msisdn = phonenumbers.format_number(
+            phone_number_object, phonenumbers.PhoneNumberFormat.E164
+        )[1:]
 
         resp = None
 
-        #try:
-        sid = self.sydent.validators.msisdn.requestToken(
-            msisdn, clientSecret, sendAttempt, None
-        )
-        #except EmailAddressException:
-        #    request.setResponseCode(400)
-        #    resp = {'errcode': 'M_INVALID_EMAIL', 'error':'Invalid email address'}
-        #except EmailSendException:
-        #    request.setResponseCode(500)
-        #    resp = {'errcode': 'M_EMAIL_SEND_ERROR', 'error': 'Failed to send email'}
+        try:
+            sid = self.sydent.validators.msisdn.requestToken(
+                msisdn, clientSecret, sendAttempt, None
+            )
+        except e:
+            logger.error("Exception sending SMS", e);
+            request.setResponseCode(500)
+            resp = {'errcode': 'M_UNKNOWN', 'error':'Internal Server Error'}
 
         if not resp:
             resp = {'success': True, 'sid': sid}
@@ -85,7 +91,7 @@ class MsisdnValidateCodeServlet(Resource):
                 request.setResponseCode(302)
                 request.setHeader("Location", next_link)
         else:
-            msg = "Verification failed: you may need to request another verification email"
+            msg = "Verification failed: you may need to request another verification text"
 
         templateFile = self.sydent.cfg.get('http', 'verify_response_template')
 

+ 0 - 2
sydent/sms/openmarket.py

@@ -63,8 +63,6 @@ class OpenMarketSMS:
             API_BASE_URL, body, { "headers": headers }
         )
         headers = dict(resp.headers.getAllRawHeaders())
-        print resp
-        print headers
 
         if 'Location' not in headers:
             raise Exception("Got response from sending SMS with no location header")