class TestOAuth(unittest.TestCase): signatures = {'consumer_key':'v9s778n692e9qvd83wfj9t8c','shared_secret':'54XqbMADta'}; test_url = 'http://api.netflix.com/catalog/titles'; parameters = 'term=mac%20and+me&expand=formats,synopsis&max_results=1&v=2.0&output=json'; def setUp(self): self.o1 = OAuthSimple() def testUtils(self): self.assertEqual(self.o1._oauthEscape('a b+c!d*\\e(f)g+h'),'a%20b%2Bc%21d%2A%5Ce%28f%29g%2Bh'); self.assertEqual(self.o1._arrayMerge({'a':0,'b':2,'c':3},{'a':1,'d':4}),{'a':1,'b':2,'c':3,'d':4}); self.o1.signatures({'api_key':'123','shared_secret':'456'}) self.o1.setParameters({'a':1,'b':2}); self.assertEqual(self.o1._secrets['oauth_consumer_key'],'123'); self.assertEqual(self.o1._secrets['shared_secret'],'456') self.assertEqual(len(self.o1._getNonce(10)),10); self.assertNotEqual(self.o1._getNonce(),self.o1._getNonce()) self.o1.reset(); self.assertTrue(len(self.o1._parameters)==0) def testSimple(self): self.o1.reset(); signed = self.o1.sign({'signatures':self.signatures,'parameters':self.parameters,'path':self.test_url}); # import pdb; pdb.set_trace(); self.assertTrue(len(signed.get('signature')) > 0) self.assertTrue(len(signed.get('signed_url'))>0) # send the link. try: rsp=urllib2.urlopen(signed.get('signed_url')) except urllib2.HTTPError as ex: if (ex.headers.get('x-mashery-error-code') == 'ERR_401_TIMESTAMP_IS_INVALID'): print "Your clock is off. Check and retry." raise print ex raise content = json.loads(rsp.read()) self.assertTrue(content.get('catalog')[0].get('id') == u'http://api.netflix.com/catalog/titles/movies/60035973') def testComplex(self): self.o1.reset(); self.o1.signatures(self.signatures); self.o1.setPath(u'http://api.netflix.com/catalog/titles/movies/60035973'); self.o1.setParameters({'expand':'all', 'v':'2.0', 'output':'json'}); signed = self.o1.sign(); content = json.loads(urllib2.urlopen(signed.get('signed_url')).read()) # This is probably testing Netflix's API more than mine. self.assertEqual(content['catalog_title']['directors'][0]['name'],u'Stewart Raffill')
def view(request, course_prefix, course_suffix): # Only use the ready course (for the piazza_id) since Piazza has no notion # of draft/live. course = request.common_page_data['ready_course'] lti_params = { "lti_message_type": "basic-lti-launch-request", "lti_version": "LTI-1p0", "resource_link_id": "class2go-forum", } lti_params['user_id'] = request.user.id # TODO: once we get course policies in place, provide an override to enable using real # names (see #578) # # lti_params['lis_person_name_family'] = request.user.last_name # lti_params['lis_person_name_given'] = request.user.first_name # lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name lti_params['lis_person_name_full'] = request.user.username lti_params['lis_person_contact_email_primary'] = request.user.email # Piazza only supports two roles, instructor and strudent; TA's (readonly too) are instructors. if request.common_page_data['is_course_admin']: lti_params['roles'] = "Instructor" else: lti_params['roles'] = "Student" lti_params['context_id'] = course.piazza_id lti_params['context_label'] = request.common_page_data['course_prefix'] lti_params['context_title'] = course.title # Use OAuthSimple to sign the request. signatures = { 'consumer_key': PIAZZA_KEY, 'shared_secret': PIAZZA_SECRET, } oauthsimple = OAuthSimple() signed_request = oauthsimple.sign({ 'path': PIAZZA_ENDPOINT, 'action': "POST", 'parameters': lti_params, 'signatures': signatures, }) form = PiazzaAuthForm(initial=signed_request['parameters']) # Set common_page_data['can_switch_mode'] to false to hide mode switcher on this page. common_page_data['can_switch_mode'] = False return render_to_response('forums/piazza.html', { 'common_page_data': request.common_page_data, 'form': form, 'piazza_target_url': PIAZZA_ENDPOINT, }, context_instance=RequestContext(request))
def view(request, course_prefix, course_suffix): try: common_page_data = get_common_page_data(request, course_prefix, course_suffix) except: raise Http404 # Only use the ready course (for the piazza_id) since Piazza has no notion # of draft/live. course = common_page_data['ready_course'] lti_params = { "lti_message_type": "basic-lti-launch-request", "lti_version": "LTI-1p0", "resource_link_id": "class2go-forum", } lti_params['user_id'] = request.user.id lti_params['lis_person_name_given'] = request.user.first_name lti_params['lis_person_name_family'] = request.user.last_name lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name lti_params['lis_person_contact_email_primary'] = request.user.email # Piazza only supports two roles, instructor and strudent. TA's (readonly too) are instructors too. if common_page_data['is_course_admin']: lti_params['roles'] = "Instructor" else: lti_params['roles'] = "Student" lti_params['context_id'] = course.piazza_id lti_params['context_label'] = common_page_data['course_prefix'] lti_params['context_title'] = course.title # Use OAuthSimple to sign the request. signatures = { 'consumer_key': PIAZZA_KEY, 'shared_secret': PIAZZA_SECRET, } oauthsimple = OAuthSimple() signed_request = oauthsimple.sign({ 'path': PIAZZA_ENDPOINT, 'action': "POST", 'parameters': lti_params, 'signatures': signatures, }) form = PiazzaAuthForm(initial=signed_request['parameters']) return render_to_response('forums/piazza.html', { 'common_page_data': common_page_data, 'form': form, 'piazza_target_url': PIAZZA_ENDPOINT, }, context_instance=RequestContext(request))
def view(request, course_prefix, course_suffix): # Only use the ready course (for the piazza_id) since Piazza has no notion # of draft/live. course = request.common_page_data['ready_course'] lti_params = { "lti_message_type": "basic-lti-launch-request", "lti_version": "LTI-1p0", "lis_person_sourcedid": "class2go:user", "resource_link_id": "class2go-forum", "resource_link_title": "Class2Go", "resource_link_description": "Class2Go Forum", "tool_consumer_instance_guid": "class2go guid", "tool_consumer_instance_description": "Class2Go", "oauth_callback": "about:blank", "ext_submit": "Press To Launch" } lti_params['user_id'] = request.user.id # TODO: once we get course policies in place, provide an override to enable using real # names (see #578) # # lti_params['lis_person_name_family'] = request.user.last_name # lti_params['lis_person_name_given'] = request.user.first_name # lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name profile = request.user.get_profile() show_confirmation = False if (not profile.piazza_name): show_confirmation = True fullname = request.user.first_name + " " + request.user.last_name lti_params['lis_person_name_full'] = fullname.encode("utf-8") else: lti_params['lis_person_name_full'] = profile.piazza_name.encode("utf-8") if (not profile.piazza_email): show_confirmation = True lti_params['lis_person_contact_email_primary'] = request.user.email else: lti_params['lis_person_contact_email_primary'] = profile.piazza_email # Piazza only supports two roles, instructor and strudent; TA's (readonly too) are instructors. if request.common_page_data['is_course_admin']: lti_params['roles'] = "Instructor" else: lti_params['roles'] = "Student" visit_log = PageVisitLog( course = course, user = request.user, page_type= 'forum', ) visit_log.save() lti_params['context_id'] = course.piazza_id lti_params['context_label'] = request.common_page_data['course_prefix'] lti_params['context_title'] = course.title # Use OAuthSimple to sign the request. signatures = { 'consumer_key': PIAZZA_KEY, 'shared_secret': PIAZZA_SECRET, } oauthsimple = OAuthSimple() signed_request = oauthsimple.sign({ 'path': PIAZZA_ENDPOINT, 'action': "POST", 'parameters': lti_params, 'signatures': signatures, }) form = PiazzaAuthForm(initial=signed_request['parameters']) querystring = request.META['QUERY_STRING'] # Set common_page_data['can_switch_mode'] to false to hide mode switcher on this page. request.common_page_data['can_switch_mode'] = False return render_to_response('forums/piazza.html', { 'common_page_data': request.common_page_data, 'show_confirmation': show_confirmation, 'form': form, 'piazza_target_url': PIAZZA_ENDPOINT, 'querystring': querystring, }, context_instance=RequestContext(request))
def view(request, course_prefix, course_suffix): # Only use the ready course (for the piazza_id) since Piazza has no notion # of draft/live. course = request.common_page_data['ready_course'] lti_params = { "lti_message_type": "basic-lti-launch-request", "lti_version": "LTI-1p0", "lis_person_sourcedid": "class2go:user", "resource_link_id": "class2go-forum", "resource_link_title": "Class2Go", "resource_link_description": "Class2Go Forum", "tool_consumer_instance_guid": "class2go guid", "tool_consumer_instance_description": "Class2Go", "oauth_callback": "about:blank", "ext_submit": "Press To Launch" } lti_params['user_id'] = request.user.id # TODO: once we get course policies in place, provide an override to enable using real # names (see #578) # # lti_params['lis_person_name_family'] = request.user.last_name # lti_params['lis_person_name_given'] = request.user.first_name # lti_params['lis_person_name_full'] = request.user.first_name + " " + request.user.last_name profile = request.user.get_profile() show_confirmation = False if (not profile.piazza_name): show_confirmation = True fullname = request.user.first_name + " " + request.user.last_name lti_params['lis_person_name_full'] = fullname.encode("utf-8") else: lti_params['lis_person_name_full'] = profile.piazza_name.encode( "utf-8") if (not profile.piazza_email): show_confirmation = True lti_params['lis_person_contact_email_primary'] = request.user.email else: lti_params['lis_person_contact_email_primary'] = profile.piazza_email # Piazza only supports two roles, instructor and strudent; TA's (readonly too) are instructors. if request.common_page_data['is_course_admin']: lti_params['roles'] = "Instructor" else: lti_params['roles'] = "Student" visit_log = PageVisitLog( course=course, user=request.user, page_type='forum', ) visit_log.save() lti_params['context_id'] = course.piazza_id lti_params['context_label'] = request.common_page_data['course_prefix'] lti_params['context_title'] = course.title # Use OAuthSimple to sign the request. signatures = { 'consumer_key': PIAZZA_KEY, 'shared_secret': PIAZZA_SECRET, } oauthsimple = OAuthSimple() signed_request = oauthsimple.sign({ 'path': PIAZZA_ENDPOINT, 'action': "POST", 'parameters': lti_params, 'signatures': signatures, }) form = PiazzaAuthForm(initial=signed_request['parameters']) querystring = request.META['QUERY_STRING'] # Set common_page_data['can_switch_mode'] to false to hide mode switcher on this page. request.common_page_data['can_switch_mode'] = False return render_to_response('forums/piazza.html', { 'common_page_data': request.common_page_data, 'show_confirmation': show_confirmation, 'form': form, 'piazza_target_url': PIAZZA_ENDPOINT, 'querystring': querystring, }, context_instance=RequestContext(request))
class TestOAuth(unittest.TestCase): signatures = { 'consumer_key': 'v9s778n692e9qvd83wfj9t8c', 'shared_secret': '54XqbMADta' } test_url = 'http://api.netflix.com/catalog/titles' parameters = \ 'term=mac%20and+me&expand=formats,' +\ 'synopsis&max_results=1&v=2.0&output=json' def setUp(self): self.o1 = OAuthSimple() def testUtils(self): self.assertEqual(self.o1._oauthEscape('a b+c!d*\\e(f)g+h'), 'a%20b%2Bc%21d%2A%5Ce%28f%29g%2Bh') self.assertEqual( self.o1._arrayMerge({ 'a': 0, 'b': 2, 'c': 3 }, { 'a': 1, 'd': 4 }), { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }) self.o1.signatures({'api_key': '123', 'shared_secret': '456'}) self.o1.setParameters({ 'a': 1, 'b': 2 }) self.assertEqual(self.o1._secrets['oauth_consumer_key'], '123') self.assertEqual(self.o1._secrets['shared_secret'], '456') self.assertEqual(len(self.o1._getNonce(10)), 10) self.assertNotEqual(self.o1._getNonce(), self.o1._getNonce()) self.o1.reset() self.assertTrue(len(self.o1._parameters) == 0) def testSimple(self): self.o1.reset() signed = self.o1.sign({ 'signatures': self.signatures, 'parameters': self.parameters, 'path': self.test_url }) # import pdb; pdb.set_trace(); self.assertTrue(len(signed.get('signature')) > 0) self.assertTrue(len(signed.get('signed_url')) > 0) # send the link. try: rsp = urllib2.urlopen(signed.get('signed_url')) except urllib2.HTTPError, ex: if (ex.headers.get('x-mashery-error-code') == 'ERR_401_TIMESTAMP_IS_INVALID'): print "Your clock is off. Check and retry." raise print ex raise content = json.loads(rsp.read()) self.assertTrue( content.get('catalog')[0].get('id') == u'http://api.netflix.com/catalog/titles/movies/60035973')