15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::Captcha::Captcha() : image_width(0), image_height(0) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::Captcha::Captcha( 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& token, const GURL& audio, const GURL& img, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& unlock, int width, int height) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : token(token), audio_url(audio), image_url(img), unlock_url(unlock), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_width(width), image_height(height) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::Captcha::~Captcha() { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GoogleServiceAuthError::Captcha::operator==(const Captcha& b) const { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (token == b.token && 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_url == b.audio_url && 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_url == b.image_url && 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unlock_url == b.unlock_url && 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_width == b.image_width && 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_height == b.image_height); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::SecondFactor::SecondFactor() : field_length(0) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::SecondFactor::SecondFactor( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& token, const std::string& prompt, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& alternate, int length) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : token(token), prompt_text(prompt), alternate_text(alternate), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_length(length) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::SecondFactor::~SecondFactor() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GoogleServiceAuthError::SecondFactor::operator==( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SecondFactor& b) const { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (token == b.token && 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prompt_text == b.prompt_text && 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alternate_text == b.alternate_text && 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_length == b.field_length); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GoogleServiceAuthError::operator==( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& b) const { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (state_ == b.state_ && 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_error_ == b.network_error_ && 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_ == b.captcha_ && 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_factor_ == b.second_factor_); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::GoogleServiceAuthError(State s) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : state_(s), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_error_(0) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the caller has no idea, then we just set it to a generic failure. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (s == CONNECTION_FAILED) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_error_ = net::ERR_FAILED; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGoogleServiceAuthError::GoogleServiceAuthError( 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch State state, 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& error_message) 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : state_(state), 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch network_error_(0), 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error_message_(error_message) { 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError::FromConnectionError(int error) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GoogleServiceAuthError(CONNECTION_FAILED, error); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError GoogleServiceAuthError::FromClientLoginCaptchaChallenge( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& captcha_token, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& captcha_image_url, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& captcha_unlock_url) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GoogleServiceAuthError(CAPTCHA_REQUIRED, captcha_token, GURL(), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_image_url, captcha_unlock_url, 0, 0); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGoogleServiceAuthError GoogleServiceAuthError::FromServiceError( 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& error_message) { 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return GoogleServiceAuthError(SERVICE_ERROR, error_message); 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGoogleServiceAuthError GoogleServiceAuthError::FromUnexpectedServiceResponse( 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& error_message) { 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return GoogleServiceAuthError(UNEXPECTED_SERVICE_RESPONSE, error_message); 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GoogleServiceAuthError GoogleServiceAuthError::AuthErrorNone() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GoogleServiceAuthError(NONE); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::State GoogleServiceAuthError::state() const { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return state_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GoogleServiceAuthError::Captcha& GoogleServiceAuthError::captcha() const { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return captcha_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GoogleServiceAuthError::SecondFactor& 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::second_factor() const { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return second_factor_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GoogleServiceAuthError::network_error() const { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_error_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& GoogleServiceAuthError::token() const { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state_) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CAPTCHA_REQUIRED: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return captcha_.token; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TWO_FACTOR: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return second_factor_.token; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::EmptyString(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& GoogleServiceAuthError::error_message() const { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_message_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::DictionaryValue* GoogleServiceAuthError::ToValue() const { 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* value = new base::DictionaryValue(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string state_str; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state_) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define STATE_CASE(x) case x: state_str = #x; break 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(NONE); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(INVALID_GAIA_CREDENTIALS); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(USER_NOT_SIGNED_UP); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(CONNECTION_FAILED); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(CAPTCHA_REQUIRED); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(ACCOUNT_DELETED); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(ACCOUNT_DISABLED); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(SERVICE_UNAVAILABLE); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(TWO_FACTOR); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(REQUEST_CANCELED); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_CASE(HOSTED_NOT_ALLOWED); 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch STATE_CASE(UNEXPECTED_SERVICE_RESPONSE); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch STATE_CASE(SERVICE_ERROR); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef STATE_CASE 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString("state", state_str); 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!error_message_.empty()) { 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch value->SetString("errorMessage", error_message_); 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_ == CAPTCHA_REQUIRED) { 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* captcha_value = new base::DictionaryValue(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->Set("captcha", captcha_value); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_value->SetString("token", captcha_.token); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_value->SetString("audioUrl", captcha_.audio_url.spec()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_value->SetString("imageUrl", captcha_.image_url.spec()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_value->SetString("unlockUrl", captcha_.unlock_url.spec()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_value->SetInteger("imageWidth", captcha_.image_width); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_value->SetInteger("imageHeight", captcha_.image_height); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (state_ == CONNECTION_FAILED) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString("networkError", net::ErrorToString(network_error_)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (state_ == TWO_FACTOR) { 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* two_factor_value = new base::DictionaryValue(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->Set("two_factor", two_factor_value); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_factor_value->SetString("token", second_factor_.token); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_factor_value->SetString("promptText", second_factor_.prompt_text); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_factor_value->SetString("alternateText", second_factor_.alternate_text); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two_factor_value->SetInteger("fieldLength", second_factor_.field_length); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GoogleServiceAuthError::ToString() const { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state_) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NONE: 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case INVALID_GAIA_CREDENTIALS: 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Invalid credentials."; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case USER_NOT_SIGNED_UP: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Not authorized."; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CONNECTION_FAILED: 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("Connection failed (%d).", network_error_); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CAPTCHA_REQUIRED: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("CAPTCHA required (%s).", 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_.token.c_str()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ACCOUNT_DELETED: 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Account deleted."; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ACCOUNT_DISABLED: 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Account disabled."; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SERVICE_UNAVAILABLE: 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Service unavailable; try again later."; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TWO_FACTOR: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::StringPrintf("2-step verification required (%s).", 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_factor_.token.c_str()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case REQUEST_CANCELED: 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Request canceled."; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case HOSTED_NOT_ALLOWED: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Google account required."; 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case UNEXPECTED_SERVICE_RESPONSE: 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::StringPrintf("Unexpected service response (%s)", 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error_message_.c_str()); 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case SERVICE_ERROR: 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::StringPrintf("Service responded with error: '%s'", 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error_message_.c_str()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::GoogleServiceAuthError(State s, int error) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : state_(s), 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_error_(error) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GoogleServiceAuthError::GoogleServiceAuthError( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State s, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& captcha_token, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& captcha_audio_url, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& captcha_image_url, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& captcha_unlock_url, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int image_width, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int image_height) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : state_(s), 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_(captcha_token, captcha_audio_url, captcha_image_url, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captcha_unlock_url, image_width, image_height), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_error_(0) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 256