15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/chromeos/supervised_user_password_service.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/login/supervised/supervised_user_authentication.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/chrome_user_manager.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/supervised_user_manager.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_constants.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos { 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserPasswordService::SupervisedUserPasswordService() 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : weak_ptr_factory_(this) {} 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserPasswordService::~SupervisedUserPasswordService() {} 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserPasswordService::Init( 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& user_id, 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSharedSettingsService* shared_settings_service) { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_id_ = user_id; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) settings_service_ = shared_settings_service; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) settings_service_subscription_ = settings_service_->Subscribe( 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&SupervisedUserPasswordService::OnSharedSettingsChange, 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Force value check in case we have missed some notification. 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::SupervisedUserManager* supervised_user_manager = 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetSupervisedUserManager(); 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnSharedSettingsChange(supervised_user_manager->GetUserSyncId(user_id), 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_users::kChromeOSPasswordData); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserPasswordService::OnSharedSettingsChange( 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& su_id, 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& key) { 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (key != supervised_users::kChromeOSPasswordData) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::SupervisedUserManager* supervised_user_manager = 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetSupervisedUserManager(); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const user_manager::User* user = supervised_user_manager->FindBySyncId(su_id); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (user == NULL) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(WARNING) << "Got notification for user not on device."; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(user_id_ == user->email()); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (user_id_ != user->email()) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::Value* value = settings_service_->GetValue(su_id, key); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (value == NULL) { 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(WARNING) << "Got empty value from sync."; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!value->GetAsDictionary(&dict)) { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(WARNING) << "Got non-dictionary value from sync."; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::SupervisedUserAuthentication* auth = 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supervised_user_manager->GetAuthentication(); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!auth->NeedPasswordChange(user_id_, dict)) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) auth->ScheduleSupervisedPasswordChange(user_id_, dict); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SupervisedUserPasswordService::Shutdown() { 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) settings_service_subscription_.reset(); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace chromeos 77