Commit 6c342178 authored by bartfab's avatar bartfab Committed by Commit bot

Do not use unaffiliated users' connections for device policy pushing

Device policy pushing requires a connected invalidation service. When
a user logs in, an invalidation service is typically spun up for the
user. Device policy pushing can reuse this service instead of running
its own invalidation service to conserve server resources.

This CL ensures that for privacy reasons, device policy pushing only
reuses the user's invalidation service if the user is affiliated with
the device.

BUG=415094
TEST=New unit test

Review URL: https://codereview.chromium.org/567393006

Cr-Commit-Position: refs/heads/master@{#295483}
parent 2430b2a3
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
#include "chrome/browser/chromeos/policy/ticl_device_settings_provider.h" #include "chrome/browser/chromeos/policy/ticl_device_settings_provider.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/settings/device_identity_provider.h" #include "chrome/browser/chromeos/settings/device_identity_provider.h"
#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h" #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h"
...@@ -31,6 +32,8 @@ ...@@ -31,6 +32,8 @@
#include "components/invalidation/profile_invalidation_provider.h" #include "components/invalidation/profile_invalidation_provider.h"
#include "components/invalidation/ticl_invalidation_service.h" #include "components/invalidation/ticl_invalidation_service.h"
#include "components/invalidation/ticl_settings_provider.h" #include "components/invalidation/ticl_settings_provider.h"
#include "components/policy/core/common/cloud/cloud_policy_constants.h"
#include "components/user_manager/user.h"
#include "content/public/browser/notification_details.h" #include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "google_apis/gaia/identity_provider.h" #include "google_apis/gaia/identity_provider.h"
...@@ -141,15 +144,23 @@ void DeviceCloudPolicyInvalidator::Observe( ...@@ -141,15 +144,23 @@ void DeviceCloudPolicyInvalidator::Observe(
const content::NotificationSource& source, const content::NotificationSource& source,
const content::NotificationDetails& details) { const content::NotificationDetails& details) {
DCHECK_EQ(chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, type); DCHECK_EQ(chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, type);
Profile* profile = content::Details<Profile>(details).ptr();
invalidation::ProfileInvalidationProvider* invalidation_provider = invalidation::ProfileInvalidationProvider* invalidation_provider =
invalidation::ProfileInvalidationProviderFactory::GetForProfile( invalidation::ProfileInvalidationProviderFactory::GetForProfile(profile);
content::Details<Profile>(details).ptr());
if (!invalidation_provider) { if (!invalidation_provider) {
// If the Profile does not support invalidation (e.g. guest, incognito), // If the Profile does not support invalidation (e.g. guest, incognito),
// ignore it. // ignore it.
return; return;
} }
user_manager::User* user =
chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
if (!user ||
g_browser_process->platform_part()->browser_policy_connector_chromeos()->
GetUserAffiliation(user->email()) != USER_AFFILIATION_MANAGED) {
// If the Profile belongs to a user who is not affiliated with the domain
// the device is enrolled into, ignore it.
return;
}
// Create a state observer for the user's invalidation service. // Create a state observer for the user's invalidation service.
profile_invalidation_service_observers_.push_back( profile_invalidation_service_observers_.push_back(
new InvalidationServiceObserver( new InvalidationServiceObserver(
...@@ -209,9 +220,9 @@ void DeviceCloudPolicyInvalidator::TryToCreateInvalidator() { ...@@ -209,9 +220,9 @@ void DeviceCloudPolicyInvalidator::TryToCreateInvalidator() {
profile_invalidation_service_observers_.begin(); profile_invalidation_service_observers_.begin();
it != profile_invalidation_service_observers_.end(); ++it) { it != profile_invalidation_service_observers_.end(); ++it) {
if ((*it)->IsServiceConnected()) { if ((*it)->IsServiceConnected()) {
// If a connected invalidation service belonging to a logged-in user is // If a connected invalidation service belonging to an affiliated
// found, create a |CloudPolicyInvalidator| backed by that service and // logged-in user is found, create a |CloudPolicyInvalidator| backed by
// destroy the device-global service, if any. // that service and destroy the device-global service, if any.
DestroyDeviceInvalidationService(); DestroyDeviceInvalidationService();
CreateInvalidator((*it)->GetInvalidationService()); CreateInvalidator((*it)->GetInvalidationService());
return; return;
......
...@@ -23,12 +23,11 @@ namespace policy { ...@@ -23,12 +23,11 @@ namespace policy {
class CloudPolicyInvalidator; class CloudPolicyInvalidator;
// This class provides invalidations for device policy via a // This class provides invalidations for device policy via a
// |CloudPolicyInvalidator| backed by an |InvalidationService|. If a user with a // |CloudPolicyInvalidator| backed by an |InvalidationService|. If an affiliated
// connected invalidation service is logged in, that service is used to conserve // user with a connected invalidation service is logged in, that service is used
// server resources. If there are no logged-in users or none of them have // to conserve server resources. If there are no logged-in users matching these
// connected invalidation services, a device-global |TiclInvalidationService| is // criteria, a device-global |TiclInvalidationService| is spun up.
// spun up. // The class monitors the status of the invalidation services and switches
// The class monitors the status of all invalidation services and switches
// between them whenever the service currently in use disconnects or the // between them whenever the service currently in use disconnects or the
// device-global invalidation service can be replaced with another service that // device-global invalidation service can be replaced with another service that
// just connected. // just connected.
...@@ -55,11 +54,11 @@ class DeviceCloudPolicyInvalidator : public content::NotificationObserver { ...@@ -55,11 +54,11 @@ class DeviceCloudPolicyInvalidator : public content::NotificationObserver {
invalidation::InvalidationService* invalidation_service); invalidation::InvalidationService* invalidation_service);
// Attempt to create a |CloudPolicyInvalidator| backed by a connected // Attempt to create a |CloudPolicyInvalidator| backed by a connected
// invalidation service. If there is no connected invalidation service, a // invalidation service. If no connected invalidation service is available for
// |CloudPolicyInvalidator| will be created later when a connected service // use, a |CloudPolicyInvalidator| will be created later when a connected
// becomes available. // service becomes available.
// Further ensures that a device-global invalidation service is running iff // Further ensures that a device-global invalidation service is running iff
// there is no other connected service. // there is no other connected service available for use.
void TryToCreateInvalidator(); void TryToCreateInvalidator();
// Create a |CloudPolicyInvalidator| backed by the |invalidation_service|. // Create a |CloudPolicyInvalidator| backed by the |invalidation_service|.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment