Index: chrome/browser/chromeos/platform_keys/platform_keys_service.h |
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service.h b/chrome/browser/chromeos/platform_keys/platform_keys_service.h |
index 71adf3b7a32088fc33e1725ac506de880566f9ba..082ef20071fe8b5a55ca0aa94f1777e4a5c5663a 100644 |
--- a/chrome/browser/chromeos/platform_keys/platform_keys_service.h |
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_service.h |
@@ -39,6 +39,36 @@ namespace chromeos { |
class PlatformKeysService : public KeyedService { |
public: |
+ struct KeyEntry; |
+ using KeyEntries = std::vector<KeyEntry>; |
+ |
+ // The SelectDelegate is used to select a single certificate from all |
+ // certificates matching a request (see SelectClientCertificates). E.g. this |
+ // can happen by exposing UI to let the user select. |
+ class SelectDelegate { |
+ public: |
+ // TODO(pneubeck): Handle if the selection was aborted, e.g. by the user. |
+ using CertificateSelectedCallback = |
+ base::Callback<void(scoped_refptr<net::X509Certificate> selection)>; |
+ |
+ SelectDelegate(); |
+ virtual ~SelectDelegate(); |
+ |
+ // Called on an interactive SelectClientCertificates call with the list of |
+ // matching certificates, |certs|. |
+ // The certificate passed to |callback| will be forwarded to the |
+ // calling extension and the extension will get unlimited sign permission |
+ // for this cert. By passing null to |callback|, no cert will be selected. |
+ // Must eventually call |callback| or be destructed. |callback| must not be |
+ // called after this delegate is destructed. |
+ virtual void Select(const std::string& extension_id, |
+ const net::CertificateList& certs, |
+ const CertificateSelectedCallback& callback) = 0; |
+ |
+ private: |
+ DISALLOW_ASSIGN(SelectDelegate); |
+ }; |
+ |
// Stores registration information in |state_store|, i.e. for each extension |
// the list of public keys that are valid to be used for signing. Each key can |
// be used for signing at most once. |
@@ -50,18 +80,22 @@ class PlatformKeysService : public KeyedService { |
extensions::StateStore* state_store); |
~PlatformKeysService() override; |
- // Disables the checks whether an extension is allowed to read client |
- // certificates or allowed to use the signing function of a key. |
- // TODO(pneubeck): Remove this once a permissions are implemented. |
- void DisablePermissionCheckForTesting(); |
+ // Sets the delegate which will be used for interactive |
+ // SelectClientCertificates calls. |
+ void SetSelectDelegate(scoped_ptr<SelectDelegate> delegate); |
+ |
+ // Grants unlimited sign permission for |cert| to the extension with the ID |
+ // |extension_id|. |
+ void GrantUnlimitedSignPermission(const std::string& extension_id, |
+ scoped_refptr<net::X509Certificate> cert); |
// If the generation was successful, |public_key_spki_der| will contain the |
// DER encoding of the SubjectPublicKeyInfo of the generated key and |
// |error_message| will be empty. If it failed, |public_key_spki_der| will be |
// empty and |error_message| contain an error message. |
- typedef base::Callback<void(const std::string& public_key_spki_der, |
- const std::string& error_message)> |
- GenerateKeyCallback; |
+ using GenerateKeyCallback = |
+ base::Callback<void(const std::string& public_key_spki_der, |
+ const std::string& error_message)>; |
// Generates an RSA key pair with |modulus_length_bits| and registers the key |
// to allow a single sign operation by the given extension. |token_id| is |
@@ -77,8 +111,8 @@ class PlatformKeysService : public KeyedService { |
// If signing was successful, |signature| will be contain the signature and |
// |error_message| will be empty. If it failed, |signature| will be empty and |
// |error_message| contain an error message. |
- typedef base::Callback<void(const std::string& signature, |
- const std::string& error_message)> SignCallback; |
+ using SignCallback = base::Callback<void(const std::string& signature, |
+ const std::string& error_message)>; |
// Digests |data|, applies PKCS1 padding and afterwards signs the data with |
// the private key matching |params.public_key|. If a non empty token id is |
@@ -118,27 +152,35 @@ class PlatformKeysService : public KeyedService { |
// contain the list of matching certificates (maybe empty) and |error_message| |
// will be empty. If an error occurred, |matches| will be null and |
// |error_message| contain an error message. |
- typedef base::Callback<void(scoped_ptr<net::CertificateList> matches, |
- const std::string& error_message)> |
- SelectCertificatesCallback; |
- |
- // Returns the list of all certificates that match |request|. |callback| will |
- // be invoked with these matches or an error message. |
+ using SelectCertificatesCallback = |
+ base::Callback<void(scoped_ptr<net::CertificateList> matches, |
+ const std::string& error_message)>; |
+ |
+ // Returns a list of certificates matching |request|. |
+ // 1) all certificates that match the request (like being rooted in one of the |
+ // give CAs) are determined. 2) if |interactive| is true, the currently set |
+ // SelectDelegate is used to select a single certificate from these matches |
+ // which will the extension will also be granted access to. 3) only |
+ // certificates, that the extension has unlimited sign permission for, will be |
+ // returned. |
+ // |callback| will be invoked with these certificates or an error message. |
// Will only call back during the lifetime of this object. |
- // TODO(pneubeck): Add the interactive option and integrate the select |
- // certificate dialog. |
void SelectClientCertificates( |
const platform_keys::ClientCertificateRequest& request, |
+ bool interactive, |
const std::string& extension_id, |
const SelectCertificatesCallback& callback); |
private: |
using GetPlatformKeysCallback = |
- base::Callback<void(scoped_ptr<base::ListValue> platform_keys)>; |
+ base::Callback<void(scoped_ptr<KeyEntries> platform_keys)>; |
+ |
+ enum SignPermission { ONCE, UNLIMITED }; |
- class Task; |
- class SignTask; |
class PermissionUpdateTask; |
+ class SelectTask; |
+ class SignTask; |
+ class Task; |
// Starts |task| eventually. To ensure that at most one |Task| is running at a |
// time, it queues |task| for later execution if necessary. |
@@ -159,7 +201,7 @@ class PlatformKeysService : public KeyedService { |
// Writes |platform_keys| to the state store of the extension with id |
// |extension_id|. |
void SetPlatformKeysOfExtension(const std::string& extension_id, |
- scoped_ptr<base::ListValue> platform_keys); |
+ const KeyEntries& platform_keys); |
// Callback used by |GenerateRSAKey|. |
// If the key generation was successful, registers the generated public key |
@@ -179,17 +221,6 @@ class PlatformKeysService : public KeyedService { |
const std::string& public_key_spki_der, |
Task* task); |
- // Calback used by |SelectClientCertificates|. |
- // If the certificate request could be processed successfully, |matches| will |
- // contain the list of matching certificates (maybe empty) and |error_message| |
- // will be empty. If an error occurred, |matches| will be null and |
- // |error_message| contain an error message. |
- void SelectClientCertificatesCallback( |
- const std::string& extension_id, |
- const SelectCertificatesCallback& callback, |
- scoped_ptr<net::CertificateList> matches, |
- const std::string& error_message); |
- |
// Callback used by |GetPlatformKeysOfExtension|. |
// Is called with |value| set to the PlatformKeys value read from the |
// StateStore, which it forwards to |callback|. On error, calls |callback| |
@@ -200,7 +231,7 @@ class PlatformKeysService : public KeyedService { |
content::BrowserContext* browser_context_; |
extensions::StateStore* state_store_; |
- bool permission_check_enabled_ = true; |
+ scoped_ptr<SelectDelegate> select_delegate_; |
std::queue<linked_ptr<Task>> tasks_; |
base::WeakPtrFactory<PlatformKeysService> weak_factory_; |