Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(261)

Side by Side Diff: chrome/browser/supervised_user/supervised_user_service.cc

Issue 925563002: Supervised users: Slightly relax restrictions around extensions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@test_ext_install_disable
Patch Set: fix Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/prefs/pref_service.h" 10 #include "base/prefs/pref_service.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 prefs::kSupervisedUserCustodianName, 76 prefs::kSupervisedUserCustodianName,
77 prefs::kSupervisedUserCustodianEmail, 77 prefs::kSupervisedUserCustodianEmail,
78 prefs::kSupervisedUserCustodianProfileImageURL, 78 prefs::kSupervisedUserCustodianProfileImageURL,
79 prefs::kSupervisedUserCustodianProfileURL, 79 prefs::kSupervisedUserCustodianProfileURL,
80 prefs::kSupervisedUserSecondCustodianName, 80 prefs::kSupervisedUserSecondCustodianName,
81 prefs::kSupervisedUserSecondCustodianEmail, 81 prefs::kSupervisedUserSecondCustodianEmail,
82 prefs::kSupervisedUserSecondCustodianProfileImageURL, 82 prefs::kSupervisedUserSecondCustodianProfileImageURL,
83 prefs::kSupervisedUserSecondCustodianProfileURL, 83 prefs::kSupervisedUserSecondCustodianProfileURL,
84 }; 84 };
85 85
86 #if defined(ENABLE_EXTENSIONS)
87 enum ExtensionState {
88 EXTENSION_FORCED,
89 EXTENSION_BLOCKED,
90 EXTENSION_ALLOWED
91 };
92
93 ExtensionState GetExtensionState(const extensions::Extension* extension) {
94 // |extension| can be NULL in unit_tests.
95 if (extension && extension->is_theme())
96 return EXTENSION_ALLOWED;
97
98 bool was_installed_by_default = extension->was_installed_by_default();
Pam (message me for reviews) 2015/02/23 10:18:50 If indeed |extension| can be NULL in unit tests, k
Marc Treib 2015/02/23 12:07:38 Huh. Since I got green try runs, looks like extens
99 bool was_installed_by_custodian = extension->was_installed_by_custodian();
100 #if defined(OS_CHROMEOS)
101 // On Chrome OS all external sources are controlled by us so it means that
102 // they are "default". Method was_installed_by_default returns false because
103 // extensions creation flags are ignored in case of default extensions with
104 // update URL(the flags aren't passed to OnExternalExtensionUpdateUrlFound).
105 // TODO(dpolukhin): remove this Chrome OS specific code as soon as creation
106 // flags are not ignored.
107 was_installed_by_default =
108 extensions::Manifest::IsExternalLocation(extension->location());
109 #endif
110 if (extensions::Manifest::IsComponentLocation(extension->location()) ||
111 was_installed_by_default ||
112 was_installed_by_custodian) {
113 // Enforce default extensions as well as custodian-installed extensions
114 // (if we'd allow the supervised user to uninstall them, there'd be no way
115 // to get them back).
116 return EXTENSION_FORCED;
117 }
118
119 return EXTENSION_BLOCKED;
120 }
121 #endif
122
86 } // namespace 123 } // namespace
87 124
88 base::FilePath SupervisedUserService::Delegate::GetBlacklistPath() const { 125 base::FilePath SupervisedUserService::Delegate::GetBlacklistPath() const {
89 return base::FilePath(); 126 return base::FilePath();
90 } 127 }
91 128
92 GURL SupervisedUserService::Delegate::GetBlacklistURL() const { 129 GURL SupervisedUserService::Delegate::GetBlacklistURL() const {
93 return GURL(); 130 return GURL();
94 } 131 }
95 132
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 void SupervisedUserService::RemoveObserver( 379 void SupervisedUserService::RemoveObserver(
343 SupervisedUserServiceObserver* observer) { 380 SupervisedUserServiceObserver* observer) {
344 observer_list_.RemoveObserver(observer); 381 observer_list_.RemoveObserver(observer);
345 } 382 }
346 383
347 void SupervisedUserService::AddPermissionRequestCreator( 384 void SupervisedUserService::AddPermissionRequestCreator(
348 scoped_ptr<PermissionRequestCreator> creator) { 385 scoped_ptr<PermissionRequestCreator> creator) {
349 permissions_creators_.push_back(creator.release()); 386 permissions_creators_.push_back(creator.release());
350 } 387 }
351 388
352 #if defined(ENABLE_EXTENSIONS)
353 std::string SupervisedUserService::GetDebugPolicyProviderName() const {
354 // Save the string space in official builds.
355 #ifdef NDEBUG
356 NOTREACHED();
357 return std::string();
358 #else
359 return "Supervised User Service";
360 #endif
361 }
362
363 bool SupervisedUserService::UserMayLoad(const extensions::Extension* extension,
364 base::string16* error) const {
365 base::string16 tmp_error;
366 if (ExtensionManagementPolicyImpl(extension, &tmp_error))
367 return true;
368
369 bool was_installed_by_default = extension->was_installed_by_default();
370 bool was_installed_by_custodian = extension->was_installed_by_custodian();
371 #if defined(OS_CHROMEOS)
372 // On Chrome OS all external sources are controlled by us so it means that
373 // they are "default". Method was_installed_by_default returns false because
374 // extensions creation flags are ignored in case of default extensions with
375 // update URL(the flags aren't passed to OnExternalExtensionUpdateUrlFound).
376 // TODO(dpolukhin): remove this Chrome OS specific code as soon as creation
377 // flags are not ignored.
378 was_installed_by_default =
379 extensions::Manifest::IsExternalLocation(extension->location());
380 #endif
381 if (extensions::Manifest::IsComponentLocation(extension->location()) ||
382 was_installed_by_default ||
383 was_installed_by_custodian) {
384 return true;
385 }
386
387 if (error)
388 *error = tmp_error;
389 return false;
390 }
391
392 bool SupervisedUserService::UserMayModifySettings(
393 const extensions::Extension* extension,
394 base::string16* error) const {
395 return ExtensionManagementPolicyImpl(extension, error);
396 }
397
398 #endif // defined(ENABLE_EXTENSIONS)
399
400 syncer::ModelTypeSet SupervisedUserService::GetPreferredDataTypes() const { 389 syncer::ModelTypeSet SupervisedUserService::GetPreferredDataTypes() const {
401 if (!ProfileIsSupervised()) 390 if (!ProfileIsSupervised())
402 return syncer::ModelTypeSet(); 391 return syncer::ModelTypeSet();
403 392
404 syncer::ModelTypeSet result; 393 syncer::ModelTypeSet result;
405 if (IncludesSyncSessionsType()) 394 if (IncludesSyncSessionsType())
406 result.Put(syncer::SESSIONS); 395 result.Put(syncer::SESSIONS);
407 result.Put(syncer::EXTENSIONS); 396 result.Put(syncer::EXTENSIONS);
408 result.Put(syncer::EXTENSION_SETTINGS); 397 result.Put(syncer::EXTENSION_SETTINGS);
409 result.Put(syncer::APPS); 398 result.Put(syncer::APPS);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 bool sync_everything = false; 468 bool sync_everything = false;
480 syncer::ModelTypeSet synced_datatypes; 469 syncer::ModelTypeSet synced_datatypes;
481 service->OnUserChoseDatatypes(sync_everything, synced_datatypes); 470 service->OnUserChoseDatatypes(sync_everything, synced_datatypes);
482 471
483 // Notify ProfileSyncService that we are done with configuration. 472 // Notify ProfileSyncService that we are done with configuration.
484 service->SetSetupInProgress(false); 473 service->SetSetupInProgress(false);
485 service->SetSyncSetupCompleted(); 474 service->SetSyncSetupCompleted();
486 } 475 }
487 476
488 #if defined(ENABLE_EXTENSIONS) 477 #if defined(ENABLE_EXTENSIONS)
489 bool SupervisedUserService::ExtensionManagementPolicyImpl( 478 std::string SupervisedUserService::GetDebugPolicyProviderName() const {
479 // Save the string space in official builds.
480 #ifdef NDEBUG
481 NOTREACHED();
482 return std::string();
483 #else
484 return "Supervised User Service";
485 #endif
486 }
487
488 bool SupervisedUserService::UserMayLoad(const extensions::Extension* extension,
489 base::string16* error) const {
490 DCHECK(ProfileIsSupervised());
491 ExtensionState result = GetExtensionState(extension);
492 bool may_load = (result != EXTENSION_BLOCKED);
493 if (!may_load && error)
494 *error = l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOCKED_SUPERVISED_USER);
495 return may_load;
496 }
497
498 // Note: Having MustRemainInstalled always say "true" for custodian-installed
499 // extensions does NOT prevent remote uninstalls (which is a bit unexpected, but
500 // exactly what we want).
501 bool SupervisedUserService::MustRemainInstalled(
490 const extensions::Extension* extension, 502 const extensions::Extension* extension,
491 base::string16* error) const { 503 base::string16* error) const {
492 // |extension| can be NULL in unit_tests. 504 DCHECK(ProfileIsSupervised());
493 if (!ProfileIsSupervised() || (extension && extension->is_theme())) 505 ExtensionState result = GetExtensionState(extension);
494 return true; 506 bool may_uninstall = (result != EXTENSION_FORCED);
Pam (message me for reviews) 2015/02/23 10:18:50 Please change the sense of this (i.e. use may_not_
Marc Treib 2015/02/23 12:07:38 Done.
495 507 if (!may_uninstall && error)
496 if (error)
497 *error = l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOCKED_SUPERVISED_USER); 508 *error = l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOCKED_SUPERVISED_USER);
498 return false; 509 return !may_uninstall;
499 } 510 }
500 511
501 void SupervisedUserService::SetExtensionsActive() { 512 void SupervisedUserService::SetExtensionsActive() {
502 extensions::ExtensionSystem* extension_system = 513 extensions::ExtensionSystem* extension_system =
503 extensions::ExtensionSystem::Get(profile_); 514 extensions::ExtensionSystem::Get(profile_);
504 extensions::ManagementPolicy* management_policy = 515 extensions::ManagementPolicy* management_policy =
505 extension_system->management_policy(); 516 extension_system->management_policy();
506 517
507 if (management_policy) { 518 if (management_policy) {
508 if (active_) 519 if (active_)
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 // The active user can be NULL in unit tests. 959 // The active user can be NULL in unit tests.
949 if (user_manager::UserManager::Get()->GetActiveUser()) { 960 if (user_manager::UserManager::Get()->GetActiveUser()) {
950 return UTF16ToUTF8(user_manager::UserManager::Get()->GetUserDisplayName( 961 return UTF16ToUTF8(user_manager::UserManager::Get()->GetUserDisplayName(
951 user_manager::UserManager::Get()->GetActiveUser()->GetUserID())); 962 user_manager::UserManager::Get()->GetActiveUser()->GetUserID()));
952 } 963 }
953 return std::string(); 964 return std::string();
954 #else 965 #else
955 return profile_->GetPrefs()->GetString(prefs::kProfileName); 966 return profile_->GetPrefs()->GetString(prefs::kProfileName);
956 #endif 967 #endif
957 } 968 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698