OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/supervised_user/supervised_user_service.h" | 5 #include "chrome/browser/supervised_user/supervised_user_service.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
11 | 11 |
12 #include "base/macros.h" | 12 #include "base/macros.h" |
13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
14 #include "base/path_service.h" | 14 #include "base/path_service.h" |
15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
16 #include "base/threading/thread_task_runner_handle.h" | 16 #include "base/threading/thread_task_runner_handle.h" |
17 #include "build/build_config.h" | 17 #include "build/build_config.h" |
18 #include "chrome/browser/chrome_notification_types.h" | 18 #include "chrome/browser/chrome_notification_types.h" |
19 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
20 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" | 20 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" |
21 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 21 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
22 #include "chrome/browser/signin/signin_manager_factory.h" | 22 #include "chrome/browser/signin/signin_manager_factory.h" |
23 #include "chrome/browser/supervised_user/legacy/custodian_profile_downloader_ser
vice.h" | 23 #include "chrome/browser/supervised_user/legacy/custodian_profile_downloader_ser
vice.h" |
24 #include "chrome/browser/supervised_user/legacy/custodian_profile_downloader_ser
vice_factory.h" | 24 #include "chrome/browser/supervised_user/legacy/custodian_profile_downloader_ser
vice_factory.h" |
25 #include "chrome/browser/supervised_user/permission_request_creator.h" | 25 #include "chrome/browser/supervised_user/permission_request_creator.h" |
| 26 #include "chrome/browser/supervised_user/supervised_user_features.h" |
26 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" | 27 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" |
27 #include "chrome/browser/supervised_user/supervised_user_whitelist_service.h" | 28 #include "chrome/browser/supervised_user/supervised_user_whitelist_service.h" |
28 #include "chrome/browser/ui/browser_list.h" | 29 #include "chrome/browser/ui/browser_list.h" |
29 #include "chrome/common/chrome_paths.h" | 30 #include "chrome/common/chrome_paths.h" |
30 #include "chrome/common/pref_names.h" | 31 #include "chrome/common/pref_names.h" |
31 #include "chrome/test/base/testing_profile.h" | 32 #include "chrome/test/base/testing_profile.h" |
32 #include "components/prefs/pref_service.h" | 33 #include "components/prefs/pref_service.h" |
33 #include "components/prefs/scoped_user_pref_update.h" | 34 #include "components/prefs/scoped_user_pref_update.h" |
34 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" | 35 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" |
35 #include "components/signin/core/browser/signin_manager.h" | 36 #include "components/signin/core/browser/signin_manager.h" |
36 #include "components/version_info/version_info.h" | 37 #include "components/version_info/version_info.h" |
37 #include "content/public/test/test_browser_thread_bundle.h" | 38 #include "content/public/test/test_browser_thread_bundle.h" |
38 #include "content/public/test/test_utils.h" | 39 #include "content/public/test/test_utils.h" |
39 #include "testing/gtest/include/gtest/gtest.h" | 40 #include "testing/gtest/include/gtest/gtest.h" |
40 | 41 |
41 #if defined(ENABLE_EXTENSIONS) | 42 #if defined(ENABLE_EXTENSIONS) |
42 #include "chrome/browser/extensions/extension_service.h" | 43 #include "chrome/browser/extensions/extension_service.h" |
43 #include "chrome/browser/extensions/extension_service_test_base.h" | 44 #include "chrome/browser/extensions/extension_service_test_base.h" |
44 #include "chrome/browser/extensions/extension_util.h" | 45 #include "chrome/browser/extensions/extension_util.h" |
45 #include "chrome/browser/extensions/unpacked_installer.h" | 46 #include "chrome/browser/extensions/unpacked_installer.h" |
46 #include "chrome/common/extensions/features/feature_channel.h" | 47 #include "chrome/common/extensions/features/feature_channel.h" |
47 #include "extensions/common/extension.h" | 48 #include "extensions/common/extension.h" |
48 #include "extensions/common/extension_builder.h" | 49 #include "extensions/common/extension_builder.h" |
49 #include "extensions/common/manifest_constants.h" | 50 #include "extensions/common/manifest_constants.h" |
| 51 |
| 52 using extensions::Extension; |
50 #endif | 53 #endif |
51 | 54 |
52 using content::MessageLoopRunner; | 55 using content::MessageLoopRunner; |
53 | 56 |
54 namespace { | 57 namespace { |
55 | 58 |
56 #if !defined(OS_ANDROID) | 59 #if !defined(OS_ANDROID) |
57 void OnProfileDownloadedFail(const base::string16& full_name) { | 60 void OnProfileDownloadedFail(const base::string16& full_name) { |
58 ASSERT_TRUE(false) << "Profile download should not have succeeded."; | 61 ASSERT_TRUE(false) << "Profile download should not have succeeded."; |
59 } | 62 } |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 // PermissionRequestCreator: | 256 // PermissionRequestCreator: |
254 bool IsEnabled() const override { return enabled_; } | 257 bool IsEnabled() const override { return enabled_; } |
255 | 258 |
256 void CreateURLAccessRequest(const GURL& url_requested, | 259 void CreateURLAccessRequest(const GURL& url_requested, |
257 const SuccessCallback& callback) override { | 260 const SuccessCallback& callback) override { |
258 ASSERT_TRUE(enabled_); | 261 ASSERT_TRUE(enabled_); |
259 requested_urls_.push_back(url_requested); | 262 requested_urls_.push_back(url_requested); |
260 callbacks_.push_back(callback); | 263 callbacks_.push_back(callback); |
261 } | 264 } |
262 | 265 |
| 266 void CreateExtensionInstallRequest(const std::string& extension_id, |
| 267 const SuccessCallback& callback) override { |
| 268 FAIL(); |
| 269 } |
| 270 |
263 void CreateExtensionUpdateRequest(const std::string& id, | 271 void CreateExtensionUpdateRequest(const std::string& id, |
264 const SuccessCallback& callback) override { | 272 const SuccessCallback& callback) override { |
265 FAIL(); | 273 FAIL(); |
266 } | 274 } |
267 | 275 |
268 bool enabled_; | 276 bool enabled_; |
269 std::vector<GURL> requested_urls_; | 277 std::vector<GURL> requested_urls_; |
270 std::vector<SuccessCallback> callbacks_; | 278 std::vector<SuccessCallback> callbacks_; |
271 | 279 |
272 DISALLOW_COPY_AND_ASSIGN(MockPermissionRequestCreator); | 280 DISALLOW_COPY_AND_ASSIGN(MockPermissionRequestCreator); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 public: | 438 public: |
431 SupervisedUserServiceExtensionTestUnsupervised() | 439 SupervisedUserServiceExtensionTestUnsupervised() |
432 : SupervisedUserServiceExtensionTestBase(false) {} | 440 : SupervisedUserServiceExtensionTestBase(false) {} |
433 }; | 441 }; |
434 | 442 |
435 class SupervisedUserServiceExtensionTest | 443 class SupervisedUserServiceExtensionTest |
436 : public SupervisedUserServiceExtensionTestBase { | 444 : public SupervisedUserServiceExtensionTestBase { |
437 public: | 445 public: |
438 SupervisedUserServiceExtensionTest() | 446 SupervisedUserServiceExtensionTest() |
439 : SupervisedUserServiceExtensionTestBase(true) {} | 447 : SupervisedUserServiceExtensionTestBase(true) {} |
| 448 |
| 449 protected: |
| 450 void InitSupervisedUserInitiatedExtensionInstallFeature(bool enabled) { |
| 451 base::FeatureList::ClearInstanceForTesting(); |
| 452 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); |
| 453 if (enabled) { |
| 454 feature_list->InitializeFromCommandLine( |
| 455 "SupervisedUserInitiatedExtensionInstall", std::string()); |
| 456 } |
| 457 base::FeatureList::SetInstance(std::move(feature_list)); |
| 458 } |
440 }; | 459 }; |
441 | 460 |
442 TEST_F(SupervisedUserServiceExtensionTest, ExtensionManagementPolicyProvider) { | 461 TEST_F(SupervisedUserServiceExtensionTest, |
| 462 ExtensionManagementPolicyProviderWithoutSUInitiatedInstalls) { |
443 SupervisedUserService* supervised_user_service = | 463 SupervisedUserService* supervised_user_service = |
444 SupervisedUserServiceFactory::GetForProfile(profile_.get()); | 464 SupervisedUserServiceFactory::GetForProfile(profile_.get()); |
445 ASSERT_TRUE(profile_->IsSupervised()); | 465 ASSERT_TRUE(profile_->IsSupervised()); |
446 | 466 |
447 // Check that a supervised user can install and uninstall a theme. | 467 // Disable supervised user initiated installs. |
| 468 InitSupervisedUserInitiatedExtensionInstallFeature(false); |
| 469 |
| 470 // Check that a supervised user can install and uninstall a theme even if |
| 471 // they are not allowed to install extensions. |
448 { | 472 { |
449 scoped_refptr<extensions::Extension> theme = MakeThemeExtension(); | 473 scoped_refptr<extensions::Extension> theme = MakeThemeExtension(); |
450 | 474 |
451 base::string16 error_1; | 475 base::string16 error_1; |
452 EXPECT_TRUE(supervised_user_service->UserMayLoad(theme.get(), &error_1)); | 476 EXPECT_TRUE(supervised_user_service->UserMayLoad(theme.get(), &error_1)); |
453 EXPECT_TRUE(error_1.empty()); | 477 EXPECT_TRUE(error_1.empty()); |
454 | 478 |
455 base::string16 error_2; | 479 base::string16 error_2; |
456 EXPECT_FALSE( | 480 EXPECT_FALSE( |
457 supervised_user_service->MustRemainInstalled(theme.get(), &error_2)); | 481 supervised_user_service->MustRemainInstalled(theme.get(), &error_2)); |
(...skipping 25 matching lines...) Expand all Loading... |
483 supervised_user_service->MustRemainInstalled(extension.get(), | 507 supervised_user_service->MustRemainInstalled(extension.get(), |
484 &error_2)); | 508 &error_2)); |
485 EXPECT_FALSE(error_2.empty()); | 509 EXPECT_FALSE(error_2.empty()); |
486 } | 510 } |
487 | 511 |
488 #ifndef NDEBUG | 512 #ifndef NDEBUG |
489 EXPECT_FALSE(supervised_user_service->GetDebugPolicyProviderName().empty()); | 513 EXPECT_FALSE(supervised_user_service->GetDebugPolicyProviderName().empty()); |
490 #endif | 514 #endif |
491 } | 515 } |
492 | 516 |
| 517 TEST_F(SupervisedUserServiceExtensionTest, |
| 518 ExtensionManagementPolicyProviderWithSUInitiatedInstalls) { |
| 519 SupervisedUserService* supervised_user_service = |
| 520 SupervisedUserServiceFactory::GetForProfile(profile_.get()); |
| 521 ASSERT_TRUE(profile_->IsSupervised()); |
| 522 |
| 523 // Enable supervised user initiated installs. |
| 524 InitSupervisedUserInitiatedExtensionInstallFeature(true); |
| 525 // The supervised user should be able to load and uninstall the extensions |
| 526 // they install. |
| 527 { |
| 528 scoped_refptr<extensions::Extension> extension = MakeExtension(false); |
| 529 |
| 530 base::string16 error; |
| 531 EXPECT_TRUE(supervised_user_service->UserMayLoad(extension.get(), &error)); |
| 532 EXPECT_TRUE(error.empty()); |
| 533 |
| 534 base::string16 error_2; |
| 535 EXPECT_FALSE(supervised_user_service->MustRemainInstalled(extension.get(), |
| 536 &error_2)); |
| 537 EXPECT_TRUE(error_2.empty()); |
| 538 |
| 539 base::string16 error_3; |
| 540 Extension::DisableReason reason = Extension::DISABLE_NONE; |
| 541 EXPECT_TRUE(supervised_user_service->MustRemainDisabled(extension.get(), |
| 542 &reason, |
| 543 &error_3)); |
| 544 EXPECT_EQ(Extension::DISABLE_CUSTODIAN_APPROVAL_REQUIRED, reason); |
| 545 EXPECT_FALSE(error_3.empty()); |
| 546 |
| 547 base::string16 error_4; |
| 548 EXPECT_TRUE(supervised_user_service->UserMayModifySettings(extension.get(), |
| 549 &error_4)); |
| 550 EXPECT_TRUE(error_4.empty()); |
| 551 } |
| 552 |
| 553 { |
| 554 // A custodian-installed extension may be loaded, but not uninstalled. |
| 555 scoped_refptr<extensions::Extension> extension = MakeExtension(true); |
| 556 |
| 557 base::string16 error_1; |
| 558 EXPECT_TRUE( |
| 559 supervised_user_service->UserMayLoad(extension.get(), &error_1)); |
| 560 EXPECT_TRUE(error_1.empty()); |
| 561 |
| 562 base::string16 error_2; |
| 563 EXPECT_TRUE(supervised_user_service->MustRemainInstalled(extension.get(), |
| 564 &error_2)); |
| 565 EXPECT_FALSE(error_2.empty()); |
| 566 |
| 567 base::string16 error_3; |
| 568 Extension::DisableReason reason = Extension::DISABLE_NONE; |
| 569 EXPECT_FALSE(supervised_user_service->MustRemainDisabled(extension.get(), |
| 570 &reason, |
| 571 &error_3)); |
| 572 EXPECT_EQ(Extension::DISABLE_NONE, reason); |
| 573 EXPECT_TRUE(error_3.empty()); |
| 574 |
| 575 base::string16 error_4; |
| 576 EXPECT_FALSE(supervised_user_service->UserMayModifySettings(extension.get(), |
| 577 &error_4)); |
| 578 EXPECT_FALSE(error_4.empty()); |
| 579 } |
| 580 |
| 581 #ifndef NDEBUG |
| 582 EXPECT_FALSE(supervised_user_service->GetDebugPolicyProviderName().empty()); |
| 583 #endif |
| 584 } |
| 585 |
493 TEST_F(SupervisedUserServiceExtensionTest, NoContentPacks) { | 586 TEST_F(SupervisedUserServiceExtensionTest, NoContentPacks) { |
494 SupervisedUserService* supervised_user_service = | 587 SupervisedUserService* supervised_user_service = |
495 SupervisedUserServiceFactory::GetForProfile(profile_.get()); | 588 SupervisedUserServiceFactory::GetForProfile(profile_.get()); |
496 SupervisedUserURLFilter* url_filter = | 589 SupervisedUserURLFilter* url_filter = |
497 supervised_user_service->GetURLFilterForUIThread(); | 590 supervised_user_service->GetURLFilterForUIThread(); |
498 | 591 |
499 // ASSERT_EQ instead of ASSERT_TRUE([...].empty()) so that the error | 592 // ASSERT_EQ instead of ASSERT_TRUE([...].empty()) so that the error |
500 // message contains the size in case of failure. | 593 // message contains the size in case of failure. |
501 ASSERT_EQ(0u, site_list_observer_.site_lists().size()); | 594 ASSERT_EQ(0u, site_list_observer_.site_lists().size()); |
502 | 595 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 EXPECT_EQ(title2, site_list_observer_.site_lists()[0]->title()); | 676 EXPECT_EQ(title2, site_list_observer_.site_lists()[0]->title()); |
584 EXPECT_TRUE(site_list_observer_.site_lists()[0]->entry_point().is_empty()); | 677 EXPECT_TRUE(site_list_observer_.site_lists()[0]->entry_point().is_empty()); |
585 | 678 |
586 url_filter_observer_.Wait(); | 679 url_filter_observer_.Wait(); |
587 EXPECT_EQ(SupervisedUserURLFilter::WARN, | 680 EXPECT_EQ(SupervisedUserURLFilter::WARN, |
588 url_filter->GetFilteringBehaviorForURL(youtube_url)); | 681 url_filter->GetFilteringBehaviorForURL(youtube_url)); |
589 EXPECT_EQ(SupervisedUserURLFilter::ALLOW, | 682 EXPECT_EQ(SupervisedUserURLFilter::ALLOW, |
590 url_filter->GetFilteringBehaviorForURL(moose_url)); | 683 url_filter->GetFilteringBehaviorForURL(moose_url)); |
591 } | 684 } |
592 #endif // defined(ENABLE_EXTENSIONS) | 685 #endif // defined(ENABLE_EXTENSIONS) |
OLD | NEW |