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..42a8b5f4e6d44f463472d3b20a4b5518209bb5e9 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,10 +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; | 
| + chromeos::SessionManagerClient::RetrievePolicyResponseType response_type = | 
| session_manager_client_->BlockingRetrievePolicyForUser( | 
| - cryptohome::Identification(account_id_)); | 
| - if (policy_blob.empty()) { | 
| + cryptohome::Identification(account_id_), &policy_blob); | 
| + | 
| + if (response_type == chromeos::SessionManagerClient:: | 
| + RetrievePolicyResponseType::SESSION_DOES_NOT_EXIST) { | 
| 
 
Daniel Erat
2017/04/20 21:06:38
if this is unexpected, can you at least do somethi
 
igorcov
2017/04/21 11:36:21
Done.
 
 | 
| + chrome::AttemptUserExit(); | 
| + return; | 
| + } | 
| + | 
| + if (response_type == | 
| + chromeos::SessionManagerClient::RetrievePolicyResponseType::SUCCESS && | 
| + policy_blob.empty()) { | 
| // The session manager doesn't have policy, or the call failed. | 
| 
 
emaxx
2017/04/21 00:01:52
nit: Looks like the "or the call failed" part is n
 
igorcov
2017/04/21 11:36:21
Done.
 
 | 
| NotifyStoreLoaded(); | 
| return; | 
| @@ -120,7 +130,9 @@ void UserCloudPolicyStoreChromeOS::LoadImmediately() { | 
| std::unique_ptr<em::PolicyFetchResponse> policy( | 
| new em::PolicyFetchResponse()); | 
| - if (!policy->ParseFromString(policy_blob)) { | 
| + if (response_type != | 
| + chromeos::SessionManagerClient::RetrievePolicyResponseType::SUCCESS || | 
| + !policy->ParseFromString(policy_blob)) { | 
| status_ = STATUS_PARSE_ERROR; | 
| 
 
emaxx
2017/04/21 00:01:52
The STATUS_PARSE_ERROR error is probably not the b
 
igorcov
2017/04/21 11:36:21
Done.
 
 | 
| NotifyStoreError(); | 
| return; | 
| @@ -214,8 +226,21 @@ void UserCloudPolicyStoreChromeOS::OnPolicyStored(bool success) { | 
| } | 
| void UserCloudPolicyStoreChromeOS::OnPolicyRetrieved( | 
| - const std::string& policy_blob) { | 
| - if (policy_blob.empty()) { | 
| + const std::string& policy_blob, | 
| + chromeos::SessionManagerClient::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 == chromeos::SessionManagerClient:: | 
| + RetrievePolicyResponseType::SESSION_DOES_NOT_EXIST) { | 
| 
 
Daniel Erat
2017/04/20 21:06:38
same comment here about logging an error
 
igorcov
2017/04/21 11:36:21
Done.
 
 | 
| + chrome::AttemptUserExit(); | 
| + return; | 
| + } | 
| + | 
| + if (policy_blob.empty() && | 
| + response_type == | 
| + chromeos::SessionManagerClient::RetrievePolicyResponseType::SUCCESS) { | 
| // session_manager doesn't have policy. Adjust internal state and notify | 
| // the world about the policy update. | 
| policy_map_.Clear(); | 
| @@ -227,7 +252,9 @@ void UserCloudPolicyStoreChromeOS::OnPolicyRetrieved( | 
| std::unique_ptr<em::PolicyFetchResponse> policy( | 
| new em::PolicyFetchResponse()); | 
| - if (!policy->ParseFromString(policy_blob)) { | 
| + if (response_type != | 
| + chromeos::SessionManagerClient::RetrievePolicyResponseType::SUCCESS || | 
| + !policy->ParseFromString(policy_blob)) { | 
| status_ = STATUS_PARSE_ERROR; | 
| NotifyStoreError(); | 
| return; |