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