OLD | NEW |
| (Empty) |
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 CHROME_COMMON_NET_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_ | |
23 #define CHROME_COMMON_NET_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_ | |
24 | |
25 #include <string> | |
26 | |
27 #include "googleurl/src/gurl.h" | |
28 | |
29 namespace base { | |
30 class DictionaryValue; | |
31 } | |
32 | |
33 class 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 | |
82 // Additional data for CAPTCHA_REQUIRED errors. | |
83 struct Captcha { | |
84 Captcha(); | |
85 Captcha(const std::string& token, | |
86 const GURL& audio, | |
87 const GURL& img, | |
88 const GURL& unlock, | |
89 int width, | |
90 int height); | |
91 ~Captcha(); | |
92 // For test only. | |
93 bool operator==(const Captcha &b) const; | |
94 | |
95 std::string token; // Globally identifies the specific CAPTCHA challenge. | |
96 GURL audio_url; // The CAPTCHA audio to use instead of image. | |
97 GURL image_url; // The CAPTCHA image to show the user. | |
98 GURL unlock_url; // Pretty unlock page containing above captcha. | |
99 int image_width; // Width of captcha image. | |
100 int image_height; // Height of capture image. | |
101 }; | |
102 | |
103 // Additional data for TWO_FACTOR errors. | |
104 struct SecondFactor { | |
105 SecondFactor(); | |
106 SecondFactor(const std::string& token, | |
107 const std::string& prompt, | |
108 const std::string& alternate, | |
109 int length); | |
110 ~SecondFactor(); | |
111 // For test only. | |
112 bool operator==(const SecondFactor &b) const; | |
113 | |
114 // Globally identifies the specific second-factor challenge. | |
115 std::string token; | |
116 // Localised prompt text, eg Enter the verification code sent to your | |
117 // phone number ending in XXX. | |
118 std::string prompt_text; | |
119 // Localized text describing an alternate option, eg Get a verification | |
120 // code in a text message. | |
121 std::string alternate_text; | |
122 // Character length for the challenge field. | |
123 int field_length; | |
124 }; | |
125 | |
126 // For test only. | |
127 bool operator==(const GoogleServiceAuthError &b) const; | |
128 | |
129 // Construct a GoogleServiceAuthError from a State with no additional data. | |
130 explicit GoogleServiceAuthError(State s); | |
131 | |
132 // Construct a GoogleServiceAuthError from a network error. | |
133 // It will be created with CONNECTION_FAILED set. | |
134 static GoogleServiceAuthError FromConnectionError(int error); | |
135 | |
136 // Construct a CAPTCHA_REQUIRED error with CAPTCHA challenge data from the | |
137 // the ClientLogin endpoint. | |
138 // TODO(rogerta): once ClientLogin is no longer used, may be able to get | |
139 // rid of this function. | |
140 static GoogleServiceAuthError FromClientLoginCaptchaChallenge( | |
141 const std::string& captcha_token, | |
142 const GURL& captcha_image_url, | |
143 const GURL& captcha_unlock_url); | |
144 | |
145 // Construct a CAPTCHA_REQUIRED error with CAPTCHA challenge data from the | |
146 // ClientOAuth endpoint. | |
147 static GoogleServiceAuthError FromCaptchaChallenge( | |
148 const std::string& captcha_token, | |
149 const GURL& captcha_audio_url, | |
150 const GURL& captcha_image_url, | |
151 int image_width, | |
152 int image_height); | |
153 | |
154 // Construct a TWO_FACTOR error with second-factor challenge data. | |
155 static GoogleServiceAuthError FromSecondFactorChallenge( | |
156 const std::string& captcha_token, | |
157 const std::string& prompt_text, | |
158 const std::string& alternate_text, | |
159 int field_length); | |
160 | |
161 // Construct an INVALID_GAIA_CREDENTIALS error from a ClientOAuth response. | |
162 // |data| is the JSON response from the server explaning the error. | |
163 static GoogleServiceAuthError FromClientOAuthError(const std::string& data); | |
164 | |
165 // Provided for convenience for clients needing to reset an instance to NONE. | |
166 // (avoids err_ = GoogleServiceAuthError(GoogleServiceAuthError::NONE), due | |
167 // to explicit class and State enum relation. Note: shouldn't be inlined! | |
168 static GoogleServiceAuthError None(); | |
169 | |
170 // The error information. | |
171 State state() const; | |
172 const Captcha& captcha() const; | |
173 const SecondFactor& second_factor() const; | |
174 int network_error() const; | |
175 const std::string& token() const; | |
176 const std::string& error_message() const; | |
177 | |
178 // Returns info about this object in a dictionary. Caller takes | |
179 // ownership of returned dictionary. | |
180 base::DictionaryValue* ToValue() const; | |
181 | |
182 // Returns a message describing the error. | |
183 std::string ToString() const; | |
184 | |
185 private: | |
186 GoogleServiceAuthError(State s, int error); | |
187 | |
188 explicit GoogleServiceAuthError(const std::string& error_message); | |
189 | |
190 GoogleServiceAuthError(State s, const std::string& captcha_token, | |
191 const GURL& captcha_audio_url, | |
192 const GURL& captcha_image_url, | |
193 const GURL& captcha_unlock_url, | |
194 int image_width, | |
195 int image_height); | |
196 | |
197 GoogleServiceAuthError(State s, const std::string& captcha_token, | |
198 const std::string& prompt_text, | |
199 const std::string& alternate_text, | |
200 int field_length); | |
201 | |
202 State state_; | |
203 Captcha captcha_; | |
204 SecondFactor second_factor_; | |
205 int network_error_; | |
206 std::string error_message_; | |
207 }; | |
208 | |
209 #endif // CHROME_COMMON_NET_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_ | |
OLD | NEW |