• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 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 #pragma once
25 
26 #include <string>
27 
28 #include "googleurl/src/gurl.h"
29 
30 class DictionaryValue;
31 
32 class GoogleServiceAuthError {
33  public:
34   //
35   // These enumerations are referenced by integer value in HTML login code.
36   // Do not change the numeric values.
37   //
38   enum State {
39     // The user is authenticated.
40     NONE = 0,
41 
42     // The credentials supplied to GAIA were either invalid, or the locally
43     // cached credentials have expired.
44     INVALID_GAIA_CREDENTIALS = 1,
45 
46     // The GAIA user is not authorized to use the service.
47     USER_NOT_SIGNED_UP = 2,
48 
49     // Could not connect to server to verify credentials. This could be in
50     // response to either failure to connect to GAIA or failure to connect to
51     // the service needing GAIA tokens during authentication.
52     CONNECTION_FAILED = 3,
53 
54     // The user needs to satisfy a CAPTCHA challenge to unlock their account.
55     // If no other information is available, this can be resolved by visiting
56     // https://www.google.com/accounts/DisplayUnlockCaptcha. Otherwise,
57     // captcha() will provide details about the associated challenge.
58     CAPTCHA_REQUIRED = 4,
59 
60     // The user account has been deleted.
61     ACCOUNT_DELETED = 5,
62 
63     // The user account has been disabled.
64     ACCOUNT_DISABLED = 6,
65 
66     // The service is not available; try again later.
67     SERVICE_UNAVAILABLE = 7,
68 
69     // The password is valid but we need two factor to get a token.
70     TWO_FACTOR = 8,
71 
72     // The requestor of the authentication step cancelled the request
73     // prior to completion.
74     REQUEST_CANCELED = 9,
75 
76     // The user has provided a HOSTED account, when this service requires
77     // a GOOGLE account.
78     HOSTED_NOT_ALLOWED = 10,
79   };
80 
81   // Additional data for CAPTCHA_REQUIRED errors.
82   struct Captcha {
83     Captcha(const std::string& t, const GURL& img, const GURL& unlock);
84     std::string token;  // Globally identifies the specific CAPTCHA challenge.
85     GURL image_url;     // The CAPTCHA image to show the user.
86     GURL unlock_url;    // Pretty unlock page containing above captcha.
87   };
88 
89   // For test only.
90   bool operator==(const GoogleServiceAuthError &b) const;
91 
92   // Construct a GoogleServiceAuthError from a State with no additional data.
93   explicit GoogleServiceAuthError(State s);
94 
95   // Construct a GoogleServiceAuthError from a network error.
96   // It will be created with CONNECTION_FAILED set.
97   static GoogleServiceAuthError FromConnectionError(int error);
98 
99   // Construct a CAPTCHA_REQUIRED error with CAPTCHA challenge data.
100   static GoogleServiceAuthError FromCaptchaChallenge(
101       const std::string& captcha_token,
102       const GURL& captcha_image_url,
103       const GURL& captcha_unlock_url);
104 
105   // Provided for convenience for clients needing to reset an instance to NONE.
106   // (avoids err_ = GoogleServiceAuthError(GoogleServiceAuthError::NONE), due
107   // to explicit class and State enum relation. Note: shouldn't be inlined!
108   static GoogleServiceAuthError None();
109 
110   // The error information.
111   const State& state() const;
112   const Captcha& captcha() const;
113   int network_error() const;
114 
115   // Returns info about this object in a dictionary.  Caller takes
116   // ownership of returned dictionary.
117   DictionaryValue* ToValue() const;
118 
119  private:
120   GoogleServiceAuthError(State s, int error);
121 
122   GoogleServiceAuthError(State s, const std::string& captcha_token,
123                          const GURL& captcha_image_url,
124                          const GURL& captcha_unlock_url);
125 
126   State state_;
127   Captcha captcha_;
128   int network_error_;
129 };
130 
131 #endif  // CHROME_COMMON_NET_GAIA_GOOGLE_SERVICE_AUTH_ERROR_H_
132