google_service_auth_error.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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
30class DictionaryValue;
31
32class 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