google_service_auth_error.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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  // Construct a CAPTCHA_REQUIRED error with CAPTCHA challenge data from the
149  // ClientOAuth endpoint.
150  static GoogleServiceAuthError FromCaptchaChallenge(
151      const std::string& captcha_token,
152      const GURL& captcha_audio_url,
153      const GURL& captcha_image_url,
154      int image_width,
155      int image_height);
156
157  // Construct a TWO_FACTOR error with second-factor challenge data.
158  static GoogleServiceAuthError FromSecondFactorChallenge(
159      const std::string& captcha_token,
160      const std::string& prompt_text,
161      const std::string& alternate_text,
162      int field_length);
163
164  // Construct an INVALID_GAIA_CREDENTIALS error from a ClientOAuth response.
165  // |data| is the JSON response from the server explaning the error.
166  static GoogleServiceAuthError FromClientOAuthError(const std::string& data);
167
168  // Provided for convenience for clients needing to reset an instance to NONE.
169  // (avoids err_ = GoogleServiceAuthError(GoogleServiceAuthError::NONE), due
170  // to explicit class and State enum relation. Note: shouldn't be inlined!
171  static GoogleServiceAuthError None();
172
173  // The error information.
174  State state() const;
175  const Captcha& captcha() const;
176  const SecondFactor& second_factor() const;
177  int network_error() const;
178  const std::string& token() const;
179  const std::string& error_message() const;
180
181  // Returns info about this object in a dictionary.  Caller takes
182  // ownership of returned dictionary.
183  base::DictionaryValue* ToValue() const;
184
185  // Returns a message describing the error.
186  std::string ToString() const;
187
188 private:
189  GoogleServiceAuthError(State s, int error);
190
191  explicit GoogleServiceAuthError(const std::string& error_message);
192
193  GoogleServiceAuthError(State s, const std::string& captcha_token,
194                         const GURL& captcha_audio_url,
195                         const GURL& captcha_image_url,
196                         const GURL& captcha_unlock_url,
197                         int image_width,
198                         int image_height);
199
200  GoogleServiceAuthError(State s, const std::string& captcha_token,
201                         const std::string& prompt_text,
202                         const std::string& alternate_text,
203                         int field_length);
204
205  State state_;
206  Captcha captcha_;
207  SecondFactor second_factor_;
208  int network_error_;
209  std::string error_message_;
210};
211
212#endif  // GOOGLE_APIS_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_
213