browser_policy_connector.cc revision 116680a4aac90f2aa7413d9095a592090648e557
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string16.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/device_management_service.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/configuration_policy_provider.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_namespace.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_pref_names.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_service_impl.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_statistics_collector.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_switches.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "policy/policy_constants.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/icu/source/i18n/unicode/regex.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace policy {
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The URL for the device management server.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kDefaultDeviceManagementServerUrl[] =
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "https://m.google.com/devicemanagement/data/api";
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Used in BrowserPolicyConnector::SetPolicyProviderForTesting.
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool g_created_policy_service = false;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ConfigurationPolicyProvider* g_testing_provider = NULL;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns true if |domain| matches the regex |pattern|.
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MatchDomain(const base::string16& domain, const base::string16& pattern) {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UErrorCode status = U_ZERO_ERROR;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const icu::UnicodeString icu_pattern(pattern.data(), pattern.length());
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  icu::RegexMatcher matcher(icu_pattern, UREGEX_CASE_INSENSITIVE, status);
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!U_SUCCESS(status)) {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // http://crbug.com/365351 - if for some reason the matcher creation fails
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // just return that the pattern doesn't match the domain. This is safe
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // because the calling method (IsNonEnterpriseUser()) is just used to enable
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // an optimization for non-enterprise users - better to skip the
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // optimization than crash.
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DLOG(ERROR) << "Possible invalid domain pattern: " << pattern
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                << " - Error: " << status;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  icu::UnicodeString icu_input(domain.data(), domain.length());
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  matcher.reset(icu_input);
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  status = U_ZERO_ERROR;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UBool match = matcher.matches(status);
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(U_SUCCESS(status));
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return !!match;  // !! == convert from UBool to bool.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserPolicyConnector::BrowserPolicyConnector(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const HandlerListFactory& handler_list_factory)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : is_initialized_(false),
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      platform_policy_provider_(NULL) {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // GetPolicyService() must be ready after the constructor is done.
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The connector is created very early during startup, when the browser
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // threads aren't running yet; initialize components that need local_state,
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the system request context or other threads (e.g. FILE) at Init().
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Initialize the SchemaRegistry with the Chrome schema before creating any
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // of the policy providers in subclasses.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome_schema_ = Schema::Wrap(GetChromeSchemaData());
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  handler_list_ = handler_list_factory.Run(chrome_schema_);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  schema_registry_.RegisterComponent(PolicyNamespace(POLICY_DOMAIN_CHROME, ""),
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     chrome_schema_);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserPolicyConnector::~BrowserPolicyConnector() {
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (is_initialized()) {
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Shutdown() wasn't invoked by our owner after having called Init().
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This usually means it's an early shutdown and
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // BrowserProcessImpl::StartTearDown() wasn't invoked.
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Cleanup properly in those cases and avoid crashing the ToastCrasher test.
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Shutdown();
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnector::Init(
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefService* local_state,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<DeviceManagementService> device_management_service) {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!is_initialized());
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_management_service_ = device_management_service.Pass();
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (g_testing_provider)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    g_testing_provider->Init(GetSchemaRegistry());
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < policy_providers_.size(); ++i)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    policy_providers_[i]->Init(GetSchemaRegistry());
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy_statistics_collector_.reset(
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new policy::PolicyStatisticsCollector(
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&GetChromePolicyDetails),
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          GetChromeSchema(),
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          GetPolicyService(),
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          local_state,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::MessageLoop::current()->message_loop_proxy()));
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy_statistics_collector_->Initialize();
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  is_initialized_ = true;
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnector::Shutdown() {
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  is_initialized_ = false;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (g_testing_provider)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    g_testing_provider->Shutdown();
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < policy_providers_.size(); ++i)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    policy_providers_[i]->Shutdown();
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Drop g_testing_provider so that tests executed with --single_process can
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // call SetPolicyProviderForTesting() again. It is still owned by the test.
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_testing_provider = NULL;
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_created_policy_service = false;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_management_service_.reset();
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PolicyService* BrowserPolicyConnector::GetPolicyService() {
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!policy_service_) {
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    g_created_policy_service = true;
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<ConfigurationPolicyProvider*> providers;
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (g_testing_provider) {
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      providers.push_back(g_testing_provider);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      providers.resize(policy_providers_.size());
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::copy(policy_providers_.begin(),
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                policy_providers_.end(),
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                providers.begin());
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    policy_service_.reset(new PolicyServiceImpl(providers));
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return policy_service_.get();
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ConfigurationPolicyProvider* BrowserPolicyConnector::GetPlatformProvider() {
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (g_testing_provider)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return g_testing_provider;
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return platform_policy_provider_;
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const Schema& BrowserPolicyConnector::GetChromeSchema() const {
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return chrome_schema_;
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CombinedSchemaRegistry* BrowserPolicyConnector::GetSchemaRegistry() {
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return &schema_registry_;
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnector::ScheduleServiceInitialization(
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int64 delay_milliseconds) {
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Skip device initialization if the BrowserPolicyConnector was never
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // initialized (unit tests).
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (device_management_service_)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    device_management_service_->ScheduleInitialization(delay_milliseconds);
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const ConfigurationPolicyHandlerList*
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    BrowserPolicyConnector::GetHandlerList() const {
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return handler_list_.get();
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnector::SetPolicyProviderForTesting(
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ConfigurationPolicyProvider* provider) {
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If this function is used by a test then it must be called before the
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // browser is created, and GetPolicyService() gets called.
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(!g_created_policy_service);
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!g_testing_provider);
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_testing_provider = provider;
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BrowserPolicyConnector::IsNonEnterpriseUser(const std::string& username) {
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (username.empty() || username.find('@') == std::string::npos) {
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // An empty username means incognito user in case of ChromiumOS and
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // no logged-in user in case of Chromium (SigninService). Many tests use
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // nonsense email addresses (e.g. 'test') so treat those as non-enterprise
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // users.
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Exclude many of the larger public email providers as we know these users
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // are not from hosted enterprise domains.
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const wchar_t* kNonManagedDomainPatterns[] = {
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"aol\\.com",
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"googlemail\\.com",
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"gmail\\.com",
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"hotmail(\\.co|\\.com|)\\.[^.]+", // hotmail.com, hotmail.it, hotmail.co.uk
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"live\\.com",
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"mail\\.ru",
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"msn\\.com",
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"qq\\.com",
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"yahoo(\\.co|\\.com|)\\.[^.]+", // yahoo.com, yahoo.co.uk, yahoo.com.tw
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    L"yandex\\.ru",
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 domain = base::UTF8ToUTF16(
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gaia::ExtractDomainName(gaia::CanonicalizeEmail(username)));
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kNonManagedDomainPatterns); i++) {
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 pattern = base::WideToUTF16(kNonManagedDomainPatterns[i]);
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (MatchDomain(domain, pattern))
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string BrowserPolicyConnector::GetDeviceManagementUrl() {
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (command_line->HasSwitch(switches::kDeviceManagementUrl))
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return command_line->GetSwitchValueASCII(switches::kDeviceManagementUrl);
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  else
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return kDefaultDeviceManagementServerUrl;
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnector::RegisterPrefs(PrefRegistrySimple* registry) {
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry->RegisterIntegerPref(
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      policy_prefs::kUserPolicyRefreshRate,
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs);
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnector::AddPolicyProvider(
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<ConfigurationPolicyProvider> provider) {
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy_providers_.push_back(provider.release());
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnector::SetPlatformPolicyProvider(
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<ConfigurationPolicyProvider> provider) {
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(!platform_policy_provider_);
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  platform_policy_provider_ = provider.get();
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddPolicyProvider(provider.Pass());
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace policy
249