|
|
|
@ -481,14 +481,14 @@ class OAuthRpcServer(object):
|
|
|
|
|
"OAuth2 support requires it.")
|
|
|
|
|
logging.error("Installing pyopenssl will probably solve this issue.")
|
|
|
|
|
raise RuntimeError('No OpenSSL support')
|
|
|
|
|
creds = oa2client.SignedJwtAssertionCredentials(
|
|
|
|
|
self.creds = oa2client.SignedJwtAssertionCredentials(
|
|
|
|
|
client_email,
|
|
|
|
|
client_private_key,
|
|
|
|
|
'https://www.googleapis.com/auth/userinfo.email',
|
|
|
|
|
private_key_password=private_key_password,
|
|
|
|
|
user_agent=user_agent)
|
|
|
|
|
|
|
|
|
|
self._http = creds.authorize(httplib2.Http(timeout=timeout))
|
|
|
|
|
self._http = self.creds.authorize(httplib2.Http(timeout=timeout))
|
|
|
|
|
|
|
|
|
|
def Send(self,
|
|
|
|
|
request_path,
|
|
|
|
@ -525,17 +525,30 @@ class OAuthRpcServer(object):
|
|
|
|
|
if kwargs:
|
|
|
|
|
url += "?" + urllib.urlencode(kwargs)
|
|
|
|
|
|
|
|
|
|
ret = self._http.request(url,
|
|
|
|
|
method=method,
|
|
|
|
|
body=payload,
|
|
|
|
|
headers=headers)
|
|
|
|
|
|
|
|
|
|
if (method == 'GET'
|
|
|
|
|
and not ret[0]['content-location'].startswith(self.host)):
|
|
|
|
|
upload.logging.warning('Redirection to host %s detected: '
|
|
|
|
|
'login may have failed/expired.'
|
|
|
|
|
% urlparse.urlparse(
|
|
|
|
|
ret[0]['content-location']).netloc)
|
|
|
|
|
# This weird loop is there to detect when the OAuth2 token has expired.
|
|
|
|
|
# This is specific to appengine *and* rietveld. It relies on the
|
|
|
|
|
# assumption that a 302 is triggered only by an expired OAuth2 token. This
|
|
|
|
|
# prevents any usage of redirections in pages accessed this way.
|
|
|
|
|
|
|
|
|
|
# This variable is used to make sure the following loop runs only twice.
|
|
|
|
|
redirect_caught = False
|
|
|
|
|
while True:
|
|
|
|
|
try:
|
|
|
|
|
ret = self._http.request(url,
|
|
|
|
|
method=method,
|
|
|
|
|
body=payload,
|
|
|
|
|
headers=headers,
|
|
|
|
|
redirections=0)
|
|
|
|
|
except httplib2.RedirectLimit:
|
|
|
|
|
if redirect_caught or method != 'GET':
|
|
|
|
|
logging.error('Redirection detected after logging in. Giving up.')
|
|
|
|
|
raise
|
|
|
|
|
redirect_caught = True
|
|
|
|
|
logging.debug('Redirection detected. Trying to log in again...')
|
|
|
|
|
self.creds.access_token = None
|
|
|
|
|
continue
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
return ret[1]
|
|
|
|
|
|
|
|
|
|
finally:
|
|
|
|
|