Chromium Code Reviews| Index: chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc |
| diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a40da4ea4fded7ad0c516ec1ab28e4feddc4eb0d |
| --- /dev/null |
| +++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc |
| @@ -0,0 +1,215 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/values.h" |
| +#include "chrome/browser/chromeos/platform_keys/platform_keys.h" |
| +#include "chrome/common/extensions/api/enterprise_platform_keys.h" |
| +#include "chrome/common/extensions/api/enterprise_platform_keys_internal.h" |
| +#include "net/cert/x509_certificate.h" |
| + |
| +namespace extensions { |
| + |
| +namespace { |
| + |
| +namespace api_epk = api::enterprise_platform_keys; |
| +namespace api_epki = api::enterprise_platform_keys_internal; |
| + |
| +const char kErrorInvalidX509Cert[] = |
| + "Certificate is not a valid X.509 certificate."; |
| +const char kTokenIdUser[] = "user"; |
| + |
| +// Returns whether |token_id| references a known Token. |
| +bool ValidateToken(const std::string& token_id) { |
| + // For now, the user token is the only valid one. |
| + return token_id == kTokenIdUser; |
| +} |
| + |
| +} // namespace |
| + |
| +EnterprisePlatformKeysInternalGenerateKeyFunction:: |
| + ~EnterprisePlatformKeysInternalGenerateKeyFunction() { |
| +} |
| + |
| +ExtensionFunction::ResponseAction |
| +EnterprisePlatformKeysInternalGenerateKeyFunction::Run() { |
| + scoped_ptr<api_epki::GenerateKey::Params> params( |
| + api_epki::GenerateKey::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params && ValidateToken(params->token_id)); |
|
not at google - send to devlin
2014/05/14 18:11:01
given that the ValidateFunction is part of the val
pneubeck (no reviews)
2014/05/15 09:25:10
Not sure what you mean by 'accidentally terminate
not at google - send to devlin
2014/05/15 15:03:05
I mean that a failure on EXTENSION_FUNCTION_VALIDA
|
| + chromeos::platform_keys::GenerateRSAKey( |
| + params->token_id, |
| + params->modulus_length, |
| + base::Bind( |
| + &EnterprisePlatformKeysInternalGenerateKeyFunction::OnGeneratedKey, |
| + this), |
| + GetProfile()); |
| + return RespondLater(); |
| +} |
| + |
| +void EnterprisePlatformKeysInternalGenerateKeyFunction::OnGeneratedKey( |
| + const std::string& public_key_der, |
| + const std::string& error_message) { |
| + if (error_message.empty()) { |
| + Respond(MultipleArguments( |
| + api_epki::GenerateKey::Results::Create(public_key_der).release())); |
| + } else { |
| + Respond(Error(error_message)); |
| + } |
| +} |
| + |
| +EnterprisePlatformKeysInternalSignFunction:: |
| + ~EnterprisePlatformKeysInternalSignFunction() { |
| +} |
| + |
| +ExtensionFunction::ResponseAction |
| +EnterprisePlatformKeysInternalSignFunction::Run() { |
| + scoped_ptr<api_epki::Sign::Params> params( |
| + api_epki::Sign::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params && ValidateToken(params->token_id)); |
| + chromeos::platform_keys::Sign( |
| + params->token_id, |
| + params->public_key, |
| + params->data, |
| + base::Bind(&EnterprisePlatformKeysInternalSignFunction::OnSigned, this), |
| + GetProfile()); |
| + return RespondLater(); |
| +} |
| + |
| +void EnterprisePlatformKeysInternalSignFunction::OnSigned( |
| + const std::string& signature, |
| + const std::string& error_message) { |
| + if (error_message.empty()) { |
| + Respond(MultipleArguments( |
| + api_epki::Sign::Results::Create(signature).release())); |
| + } else { |
| + Respond(Error(error_message)); |
| + } |
| +} |
| + |
| +EnterprisePlatformKeysGetCertificatesFunction:: |
| + ~EnterprisePlatformKeysGetCertificatesFunction() { |
| +} |
| + |
| +ExtensionFunction::ResponseAction |
| +EnterprisePlatformKeysGetCertificatesFunction::Run() { |
| + scoped_ptr<api_epk::GetCertificates::Params> params( |
| + api_epk::GetCertificates::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params && ValidateToken(params->token_id)); |
| + chromeos::platform_keys::GetCertificates( |
| + params->token_id, |
| + base::Bind( |
| + &EnterprisePlatformKeysGetCertificatesFunction::OnGotCertificates, |
| + this), |
| + GetProfile()); |
| + return RespondLater(); |
| +} |
| + |
| +void EnterprisePlatformKeysGetCertificatesFunction::OnGotCertificates( |
| + scoped_ptr<net::CertificateList> certs, |
| + const std::string& error_message) { |
| + if (!error_message.empty()) { |
| + Respond(Error(error_message)); |
| + return; |
| + } |
| + |
| + scoped_ptr<base::ListValue> client_certs(new base::ListValue()); |
| + for (net::CertificateList::const_iterator it = certs->begin(); |
| + it != certs->end(); |
| + ++it) { |
| + std::string der_encoding; |
| + net::X509Certificate::GetDEREncoded((*it)->os_cert_handle(), &der_encoding); |
| + client_certs->Append(base::BinaryValue::CreateWithCopiedBuffer( |
| + der_encoding.data(), der_encoding.size())); |
| + } |
| + |
| + scoped_ptr<base::ListValue> results(new base::ListValue()); |
| + results->Append(client_certs.release()); |
| + Respond(MultipleArguments(results.release())); |
| +} |
| + |
| +EnterprisePlatformKeysImportCertificateFunction:: |
| + ~EnterprisePlatformKeysImportCertificateFunction() { |
| +} |
| + |
| +ExtensionFunction::ResponseAction |
| +EnterprisePlatformKeysImportCertificateFunction::Run() { |
| + scoped_ptr<api_epk::ImportCertificate::Params> params( |
| + api_epk::ImportCertificate::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params && ValidateToken(params->token_id)); |
| + |
| + const std::string& cert_der = params->certificate; |
| + scoped_refptr<net::X509Certificate> cert_x509 = |
| + net::X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size()); |
| + if (!cert_x509) |
| + return RespondNow(Error(kErrorInvalidX509Cert)); |
| + |
| + chromeos::platform_keys::ImportCertificate( |
| + params->token_id, |
| + cert_x509, |
| + base::Bind(&EnterprisePlatformKeysImportCertificateFunction:: |
| + OnImportedCertificate, |
| + this), |
| + GetProfile()); |
| + return RespondLater(); |
| +} |
| + |
| +void EnterprisePlatformKeysImportCertificateFunction::OnImportedCertificate( |
| + const std::string& error_message) { |
| + if (error_message.empty()) |
| + Respond(NoArguments()); |
| + else |
| + Respond(Error(error_message)); |
| +} |
| + |
| +EnterprisePlatformKeysRemoveCertificateFunction:: |
| + ~EnterprisePlatformKeysRemoveCertificateFunction() { |
| +} |
| + |
| +ExtensionFunction::ResponseAction |
| +EnterprisePlatformKeysRemoveCertificateFunction::Run() { |
| + scoped_ptr<api_epk::RemoveCertificate::Params> params( |
| + api_epk::RemoveCertificate::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params && ValidateToken(params->token_id)); |
| + |
| + const std::string& cert_der = params->certificate; |
| + scoped_refptr<net::X509Certificate> cert_x509 = |
| + net::X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size()); |
| + if (!cert_x509) |
| + return RespondNow(Error(kErrorInvalidX509Cert)); |
| + |
| + chromeos::platform_keys::RemoveCertificate( |
| + params->token_id, |
| + cert_x509, |
| + base::Bind(&EnterprisePlatformKeysRemoveCertificateFunction:: |
| + OnRemovedCertificate, |
| + this), |
| + GetProfile()); |
| + return RespondLater(); |
| +} |
| + |
| +void EnterprisePlatformKeysRemoveCertificateFunction::OnRemovedCertificate( |
| + const std::string& error_message) { |
| + if (error_message.empty()) |
| + Respond(NoArguments()); |
| + else |
| + Respond(Error(error_message)); |
| +} |
| + |
| +EnterprisePlatformKeysInternalGetTokensFunction:: |
| + ~EnterprisePlatformKeysInternalGetTokensFunction() { |
| +} |
| + |
| +ExtensionFunction::ResponseAction |
| +EnterprisePlatformKeysInternalGetTokensFunction::Run() { |
| + EXTENSION_FUNCTION_VALIDATE(args_->empty()); |
| + |
| + std::vector<std::string> token_ids; |
| + token_ids.push_back(kTokenIdUser); |
| + return RespondNow(MultipleArguments( |
| + api_epki::GetTokens::Results::Create(token_ids).release())); |
| +} |
| + |
| +} // namespace extensions |