Index: chrome/browser/chromeos/platform_keys/key_permissions.h |
diff --git a/chrome/browser/chromeos/platform_keys/key_permissions.h b/chrome/browser/chromeos/platform_keys/key_permissions.h |
index af584e2d10c60696045c9fc4077abbaaee7c2c69..69eb4038aebb24ef81c4a5a6719be3953ef9367b 100644 |
--- a/chrome/browser/chromeos/platform_keys/key_permissions.h |
+++ b/chrome/browser/chromeos/platform_keys/key_permissions.h |
@@ -12,7 +12,10 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
+class PrefService; |
+ |
namespace base { |
+class DictionaryValue; |
class Value; |
} |
@@ -20,15 +23,53 @@ namespace extensions { |
class StateStore; |
} |
+namespace policy { |
+class PolicyService; |
+} |
+ |
+namespace user_prefs { |
+class PrefRegistrySyncable; |
+} |
+ |
namespace chromeos { |
// This class manages permissions for extensions to use private keys through |
-// chrome.platformKeys . |
-// It handles the following permissions: |
-// * The extension that generated a key has the permission to sign arbitrary |
-// data with that key at most once. |
-// * The user can explicitly grant an extension the permission to sign |
-// arbitrary data with a key an unlimited number of times. |
+// chrome.platformKeys or chrome.enterprise.platformKeys . |
+// The permission model depends on whether the user account is managed or not. |
+// |
+// ** If the user account is not managed ** |
+// The user is under full control of the keys that are generated or imported |
+// while the device is not managed. For that, a user can grant a specific |
+// extension the permission to sign arbitrary data with a specific key for an |
+// unlimited number of times. |
+// |
+// ** If the user account is managed ** |
+// The administrator is in charge of granting access to keys that are meant for |
+// corporate usage. |
+// |
+// As not every key is meant for corporate usage but probably for the user's |
+// private usage, this class introduces the concept of tagging keys with the |
+// intended purpose of the key. Currently, the only usage that can be assigned |
+// to a key is "corporate". |
+// |
+// Every key that is generated by the chrome.enterprise.platformKeys API (which |
+// requires the user account to be managed), is marked for corporate usage. |
+// Any key that is generated or imported by other means is currently not marked |
+// for corporate usage. |
+// |
+// The KeyPermissions policy allows the administrator to list exactly the |
+// extensions that are allowed to use such corporate keys. Non-corporate keys |
+// are not affected. This policy is the only means to grant this permission. |
+// |
+// ** One-off Permission for the Certification Requests ** |
+// Independent of the above, the extension that generates a key using the |
+// chrome.enterprise.platformKeys API is allowed to sign arbitrary data with the |
+// private key for a single time in order to create a certification request. |
+// The assumption is that certification requests usually require a signature of |
+// data including the public key. So the one-off permission implies that once a |
+// certificate authority creates the certificate of the generated key, the |
+// generating extension isn't able to use the key anymore except if explicitly |
+// permitted by the administrator. |
class KeyPermissions { |
public: |
// Allows querying and modifying permissions and registering keys for a |
@@ -41,6 +82,8 @@ class KeyPermissions { |
// |KeyPermissions::GetPermissionsForExtension| instead. |
PermissionsForExtension(const std::string& extension_id, |
scoped_ptr<base::Value> state_store_value, |
+ PrefService* profile_prefs, |
+ policy::PolicyService* profile_policies, |
KeyPermissions* key_permissions); |
~PermissionsForExtension(); |
@@ -92,17 +135,26 @@ class KeyPermissions { |
KeyPermissions::PermissionsForExtension::KeyEntry* GetStateStoreEntry( |
const std::string& public_key_spki_der_b64); |
+ bool PolicyAllowsCorporateKeyUsage() const; |
+ |
const std::string extension_id_; |
std::vector<KeyEntry> state_store_entries_; |
+ PrefService* const profile_prefs_; |
+ policy::PolicyService* const profile_policies_; |
KeyPermissions* const key_permissions_; |
DISALLOW_COPY_AND_ASSIGN(PermissionsForExtension); |
}; |
- // |extensions_state_store| must not be null and outlive this object. |
+ // |profile_prefs| and |extensions_state_store| must not be null and must |
+ // outlive this object. |
+ // If |profile_is_managed| is false, |profile_policies| is ignored. Otherwise, |
+ // |profile_policies| must not be null and must outlive this object. |
// |profile_is_managed| determines the default usage and permissions for |
// keys without explicitly assigned usage. |
KeyPermissions(bool profile_is_managed, |
+ PrefService* profile_prefs, |
+ policy::PolicyService* profile_policies, |
extensions::StateStore* extensions_state_store); |
~KeyPermissions(); |
@@ -119,9 +171,13 @@ class KeyPermissions { |
// Returns true if the user can grant any permission for |public_key_spki_der| |
// to extensions. |public_key_spki_der| must be the DER of a Subject Public |
// Key Info. |
- bool CanUserGrantPermissionFor(const std::string& public_key_spki_der); |
+ bool CanUserGrantPermissionFor(const std::string& public_key_spki_der) const; |
+ |
+ static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); |
private: |
+ bool IsCorporateKey(const std::string& public_key_spki_der_b64) const; |
+ |
// Creates a PermissionsForExtension object from |extension_id| and |value| |
// and passes the object to |callback|. |
void CreatePermissionObjectAndPassToCallback( |
@@ -133,7 +189,12 @@ class KeyPermissions { |
void SetPlatformKeysOfExtension(const std::string& extension_id, |
scoped_ptr<base::Value> value); |
+ const base::DictionaryValue* GetPrefsEntry( |
+ const std::string& public_key_spki_der_b64) const; |
+ |
const bool profile_is_managed_; |
+ PrefService* const profile_prefs_; |
+ policy::PolicyService* const profile_policies_; |
extensions::StateStore* const extensions_state_store_; |
base::WeakPtrFactory<KeyPermissions> weak_factory_; |