]> git.openstreetmap.org Git - osqa.git/blobdiff - forum_modules/oauthauth/consumer.py
Merge pull request #45 from udacity/sort_modes
[osqa.git] / forum_modules / oauthauth / consumer.py
index 74734145a6af059021232e3b3ab97cb1766c2205..bbbaac8d53757ec48fa9e20fd648c93ce98764c5 100644 (file)
@@ -3,10 +3,13 @@ import urllib2
 import httplib
 import time
 
+from forum.settings import APP_URL
 from forum.authentication.base import AuthenticationConsumer, InvalidAuthentication
 from django.utils.translation import ugettext as _
+from django.core.urlresolvers import reverse
 
-from lib import oauth
+from settings import TWITTER_AUTO_CALLBACK_REDIRECT
+from lib import oauth2
 
 class OAuthAbstractAuthConsumer(AuthenticationConsumer):
 
@@ -14,8 +17,8 @@ class OAuthAbstractAuthConsumer(AuthenticationConsumer):
         self.consumer_secret = consumer_secret
         self.consumer_key = consumer_key
 
-        self.consumer = oauth.OAuthConsumer(consumer_key, consumer_secret)
-        self.signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
+        self.consumer = oauth2.Consumer(consumer_key, consumer_secret)
+        self.signature_method = oauth2.SignatureMethod_HMAC_SHA1()
 
         self.server_url = server_url
         self.request_token_url = request_token_url
@@ -32,12 +35,12 @@ class OAuthAbstractAuthConsumer(AuthenticationConsumer):
         if not unauthed_token:
              raise InvalidAuthentication(_('Error, the oauth token is not on the server'))
 
-        token = oauth.OAuthToken.from_string(unauthed_token)
+        token = oauth2.Token.from_string(unauthed_token)
 
         if token.key != request.GET.get('oauth_token', 'no-token'):
             raise InvalidAuthentication(_("Something went wrong! Auth tokens do not match"))
 
-        access_token = self.fetch_access_token(token)
+        access_token = self.fetch_access_token(token, request.GET.get('oauth_verifier', '')) 
 
         return access_token.to_string()
 
@@ -46,34 +49,44 @@ class OAuthAbstractAuthConsumer(AuthenticationConsumer):
         return {}
         
     def fetch_request_token(self):
-        oauth_request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, http_url=self.request_token_url)
+        parameters = {}
+        # If the installation is configured to automatically redirect to the Twitter provider done page -- do it.
+        if bool(TWITTER_AUTO_CALLBACK_REDIRECT):
+            callback_url = '%s%s' % (APP_URL, reverse('auth_provider_done', kwargs={ 'provider' : 'twitter', }))
+            # Pass
+            parameters.update({
+                'oauth_callback' : callback_url,
+            })
+
+        oauth_request = oauth2.Request.from_consumer_and_token(self.consumer, http_url=self.request_token_url, parameters=parameters)
         oauth_request.sign_request(self.signature_method, self.consumer, None)
-        params = oauth_request.parameters
+        params = oauth_request
         data = urllib.urlencode(params)
         full_url='%s?%s'%(self.request_token_url, data)
         response = urllib2.urlopen(full_url)
-        return oauth.OAuthToken.from_string(response.read())
+        return oauth2.Token.from_string(response.read())
 
     def authorize_token_url(self, token, callback_url=None):
-        oauth_request = oauth.OAuthRequest.from_token_and_callback(token=token,\
+        oauth_request = oauth2.Request.from_token_and_callback(token=token,\
                         callback=callback_url, http_url=self.authorization_url)
-        params = oauth_request.parameters
+        params = oauth_request
         data = urllib.urlencode(params)
         full_url='%s?%s'%(self.authorization_url, data)
         return full_url
 
-    def fetch_access_token(self, token):
-        oauth_request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, token=token, http_url=self.access_token_url)
+    def fetch_access_token(self, token, oauth_verifier): 
+        oauth_request = oauth2.Request.from_consumer_and_token(self.consumer, token=token, http_url=self.access_token_url)
+        oauth_request['oauth_verifier'] = oauth_verifier 
         oauth_request.sign_request(self.signature_method, self.consumer, token)
-        params = oauth_request.parameters
+        params = oauth_request
         data = urllib.urlencode(params)
         full_url='%s?%s'%(self.access_token_url, data)
         response = urllib2.urlopen(full_url)
-        return oauth.OAuthToken.from_string(response.read())
+        return oauth2.Token.from_string(response.read())
 
     def fetch_data(self, token, http_url, parameters=None):
-        access_token = oauth.OAuthToken.from_string(token)
-        oauth_request = oauth.OAuthRequest.from_consumer_and_token(
+        access_token = oauth2.Token.from_string(token)
+        oauth_request = oauth2.Request.from_consumer_and_token(
             self.consumer, token=access_token, http_method="GET",
             http_url=http_url, parameters=parameters,
         )
@@ -81,7 +94,7 @@ class OAuthAbstractAuthConsumer(AuthenticationConsumer):
 
         url = oauth_request.to_url()
         connection = httplib.HTTPSConnection(self.server_url)
-        connection.request(oauth_request.http_method, url)
+        connection.request("GET", url)
 
         return connection.getresponse().read()