| 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 |