1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright (c) 2011 The Chromium Authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Use of this source code is governed by a BSD-style license that can be
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// found in the LICENSE file.
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "chrome/browser/chromeos/policy/user_policy_token_loader.h"
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/bind.h"
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/files/file_util.h"
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/location.h"
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/message_loop/message_loop_proxy.h"
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/metrics/histogram.h"
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/sequenced_task_runner.h"
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "components/policy/core/common/cloud/enterprise_metrics.h"
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "policy/proto/device_management_local.pb.h"
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comnamespace policy {
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comnamespace em = enterprise_management;
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comUserPolicyTokenLoader::Delegate::~Delegate() {}
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comUserPolicyTokenLoader::UserPolicyTokenLoader(
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    const base::WeakPtr<Delegate>& delegate,
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    const base::FilePath& cache_file,
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    scoped_refptr<base::SequencedTaskRunner> background_task_runner)
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    : delegate_(delegate),
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      cache_file_(cache_file),
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      origin_task_runner_(base::MessageLoopProxy::current()),
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      background_task_runner_(background_task_runner) {}
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid UserPolicyTokenLoader::Load() {
32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  background_task_runner_->PostTask(
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      FROM_HERE,
35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      base::Bind(&UserPolicyTokenLoader::LoadOnBackgroundThread, this));
36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgUserPolicyTokenLoader::~UserPolicyTokenLoader() {
39196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
41196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid UserPolicyTokenLoader::LoadOnBackgroundThread() {
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  DCHECK(background_task_runner_->RunsTasksOnCurrentThread());
43b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  std::string device_token;
443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  std::string device_id;
453d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org
463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  if (base::PathExists(cache_file_)) {
473d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org    std::string data;
48b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    em::DeviceCredentials device_credentials;
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    if (base::ReadFileToString(cache_file_, &data) &&
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        device_credentials.ParseFromArray(data.c_str(), data.size())) {
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      device_token = device_credentials.device_token();
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      device_id = device_credentials.device_id();
535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      UMA_HISTOGRAM_ENUMERATION(policy::kMetricToken,
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                kMetricTokenLoadSucceeded,
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                policy::kMetricTokenSize);
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    } else {
573a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org      UMA_HISTOGRAM_ENUMERATION(policy::kMetricToken,
583a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org                                kMetricTokenLoadFailed,
59639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                                policy::kMetricTokenSize);
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  origin_task_runner_->PostTask(
6465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      FROM_HERE,
65c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      base::Bind(&UserPolicyTokenLoader::NotifyOnOriginThread,
669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                 this,
679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                 device_token,
689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                 device_id));
699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid UserPolicyTokenLoader::NotifyOnOriginThread(const std::string& token,
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                                 const std::string& device_id) {
739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (delegate_.get())
759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    delegate_->OnTokenLoaded(token, device_id);
769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}  // namespace policy
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com