[KeyManager] saveKey implementation
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Fri, 24 Apr 2015 13:50:06 +0000 (15:50 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 11 May 2015 12:02:16 +0000 (21:02 +0900)
[Verification]
var myPubKey = new tizen.Key("pub1", null, true);
myPubKey.saveKey("MIIBIj...wIDAQAB", function() {
    console.log("ok");
}, function(e) {
    console.log("error: " + e.message);
});

Change-Id: I5f58737b0ce5d794c1b611100c0a760d26a441ed
Signed-off-by: Przemyslaw Ciezkowski <p.ciezkowski@samsung.com>
src/keymanager/keymanager.gyp
src/keymanager/keymanager_instance.cc
src/keymanager/keymanager_instance.h
src/keymanager/keymanager_observers.cc [new file with mode: 0644]
src/keymanager/keymanager_observers.h [new file with mode: 0644]

index 99ae7ff..65ddb7f 100644 (file)
         'keymanager_extension.h',
         'keymanager_instance.cc',
         'keymanager_instance.h',
+        'keymanager_observers.h',
+        'keymanager_observers.cc',
       ],
       'conditions': [
         ['tizen == 1', {
           'variables': {
             'packages': [
               'key-manager',
+              'libpcrecpp',
             ]
           },
         }],
index 949327e..106d1c4 100644 (file)
@@ -6,6 +6,8 @@
 
 #include <functional>
 #include <ckm/ckm-manager.h>
+#include <glib.h>
+#include <pcrecpp.h>
 
 #include "common/logger.h"
 #include "common/picojson.h"
@@ -21,6 +23,8 @@ KeyManagerInstance::KeyManagerInstance() {
 
   RegisterSyncHandler("KeyManager_getKeyAliasList",
       std::bind(&KeyManagerInstance::GetKeyAliasList, this, _1, _2));
+  RegisterSyncHandler("KeyManager_saveKey",
+      std::bind(&KeyManagerInstance::SaveKey, this, _1, _2));
 }
 
 KeyManagerInstance::~KeyManagerInstance() {
@@ -45,5 +49,48 @@ void KeyManagerInstance::GetKeyAliasList(const picojson::value& args,
   }
 }
 
+void KeyManagerInstance::SaveKey(const picojson::value& args,
+    picojson::object& out) {
+  LoggerD("Enter");
+
+  const picojson::value& key_object = args.get("key");
+  const std::string& alias = key_object.get("name").get<std::string>();
+  std::string password;
+  if (key_object.get("password").is<std::string>()) {
+    password = key_object.get("password").get<std::string>();
+  }
+  std::string base64 = args.get("rawKey").get<std::string>();
+  pcrecpp::RE_Options opt;
+  opt.set_multiline(true);
+  //remove first line and last line
+  pcrecpp::RE("-----[^-]*-----", opt).GlobalReplace("", &base64);
+  gsize len = 0;
+  guchar* raw_data = g_base64_decode(base64.c_str(), &len);
+  CKM::RawBuffer raw_buffer;
+  raw_buffer.assign(raw_data, raw_data + len);
+  g_free(raw_data);
+  CKM::Password pass(password.c_str());
+  CKM::KeyShPtr key = CKM::Key::create(raw_buffer, pass);
+  CKM::Policy policy(pass, key_object.get("extractable").get<bool>());
+  CKM::ManagerAsync::ObserverPtr observer(new SaveKeyObserver(this,
+    args.get("callbackId").get<double>()));
+  m_manager.saveKey(observer, alias, key, policy);
+
+  ReportSuccess(out);
+}
+
+void KeyManagerInstance::OnSaveKey(double callbackId,
+    const common::PlatformResult& result) {
+  LoggerD("Enter");
+  picojson::value::object dict;
+  dict["callbackId"] = picojson::value(callbackId);
+  if (result.IsError()) {
+    LoggerE("There was an error");
+    ReportError(result, &dict);
+  }
+  picojson::value res(dict);
+  PostMessage(res.serialize().c_str());
+}
+
 } // namespace keymanager
 } // namespace extension
