8
8
import time
9
9
import oauth
10
10
11
+ import logging
12
+
13
+ class RefreshException (Exception ):
14
+ pass
15
+ class PermissionException (Exception ):
16
+ pass
17
+
11
18
class OAuthClient (oauth .OAuthClient ):
12
19
"""A client to help simplify the oauth pain"""
13
20
signature_method_hmac_sha1 = oauth .OAuthSignatureMethod_HMAC_SHA1 ()
@@ -34,21 +41,24 @@ def access_token_url(self):
34
41
35
42
type = "unknown"
36
43
37
- def fetch_token (self , oauth_request ):
44
+ def fetch_token (self , oauth_request , user ):
38
45
# returns OAuthToken
39
- response = self .urlopen (oauth_request .to_url ())
46
+ response = self .urlopen (oauth_request .to_url (), user )
40
47
return oauth .OAuthToken .from_string (response .read ())
41
48
42
- def urlopen (self , url , old_url = None , user = None , * args , ** kwargs ):
49
+ def urlopen (self , url , user , * args , ** kwargs ):
50
+ logging .debug (url )
51
+ # print "\n", url
43
52
try :
44
53
response = urllib2 .urlopen (url )
45
54
except urllib2 .HTTPError , why :
46
55
error = why .headers .get ("www-authenticate" , None )
47
- if why .code == 401 :
48
- if error and error .find ("token_expired" ) != - 1 :
49
- if old_url and user :
50
- self .refresh (user )
51
- return self .fetch (old_url , user , * args , ** kwargs )
56
+ if error :
57
+ if error .find ("token_expired" ) != - 1 :
58
+ self .refresh (user )
59
+ raise RefreshException ("New token aquired. Retry" )
60
+ if error .find ("permission_denied" ) != - 1 :
61
+ raise PermissionException ("Permission denied. Probably revoked OAuth: %s" % url )
52
62
why .msg += "\n %s\n %s\n %s" % (url , why .headers , "" .join (why .readlines ()))
53
63
raise why
54
64
@@ -62,7 +72,7 @@ def refresh(self, user):
62
72
self .consumer , token = access_token , http_url = self .access_token_url
63
73
)
64
74
request .sign_request (self .signature_method_hmac_sha1 , self .consumer , access_token )
65
- access_token = self .fetch_token (request )
75
+ access_token = self .fetch_token (request , user )
66
76
user .set_access_token (access_token )
67
77
user .save ()
68
78
return True
@@ -85,9 +95,9 @@ def start(self, *args, **kwargs):
85
95
self .consumer , callback = self .callback_url , http_url = self .request_token_url , parameters = kwargs
86
96
)
87
97
oauth_request .sign_request (self .signature_method_hmac_sha1 , self .consumer , None )
88
- token = self .fetch_token (oauth_request )
89
98
90
99
user = self .db .User (type = self .type )
100
+ token = self .fetch_token (oauth_request , user )
91
101
user .set_request_token (token )
92
102
user .save ()
93
103
@@ -105,11 +115,16 @@ def verify(self, user, token, verifier=None, *args, **kwargs):
105
115
self .consumer , token = request_token , verifier = verifier , http_url = self .access_token_url , parameters = kwargs
106
116
)
107
117
request .sign_request (self .sign
92C3
ature_method_hmac_sha1 , self .consumer , request_token )
108
- access_token = self .fetch_token (request )
118
+ access_token = self .fetch_token (request , user )
109
119
user .set_access_token (access_token )
110
120
user .save ()
111
121
return True
112
122
113
123
114
- def fetch (self , url , user , * args , ** kwargs ):
115
- return self .urlopen (self .sign_url (url , user ), url , user , * args , ** kwargs )
124
+ def fetch (self , url , user , tries = 1 , * args , ** kwargs ):
125
+ try :
126
+ return self .urlopen (self .sign_url (url , user ), user , * args , ** kwargs )
127
+ except RefreshException , why :
128
+ if tries == 0 :
129
+ raise why
130
+ return self .fetch (url , user , tries = tries - 1 , * args , ** kwargs )
0 commit comments