google_service_auth_error.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// A GoogleServiceAuthError is immutable, plain old data representing an 6// error from an attempt to authenticate with a Google service. 7// It could be from Google Accounts itself, or any service using Google 8// Accounts (e.g expired credentials). It may contain additional data such as 9// captcha or OTP challenges. 10 11// A GoogleServiceAuthError without additional data is just a State, defined 12// below. A case could be made to have this relation implicit, to allow raising 13// error events concisely by doing OnAuthError(GoogleServiceAuthError::NONE), 14// for example. But the truth is this class is ever so slightly more than a 15// transparent wrapper around 'State' due to additional Captcha data 16// (e.g consider operator=), and this would violate the style guide. Thus, 17// you must explicitly use the constructor when all you have is a State. 18// The good news is the implementation nests the enum inside a class, so you 19// may forward declare and typedef GoogleServiceAuthError to something shorter 20// in the comfort of your own translation unit. 21 22#ifndef GOOGLE_APIS_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_ 23#define GOOGLE_APIS_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_ 24 25#include <string> 26 27#include "googleurl/src/gurl.h" 28 29namespace base { 30class DictionaryValue; 31} 32 33class GoogleServiceAuthError { 34 public: 35 // 36 // These enumerations are referenced by integer value in HTML login code. 37 // Do not change the numeric values. 38 // 39 enum State { 40 // The user is authenticated. 41 NONE = 0, 42 43 // The credentials supplied to GAIA were either invalid, or the locally 44 // cached credentials have expired. 45 INVALID_GAIA_CREDENTIALS = 1, 46 47 // The GAIA user is not authorized to use the service. 48 USER_NOT_SIGNED_UP = 2, 49 50 // Could not connect to server to verify credentials. This could be in 51 // response to either failure to connect to GAIA or failure to connect to 52 // the service needing GAIA tokens during authentication. 53 CONNECTION_FAILED = 3, 54 55 // The user needs to satisfy a CAPTCHA challenge to unlock their account. 56 // If no other information is available, this can be resolved by visiting 57 // https://accounts.google.com/DisplayUnlockCaptcha. Otherwise, captcha() 58 // will provide details about the associated challenge. 59 CAPTCHA_REQUIRED = 4, 60 61 // The user account has been deleted. 62 ACCOUNT_DELETED = 5, 63 64 // The user account has been disabled. 65 ACCOUNT_DISABLED = 6, 66 67 // The service is not available; try again later. 68 SERVICE_UNAVAILABLE = 7, 69 70 // The password is valid but we need two factor to get a token. 71 TWO_FACTOR = 8, 72 73 // The requestor of the authentication step cancelled the request 74 // prior to completion. 75 REQUEST_CANCELED = 9, 76 77 // The user has provided a HOSTED account, when this service requires 78 // a GOOGLE account. 79 HOSTED_NOT_ALLOWED = 10, 80 81 // The number of known error states. 82 NUM_STATES = 11, 83 }; 84 85 // Additional data for CAPTCHA_REQUIRED errors. 86 struct Captcha { 87 Captcha(); 88 Captcha(const std::string& token, 89 const GURL& audio, 90 const GURL& img, 91 const GURL& unlock, 92 int width, 93 int height); 94 ~Captcha(); 95 // For test only. 96 bool operator==(const Captcha &b) const; 97 98 std::string token; // Globally identifies the specific CAPTCHA challenge. 99 GURL audio_url; // The CAPTCHA audio to use instead of image. 100 GURL image_url; // The CAPTCHA image to show the user. 101 GURL unlock_url; // Pretty unlock page containing above captcha. 102 int image_width; // Width of captcha image. 103 int image_height; // Height of capture image. 104 }; 105 106 // Additional data for TWO_FACTOR errors. 107 struct SecondFactor { 108 SecondFactor(); 109 SecondFactor(const std::string& token, 110 const std::string& prompt, 111 const std::string& alternate, 112 int length); 113 ~SecondFactor(); 114 // For test only. 115 bool operator==(const SecondFactor &b) const; 116 117 // Globally identifies the specific second-factor challenge. 118 std::string token; 119 // Localised prompt text, eg Enter the verification code sent to your 120 // phone number ending in XXX. 121 std::string prompt_text; 122 // Localized text describing an alternate option, eg Get a verification 123 // code in a text message. 124 std::string alternate_text; 125 // Character length for the challenge field. 126 int field_length; 127 }; 128 129 // For test only. 130 bool operator==(const GoogleServiceAuthError &b) const; 131 132 // Construct a GoogleServiceAuthError from a State with no additional data. 133 explicit GoogleServiceAuthError(State s); 134 135 // Construct a GoogleServiceAuthError from a network error. 136 // It will be created with CONNECTION_FAILED set. 137 static GoogleServiceAuthError FromConnectionError(int error); 138 139 // Construct a CAPTCHA_REQUIRED error with CAPTCHA challenge data from the 140 // the ClientLogin endpoint. 141 // TODO(rogerta): once ClientLogin is no longer used, may be able to get 142 // rid of this function. 143 static GoogleServiceAuthError FromClientLoginCaptchaChallenge( 144 const std::string& captcha_token, 145 const GURL& captcha_image_url, 146 const GURL& captcha_unlock_url); 147 148 // Provided for convenience for clients needing to reset an instance to NONE. 149 // (avoids err_ = GoogleServiceAuthError(GoogleServiceAuthError::NONE), due 150 // to explicit class and State enum relation. Note: shouldn't be inlined! 151 static GoogleServiceAuthError AuthErrorNone(); 152 153 // The error information. 154 State state() const; 155 const Captcha& captcha() const; 156 const SecondFactor& second_factor() const; 157 int network_error() const; 158 const std::string& token() const; 159 const std::string& error_message() const; 160 161 // Returns info about this object in a dictionary. Caller takes 162 // ownership of returned dictionary. 163 base::DictionaryValue* ToValue() const; 164 165 // Returns a message describing the error. 166 std::string ToString() const; 167 168 private: 169 GoogleServiceAuthError(State s, int error); 170 171 explicit GoogleServiceAuthError(const std::string& error_message); 172 173 GoogleServiceAuthError(State s, const std::string& captcha_token, 174 const GURL& captcha_audio_url, 175 const GURL& captcha_image_url, 176 const GURL& captcha_unlock_url, 177 int image_width, 178 int image_height); 179 180 GoogleServiceAuthError(State s, const std::string& captcha_token, 181 const std::string& prompt_text, 182 const std::string& alternate_text, 183 int field_length); 184 185 State state_; 186 Captcha captcha_; 187 SecondFactor second_factor_; 188 int network_error_; 189 std::string error_message_; 190}; 191 192#endif // GOOGLE_APIS_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_ 193