[KeyManager] save, remove, get Data object
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Mon, 4 May 2015 08:27:45 +0000 (10:27 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 11 May 2015 12:11:57 +0000 (21:11 +0900)
[Verification]
var data = new tizen.Data("data2", null, true);
data.save("MTIzNDU2Nzg5MA==",
    function() {
        console.log("ok");
        var d = tizen.keymanager.getData("data2");
        console.log(d);
        d.remove();
        console.log("remove ok");
    },
    function(e) {
        console.log(e.code);
        console.log(e.message);
    }
);

Change-Id: Ibfa9ec593e57e73368d3f996abb03e9a50927e07
Signed-off-by: Przemyslaw Ciezkowski <p.ciezkowski@samsung.com>
src/keymanager/keymanager_instance.cc
src/keymanager/keymanager_instance.h
src/keymanager/keymanager_observers.cc
src/keymanager/keymanager_observers.h

index d9a38eb..d421c1f 100644 (file)
@@ -48,6 +48,12 @@ KeyManagerInstance::KeyManagerInstance() {
       std::bind(&KeyManagerInstance::LoadCertificateFromFile, this, _1, _2));
   RegisterSyncHandler("KeyManager_removeCertificate",
       std::bind(&KeyManagerInstance::RemoveCertificate, this, _1, _2));
+  RegisterSyncHandler("KeyManager_saveData",
+      std::bind(&KeyManagerInstance::SaveData, this, _1, _2));
+  RegisterSyncHandler("KeyManager_removeData",
+      std::bind(&KeyManagerInstance::RemoveData, this, _1, _2));
+  RegisterSyncHandler("KeyManager_getData",
+      std::bind(&KeyManagerInstance::GetData, this, _1, _2));
 }
 
 KeyManagerInstance::~KeyManagerInstance() {
@@ -447,5 +453,92 @@ void KeyManagerInstance::RemoveCertificate(const picojson::value& args,
   }
 }
 
+void KeyManagerInstance::SaveData(const picojson::value& args,
+    picojson::object& out) {
+  LoggerD("Enter");
+
+  const picojson::value& data = args.get("data");
+  const std::string& alias = data.get("name").get<std::string>();
+  std::string password;
+  if (data.get("password").is<std::string>()) {
+    password = data.get("password").get<std::string>();
+  }
+  std::string base64 = args.get("rawData").get<std::string>();
+
+  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::Policy policy(pass, data.get("extractable").get<bool>());
+  CKM::ManagerAsync::ObserverPtr observer(new SaveDataObserver(this,
+      args.get("callbackId").get<double>()));
+  m_manager.saveData(observer, alias, raw_buffer, policy);
+
+  ReportSuccess(out);
+}
+
+void KeyManagerInstance::OnSaveData(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());
+}
+
+void KeyManagerInstance::RemoveData(const picojson::value& args,
+    picojson::object& out) {
+  const std::string& alias = args.get("data").get("name").get<std::string>();
+  common::PlatformResult res = RemoveAlias(alias);
+  if (res.IsError()) {
+    ReportError(res, &out);
+  } else {
+    ReportSuccess(out);
+  }
+}
+
+void KeyManagerInstance::GetData(const picojson::value& args,
+    picojson::object& out) {
+  LoggerD("Enter");
+
+  const std::string& alias = args.get("name").get<std::string>();
+  CKM::Password pass;
+  if (args.get("password").is<std::string>()) {
+    pass = args.get("password").get<std::string>().c_str();
+  }
+
+  CKM::RawBuffer raw_buffer;
+  int ret = CKM::Manager::create()->getData(alias, pass, raw_buffer);
+  if (ret != CKM_API_SUCCESS) {
+    LoggerE("Failed to get data: %d", ret);
+    if (ret == CKM_API_ERROR_DB_ALIAS_UNKNOWN) {
+      ReportError(common::PlatformResult(common::ErrorCode::NOT_FOUND_ERR,
+        "Data alias not found"), &out);
+    } else {
+      ReportError(common::PlatformResult(common::ErrorCode::UNKNOWN_ERR,
+        "Failed to get data"), &out);
+    }
+  } else {
+    picojson::object dict;
+    dict["name"] = args.get("name");
+    if (args.get("password").is<std::string>()) {
+      dict["password"] = args.get("password");
+    }
+    dict["rawData"] = picojson::value(RawBufferToBase64(raw_buffer));
+    //if key was retrieved it is extractable from db
+    dict["extractable"] = picojson::value(true);
+
+    picojson::value res(dict);
+    ReportSuccess(res, out);
+  }
+}
+
 } // namespace keymanager
 } // namespace extension
index abb0d6a..c25377d 100644 (file)
@@ -24,6 +24,7 @@ class KeyManagerInstance :
   void OnSaveCert(double callbackId, const common::PlatformResult& result);
   void OnCertFileLoaded(LoadFileCert* reader,
     const common::PlatformResult& result);
+  void OnSaveData(double callbackId, const common::PlatformResult& result);
  private:
   void GetAliasList(std::function<int(CKM::AliasVector&)> coreFunc,
       picojson::object& out);
@@ -45,6 +46,9 @@ class KeyManagerInstance :
     double callbackId);
   void RemoveCertificate(const picojson::value& args, picojson::object& out);
   common::PlatformResult RemoveAlias(const std::string &alias);
+  void SaveData(const picojson::value& args, picojson::object& out);
+  void RemoveData(const picojson::value& args, picojson::object& out);
+  void GetData(const picojson::value& args, picojson::object& out);
 
   CKM::ManagerAsync m_manager;
 };
index 0bd51f1..ee0642a 100644 (file)
@@ -188,5 +188,27 @@ LoadFileCert::~LoadFileCert() {
   delete[] buffer;
 }
 
+SaveDataObserver::SaveDataObserver(KeyManagerListener* listener, double callbackId):
+    CommonObserver(listener, callbackId) {
+}
+
+void SaveDataObserver::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::OnSaveData, listener, callbackId,
+    PlatformResult(code, "Failed to save data")));
+}
+
+void SaveDataObserver::ReceivedSaveData() {
+  LoggerD("Enter");
+  common::TaskQueue::GetInstance().Async(std::bind(
+    &KeyManagerListener::OnSaveData, listener, callbackId,
+    PlatformResult(ErrorCode::NO_ERROR)));
+}
+
 } // namespace keymanager
 } // namespace extension
index 7e02c71..68a6ef0 100644 (file)
@@ -21,6 +21,7 @@ public:
   virtual void OnSaveCert(double callbackId, const common::PlatformResult& result) = 0;
   virtual void OnCertFileLoaded(LoadFileCert* reader,
     const common::PlatformResult& result) = 0;
+  virtual void OnSaveData(double callbackId, const common::PlatformResult& result) = 0;
   virtual ~KeyManagerListener() {}
 };
 
@@ -82,6 +83,12 @@ private:
     gpointer user_data);
 };
 
+struct SaveDataObserver: public CommonObserver {
+  SaveDataObserver(KeyManagerListener* listener, double callbackId);
+  void ReceivedError(int error);
+  void ReceivedSaveData();
+};
+
 } // namespace keymanager
 } // namespace extension