index b34fce0..517f0b4 100644 (file)
@@ -6,16 +6,25 @@
 #define KEYMANAGER_KEYMANAGER_INSTANCE_H_
 
 #include "common/extension.h"
+#include <ckm/ckm-manager-async.h>
+#include "keymanager/keymanager_observers.h"
+
 
 namespace extension {
 namespace keymanager {
 
-class KeyManagerInstance : public common::ParsedInstance {
+class KeyManagerInstance :
+    public common::ParsedInstance,
+    public KeyManagerListener {
  public:
   KeyManagerInstance();
   virtual ~KeyManagerInstance();
+  void OnSaveKey(double callbackId, const common::PlatformResult& result);
  private:
   void GetKeyAliasList(picojson::value const& args, picojson::object& out);
+  void SaveKey(const picojson::value& args, picojson::object& out);
+
+  CKM::ManagerAsync m_manager;
 };
 
 } // namespace keymanager
diff --git a/src/keymanager/keymanager_observers.cc b/src/keymanager/keymanager_observers.cc
new file mode 100644 (file)
index 0000000..5e9dc95
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "keymanager/keymanager_observers.h"
+#include "common/extension.h"
+#include "common/logger.h"
+#include "common/task-queue.h"
+
+namespace extension {
+namespace keymanager {
+
+using common::PlatformResult;
+using common::ErrorCode;
+
+CommonObserver::CommonObserver(KeyManagerListener* _listener, double _callbackId):
+  listener(_listener), callbackId(_callbackId) {
+
+}
+
+SaveKeyObserver::SaveKeyObserver(KeyManagerListener* listener, double callbackId):
+  CommonObserver(listener, callbackId) {
+
+}
+
+void SaveKeyObserver::ReceivedError(int error) {
+  LoggerD("Enter, error: %d", error);
+  ErrorCode code = ErrorCode::UNKNOWN_ERR;
+  if (error == CKM_API_ERROR_INPUT_PARAM) {
+    code = ErrorCode::INVALID_VALUES_ERR;
+  }
+  common::TaskQueue::GetInstance().Async(std::bind(
+    &KeyManagerListener::OnSaveKey, listener, callbackId,
+    PlatformResult(code, "Failed to save key")));
+}
+
+void SaveKeyObserver::ReceivedSaveKey() {
+  LoggerD("Enter");
+  common::TaskQueue::GetInstance().Async(std::bind(
+    &KeyManagerListener::OnSaveKey, listener, callbackId,
+    PlatformResult(ErrorCode::NO_ERROR)));
+}
+
+
+} // namespace keymanager
+} // namespace extension
diff --git a/src/keymanager/keymanager_observers.h b/src/keymanager/keymanager_observers.h
new file mode 100644 (file)
index 0000000..86688e6
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef KEYMANAGER_KEYMANAGER_OBSERVERS_H_
+#define KEYMANAGER_KEYMANAGER_OBSERVERS_H_
+
+#include <ckm/ckm-manager-async.h>
+#include "common/platform_result.h"
+
+namespace extension {
+namespace keymanager {
+
+class KeyManagerListener {
+public:
+  virtual void OnSaveKey(double callbackId, const common::PlatformResult& result) = 0;
+  virtual ~KeyManagerListener() {}
+
+};
+
+struct CommonObserver: public CKM::ManagerAsync::Observer {
+  CommonObserver(KeyManagerListener* listener, double callbackId);
+  virtual ~CommonObserver() {}
+
+ protected:
+  KeyManagerListener* listener;
+  double callbackId;
+};
+
+struct SaveKeyObserver: public CommonObserver {
+  SaveKeyObserver(KeyManagerListener* listener, double callbackId);
+  void ReceivedError(int error);
+  void ReceivedSaveKey();
+};
+
+} // namespace keymanager
+} // namespace extension
+
+#endif // KEYMANAGER_KEYMANAGER_OBSERVERS_H_
+