15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/login/supervised/supervised_user_creation_flow.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chromeos/profiles/profile_helper.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SupervisedUserCreationScreen* GetScreen(LoginDisplayHost* host) {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(host);
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(host->GetWizardController());
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SupervisedUserCreationScreen* result =
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SupervisedUserCreationScreen::Get(host->GetWizardController());
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(result);
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return result;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SupervisedUserCreationFlow::SupervisedUserCreationFlow(
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& manager_id)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        : ExtendedUserFlow(manager_id),
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        token_validated_(false),
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        logged_in_(false),
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        session_started_(false),
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        manager_profile_(NULL) {}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SupervisedUserCreationFlow::~SupervisedUserCreationFlow() {}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SupervisedUserCreationFlow::CanLockScreen() {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SupervisedUserCreationFlow::ShouldShowSettings() {
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return false;
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SupervisedUserCreationFlow::ShouldLaunchBrowser() {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SupervisedUserCreationFlow::ShouldSkipPostLoginScreens() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
551675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochbool SupervisedUserCreationFlow::SupportsEarlyRestartToApplyFlags() {
561675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  return false;
571675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
581675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SupervisedUserCreationFlow::HandleOAuthTokenStatusChange(
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    user_manager::User::OAuthTokenStatus status) {
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (status == user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (status == user_manager::User::OAUTH2_TOKEN_STATUS_INVALID) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetScreen(host())->ShowManagerInconsistentStateErrorScreen();
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(status == user_manager::User::OAUTH2_TOKEN_STATUS_VALID);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // We expect that LaunchExtraSteps is called by this time (local
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // authentication happens before oauth token validation).
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  token_validated_ = true;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (token_validated_ && logged_in_) {
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!session_started_)
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GetScreen(host())->OnManagerFullyAuthenticated(manager_profile_);
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    session_started_ = true;
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SupervisedUserCreationFlow::HandleLoginFailure(
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const AuthFailure& failure) {
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (failure.reason() == AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetScreen(host())->OnManagerLoginFailure();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetScreen(host())->ShowManagerInconsistentStateErrorScreen();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SupervisedUserCreationFlow::HandleLoginSuccess(
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const UserContext& context) {}
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SupervisedUserCreationFlow::HandlePasswordChangeDetected() {
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetScreen(host())->ShowManagerInconsistentStateErrorScreen();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SupervisedUserCreationFlow::LaunchExtraSteps(
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile) {
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logged_in_ = true;
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager_profile_ = profile;
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ProfileHelper::Get()->ProfileStartup(profile, true);
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (token_validated_ && logged_in_) {
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!session_started_)
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GetScreen(host())->OnManagerFullyAuthenticated(manager_profile_);
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    session_started_ = true;
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else {
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetScreen(host())->OnManagerCryptohomeAuthenticated();
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
112