1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/user_policy_identity_strategy.h"
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/file_util.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/browser_signin.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/net/gaia/token_service.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/proto/device_management_backend.pb.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/proto/device_management_constants.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/proto/device_management_local.pb.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/guid.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/net/gaia/gaia_constants.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS)
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/chromeos/login/user_manager.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace policy {
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace em = enterprise_management;
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Responsible for managing the on-disk token cache.
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass UserPolicyIdentityStrategy::TokenCache
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : public base::RefCountedThreadSafe<
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          UserPolicyIdentityStrategy::TokenCache> {
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TokenCache(const base::WeakPtr<UserPolicyIdentityStrategy>& identity_strategy,
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             const FilePath& cache_file);
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Load();
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Store(const std::string& token, const std::string& device_id);
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend class base::RefCountedThreadSafe<
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      UserPolicyIdentityStrategy::TokenCache>;
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ~TokenCache() {}
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void LoadOnFileThread();
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void NotifyOnUIThread(const std::string& token,
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        const std::string& device_id);
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void StoreOnFileThread(const std::string& token,
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         const std::string& device_id);
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const base::WeakPtr<UserPolicyIdentityStrategy> identity_strategy_;
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const FilePath cache_file_;
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(TokenCache);
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
56dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::TokenCache::TokenCache(
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const base::WeakPtr<UserPolicyIdentityStrategy>& identity_strategy,
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const FilePath& cache_file)
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : identity_strategy_(identity_strategy),
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      cache_file_(cache_file) {}
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::Load() {
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BrowserThread::PostTask(
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      BrowserThread::FILE, FROM_HERE,
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NewRunnableMethod(
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          this, &UserPolicyIdentityStrategy::TokenCache::LoadOnFileThread));
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::Store(
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& token,
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& device_id) {
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BrowserThread::PostTask(
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      BrowserThread::FILE, FROM_HERE,
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NewRunnableMethod(
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          this,
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &UserPolicyIdentityStrategy::TokenCache::StoreOnFileThread,
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          token,
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          device_id));
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::LoadOnFileThread() {
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string device_token;
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string device_id;
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (file_util::PathExists(cache_file_)) {
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::string data;
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    em::DeviceCredentials device_credentials;
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (file_util::ReadFileToString(cache_file_, &data) &&
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        device_credentials.ParseFromArray(data.c_str(), data.size())) {
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device_token = device_credentials.device_token();
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device_id = device_credentials.device_id();
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BrowserThread::PostTask(
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      BrowserThread::UI, FROM_HERE,
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NewRunnableMethod(
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          this,
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &UserPolicyIdentityStrategy::TokenCache::NotifyOnUIThread,
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          device_token,
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          device_id));
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::NotifyOnUIThread(
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& token,
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& device_id) {
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (identity_strategy_.get())
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    identity_strategy_->OnCacheLoaded(token, device_id);
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::StoreOnFileThread(
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& token,
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& device_id) {
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  em::DeviceCredentials device_credentials;
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  device_credentials.set_device_token(token);
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  device_credentials.set_device_id(device_id);
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string data;
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool success = device_credentials.SerializeToString(&data);
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!success) {
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    LOG(WARNING) << "Failed serialize device token data, will not write "
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                 << cache_file_.value();
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  file_util::WriteFile(cache_file_, data.c_str(), data.length());
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
133dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::UserPolicyIdentityStrategy(
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Profile* profile,
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const FilePath& cache_file)
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : profile_(profile),
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cache_ = new TokenCache(weak_ptr_factory_.GetWeakPtr(), cache_file);
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  registrar_.Add(this,
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                 NotificationType::TOKEN_AVAILABLE,
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                 Source<TokenService>(profile->GetTokenService()));
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Register for the event of user login. The device management token won't
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // be fetched until we know the domain of the currently logged in user.
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS)
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  registrar_.Add(this,
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                 NotificationType::LOGIN_USER_CHANGED,
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                 NotificationService::AllSources());
149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  registrar_.Add(this,
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                 NotificationType::GOOGLE_SIGNIN_SUCCESSFUL,
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                 Source<Profile>(profile_));
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cache_->Load();
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
158dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::~UserPolicyIdentityStrategy() {}
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetDeviceToken() {
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return device_token_;
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetDeviceID() {
165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return device_id_;
166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetMachineID() {
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return std::string();
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string UserPolicyIdentityStrategy::GetMachineModel() {
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return std::string();
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenem::DeviceRegisterRequest_Type
177dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::GetPolicyRegisterType() {
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return em::DeviceRegisterRequest::USER;
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetPolicyType() {
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return kChromeUserPolicyType;
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool UserPolicyIdentityStrategy::GetCredentials(std::string* username,
186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                std::string* auth_token) {
187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  *username = GetCurrentUser();
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  *auth_token = profile_->GetTokenService()->GetTokenForService(
189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      GaiaConstants::kDeviceManagementService);
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return !username->empty() && !auth_token->empty() && !device_id_.empty();
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::OnDeviceTokenAvailable(
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& token) {
196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(!device_id_.empty());
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  device_token_ = token;
198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  cache_->Store(device_token_, device_id_);
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NotifyDeviceTokenChanged();
200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetCurrentUser() {
203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS)
204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO(mnissler) On CrOS it seems impossible to figure out what user belongs
205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // to a profile. Revisit after multi-profile support landed.
206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return chromeos::UserManager::Get()->logged_in_user().email();
207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else
208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return profile_->GetBrowserSignin()->GetSignedInUsername();
209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::CheckAndTriggerFetch() {
213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetCurrentUser().empty() &&
214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      profile_->GetTokenService()->HasTokenForService(
215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          GaiaConstants::kDeviceManagementService)) {
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // For user tokens, there is no actual identifier. We generate a random
217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // identifier instead each time we ask for the token.
218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device_id_ = guid::GenerateGUID();
219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NotifyAuthChanged();
220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::OnCacheLoaded(const std::string& token,
224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                               const std::string& device_id) {
225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!token.empty() && !device_id.empty()) {
226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device_token_ = token;
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device_id_ = device_id;
228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NotifyDeviceTokenChanged();
229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CheckAndTriggerFetch();
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::Observe(NotificationType type,
235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                         const NotificationSource& source,
236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                         const NotificationDetails& details) {
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (type == NotificationType::TOKEN_AVAILABLE) {
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (Source<TokenService>(source).ptr() == profile_->GetTokenService()) {
240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const TokenService::TokenAvailableDetails* token_details =
241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          Details<const TokenService::TokenAvailableDetails>(details).ptr();
242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (token_details->service() == GaiaConstants::kDeviceManagementService)
243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (device_token_.empty()) {
244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          // Request a new device management server token, but only in case we
245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          // don't already have it.
246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          CheckAndTriggerFetch();
247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS)
250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (type == NotificationType::LOGIN_USER_CHANGED) {
251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CheckAndTriggerFetch();
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (type == NotificationType::GOOGLE_SIGNIN_SUCCESSFUL) {
254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (profile_ == Source<Profile>(source).ptr())
255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CheckAndTriggerFetch();
256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NOTREACHED();
259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace policy
263