user_cloud_policy_token_forwarder_factory.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1// Copyright (c) 2013 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/chromeos/policy/user_cloud_policy_token_forwarder_factory.h"
6
7#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
8#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
9#include "chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.h"
10#include "chrome/browser/profiles/profile.h"
11#include "chrome/browser/signin/token_service.h"
12#include "chrome/browser/signin/token_service_factory.h"
13#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
14
15namespace policy {
16
17// static
18UserCloudPolicyTokenForwarderFactory*
19    UserCloudPolicyTokenForwarderFactory::GetInstance() {
20  return Singleton<UserCloudPolicyTokenForwarderFactory>::get();
21}
22
23UserCloudPolicyTokenForwarderFactory::UserCloudPolicyTokenForwarderFactory()
24    : BrowserContextKeyedServiceFactory(
25        "UserCloudPolicyTokenForwarder",
26        BrowserContextDependencyManager::GetInstance()) {
27  DependsOn(TokenServiceFactory::GetInstance());
28  DependsOn(UserCloudPolicyManagerFactoryChromeOS::GetInstance());
29}
30
31UserCloudPolicyTokenForwarderFactory::~UserCloudPolicyTokenForwarderFactory() {}
32
33BrowserContextKeyedService*
34    UserCloudPolicyTokenForwarderFactory::BuildServiceInstanceFor(
35        content::BrowserContext* context) const {
36  Profile* profile = static_cast<Profile*>(context);
37  UserCloudPolicyManagerChromeOS* manager =
38      UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile);
39  TokenService* token_service =
40      TokenServiceFactory::GetForProfile(profile);
41  if (!token_service || !manager)
42    return NULL;
43  if (manager->IsClientRegistered()) {
44    // The CloudPolicyClient is already registered, so the manager doesn't need
45    // the refresh token. The manager may have fetched a refresh token if it
46    // performed a blocking policy fetch; send it to the TokenService in that
47    // case, so that it can be reused for other services.
48    if (!manager->oauth2_tokens().refresh_token.empty())
49      token_service->UpdateCredentialsWithOAuth2(manager->oauth2_tokens());
50    return NULL;
51  }
52  return new UserCloudPolicyTokenForwarder(manager, token_service);
53}
54
55bool UserCloudPolicyTokenForwarderFactory::
56ServiceIsCreatedWithBrowserContext() const {
57  // Create this object when the profile is created so it fetches the token
58  // during startup.
59  return true;
60}
61
62bool UserCloudPolicyTokenForwarderFactory::ServiceIsNULLWhileTesting() const {
63  // This is only needed in a handful of tests that manually create the object.
64  return true;
65}
66
67}  // namespace policy
68