1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifndef CHROME_BROWSER_MANAGED_MODE_MANAGED_USER_REGISTRATION_UTILITY_H_ 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define CHROME_BROWSER_MANAGED_MODE_MANAGED_USER_REGISTRATION_UTILITY_H_ 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <map> 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <string> 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/callback.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/gtest_prod_util.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/weak_ptr.h" 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/prefs/pref_change_registrar.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/string16.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_sync_service.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_sync_service_observer.h" 182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/managed_mode/managed_users.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class GoogleServiceAuthError; 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ManagedUserRefreshTokenFetcher; 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ManagedUserRegistrationUtilityTest; 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PrefService; 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace browser_sync { 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class DeviceInfo; 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Structure to store registration information. 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)struct ManagedUserRegistrationInfo { 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) explicit ManagedUserRegistrationInfo(const string16& name); 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) string16 name; 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string master_key; 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Holds the state necessary for registering a new managed user with the 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// management server and associating it with its custodian. Each instance 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// of this class handles registering a single managed user and should not 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// be used afterwards. 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ManagedUserRegistrationUtility 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : public ManagedUserSyncServiceObserver { 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Callback for Register() below. If registration is successful, |token| will 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // contain an OAuth2 refresh token for the newly registered managed user, 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // otherwise |token| will be empty and |error| will contain the authentication 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // error for the custodian. 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) typedef base::Callback<void(const GoogleServiceAuthError& /* error */, 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& /* token */)> 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistrationCallback; 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~ManagedUserRegistrationUtility(); 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static scoped_ptr<ManagedUserRegistrationUtility> Create(Profile* profile); 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch static std::string GenerateNewManagedUserId(); 582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Registers a new managed user with the server. |managed_user_id| is a new 602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // unique ID for the new managed user. If its value is the same as that of 612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // of one of the existing managed users, then the same user will be created 622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // on this machine. |info| contains necessary information like the display 632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // name of the the user. |callback| is called with the result of the 642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // registration. We use the info here and not the profile, because on 652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Chrome OS the profile of the managed user does not yet exist. 662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void Register(const std::string& managed_user_id, 672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const ManagedUserRegistrationInfo& info, 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const RegistrationCallback& callback); 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // ManagedUserSyncServiceObserver: 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnManagedUserAcknowledged(const std::string& managed_user_id) 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE; 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnManagedUsersSyncingStopped() OVERRIDE; 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ManagedUserRegistrationUtilityTest, Register); 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ManagedUserRegistrationUtilityTest, 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegisterBeforeInitialSync); 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ManagedUserRegistrationUtilityTest, 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SyncServiceShutdownBeforeRegFinish); 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ManagedUserRegistrationUtilityTest, 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StopSyncingBeforeRegFinish); 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Use the |Create(...)| method to get instances of this class. 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedUserRegistrationUtility( 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrefService* prefs, 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<ManagedUserRefreshTokenFetcher> token_fetcher, 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedUserSyncService* service); 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fetches the managed user token when we have the device name. 90bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch void FetchToken(const std::string& client_name); 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Called when we have received a token for the managed user. 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void OnReceivedToken(const GoogleServiceAuthError& error, 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& token); 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Dispatches the callback and cleans up if all the conditions have been met. 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CompleteRegistrationIfReady(); 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Aborts any registration currently in progress. If |run_callback| is true, 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // calls the callback specified in Register() with the given |error|. 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void AbortPendingRegistration(bool run_callback, 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GoogleServiceAuthError& error); 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If |run_callback| is true, dispatches the callback with the saved token 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // (which may be empty) and the given |error|. In any case, resets internal 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // variables to be ready for the next registration. 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CompleteRegistration(bool run_callback, 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GoogleServiceAuthError& error); 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Cancels any registration currently in progress, without calling the 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // callback or reporting an error. 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CancelPendingRegistration(); 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WeakPtrFactory<ManagedUserRegistrationUtility> weak_ptr_factory_; 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrefService* prefs_; 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<ManagedUserRefreshTokenFetcher> token_fetcher_; 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // A |BrowserContextKeyedService| owned by the custodian profile. 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ManagedUserSyncService* managed_user_sync_service_; 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string pending_managed_user_id_; 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string pending_managed_user_token_; 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool pending_managed_user_acknowledged_; 1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool is_existing_managed_user_; 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistrationCallback callback_; 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ManagedUserRegistrationUtility); 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif // CHROME_BROWSER_MANAGED_MODE_MANAGED_USER_REGISTRATION_UTILITY_H_ 131