10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef GOOGLE_APIS_GAIA_IDENTITY_PROVIDER_H_
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define GOOGLE_APIS_GAIA_IDENTITY_PROVIDER_H_
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <string>
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/compiler_specific.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/macros.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/observer_list.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gaia/oauth2_token_service.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Helper class that provides access to information about logged-in GAIA
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// accounts. Each instance of this class references an entity who may be logged
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// in to zero, one or multiple GAIA accounts. The class provides access to the
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// OAuth tokens for all logged-in accounts and indicates which of these is
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// currently active.
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// The main purpose of this abstraction layer is to isolate consumers of GAIA
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// information from the different sources and various token service
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// implementations. Whenever possible, consumers of GAIA information should be
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// provided with an instance of this class instead of accessing other GAIA APIs
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// directly.
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass IdentityProvider : public OAuth2TokenService::Observer {
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  class Observer {
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch   public:
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Called when a GAIA account logs in and becomes the active account. All
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // account information is available when this method is called and all
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // |IdentityProvider| methods will return valid data.
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual void OnActiveAccountLogin() {}
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Called when the active GAIA account logs out. The account information may
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // have been cleared already when this method is called. The
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // |IdentityProvider| methods may return inconsistent or outdated
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // information if called from within OnLogout().
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual void OnActiveAccountLogout() {}
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch   protected:
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual ~Observer();
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  };
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~IdentityProvider();
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Adds and removes observers that will be notified of changes to the refresh
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // token availability for the active account.
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void AddActiveAccountRefreshTokenObserver(
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      OAuth2TokenService::Observer* observer);
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void RemoveActiveAccountRefreshTokenObserver(
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      OAuth2TokenService::Observer* observer);
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Gets the active account's user name.
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual std::string GetActiveUsername() = 0;
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Gets the active account's account ID.
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual std::string GetActiveAccountId() = 0;
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Gets the token service vending OAuth tokens for all logged-in accounts.
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual OAuth2TokenService* GetTokenService() = 0;
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Requests login to a GAIA account. Implementations can show a login UI, log
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // in automatically if sufficient credentials are available or may ignore the
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // request. Returns true if the login request was processed and false if it
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // was ignored.
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual bool RequestLogin() = 0;
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void AddObserver(Observer* observer);
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void RemoveObserver(Observer* observer);
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // OAuth2TokenService::Observer:
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE;
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE;
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void OnRefreshTokensLoaded() OVERRIDE;
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  IdentityProvider();
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Fires an OnActiveAccountLogin notification.
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void FireOnActiveAccountLogin();
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Fires an OnActiveAccountLogout notification.
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void FireOnActiveAccountLogout();
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ObserverList<Observer, true> observers_;
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ObserverList<OAuth2TokenService::Observer, true> token_service_observers_;
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int token_service_observer_count_;
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(IdentityProvider);
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // GOOGLE_APIS_GAIA_IDENTITY_PROVIDER_H_
94