123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SUPERVISED_SUPERVISED_USER_CREATION_CONTROLLER_H_
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_SUPERVISED_SUPERVISED_USER_CREATION_CONTROLLER_H_
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <string>
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/files/file_path.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/memory/weak_ptr.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/string16.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/timer/timer.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/values.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/login/supervised/supervised_user_authenticator.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_registration_utility.h"
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class Profile;
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace chromeos {
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class SupervisedUserCreationController {
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // This constant is used to indicate that user does not have one of default
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // avatars: either he has no chromeos avatar at all, or has an external
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // image as an avatar.
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static const int kDummyAvatarIndex;
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  enum ErrorCode {
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    NO_ERROR,
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    CRYPTOHOME_NO_MOUNT,
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    CRYPTOHOME_FAILED_MOUNT,
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    CRYPTOHOME_FAILED_TPM,
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    CLOUD_SERVER_ERROR,
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    TOKEN_WRITE_FAILED,
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  class StatusConsumer {
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   public:
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual ~StatusConsumer();
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual void OnCreationError(ErrorCode code) = 0;
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual void OnLongCreationWarning() = 0;
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual void OnCreationTimeout() = 0;
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual void OnCreationSuccess() = 0;
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // All UI initialization is deferred till Init() call.
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // |Consumer| is not owned by controller, and it is expected that it wouldn't
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // be deleted before SupervisedUserCreationController.
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit SupervisedUserCreationController(StatusConsumer* consumer);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~SupervisedUserCreationController();
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns the current supervised user controller if it has been created.
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static SupervisedUserCreationController* current_controller() {
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return current_controller_;
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Set up controller for creating new supervised user with |display_name|,
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // |password| and avatar indexed by |avatar_index|. StartCreation() have to
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // be called to actually start creating user.
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void StartCreation(const base::string16& display_name,
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             const std::string& password,
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                             int avatar_index) = 0;
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Configures and initiates importing existing supervised user to this device.
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Existing user is identified by |sync_id|, has |display_name|, |password|,
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // |avatar_index|. The master key for cryptohome is a |master_key|.
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void StartImport(const base::string16& display_name,
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                           const std::string& password,
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                           int avatar_index,
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                           const std::string& sync_id,
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                           const std::string& master_key) = 0;
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Configures and initiates importing existing supervised user to this device.
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Existing user is identified by |sync_id|, has |display_name|,
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // |avatar_index|. The master key for cryptohome is a |master_key|. The user
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // has password specified in |password_data| and
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // |encryption_key|/|signature_key| for cryptohome.
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void StartImport(const base::string16& display_name,
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           int avatar_index,
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           const std::string& sync_id,
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           const std::string& master_key,
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           const base::DictionaryValue* password_data,
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           const std::string& encryption_key,
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           const std::string& signature_key) = 0;
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void SetManagerProfile(Profile* manager_profile) = 0;
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual Profile* GetManagerProfile() = 0;
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void CancelCreation() = 0;
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void FinishCreation() = 0;
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual std::string GetSupervisedUserId() = 0;
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) protected:
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Pointer to the current instance of the controller to be used by
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // automation tests.
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static SupervisedUserCreationController* current_controller_;
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  StatusConsumer* consumer_;
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SupervisedUserCreationController);
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace chromeos
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SUPERVISED_SUPERVISED_USER_CREATION_CONTROLLER_H_
109