def test_nonces(self): with self.silo['Consumers'].open() as collection: consumer = lti.ToolConsumer.new_from_values( collection.new_entity(), self.cipher, 'default', key="12345", secret=ul("secret")) collection.insert_entity(consumer.entity) provider = lti.ToolProvider( self.container['Consumers'], self.container['Nonces'], self.cipher) consumer = provider.lookup_consumer('12345') self.assertTrue(provider.validate_timestamp_and_nonce( consumer.key, 0, '9e4a4b085c8c46d6aae6b5d9c8a15418', None)) # the same nonce should now evaluate to True self.assertFalse(provider.validate_timestamp_and_nonce( consumer.key, 0, '9e4a4b085c8c46d6aae6b5d9c8a15418', None)) # but a different one is False self.assertTrue(provider.validate_timestamp_and_nonce( consumer.key, 0, '8f274dca508711c2e70a67ab68fcc1f2', None)) # now at 89:59 we are still not allowed to reuse the nonce self.mock_time.tick(89*60+59.0) self.assertFalse(provider.validate_timestamp_and_nonce( consumer.key, 0, '9e4a4b085c8c46d6aae6b5d9c8a15418', None)) # but if we tick over 90 mins we're good to go again self.mock_time.tick(1.001) self.assertTrue(provider.validate_timestamp_and_nonce( consumer.key, 0, '9e4a4b085c8c46d6aae6b5d9c8a15418', None))
def test_launch(self): command = "POST" url = "http://www.example.com/launch" headers = {'Content-Type': 'application/x-www-form-urlencoded'} query_string = "context_id=456434513&context_label=SI182&"\ "context_title=Design%20of%20Personal%20Environments&"\ "launch_presentation_css_url=http%3A%2F%2Fwww.imsglobal.org%2F"\ "developers%2FLTI%2Ftest%2Fv1p1%2Flms.css&"\ "launch_presentation_document_target=frame&"\ "launch_presentation_locale=en-US&"\ "launch_presentation_return_url=http%3A%2F%2Fwww.imsglobal.org%2F"\ "developers%2FLTI%2Ftest%2Fv1p1%2Flms_return.php&"\ "lis_outcome_service_url=http%3A%2F%2Fwww.imsglobal.org%2F"\ "developers%2FLTI%2Ftest%2Fv1p1%2Fcommon%2F"\ "tool_consumer_outcome.php%3Fb64%3DMTIzNDU6OjpzZWNyZXQ%3D&"\ "lis_person_contact_email_primary=user%40school.edu&"\ "lis_person_name_family=Public&"\ "lis_person_name_full=Jane%20Q.%20Public&"\ "lis_person_name_given=Given&"\ "lis_person_sourcedid=school.edu%3Auser&"\ "lis_result_sourcedid=feb-123-456-2929%3A%3A28883&"\ "lti_message_type=basic-lti-launch-request&"\ "lti_version=LTI-1p0&"\ "oauth_callback=about%3Ablank&oauth_consumer_key=12345&"\ "oauth_nonce=45f32b44e314244a222d0e070fa55384&"\ "oauth_signature=SKhxr%2Bx4p9jVO6sFxKdpA5neDtg%3D&"\ "oauth_signature_method=HMAC-SHA1&"\ "oauth_timestamp=1420370306&"\ "oauth_version=1.0&"\ "resource_link_description=A%20weekly%20blog.&"\ "resource_link_id=120988f929-274612&"\ "resource_link_title=Weekly%20Blog&"\ "roles=Instructor&"\ "tool_consumer_info_product_family_code=ims&"\ "tool_consumer_info_version=1.1&"\ "tool_consumer_instance_description="\ "University%20of%20School%20%28LMSng%29&"\ "tool_consumer_instance_guid=lmsng.school.edu&"\ "user_id=292832126" with self.silo['Consumers'].open() as collection: consumer = lti.ToolConsumer.new_from_values( collection.new_entity(), self.cipher, 'default', key="12345", secret=ul("secret")) collection.insert_entity(consumer.entity) provider = lti.ToolProvider( self.container['Consumers'], self.container['Nonces'], self.cipher) consumer, parameters = provider.launch( command, url, headers, query_string) self.assertTrue(consumer.key == '12345') self.assertTrue('user_id' in parameters) self.assertTrue(parameters['user_id'] == '292832126') # we should have an exception if we change the parameters! try: consumer, parameters = provider.launch( "POST", url, headers, query_string + "%custom_value=X") self.fail("LTI launch with bad signature") except lti.LTIAuthenticationError: pass
def test_constructor(self): provider = lti.ToolProvider( self.container['Consumers'], self.container['Nonces'], self.cipher) # by default, there are no consumers try: provider.lookup_consumer('12345') self.fail("No consumers") except KeyError: pass with self.silo['Consumers'].open() as collection: consumer = lti.ToolConsumer.new_from_values( collection.new_entity(), self.cipher, 'default', key="12345", secret=ul("secret")) collection.insert_entity(consumer.entity) try: consumer = provider.lookup_consumer('12345') self.assertTrue(consumer.key == '12345') self.assertTrue(consumer.secret == 'secret') except KeyError: self.fail("Failed to find consumer")