Index: chrome/browser/chromeos/policy/active_directory_policy_manager.h |
diff --git a/chrome/browser/chromeos/policy/active_directory_policy_manager.h b/chrome/browser/chromeos/policy/active_directory_policy_manager.h |
index 46cf742e3f35dd633174965ce6ff71098e0418d7..abea495d8e818a5ecefa015b229bc44898841cad 100644 |
--- a/chrome/browser/chromeos/policy/active_directory_policy_manager.h |
+++ b/chrome/browser/chromeos/policy/active_directory_policy_manager.h |
@@ -7,8 +7,11 @@ |
#include <memory> |
+#include "base/bind.h" |
#include "base/macros.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/time/time.h" |
+#include "base/timer/timer.h" |
#include "components/policy/core/common/cloud/cloud_policy_store.h" |
#include "components/policy/core/common/configuration_policy_provider.h" |
#include "components/policy/core/common/policy_scheduler.h" |
@@ -18,9 +21,11 @@ namespace policy { |
// ConfigurationPolicyProvider for device or user policy from Active Directory. |
// The choice of constructor determines whether device or user policy is |
-// provided. The policy is fetched from the Domain Controller by authpolicyd |
-// which stores it in session manager and from where it is loaded by |
-// ActiveDirectoryPolicyManager. |
+// provided. |
+// Data flow: Triggered by DoPolicyFetch(), policy is fetched by authpolicyd and |
+// stored in session manager with completion indicated by OnPolicyFetched(). |
+// From there policy load from session manager is triggered, completion of which |
+// is notified via OnStoreLoaded()/OnStoreError(). |
class ActiveDirectoryPolicyManager : public ConfigurationPolicyProvider, |
public CloudPolicyStore::Observer { |
public: |
@@ -33,6 +38,9 @@ class ActiveDirectoryPolicyManager : public ConfigurationPolicyProvider, |
// Create manager for |accound_id| user policy. |
static std::unique_ptr<ActiveDirectoryPolicyManager> CreateForUserPolicy( |
const AccountId& account_id, |
+ bool wait_for_policy_fetch, |
+ base::TimeDelta initial_policy_fetch_timeout, |
+ base::OnceClosure exit_session, |
std::unique_ptr<CloudPolicyStore> store); |
// ConfigurationPolicyProvider: |
@@ -47,10 +55,25 @@ class ActiveDirectoryPolicyManager : public ConfigurationPolicyProvider, |
CloudPolicyStore* store() const { return store_.get(); } |
+ // Helper function to force a policy fetch timeout. |
+ void ForceTimeoutForTest(); |
+ |
private: |
- // |account_id| specifies the user to manage policy for. If |account_id| is |
+ // |account_id| specifies the user to manage policy for. If |account_id| is |
// empty, device policy is managed. |
+ // |
+ // The following applies to user policy only: If |wait_for_policy_fetch| is |
+ // true, IsInitializationComplete() is forced to false until either there has |
+ // been a successful policy fetch from the server and a subsequent successful |
+ // load from session manager or |initial_policy_fetch_timeout| has expired and |
+ // there has been a successful load from session manager. The timeout may be |
+ // set to TimeDelta::Max() to enforce successful policy fetch. In case the |
+ // conditions for signaling initialization complete are not met, the user |
+ // session is aborted by calling |exit_session|. |
ActiveDirectoryPolicyManager(const AccountId& account_id, |
+ bool wait_for_policy_fetch, |
+ base::TimeDelta initial_policy_fetch_timeout, |
+ base::OnceClosure exit_session, |
std::unique_ptr<CloudPolicyStore> store); |
// Publish the policy that's currently cached in the store. |
@@ -58,14 +81,49 @@ class ActiveDirectoryPolicyManager : public ConfigurationPolicyProvider, |
// Calls into authpolicyd to fetch policy. Reports success or failure via |
// |callback|. |
- void DoFetch(PolicyScheduler::TaskCallback callback); |
+ void DoPolicyFetch(PolicyScheduler::TaskCallback callback); |
- // Called by scheduler with result of policy fetch. |
+ // Called by scheduler with result of policy fetch. This covers policy |
+ // download, parsing and storing into session manager. (To access and publish |
+ // the policy, the store needs to be reloaded from session manager.) |
void OnPolicyFetched(bool success); |
+ // Called when |initial_policy_timeout_| times out, to cancel the blocking |
+ // wait for the initial policy fetch. |
+ void OnBlockingFetchTimeout(); |
+ |
+ // Cancels waiting for the initial policy fetch/load and flags the |
+ // ConfigurationPolicyProvider ready (assuming all other initialization tasks |
+ // have completed) or exits the session in case the requirements to continue |
+ // have not been met. |success| denotes whether the policy fetch was |
+ // successful. |
+ void CancelWaitForInitialPolicy(bool success); |
+ |
const AccountId account_id_; |
- std::unique_ptr<CloudPolicyStore> store_; |
+ // Whether we're waiting for a policy fetch to complete before reporting |
+ // IsInitializationComplete(). |
+ bool waiting_for_initial_policy_fetch_; |
+ |
+ // Whether the user session is continued in case of failure of initial policy |
+ // fetch. |
+ bool initial_policy_fetch_may_fail_; |
+ |
+ // Whether policy fetch has ever been reported as completed by authpolicyd. |
+ bool fetch_ever_completed_ = false; |
+ |
+ // Whether policy fetch has ever been reported as successful by authpolicyd. |
+ bool fetch_ever_succeeded_ = false; |
+ |
+ // A timer that puts a hard limit on the maximum time to wait for the initial |
+ // policy fetch/load. |
+ base::Timer initial_policy_timeout_{false /* retain_user_task */, |
+ false /* is_repeating */}; |
+ |
+ // Callback to exit the session. |
+ base::OnceClosure exit_session_; |
+ |
+ std::unique_ptr<CloudPolicyStore> store_; |
std::unique_ptr<PolicyScheduler> scheduler_; |
// Must be last member. |