supervised_user_password_service.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1// Copyright 2014 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#include "chrome/browser/supervised_user/chromeos/supervised_user_password_service.h" 6 7#include "base/bind.h" 8#include "base/values.h" 9#include "chrome/browser/chromeos/login/managed/supervised_user_authentication.h" 10#include "chrome/browser/chromeos/login/users/supervised_user_manager.h" 11#include "chrome/browser/chromeos/login/users/user_manager.h" 12#include "chrome/browser/supervised_user/supervised_user_constants.h" 13#include "chrome/browser/supervised_user/supervised_user_sync_service.h" 14 15namespace chromeos { 16 17SupervisedUserPasswordService::SupervisedUserPasswordService() 18 : weak_ptr_factory_(this) {} 19 20SupervisedUserPasswordService::~SupervisedUserPasswordService() {} 21 22void SupervisedUserPasswordService::Init( 23 const std::string& user_id, 24 SupervisedUserSharedSettingsService* shared_settings_service) { 25 user_id_ = user_id; 26 settings_service_ = shared_settings_service; 27 settings_service_subscription_ = settings_service_->Subscribe( 28 base::Bind(&SupervisedUserPasswordService::OnSharedSettingsChange, 29 weak_ptr_factory_.GetWeakPtr())); 30 31 // Force value check in case we have missed some notification. 32 33 chromeos::SupervisedUserManager* supervised_user_manager = 34 chromeos::UserManager::Get()->GetSupervisedUserManager(); 35 36 OnSharedSettingsChange(supervised_user_manager->GetUserSyncId(user_id), 37 supervised_users::kChromeOSPasswordData); 38} 39 40void SupervisedUserPasswordService::OnSharedSettingsChange( 41 const std::string& su_id, 42 const std::string& key) { 43 if (key != supervised_users::kChromeOSPasswordData) 44 return; 45 chromeos::SupervisedUserManager* supervised_user_manager = 46 chromeos::UserManager::Get()->GetSupervisedUserManager(); 47 const chromeos::User* user = supervised_user_manager->FindBySyncId(su_id); 48 if (user == NULL) { 49 LOG(WARNING) << "Got notification for user not on device."; 50 return; 51 } 52 DCHECK(user_id_ == user->email()); 53 if (user_id_ != user->email()) 54 return; 55 const base::Value* value = settings_service_->GetValue(su_id, key); 56 if (value == NULL) { 57 LOG(WARNING) << "Got empty value from sync."; 58 return; 59 } 60 const base::DictionaryValue* dict; 61 if (!value->GetAsDictionary(&dict)) { 62 LOG(WARNING) << "Got non-dictionary value from sync."; 63 return; 64 } 65 chromeos::SupervisedUserAuthentication* auth = 66 supervised_user_manager->GetAuthentication(); 67 if (!auth->NeedPasswordChange(user_id_, dict)) 68 return; 69 auth->ScheduleSupervisedPasswordChange(user_id_, dict); 70} 71 72void SupervisedUserPasswordService::Shutdown() { 73 settings_service_subscription_.reset(); 74} 75 76} // namespace chromeos 77