diff options
author | raymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-04 17:15:48 +0000 |
---|---|---|
committer | raymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-04 17:15:48 +0000 |
commit | de289526526174fcea503e55153e21411a944fee (patch) | |
tree | 2c3dc5498cf014c19877ef663fe3b9dd10a8426b /ppapi/shared_impl | |
parent | eb63d674308842a51494c543565389dd08059c45 (diff) | |
download | chromium_src-de289526526174fcea503e55153e21411a944fee.zip chromium_src-de289526526174fcea503e55153e21411a944fee.tar.gz chromium_src-de289526526174fcea503e55153e21411a944fee.tar.bz2 |
Add the PPAPI X509 Certificate interface and implementation.
Adds the interface for accessing X509 certificate fields. Note that the interface uses a GetField(field) method for accessing various fields of the certificate and all resuls are returned as pp::Var. This greatly simplifies the implementation of the interface and process of adding/changing fields so it is probably better (at least in the short term for flash).
BUG=114626
TEST=out/Debug/ui_tests --gtest_filter=*PPAPITest.*X509Certificate*
NOTRY=true
Review URL: http://codereview.chromium.org/9693024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130654 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/shared_impl')
-rw-r--r-- | ppapi/shared_impl/api_id.h | 1 | ||||
-rw-r--r-- | ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc | 138 | ||||
-rw-r--r-- | ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h | 71 | ||||
-rw-r--r-- | ppapi/shared_impl/resource.h | 3 |
4 files changed, 212 insertions, 1 deletions
diff --git a/ppapi/shared_impl/api_id.h b/ppapi/shared_impl/api_id.h index ea6ed67..8d02e59 100644 --- a/ppapi/shared_impl/api_id.h +++ b/ppapi/shared_impl/api_id.h @@ -53,6 +53,7 @@ enum ApiID { API_ID_PPB_VAR_DEPRECATED, API_ID_PPB_VIDEO_CAPTURE_DEV, API_ID_PPB_VIDEO_DECODER_DEV, + API_ID_PPB_X509_CERTIFICATE_PRIVATE, API_ID_PPP_CLASS, API_ID_PPP_GRAPHICS_3D, diff --git a/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc b/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc new file mode 100644 index 0000000..665ca73 --- /dev/null +++ b/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc @@ -0,0 +1,138 @@ +// Copyright (c) 2012 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 "ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h" + +#include "base/logging.h" +#include "ppapi/shared_impl/ppapi_globals.h" +#include "ppapi/shared_impl/var.h" +#include "ppapi/shared_impl/var_tracker.h" + +namespace ppapi { + +void PPB_X509Certificate_Fields::SetField( + PP_X509Certificate_Private_Field field, + base::Value* value) { + uint32_t index = static_cast<uint32_t>(field); + bool success = values_.Set(index, value); + DCHECK(success); +} + +PP_Var PPB_X509Certificate_Fields::GetFieldAsPPVar( + PP_X509Certificate_Private_Field field) const { + uint32_t index = static_cast<uint32_t>(field); + base::Value* value; + bool success = values_.Get(index, &value); + if (!success) { + // Our list received might be smaller than the number of fields, so just + // return null if the index is OOB. + return PP_MakeNull(); + } + + switch (value->GetType()) { + case Value::TYPE_NULL: + return PP_MakeNull(); + case Value::TYPE_BOOLEAN: { + bool val; + value->GetAsBoolean(&val); + return PP_MakeBool(PP_FromBool(val)); + } + case Value::TYPE_INTEGER: { + int val; + value->GetAsInteger(&val); + return PP_MakeInt32(val); + } + case Value::TYPE_DOUBLE: { + double val; + value->GetAsDouble(&val); + return PP_MakeDouble(val); + } + case Value::TYPE_STRING: { + std::string val; + value->GetAsString(&val); + return StringVar::StringToPPVar(val); + } + case Value::TYPE_BINARY: { + const base::BinaryValue* binary = + static_cast<const base::BinaryValue*>(value); + uint32_t size = static_cast<uint32_t>(binary->GetSize()); + const char* buffer = binary->GetBuffer(); + PP_Var array_buffer = + PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(size, + buffer); + return array_buffer; + } + case Value::TYPE_DICTIONARY: + case Value::TYPE_LIST: + // Not handled. + break; + } + + // Should not reach here. + CHECK(false); + return PP_MakeUndefined(); +} + +//------------------------------------------------------------------------------ + +PPB_X509Certificate_Private_Shared::PPB_X509Certificate_Private_Shared( + ResourceObjectType type, + PP_Instance instance) : Resource(type, instance), fields_(NULL) { +} + +PPB_X509Certificate_Private_Shared::PPB_X509Certificate_Private_Shared( + ResourceObjectType type, + PP_Instance instance, + PPB_X509Certificate_Fields* fields) + : Resource(type, instance), + fields_(fields) { +} + +PPB_X509Certificate_Private_Shared::~PPB_X509Certificate_Private_Shared() { +} + +thunk::PPB_X509Certificate_Private_API* +PPB_X509Certificate_Private_Shared::AsPPB_X509Certificate_Private_API() { + return this; +} + +PP_Bool PPB_X509Certificate_Private_Shared::Initialize(const char* bytes, + uint32_t length) { + // The certificate should be immutable once initialized. + if (fields_.get()) + return PP_FALSE; + + if (!bytes || length == 0) + return PP_FALSE; + + std::vector<char> der(bytes, bytes + length); + scoped_ptr<PPB_X509Certificate_Fields> fields( + new PPB_X509Certificate_Fields()); + bool success = ParseDER(der, fields.get()); + if (success) { + fields_.swap(fields); + return PP_TRUE; + } + return PP_FALSE; +} + +PP_Var PPB_X509Certificate_Private_Shared::GetField( + PP_X509Certificate_Private_Field field) { + if (!fields_.get()) + return PP_MakeUndefined(); + + return fields_->GetFieldAsPPVar(field); +} + +bool PPB_X509Certificate_Private_Shared::ParseDER( + const std::vector<char>& der, + PPB_X509Certificate_Fields* result) { + // A concrete PPB_X509Certificate_Private_Shared should only ever be + // constructed by passing in PPB_X509Certificate_Fields, in which case it is + // already initialized. + CHECK(false); + return false; +} + +} // namespace ppapi diff --git a/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h b/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h new file mode 100644 index 0000000..70f84cd --- /dev/null +++ b/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h @@ -0,0 +1,71 @@ +// Copyright (c) 2012 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. + +#ifndef PPAPI_SHARED_IMPL_PRIVATE_PPB_X509_CERTIFICATE_PRIVATE_IMPL_H_ +#define PPAPI_SHARED_IMPL_PRIVATE_PPB_X509_CERTIFICATE_PRIVATE_IMPL_H_ + +#include <vector> + +#include "base/memory/scoped_ptr.h" +#include "base/values.h" +#include "ppapi/c/private/ppb_x509_certificate_private.h" +#include "ppapi/shared_impl/resource.h" +#include "ppapi/thunk/ppb_x509_certificate_private_api.h" + +namespace IPC { +template <class T> +struct ParamTraits; +} + +namespace ppapi { + +class PPAPI_SHARED_EXPORT PPB_X509Certificate_Fields { + public: + // Takes ownership of |value|. + void SetField(PP_X509Certificate_Private_Field field, base::Value* value); + PP_Var GetFieldAsPPVar(PP_X509Certificate_Private_Field field) const; + + private: + // Friend so ParamTraits can serialize us. + friend struct IPC::ParamTraits<ppapi::PPB_X509Certificate_Fields>; + + base::ListValue values_; +}; + +//------------------------------------------------------------------------------ + +class PPAPI_SHARED_EXPORT PPB_X509Certificate_Private_Shared + : public thunk::PPB_X509Certificate_Private_API, + public Resource { + public: + PPB_X509Certificate_Private_Shared(ResourceObjectType type, + PP_Instance instance); + // Used by tcp_socket_shared_impl to construct a certificate resource from a + // server certificate. This object owns the pointer passed in. + PPB_X509Certificate_Private_Shared(ResourceObjectType type, + PP_Instance instance, + PPB_X509Certificate_Fields* fields); + virtual ~PPB_X509Certificate_Private_Shared(); + + // Resource overrides. + virtual PPB_X509Certificate_Private_API* + AsPPB_X509Certificate_Private_API() OVERRIDE; + + // PPB_X509Certificate_Private_API implementation. + virtual PP_Bool Initialize(const char* bytes, uint32_t length) OVERRIDE; + virtual PP_Var GetField(PP_X509Certificate_Private_Field field) OVERRIDE; + + protected: + virtual bool ParseDER(const std::vector<char>& der, + PPB_X509Certificate_Fields* result); + + private: + scoped_ptr<PPB_X509Certificate_Fields> fields_; + + DISALLOW_COPY_AND_ASSIGN(PPB_X509Certificate_Private_Shared); +}; + +} // namespace ppapi + +#endif // PPAPI_SHARED_IMPL_PRIVATE_X509_CERTIFICATE_PRIVATE_IMPL_H_ diff --git a/ppapi/shared_impl/resource.h b/ppapi/shared_impl/resource.h index 86f5168..5b03f53 100644 --- a/ppapi/shared_impl/resource.h +++ b/ppapi/shared_impl/resource.h @@ -62,7 +62,8 @@ F(PPB_VideoLayer_API) \ F(PPB_View_API) \ F(PPB_WebSocket_API) \ - F(PPB_Widget_API) + F(PPB_Widget_API) \ + F(PPB_X509Certificate_Private_API) namespace ppapi { |