summaryrefslogtreecommitdiffstats
path: root/ppapi/shared_impl
diff options
context:
space:
mode:
authorraymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-04 17:15:48 +0000
committerraymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-04 17:15:48 +0000
commitde289526526174fcea503e55153e21411a944fee (patch)
tree2c3dc5498cf014c19877ef663fe3b9dd10a8426b /ppapi/shared_impl
parenteb63d674308842a51494c543565389dd08059c45 (diff)
downloadchromium_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.h1
-rw-r--r--ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc138
-rw-r--r--ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h71
-rw-r--r--ppapi/shared_impl/resource.h3
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 {