Index: third_party/upload.py |
diff --git a/third_party/upload.py b/third_party/upload.py |
index 0aae84c1ea3dcaa8e76fdd71b6c9c0c2dd2709e4..c9a45b59063b401c31d07a3f42923be2fcb0db9c 100755 |
--- a/third_party/upload.py |
+++ b/third_party/upload.py |
@@ -289,7 +289,7 @@ class AbstractRpcServer(object): |
req.add_header(key, value) |
return req |
- def _GetAuthToken(self, email, password): |
+ def _GetAuthToken(self, email, password, internal=False): |
"""Uses ClientLogin to authenticate the user, returning an auth token. |
Args: |
@@ -307,8 +307,9 @@ class AbstractRpcServer(object): |
if self.host.endswith(".google.com"): |
# Needed for use inside Google. |
account_type = "HOSTED" |
+ service = ('ClientLogin') if not internal else ('ClientAuth') |
req = self._CreateRequest( |
- url="https://www.google.com/accounts/ClientLogin", |
+ url="https://www.google.com/accounts/%s" % (service,), |
data=urllib.urlencode({ |
"Email": email, |
"Passwd": password, |
@@ -371,12 +372,32 @@ class AbstractRpcServer(object): |
authentication cookie, it returns a 401 response (or a 302) and |
directs us to authenticate ourselves with ClientLogin. |
""" |
+ INTERNAL_ERROR_MAP = { |
+ "badauth": "BadAuthentication", |
+ "cr": "CaptchaRequired", |
+ "adel": "AccountDeleted", |
+ "adis": "AccountDisabled", |
+ "sdis": "ServiceDisabled", |
+ "ire": "ServiceUnavailable", |
+ } |
+ |
for i in range(3): |
credentials = self.auth_function() |
+ |
+ # Try external, then internal. |
+ e = None |
try: |
auth_token = self._GetAuthToken(credentials[0], credentials[1]) |
- except ClientLoginError, e: |
+ except urllib2.HTTPError: |
+ try: |
+ auth_token = self._GetAuthToken(credentials[0], credentials[1], |
+ internal=True) |
+ except ClientLoginError, exc: |
+ e = exc |
+ if e: |
print >> sys.stderr, '' |
+ if internal: |
+ e.reason = INTERNAL_ERROR_MAP.get(e.reason, e.reason) |
if e.reason == "BadAuthentication": |
if e.info == "InvalidSecondFactor": |
print >> sys.stderr, ( |
@@ -409,7 +430,7 @@ class AbstractRpcServer(object): |
print >> sys.stderr, "The service is not available; try again later." |
else: |
# Unknown error. |
- raise |
+ raise e |
print >> sys.stderr, '' |
continue |
self._GetAuthCookie(auth_token) |