 Chromium Code Reviews
 Chromium Code Reviews Issue 2801993002:
  Abandon user sign in when policy is retrieved before session started  (Closed)
    
  
    Issue 2801993002:
  Abandon user sign in when policy is retrieved before session started  (Closed) 
  | Index: chromeos/dbus/session_manager_client.cc | 
| diff --git a/chromeos/dbus/session_manager_client.cc b/chromeos/dbus/session_manager_client.cc | 
| index 9e87be84e0a371296c29620fa4930b9e484d6049..e890fa1d41e2f7c206071ce352c585357dc93468 100644 | 
| --- a/chromeos/dbus/session_manager_client.cc | 
| +++ b/chromeos/dbus/session_manager_client.cc | 
| @@ -15,6 +15,7 @@ | 
| #include "base/files/file_util.h" | 
| #include "base/location.h" | 
| #include "base/macros.h" | 
| +#include "base/metrics/histogram_macros.h" | 
| #include "base/path_service.h" | 
| #include "base/strings/string_number_conversions.h" | 
| #include "base/strings/string_util.h" | 
| @@ -74,6 +75,13 @@ void StoreFile(const base::FilePath& path, const std::string& data) { | 
| } | 
| } | 
| +// Helper to notify the callback with SUCCESS, to be used by the stub. | 
| +void NotifyOnRetrievePolicySuccess( | 
| + const SessionManagerClient::RetrievePolicyCallback& callback, | 
| + const std::string& protobuf) { | 
| + callback.Run(protobuf, SessionManagerClient::SUCCESS); | 
| +} | 
| + | 
| } // namespace | 
| // The SessionManagerClient implementation used in production. | 
| @@ -202,13 +210,13 @@ class SessionManagerClientImpl : public SessionManagerClient { | 
| void RetrieveDevicePolicy(const RetrievePolicyCallback& callback) override { | 
| dbus::MethodCall method_call(login_manager::kSessionManagerInterface, | 
| login_manager::kSessionManagerRetrievePolicy); | 
| - session_manager_proxy_->CallMethod( | 
| - &method_call, | 
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 
| - base::Bind(&SessionManagerClientImpl::OnRetrievePolicy, | 
| + session_manager_proxy_->CallMethodWithErrorCallback( | 
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 
| + base::Bind(&SessionManagerClientImpl::OnRetrievePolicySuccess, | 
| weak_ptr_factory_.GetWeakPtr(), | 
| - login_manager::kSessionManagerRetrievePolicy, | 
| - callback)); | 
| + login_manager::kSessionManagerRetrievePolicy, callback), | 
| + base::Bind(&SessionManagerClientImpl::OnRetrievePolicyError, | 
| + weak_ptr_factory_.GetWeakPtr(), callback)); | 
| } | 
| std::string BlockingRetrieveDevicePolicy() override { | 
| @@ -250,8 +258,7 @@ class SessionManagerClientImpl : public SessionManagerClient { | 
| const RetrievePolicyCallback& callback) override { | 
| CallRetrievePolicyByUsername( | 
| login_manager::kSessionManagerRetrieveDeviceLocalAccountPolicy, | 
| - account_name, | 
| - callback); | 
| + account_name, callback); | 
| } | 
| std::string BlockingRetrieveDeviceLocalAccountPolicy( | 
| @@ -495,14 +502,12 @@ class SessionManagerClientImpl : public SessionManagerClient { | 
| method_name); | 
| dbus::MessageWriter writer(&method_call); | 
| writer.AppendString(account_id); | 
| - session_manager_proxy_->CallMethod( | 
| - &method_call, | 
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 
| - base::Bind( | 
| - &SessionManagerClientImpl::OnRetrievePolicy, | 
| - weak_ptr_factory_.GetWeakPtr(), | 
| - method_name, | 
| - callback)); | 
| + session_manager_proxy_->CallMethodWithErrorCallback( | 
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 
| + base::Bind(&SessionManagerClientImpl::OnRetrievePolicySuccess, | 
| + weak_ptr_factory_.GetWeakPtr(), method_name, callback), | 
| + base::Bind(&SessionManagerClientImpl::OnRetrievePolicyError, | 
| + weak_ptr_factory_.GetWeakPtr(), callback)); | 
| } | 
| void CallStorePolicyByUsername(const std::string& method_name, | 
| @@ -615,12 +620,29 @@ class SessionManagerClientImpl : public SessionManagerClient { | 
| // Called when kSessionManagerRetrievePolicy or | 
| // kSessionManagerRetrievePolicyForUser method is complete. | 
| 
emaxx
2017/04/18 15:03:17
nit: Maybe change "complete" to "successfully comp
 
igorcov
2017/04/20 14:52:29
Done.
 | 
| - void OnRetrievePolicy(const std::string& method_name, | 
| - const RetrievePolicyCallback& callback, | 
| - dbus::Response* response) { | 
| + void OnRetrievePolicySuccess(const std::string& method_name, | 
| + const RetrievePolicyCallback& callback, | 
| + dbus::Response* response) { | 
| std::string serialized_proto; | 
| ExtractString(method_name, response, &serialized_proto); | 
| - callback.Run(serialized_proto); | 
| + callback.Run(serialized_proto, SUCCESS); | 
| + | 
| + UMA_HISTOGRAM_ENUMERATION("Enterprise.RetrievePolicyResponse", SUCCESS, | 
| + RETRIEVE_POLICY_RESPONSE_TYPE_COUNT); | 
| + } | 
| + | 
| + void OnRetrievePolicyError(const RetrievePolicyCallback& callback, | 
| 
emaxx
2017/04/18 15:03:17
nit: Please add a comment for this method.
 
igorcov
2017/04/20 14:52:29
Done.
 | 
| + dbus::ErrorResponse* response) { | 
| + RetrievePolicyResponseType response_type = OTHER_ERROR; | 
| + if (response->GetErrorName() == | 
| + login_manager::dbus_error::kSessionDoesNotExist) { | 
| + response_type = SESSION_DOES_NOT_EXIST; | 
| + } | 
| + callback.Run(std::string(), response_type); | 
| + | 
| + UMA_HISTOGRAM_ENUMERATION("Enterprise.RetrievePolicyResponse", | 
| + response_type, | 
| + RETRIEVE_POLICY_RESPONSE_TYPE_COUNT); | 
| } | 
| // Called when kSessionManagerStorePolicy or kSessionManagerStorePolicyForUser | 
| @@ -861,17 +883,19 @@ class SessionManagerClientStubImpl : public SessionManagerClient { | 
| void RetrieveDevicePolicy(const RetrievePolicyCallback& callback) override { | 
| base::FilePath owner_key_path; | 
| if (!PathService::Get(chromeos::FILE_OWNER_KEY, &owner_key_path)) { | 
| - callback.Run(""); | 
| + callback.Run("", SUCCESS); | 
| return; | 
| } | 
| base::FilePath device_policy_path = | 
| owner_key_path.DirName().AppendASCII(kStubDevicePolicyFile); | 
| base::PostTaskWithTraitsAndReplyWithResult( | 
| - FROM_HERE, base::TaskTraits() | 
| - .WithShutdownBehavior( | 
| - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) | 
| - .MayBlock(), | 
| - base::Bind(&GetFileContent, device_policy_path), callback); | 
| + FROM_HERE, | 
| + base::TaskTraits() | 
| + .WithShutdownBehavior( | 
| + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) | 
| + .MayBlock(), | 
| + base::Bind(&GetFileContent, device_policy_path), | 
| + base::Bind(&NotifyOnRetrievePolicySuccess, callback)); | 
| } | 
| std::string BlockingRetrieveDevicePolicy() override { | 
| base::FilePath owner_key_path; | 
| @@ -892,7 +916,7 @@ class SessionManagerClientStubImpl : public SessionManagerClient { | 
| .MayBlock(), | 
| base::Bind(&GetFileContent, | 
| GetUserFilePath(cryptohome_id, kStubPolicyFile)), | 
| - callback); | 
| + base::Bind(&NotifyOnRetrievePolicySuccess, callback)); | 
| } | 
| std::string BlockingRetrievePolicyForUser( | 
| const cryptohome::Identification& cryptohome_id) override { |