| // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // A GoogleServiceAuthError is immutable, plain old data representing an |
| // error from an attempt to authenticate with a Google service. |
| // It could be from Google Accounts itself, or any service using Google |
| // Accounts (e.g expired credentials). It may contain additional data such as |
| // captcha challenges. |
| |
| // A GoogleServiceAuthError without additional data is just a State, defined |
| // below. A case could be made to have this relation implicit, to allow raising |
| // error events concisely by doing OnAuthError(GoogleServiceAuthError::NONE), |
| // for example. But the truth is this class is ever so slightly more than a |
| // transparent wrapper around 'State' due to additional Captcha data |
| // (e.g consider operator=), and this would violate the style guide. Thus, |
| // you must explicitly use the constructor when all you have is a State. |
| // The good news is the implementation nests the enum inside a class, so you |
| // may forward declare and typedef GoogleServiceAuthError to something shorter |
| // in the comfort of your own translation unit. |
| |
| #ifndef CHROME_BROWSER_GOOGLE_SERVICE_AUTH_ERROR_H_ |
| #define CHROME_BROWSER_GOOGLE_SERVICE_AUTH_ERROR_H_ |
| |
| #include <string> |
| #include "googleurl/src/gurl.h" |
| |
| class GoogleServiceAuthError { |
| public: |
| enum State { |
| // The user is authenticated. |
| NONE = 0, |
| |
| // The credentials supplied to GAIA were either invalid, or the locally |
| // cached credentials have expired. |
| INVALID_GAIA_CREDENTIALS, |
| |
| // The GAIA user is not authorized to use the service. |
| USER_NOT_SIGNED_UP, |
| |
| // Could not connect to server to verify credentials. This could be in |
| // response to either failure to connect to GAIA or failure to connect to |
| // the service needing GAIA tokens during authentication. |
| CONNECTION_FAILED, |
| |
| // The user needs to satisfy a CAPTCHA challenge to unlock their account. |
| // If no other information is available, this can be resolved by visiting |
| // https://www.google.com/accounts/DisplayUnlockCaptcha. Otherwise, |
| // captcha() will provide details about the associated challenge. |
| CAPTCHA_REQUIRED, |
| }; |
| |
| // Additional data for CAPTCHA_REQUIRED errors. |
| struct Captcha { |
| Captcha() {} |
| Captcha(const std::string& t, const GURL& img, const GURL& unlock) |
| : token(t), image_url(img), unlock_url(unlock) {} |
| std::string token; // Globally identifies the specific CAPTCHA challenge. |
| GURL image_url; // The CAPTCHA image to show the user. |
| GURL unlock_url; // Pretty unlock page containing above captcha. |
| }; |
| |
| // Construct a GoogleServiceAuthError from a State with no additional data. |
| explicit GoogleServiceAuthError(State s) : state_(s) {} |
| |
| // Construct a CAPTCHA_REQUIRED error with CAPTCHA challenge data. |
| static GoogleServiceAuthError FromCaptchaChallenge( |
| const std::string& captcha_token, |
| const GURL& captcha_image_url, |
| const GURL& captcha_unlock_url) { |
| return GoogleServiceAuthError(CAPTCHA_REQUIRED, captcha_token, |
| captcha_image_url, captcha_unlock_url); |
| } |
| |
| // Provided for convenience for clients needing to reset an instance to NONE. |
| // (avoids err_ = GoogleServiceAuthError(GoogleServiceAuthError::NONE), due |
| // to explicit class and State enum relation. Note: shouldn't be inlined! |
| static const GoogleServiceAuthError None() { |
| static const GoogleServiceAuthError e(NONE); |
| return e; |
| } |
| |
| // The error information. |
| const State& state() const { return state_; } |
| const Captcha& captcha() const { return captcha_; } |
| |
| private: |
| GoogleServiceAuthError(State s, const std::string& captcha_token, |
| const GURL& captcha_image_url, |
| const GURL& captcha_unlock_url) |
| : state_(s), |
| captcha_(captcha_token, captcha_image_url, captcha_unlock_url) { |
| } |
| |
| State state_; |
| Captcha captcha_; |
| }; |
| |
| #endif // CHROME_BROWSER_GOOGLE_SERVICE_AUTH_ERROR_H_ |