# Cloud Policy Cloud Policy is the system to enforce some feature to enable or disable. For example, [kLacrosAvailability](https://source.chromium.org/chromium/chromium/src/+/main:out/chromeos-Debug/gen/components/policy/policy_constants.cc;l=5840;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) is the policy to decide whether lacros is available. Let's see how policy is managed. ## Policy Management [PolicyManager](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/policy/core/device_local_account_policy_provider.cc;l=148-150;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) is the main switching cenrtal between cloud policy and the policy stack. When cloud policy store is loaded, [OnStoreLoaded](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/cloud/cloud_policy_store.h;l=34;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) is called and [CheckAndPublichPolicy](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/cloud/cloud_policy_manager.cc;l=116;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090). For Ash, [UserCloudPolicyManagerAsh](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h;l=55;drc=7b9d035e02962c8d9141eaa9fd31a2613c5000c6) is the actual implementation. Here, we have [PolicyEnforcement](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h;l=63;drc=7b9d035e02962c8d9141eaa9fd31a2613c5000c6) enum which represents how much we should enfore the policy. For example, if the enforcement is `kPolicyOptional`, you can allow to start without the policy if it's already started, and not for others. ```cpp= if (!client()->is_registered() && enforcement_type_ != PolicyEnforcement::kPolicyOptional) { // We expected to load policy, but we don't have policy, so exit the // session. LOG(ERROR) << "Failed to load policy during synchronous restart " << "- terminating session"; if (fatal_error_callback_) std::move(fatal_error_callback_).Run(); return; } ``` This policy is tied with profile. [`user_cloud_policy_manager_ash_`](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/profiles/profile_impl.cc;l=575;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) is constructed and owned by Profile object construction. So, policy is not initialized before the profile construction., Sometime, we also need to update policy while Chrome is running. For example, when [DeviceSettingsUpdated](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc;l=133;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090), it may affect policy. This policy update seems to be comming from [proto](https://source.chromium.org/chromium/chromium/src/+/main:out/chromeos-Debug/gen/components/policy/proto/device_management_backend.pb.h;l=7798;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090) outside of Chrome. ## How to set/get policy The list of policy is stored as [PolicyMap](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_map.h;l=35;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090). You can set the value from [PolicyMap::Set](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_map.cc;l=373;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090). Many policies will be set from auto generated files by [policy_constants](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/BUILD.gn;l=257;drc=3d1f3fe767c49bdd55fbf3e1bba212b17cbfb271). Some polices are also set from each provider such as [DeviceLocalAccountPolicyProvider](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/policy/core/device_local_account_policy_provider.cc;l=148-150;drc=f4a00cc248dd2dc8ec8759fb51620d47b5114090). The set policy can be obtained from GetValue. For example, given policy map `map`, you can get the value for the target key `kLacrosAvilability` like this: ```cpp= const base::Value* value = map.GetValue(policy::key::kLacrosAvailability, base::Value::Type::STRING); ```