15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_AUTH_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_AUTH_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/cloud_print_url_fetcher.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_oauth_client.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cloud_print {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintAuth is a class to handle login, token refresh, and other
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// authentication tasks for Cloud Print.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintAuth will create new robot account for this proxy if needed.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintAuth will obtain new OAuth token.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintAuth will schedule periodic OAuth token refresh
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is running in the same thread as CloudPrintProxyBackend::Core.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintAuth
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<CloudPrintAuth>,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public CloudPrintURLFetcherDelegate,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public gaia::GaiaOAuthClient::Delegate {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Client {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnAuthenticationComplete(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& access_token,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& robot_oauth_refresh_token,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& robot_email,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& user_email) = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnInvalidCredentials() = 0;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     virtual ~Client() {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintAuth(Client* client,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const GURL& cloud_print_server_url,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const gaia::OAuthClientInfo& oauth_client_info,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const std::string& proxy_id);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The Authenticate* methods are the various entry points from
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CloudPrintProxyBackend::Core. It calls us on a dedicated thread to
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // actually perform synchronous (and potentially blocking) operations.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AuthenticateWithToken(const std::string& cloud_print_token);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AuthenticateWithRobotToken(const std::string& robot_oauth_refresh_token,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const std::string& robot_email);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AuthenticateWithRobotAuthCode(const std::string& robot_oauth_auth_code,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& robot_email);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RefreshAccessToken();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gaia::GaiaOAuthClient::Delegate implementation.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnGetTokensResponse(const std::string& refresh_token,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& access_token,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int expires_in_seconds) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnRefreshTokenResponse(const std::string& access_token,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int expires_in_seconds) OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnOAuthError() OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnNetworkError(int response_code) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CloudPrintURLFetcher::Delegate implementation.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction HandleJSONData(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLFetcher* source,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DictionaryValue* json_data,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool succeeded) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction OnRequestAuthError() OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetAuthHeader() OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<CloudPrintAuth>;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CloudPrintAuth();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Client* client_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gaia::OAuthClientInfo oauth_client_info_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gaia::GaiaOAuthClient> oauth_client_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The CloudPrintURLFetcher instance for the current request.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CloudPrintURLFetcher> request_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL cloud_print_server_url_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proxy id, need to send to the cloud print server to find and update
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // necessary printers during the migration process.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& proxy_id_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The OAuth2 refresh token for the robot.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string refresh_token_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The email address of the user. This is only used during initial
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // authentication with an LSID. This is only used for storing in prefs for
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // display purposes.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string user_email_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The email address of the robot account.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string robot_email_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // client login token used to authenticate request to cloud print server to
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // get the robot account.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string client_login_token_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CloudPrintAuth);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cloud_print
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_AUTH_H_
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110