Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2577)

Unified Diff: chrome/browser/policy/device_token_fetcher.h

Issue 6520008: Device policy infrastructure (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix nits Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/device_token_fetcher.h
diff --git a/chrome/browser/policy/device_token_fetcher.h b/chrome/browser/policy/device_token_fetcher.h
index ae22f3d500a54efe1b92c82ec0d98a3f9a6bf7ab..0501433ed5885b9eea26a1d639f649dec239d88b 100644
--- a/chrome/browser/policy/device_token_fetcher.h
+++ b/chrome/browser/policy/device_token_fetcher.h
@@ -7,20 +7,17 @@
#pragma once
#include <string>
-#include <vector>
-#include "base/file_path.h"
#include "base/observer_list.h"
-#include "base/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
+#include "base/scoped_ptr.h"
+#include "base/task.h"
#include "chrome/browser/policy/device_management_backend.h"
-#include "chrome/common/notification_observer.h"
-#include "chrome/common/notification_registrar.h"
-
-class Profile;
namespace policy {
+class CloudPolicyCache;
+class DeviceManagementService;
+
namespace em = enterprise_management;
// Fetches the device token that can be used for policy requests with the device
@@ -29,170 +26,112 @@ namespace em = enterprise_management;
// fetcher is shared as a singleton by all users of the device management token
// to ensure they all get the same token.
class DeviceTokenFetcher
- : public NotificationObserver,
- public DeviceManagementBackend::DeviceRegisterResponseDelegate,
- public base::RefCountedThreadSafe<DeviceTokenFetcher> {
+ : public DeviceManagementBackend::DeviceRegisterResponseDelegate {
public:
class Observer {
public:
- virtual void OnTokenSuccess() = 0;
- virtual void OnTokenError() = 0;
- virtual void OnNotManaged() = 0;
virtual ~Observer() {}
+ virtual void OnDeviceTokenAvailable() = 0;
};
- class ObserverRegistrar {
- public:
- ObserverRegistrar();
- ~ObserverRegistrar();
-
- void Init(DeviceTokenFetcher* token_fetcher);
- void AddObserver(DeviceTokenFetcher::Observer* observer);
- void RemoveAll();
- private:
- DeviceTokenFetcher* token_fetcher_;
- std::vector<DeviceTokenFetcher::Observer*> observers_;
- };
-
- // Requests to the device management server are sent through |backend|. It
- // obtains the authentication token from |token_service|. The fetcher stores
- // the device token to |token_path| once it's retrieved from the server.
- DeviceTokenFetcher(DeviceManagementBackend* backend,
- Profile* profile,
- const FilePath& token_path);
+ // |service| is used to talk to the device management service and |cache| is
+ // used to persist whether the device is unmanaged.
+ DeviceTokenFetcher(DeviceManagementService* service,
+ CloudPolicyCache* cache);
+ // Version for tests that allows to set timing paramters.
+ DeviceTokenFetcher(DeviceManagementService* service,
+ CloudPolicyCache* cache,
+ int64 token_fetch_error_delay_ms,
+ int64 unmanaged_device_refresh_rate_ms);
virtual ~DeviceTokenFetcher();
- // NotificationObserver method overrides:
- virtual void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details);
+ // Starts fetching a token.
+ // Declared virtual so it can be overridden by mocks.
+ virtual void FetchToken(const std::string& auth_token,
+ const std::string& device_id);
+
+ // Returns the device management token or the empty string if not available.
+ // Declared virtual so it can be overridden by mocks.
+ virtual const std::string& GetDeviceToken();
+
+ void AddObserver(Observer* observer);
+ void RemoveObserver(Observer* observer);
// DeviceManagementBackend::DeviceRegisterResponseDelegate method overrides:
virtual void HandleRegisterResponse(
const em::DeviceRegisterResponse& response);
virtual void OnError(DeviceManagementBackend::ErrorCode code);
- // Re-initializes this DeviceTokenFetcher
- void Restart();
-
- // Called by subscribers of the device management token to indicate that they
- // will need the token in the future. Must be called on the UI thread.
- void StartFetching();
-
- // Returns true if there is a pending token request to the device management
- // server.
- bool IsTokenPending();
-
- // Returns the device management token for this device, blocking until
- // outstanding requests to the device management server are satisfied. In the
- // case that the token could not be fetched, an empty string is returned.
- std::string GetDeviceToken();
-
- // Returns the device ID for this device. If no such ID has been set yet, a
- // new ID is generated and returned.
- std::string GetDeviceID();
-
- // True if the fetcher has a valid AuthToken for the device management server.
- bool HasAuthToken() const { return !auth_token_.empty(); }
-
- // True if the device token has been fetched and is valid.
- bool IsTokenValid() const;
-
- protected:
- // Returns the email address of the currently logged-in user.
- virtual std::string GetCurrentUser();
-
- // Used to identify GOOGLE_SIGNIN_SUCCESSFUL notifications from the owning
- // profile, and to query for the current username.
- Profile* profile_; // weak
-
private:
friend class DeviceTokenFetcherTest;
// The different states that the fetcher can be in during the process of
- // getting the device token.
+ // getting the device token. |state_| is initialized to INACTIVE, depending
+ // on the result of a token fetching attempt can transition to either of
+ // TOKEN_AVAILABLE, UNMANAGED, or ERROR. The first attempt must be triggered
+ // externally. When |state_| is UNMANAGED, a new fetching attempt is
+ // performed every |unmanaged_device_refresh_rate_ms_|; when it's ERROR,
+ // a new attempt is done after |effective_token_fetch_error_delay_ms_|.
enum FetcherState {
- kStateNotStarted,
- kStateLoadDeviceTokenFromDisk,
- kStateReadyToRequestDeviceTokenFromServer,
- kStateRequestingDeviceTokenFromServer,
- kStateHasDeviceToken,
- kStateFailure,
- kStateNotManaged,
+ // Fetcher inactive.
+ STATE_INACTIVE,
+ // Token available.
+ STATE_TOKEN_AVAILABLE,
+ // Device unmanaged.
+ STATE_UNMANAGED,
+ // Error, retry later.
+ STATE_ERROR,
};
- // Moves the fetcher into a new state. If the fetcher has the device token
- // or is moving into the failure state, callers waiting on WaitForToken
- // are unblocked.
- void SetState(FetcherState state);
-
- // Returns the full path to the file that persists the device manager token.
- void GetDeviceTokenPath(FilePath* token_path) const;
-
- // Tries to load the device token from disk. Must be called on the FILE
- // thread.
- void AttemptTokenLoadFromDisk();
-
- // Called if it's not possible to load the device token from disk. Sets the
- // fetcher in a state that's ready to register the device with the device
- // management server and receive the device token in return. If the AuthToken
- // for the device management server is available, initiate the server
- // request.
- void MakeReadyToRequestDeviceToken();
-
- // Issues a registration request to the server if both the fetcher is in the
- // ready-to-request state and the device management server AuthToken is
- // available.
- void SendServerRequestIfPossible();
+ // Common initialization helper.
+ void Initialize(DeviceManagementService* service,
+ CloudPolicyCache* cache,
+ int64 token_fetch_error_delay_ms,
+ int64 unmanaged_device_refresh_rate_ms);
- void AddObserver(Observer* obs) {
- observer_list_.AddObserver(obs);
- }
+ // Moves the fetcher into a new state.
+ void SetState(FetcherState state);
- void RemoveObserver(Observer* obs) {
- observer_list_.RemoveObserver(obs);
- }
+ // Resets |backend_|, then uses |auth_token_| and |device_id_| to perform
+ // an actual token fetch.
+ void FetchTokenInternal();
- void NotifyTokenSuccess() {
- FOR_EACH_OBSERVER(Observer, observer_list_, OnTokenSuccess());
- }
+ // Called back from the |retry_task_|.
+ void ExecuteRetryTask();
- void NotifyTokenError() {
- FOR_EACH_OBSERVER(Observer, observer_list_, OnTokenError());
- }
+ // Cancels the |retry_task_|.
+ void CancelRetryTask();
- void NotifyNotManaged() {
- FOR_EACH_OBSERVER(Observer, observer_list_, OnNotManaged());
- }
+ // Service and backend. A new backend is created whenever the fetcher gets
+ // reset.
+ DeviceManagementService* service_; // weak
+ scoped_ptr<DeviceManagementBackend> backend_;
- // Saves the device management token to disk once it has been retrieved from
- // the server. Must be called on the FILE thread.
- static void WriteDeviceTokenToDisk(const FilePath& path,
- const std::string& token,
- const std::string& device_id);
+ // Reference to the cache. Used to persist and read unmanaged state.
+ CloudPolicyCache* cache_;
- // Generates a new device ID used to register the device with the device
- // management server and generate the device token.
- static std::string GenerateNewDeviceID();
+ // Refresh parameters.
+ int64 token_fetch_error_delay_ms_;
+ int64 effective_token_fetch_error_delay_ms_;
+ int64 unmanaged_device_refresh_rate_ms_;
- ObserverList<Observer, true> observer_list_;
- FilePath token_path_;
- DeviceManagementBackend* backend_; // weak
+ // State the fetcher is currently in.
FetcherState state_;
+
+ // Current device token.
std::string device_token_;
- std::string device_id_;
- // Contains the AuthToken for the device management server. Empty if the
- // AuthToken hasn't been issued yet or that was an error getting the
- // AuthToken.
+ // Contains the AuthToken for the device management server.
std::string auth_token_;
+ // Device identifier to send to the server.
+ std::string device_id_;
+
+ // Task that has been scheduled to retry fetching a token.
+ CancelableTask* retry_task_;
- // An event that is signaled only once the device token has been fetched
- // or it has been determined that there was an error during fetching.
- base::WaitableEvent device_token_load_complete_event_;
+ ScopedRunnableMethodFactory<DeviceTokenFetcher> method_factory_;
- // Registers the fetcher for notification of successful Gaia logins.
- NotificationRegistrar registrar_;
+ ObserverList<Observer, true> observer_list_;
};
} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698