supervised_user_registration_utility.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_REGISTRATION_UTILITY_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_REGISTRATION_UTILITY_H_ 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <map> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string> 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/basictypes.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/gtest_prod_util.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/weak_ptr.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/prefs/pref_change_registrar.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string16.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/values.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service_observer.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_users.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class GoogleServiceAuthError; 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PrefService; 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class Profile; 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserRefreshTokenFetcher; 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserRegistrationUtilityTest; 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserSharedSettingsService; 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace browser_sync { 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class DeviceInfo; 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Structure to store registration information. 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct SupervisedUserRegistrationInfo { 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserRegistrationInfo(const base::string16& name, int avatar_index); 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ~SupervisedUserRegistrationInfo(); 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int avatar_index; 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::string16 name; 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string master_key; 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string password_signature_key; 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string password_encryption_key; 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::DictionaryValue password_data; 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Holds the state necessary for registering a new supervised user with the 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// management server and associating it with its custodian. Each instance 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// of this class handles registering a single supervised user and should not 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// be used afterwards. 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserRegistrationUtility { 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Callback for Register() below. If registration is successful, |token| will 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // contain an OAuth2 refresh token for the newly registered supervised user, 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // otherwise |token| will be empty and |error| will contain the authentication 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // error for the custodian. 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typedef base::Callback<void(const GoogleServiceAuthError& /* error */, 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& /* token */)> 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RegistrationCallback; 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~SupervisedUserRegistrationUtility() {} 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Creates SupervisedUserRegistrationUtility for a given |profile|. 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static scoped_ptr<SupervisedUserRegistrationUtility> Create(Profile* profile); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static std::string GenerateNewSupervisedUserId(); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Registers a new supervised user with the server. |supervised_user_id| is a 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // new unique ID for the new supervised user. If its value is the same as that 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // of one of the existing supervised users, then the same user will be created 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // on this machine (and if he has no avatar in sync, his avatar will be 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // updated). |info| contains necessary information like the display name of 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the user and his avatar. |callback| is called with the result of the 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // registration. We use the info here and not the profile, because on Chrome 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // OS the profile of the supervised user does not yet exist. 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void Register(const std::string& supervised_user_id, 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const SupervisedUserRegistrationInfo& info, 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const RegistrationCallback& callback) = 0; 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserRegistrationUtility() {} 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend class ScopedTestingSupervisedUserRegistrationUtility; 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend class SupervisedUserRegistrationUtilityTest; 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Creates implementation with explicit dependencies, can be used for testing. 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static SupervisedUserRegistrationUtility* CreateImpl( 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrefService* prefs, 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<SupervisedUserRefreshTokenFetcher> token_fetcher, 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSyncService* service, 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSharedSettingsService* shared_settings_service); 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Set the instance of SupervisedUserRegistrationUtility that will be returned 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // by next Create() call. Takes ownership of the |utility|. 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static void SetUtilityForTests(SupervisedUserRegistrationUtility* utility); 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Class that sets the instance of SupervisedUserRegistrationUtility that will 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// be returned by next Create() call, and correctly destroys it if Create() was 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// not called. 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ScopedTestingSupervisedUserRegistrationUtility { 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Delegates ownership of the |instance| to SupervisedUserRegistrationUtility. 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ScopedTestingSupervisedUserRegistrationUtility( 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserRegistrationUtility* instance); 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ~ScopedTestingSupervisedUserRegistrationUtility(); 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_REGISTRATION_UTILITY_H_ 111