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/supervised/supervised_user_authentication.h"
10#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
11#include "chrome/browser/chromeos/login/users/supervised_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      ChromeUserManager::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      ChromeUserManager::Get()->GetSupervisedUserManager();
47  const user_manager::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