class TwiMLTest(unittest.TestCase): def setUp(self): self.app = app.test_client() self.validator = RequestValidator(app.config['TWILIO_AUTH_TOKEN']) def assertTwiML(self, response): self.assertTrue("<Response>" in response.data, "Did not find " \ "<Response>: %s" % response.data) self.assertTrue("</Response>" in response.data, "Did not find " \ "</Response>: %s" % response.data) self.assertEqual("200 OK", response.status) def sms(self, body, url='/sms', to=app.config['TWILIO_CALLER_ID'], from_='+15558675309', extra_params=None, signed=True): params = { 'SmsSid': 'SMtesting', 'AccountSid': app.config['TWILIO_ACCOUNT_SID'], 'To': to, 'From': from_, 'Body': body, 'FromCity': 'BROOKLYN', 'FromState': 'NY', 'FromCountry': 'US', 'FromZip': '55555'} if extra_params: params = dict(params.items() + extra_params.items()) if signed: abs_url = 'http://{0}{1}'.format(app.config['SERVER_NAME'], url) signature = self.validator.compute_signature(abs_url, params) return self.app.post(url, data=params, headers={'X-Twilio-Signature': signature}) return self.app.post(url, data=params) def call(self, url='/voice', to=app.config['TWILIO_CALLER_ID'], from_='+15558675309', digits=None, extra_params=None, signed=True): params = { 'CallSid': 'CAtesting', 'AccountSid': app.config['TWILIO_ACCOUNT_SID'], 'To': to, 'From': from_, 'CallStatus': 'ringing', 'Direction': 'inbound', 'FromCity': 'BROOKLYN', 'FromState': 'NY', 'FromCountry': 'US', 'FromZip': '55555'} if digits: params['Digits'] = digits if extra_params: params = dict(params.items() + extra_params.items()) if signed: abs_url = 'http://{0}{1}'.format(app.config['SERVER_NAME'], url) signature = self.validator.compute_signature(abs_url, params) return self.app.post(url, data=params, headers={'X-Twilio-Signature': signature}) return self.app.post(url, data=params)
class ValidationTest(unittest.TestCase): def setUp(self): token = "1c892n40nd03kdnc0112slzkl3091j20" self.validator = RequestValidator(token) self.uri = "http://www.postbin.org/1ed898x" self.params = { "AccountSid": "AC9a9f9392lad99kla0sklakjs90j092j3", "ApiVersion": "2010-04-01", "CallSid": "CAd800bb12c0426a7ea4230e492fef2a4f", "CallStatus": "ringing", "Called": "+15306384866", "CalledCity": "OAKLAND", "CalledCountry": "US", "CalledState": "CA", "CalledZip": "94612", "Caller": "+15306666666", "CallerCity": "SOUTH LAKE TAHOE", "CallerCountry": "US", "CallerName": "CA Wireless Call", "CallerState": "CA", "CallerZip": "89449", "Direction": "inbound", "From": "+15306666666", "FromCity": "SOUTH LAKE TAHOE", "FromCountry": "US", "FromState": "CA", "FromZip": "89449", "To": "+15306384866", "ToCity": "OAKLAND", "ToCountry": "US", "ToState": "CA", "ToZip": "94612", } def test_compute_signature_bytecode(self): expected = b("fF+xx6dTinOaCdZ0aIeNkHr/ZAA=") signature = self.validator.compute_signature(self.uri, self.params, utf=False) assert_equal(signature, expected) def test_compute_signature_unicode(self): expected = u("fF+xx6dTinOaCdZ0aIeNkHr/ZAA=") signature = self.validator.compute_signature(self.uri, self.params, utf=True) assert_equal(signature, expected) def test_validation(self): expected = "fF+xx6dTinOaCdZ0aIeNkHr/ZAA=" assert_true(self.validator.validate(self.uri, self.params, expected))
def send(self, method, url, authtoken): validator = RequestValidator(authtoken) params = urllib.urlencode(self.url_params) if method == "GET": url = "{0}?{1}".format(url, params) sig = validator.compute_signature(url, {}) req = urllib2.Request(url) elif method == "POST": sig = validator.compute_signature(url, self.url_params) req = urllib2.Request(url, params) else: raise CwurlioUserException("Invalid method: %s" % method) req.add_header("X-Twilio-Signature", sig) return urllib2.urlopen(req).read()
def test_international_sms(self): token = os.environ["TWILIO_AUTH_TOKEN"] validator = RequestValidator(token) uri = "http://www.postbin.org/1c2pdoc" params = { "AccountSid": "AC4bf2dafb92341f7caf8650403e422d23", "ApiVersion": "2010-04-01", "Body": "Chloéñ", "From": "+15305451766", "FromCity": "SOUTH LAKE TAHOE", "FromCountry": "US", "FromState": "CA", "FromZip": "89449", "SmsMessageSid": "SM51d6d055f53f1072543872c601aae89b", "SmsStatus": "SM51d6d055f53f1072543872c601aae89b", "SmsStatus": "received", "To": "+15304194304", "ToCity": "WOODLAND", "ToCountry": "US", "ToState": "CA", "ToZip": "95695", } expected = "UHkWu+6WLOzPunzb8PuCGPeW1Uw=" self.assertEquals(validator.compute_signature(uri, params), expected) self.assertTrue(validator.validate(uri, params, expected))
def sms(self, body, path="/sms/", to="+15558675309", from_="+15556667777", extra_params=None): params = { "MessageSid": "CAtesting", "AccountSid": "ACxxxxx", "To": to, "From": from_, "Body": body, "Direction": "inbound", "FromCity": "BROOKLYN", "FromState": "NY", "FromCountry": "US", "FromZip": "55555" } if extra_params: for k, v in extra_params.items(): params[k] = v HTTP_HOST = "example.com" validator = RequestValidator("yyyyyyyy") absolute_url = "http://{0}{1}".format(HTTP_HOST, path) signature = validator.compute_signature(absolute_url, params) return self.post(path, params, HTTP_X_TWILIO_SIGNATURE=signature, HTTP_HOST=HTTP_HOST)
def test_good_signature_GET(self): 'good signature is allowed on GET' with self.settings(TWILIO_AUTH_TOKEN='fred'): req = self.factory.get('/', data={'a': 'b'}) validator = RequestValidator(settings.TWILIO_AUTH_TOKEN) req.META['HTTP_X_TWILIO_SIGNATURE'] = validator.compute_signature( req.build_absolute_uri(), req.POST ) self.view.request = req try: self.view.verify_request() except PermissionDenied: self.fail('Raised PermissionDenied when not expecting it')
def test_validation(self): token = "1c892n40nd03kdnc0112slzkl3091j20" validator = RequestValidator(token) uri = "http://www.postbin.org/1ed898x" params = { "AccountSid": "AC9a9f9392lad99kla0sklakjs90j092j3", "ApiVersion": "2010-04-01", "CallSid": "CAd800bb12c0426a7ea4230e492fef2a4f", "CallStatus": "ringing", "Called": "+15306384866", "CalledCity": "OAKLAND", "CalledCountry": "US", "CalledState": "CA", "CalledZip": "94612", "Caller": "+15306666666", "CallerCity": "SOUTH LAKE TAHOE", "CallerCountry": "US", "CallerName": "CA Wireless Call", "CallerState": "CA", "CallerZip": "89449", "Direction": "inbound", "From": "+15306666666", "FromCity": "SOUTH LAKE TAHOE", "FromCountry": "US", "FromState": "CA", "FromZip": "89449", "To": "+15306384866", "ToCity": "OAKLAND", "ToCountry": "US", "ToState": "CA", "ToZip": "94612", } expected = "fF+xx6dTinOaCdZ0aIeNkHr/ZAA=" self.assertEquals(validator.compute_signature(uri, params), expected) self.assertTrue(validator.validate(uri, params, expected))