- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / managed / locally_managed_user_creation_controller.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_MANAGED_LOCALLY_MANAGED_USER_CREATION_CONTROLLER_H_
6 #define CHROME_BROWSER_CHROMEOS_LOGIN_MANAGED_LOCALLY_MANAGED_USER_CREATION_CONTROLLER_H_
7
8 #include <string>
9
10 #include "base/files/file_path.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/strings/string16.h"
14 #include "base/timer/timer.h"
15 #include "chrome/browser/chromeos/login/managed/managed_user_authenticator.h"
16 #include "chrome/browser/managed_mode/managed_user_registration_utility.h"
17
18 class Profile;
19
20 namespace chromeos {
21
22 // LocallyManagedUserCreationController is used to locally managed user
23 // creation.
24 // LMU Creation process:
25 // 0. Manager is logged in
26 // 1. Generate ID for new LMU
27 // 2. Start "transaction" in Local State.
28 // 3. Create local cryptohome (errors could arise)
29 // 4. Create user in cloud (errors could arise)
30 // 5. Store cloud token in cryptohome (actually, error could arise).
31 // 6. Mark "transaction" as completed.
32 // 7. End manager session.
33
34 class LocallyManagedUserCreationController
35     : public ManagedUserAuthenticator::AuthStatusConsumer {
36  public:
37   // This constant is used to indicate that user does not have one of default
38   // avatars: either he has no chromeos avatar at all, or has an external
39   // image as an avatar.
40   static const int kDummyAvatarIndex;
41
42   enum ErrorCode {
43     NO_ERROR,
44     CRYPTOHOME_NO_MOUNT,
45     CRYPTOHOME_FAILED_MOUNT,
46     CRYPTOHOME_FAILED_TPM,
47     CLOUD_SERVER_ERROR,
48     TOKEN_WRITE_FAILED,
49   };
50
51   class StatusConsumer {
52    public:
53     virtual ~StatusConsumer();
54
55     virtual void OnCreationError(ErrorCode code) = 0;
56     virtual void OnLongCreationWarning() = 0;
57     virtual void OnCreationTimeout() = 0;
58     virtual void OnCreationSuccess() = 0;
59   };
60
61   // All UI initialization is deferred till Init() call.
62   // |Consumer| is not owned by controller, and it is expected that it wouldn't
63   // be deleted before LocallyManagedUserCreationController.
64   LocallyManagedUserCreationController(StatusConsumer* consumer,
65                                        const std::string& manager_id);
66   virtual ~LocallyManagedUserCreationController();
67
68   // Returns the current locally managed user controller if it has been created.
69   static LocallyManagedUserCreationController* current_controller() {
70     return current_controller_;
71   }
72
73   // Set up controller for creating new supervised user with |display_name|,
74   // |password| and avatar indexed by |avatar_index|. StartCreation() have to
75   // be called to actually start creating user.
76   void SetUpCreation(const string16& display_name,
77                      const std::string& password,
78                      int avatar_index);
79
80   // Configures and initiates importing existing supervised user to this device.
81   // Existing user is identified by |sync_id|, has |display_name|, |password|,
82   // |avatar_index|. The master key for cryptohome is a |master_key|.
83   void StartImport(const string16& display_name,
84                    const std::string& password,
85                    int avatar_index,
86                    const std::string& sync_id,
87                    const std::string& master_key);
88   void SetManagerProfile(Profile* manager_profile);
89   void StartCreation();
90   void CancelCreation();
91   void FinishCreation();
92   std::string GetManagedUserId();
93
94  private:
95   // Indicates if we create new user, or import an existing one.
96   enum CreationType {
97     NEW_USER,
98     USER_IMPORT,
99   };
100
101   // Contains information necessary for new user creation.
102   struct UserCreationContext {
103     UserCreationContext();
104     ~UserCreationContext();
105
106     string16 display_name;
107     int avatar_index;
108     std::string manager_id;
109     std::string local_user_id; // Used to identify cryptohome.
110     std::string sync_user_id;  // Used to identify user in manager's sync data.
111     std::string password;
112     std::string mount_hash;
113     std::string master_key;
114     bool token_acquired;
115     std::string token;
116     bool token_succesfully_written;
117     CreationType creation_type;
118     Profile* manager_profile;
119     scoped_ptr<ManagedUserRegistrationUtility> registration_utility;
120   };
121
122   // ManagedUserAuthenticator::StatusConsumer overrides.
123   virtual void OnAuthenticationFailure(
124       ManagedUserAuthenticator::AuthState error) OVERRIDE;
125   virtual void OnMountSuccess(const std::string& mount_hash) OVERRIDE;
126   virtual void OnAddKeySuccess() OVERRIDE;
127
128   void CreationTimedOut();
129   void RegistrationCallback(const GoogleServiceAuthError& error,
130                             const std::string& token);
131
132   void TokenFetched(const std::string& token);
133
134   // Completion callback for StoreManagedUserFiles method.
135   // Called on the UI thread.
136   void OnManagedUserFilesStored(bool success);
137
138   // Pointer to the current instance of the controller to be used by
139   // automation tests.
140   static LocallyManagedUserCreationController* current_controller_;
141
142   StatusConsumer* consumer_;
143
144   scoped_refptr<ManagedUserAuthenticator> authenticator_;
145
146   // Creation context. Not null while creating new LMU.
147   scoped_ptr<UserCreationContext> creation_context_;
148
149   // Timer for showing warning if creation process takes too long.
150   base::OneShotTimer<LocallyManagedUserCreationController> timeout_timer_;
151
152   // Factory of callbacks.
153   base::WeakPtrFactory<LocallyManagedUserCreationController> weak_factory_;
154
155   DISALLOW_COPY_AND_ASSIGN(LocallyManagedUserCreationController);
156 };
157
158 }  // namespace chromeos
159
160 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_MANAGED_LOCALLY_MANAGED_USER_CREATION_CONTROLLER_H_