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