• 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 #ifndef CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_AUTH_H_
6 #define CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_AUTH_H_
7 
8 #include <string>
9 
10 #include "base/values.h"
11 #include "chrome/service/cloud_print/cloud_print_url_fetcher.h"
12 #include "google_apis/gaia/gaia_oauth_client.h"
13 #include "url/gurl.h"
14 
15 namespace cloud_print {
16 
17 // CloudPrintAuth is a class to handle login, token refresh, and other
18 // authentication tasks for Cloud Print.
19 // CloudPrintAuth will create new robot account for this proxy if needed.
20 // CloudPrintAuth will obtain new OAuth token.
21 // CloudPrintAuth will schedule periodic OAuth token refresh
22 // It is running in the same thread as CloudPrintProxyBackend::Core.
23 class CloudPrintAuth
24     : public base::RefCountedThreadSafe<CloudPrintAuth>,
25       public CloudPrintURLFetcherDelegate,
26       public gaia::GaiaOAuthClient::Delegate {
27  public:
28   class Client {
29    public:
30     virtual void OnAuthenticationComplete(
31         const std::string& access_token,
32         const std::string& robot_oauth_refresh_token,
33         const std::string& robot_email,
34         const std::string& user_email) = 0;
35     virtual void OnInvalidCredentials() = 0;
36    protected:
~Client()37      virtual ~Client() {}
38   };
39 
40   CloudPrintAuth(Client* client,
41                  const GURL& cloud_print_server_url,
42                  const gaia::OAuthClientInfo& oauth_client_info,
43                  const std::string& proxy_id);
44 
45   // Note:
46   //
47   // The Authenticate* methods are the various entry points from
48   // CloudPrintProxyBackend::Core. It calls us on a dedicated thread to
49   // actually perform synchronous (and potentially blocking) operations.
50   void AuthenticateWithToken(const std::string& cloud_print_token);
51   void AuthenticateWithRobotToken(const std::string& robot_oauth_refresh_token,
52                                   const std::string& robot_email);
53   void AuthenticateWithRobotAuthCode(const std::string& robot_oauth_auth_code,
54                                      const std::string& robot_email);
55 
56   void RefreshAccessToken();
57 
58   // gaia::GaiaOAuthClient::Delegate implementation.
59   virtual void OnGetTokensResponse(const std::string& refresh_token,
60                                    const std::string& access_token,
61                                    int expires_in_seconds) OVERRIDE;
62   virtual void OnRefreshTokenResponse(const std::string& access_token,
63                                       int expires_in_seconds) OVERRIDE;
64   virtual void OnOAuthError() OVERRIDE;
65   virtual void OnNetworkError(int response_code) OVERRIDE;
66 
67   // CloudPrintURLFetcher::Delegate implementation.
68   virtual CloudPrintURLFetcher::ResponseAction HandleJSONData(
69       const net::URLFetcher* source,
70       const GURL& url,
71       base::DictionaryValue* json_data,
72       bool succeeded) OVERRIDE;
73   virtual CloudPrintURLFetcher::ResponseAction OnRequestAuthError() OVERRIDE;
74   virtual std::string GetAuthHeader() OVERRIDE;
75 
76  private:
77   friend class base::RefCountedThreadSafe<CloudPrintAuth>;
78   virtual ~CloudPrintAuth();
79 
80   Client* client_;
81   gaia::OAuthClientInfo oauth_client_info_;
82   scoped_ptr<gaia::GaiaOAuthClient> oauth_client_;
83 
84   // The CloudPrintURLFetcher instance for the current request.
85   scoped_refptr<CloudPrintURLFetcher> request_;
86 
87   GURL cloud_print_server_url_;
88   // Proxy id, need to send to the cloud print server to find and update
89   // necessary printers during the migration process.
90   const std::string& proxy_id_;
91   // The OAuth2 refresh token for the robot.
92   std::string refresh_token_;
93   // The email address of the user. This is only used during initial
94   // authentication with an LSID. This is only used for storing in prefs for
95   // display purposes.
96   std::string user_email_;
97   // The email address of the robot account.
98   std::string robot_email_;
99   // client login token used to authenticate request to cloud print server to
100   // get the robot account.
101   std::string client_login_token_;
102 
103   DISALLOW_COPY_AND_ASSIGN(CloudPrintAuth);
104 };
105 
106 }  // namespace cloud_print
107 
108 #endif  // CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_AUTH_H_
109 
110