From 45fd6938cc26c5df3ba9a473353bd194a0968aed Mon Sep 17 00:00:00 2001
From: Przemyslaw Ciezkowski
Date: Mon, 4 May 2015 10:27:45 +0200
Subject: [PATCH] [KeyManager] save, remove, get Data object
[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
---
src/keymanager/keymanager_instance.cc | 93 ++++++++++++++++++++++++++++++++++
src/keymanager/keymanager_instance.h | 4 ++
src/keymanager/keymanager_observers.cc | 22 ++++++++
src/keymanager/keymanager_observers.h | 7 +++
4 files changed, 126 insertions(+)
diff --git a/src/keymanager/keymanager_instance.cc b/src/keymanager/keymanager_instance.cc
index d9a38eb..d421c1f 100644
--- a/src/keymanager/keymanager_instance.cc
+++ b/src/keymanager/keymanager_instance.cc
@@ -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 password;
+ if (data.get("password").is()) {
+ password = data.get("password").get();
+ }
+ std::string base64 = args.get("rawData").get();
+
+ 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());
+ CKM::ManagerAsync::ObserverPtr observer(new SaveDataObserver(this,
+ args.get("callbackId").get()));
+ 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();
+ 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();
+ CKM::Password pass;
+ if (args.get("password").is()) {
+ pass = args.get("password").get().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()) {
+ 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
diff --git a/src/keymanager/keymanager_instance.h b/src/keymanager/keymanager_instance.h
index abb0d6a..c25377d 100644
--- a/src/keymanager/keymanager_instance.h
+++ b/src/keymanager/keymanager_instance.h
@@ -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 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;
};
diff --git a/src/keymanager/keymanager_observers.cc b/src/keymanager/keymanager_observers.cc
index 0bd51f1..ee0642a 100644
--- a/src/keymanager/keymanager_observers.cc
+++ b/src/keymanager/keymanager_observers.cc
@@ -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
diff --git a/src/keymanager/keymanager_observers.h b/src/keymanager/keymanager_observers.h
index 7e02c71..68a6ef0 100644
--- a/src/keymanager/keymanager_observers.h
+++ b/src/keymanager/keymanager_observers.h
@@ -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
--
2.7.4