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