Chromium Code Reviews| Index: chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc |
| diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc b/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc |
| index f73ec0ceb7924b4cee34ba619a98db1525294b92..8dcb422d81ee6264dc9debfef8541ade5abedc7d 100644 |
| --- a/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc |
| +++ b/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc |
| @@ -19,9 +19,9 @@ |
| #include "base/stl_util.h" |
| #include "base/strings/stringprintf.h" |
| #include "chrome/browser/chromeos/policy/user_policy_token_loader.h" |
| +#include "chrome/browser/lifetime/application_lifetime.h" |
| #include "chromeos/cryptohome/cryptohome_parameters.h" |
| #include "chromeos/dbus/cryptohome_client.h" |
| -#include "chromeos/dbus/session_manager_client.h" |
| #include "components/policy/core/common/cloud/cloud_policy_constants.h" |
| #include "components/policy/proto/cloud_policy.pb.h" |
| #include "components/policy/proto/device_management_local.pb.h" |
| @@ -109,11 +109,20 @@ void UserCloudPolicyStoreChromeOS::LoadImmediately() { |
| // However, on those paths we must load policy synchronously so that the |
| // Profile initialization never sees unmanaged prefs, which would lead to |
| // data loss. http://crbug.com/263061 |
| - std::string policy_blob = |
| + std::string policy_blob; |
| + RetrievePolicyResponseType response_type = |
| session_manager_client_->BlockingRetrievePolicyForUser( |
| - cryptohome::Identification(account_id_)); |
| + cryptohome::Identification(account_id_), &policy_blob); |
| + |
| + if (response_type == RetrievePolicyResponseType::SESSION_DOES_NOT_EXIST) { |
| + LOG(ERROR) |
| + << "Session manager claims that session doesn't exist; signing out"; |
| + chrome::AttemptUserExit(); |
| + return; |
| + } |
| + |
| if (policy_blob.empty()) { |
| - // The session manager doesn't have policy, or the call failed. |
| + // The session manager doesn't have policy. |
|
emaxx
2017/04/24 16:37:50
nit: Please restore the original comment, given th
igorcov
2017/04/25 09:18:41
Done.
|
| NotifyStoreLoaded(); |
| return; |
| } |
| @@ -214,7 +223,19 @@ void UserCloudPolicyStoreChromeOS::OnPolicyStored(bool success) { |
| } |
| void UserCloudPolicyStoreChromeOS::OnPolicyRetrieved( |
| - const std::string& policy_blob) { |
| + const std::string& policy_blob, |
| + RetrievePolicyResponseType response_type) { |
| + // Disallow the sign in when the Chrome OS user session has not started, which |
| + // should always happen before the profile construction. An attempt to read |
| + // the policy outside the session will always fail and return an empty policy |
| + // blob. |
| + if (response_type == RetrievePolicyResponseType::SESSION_DOES_NOT_EXIST) { |
| + LOG(ERROR) |
| + << "Session manager claims that session doesn't exist; signing out"; |
| + chrome::AttemptUserExit(); |
| + return; |
| + } |
| + |
| if (policy_blob.empty()) { |
| // session_manager doesn't have policy. Adjust internal state and notify |
| // the world about the policy update. |