From bd7632d927213cf538565e90e9b590f8cb1f7e85 Mon Sep 17 00:00:00 2001
From: Przemyslaw Ciezkowski
Date: Wed, 29 Apr 2015 13:30:24 +0200
Subject: [PATCH] [KeyManager] loadCertificateFromFile implementation
[Verification]
var cert = new tizen.Certificate("cert_file1", null, true);
cert.loadFromFile("/opt/usr/media/Others/cert.cer",
function() {
console.log('ok');
},
function(e) {
console.log(e.code);
console.log(e.message);
}
);
Change-Id: I81380b69a835ef0e3128c92b8c541bec3538f7ee
Signed-off-by: Przemyslaw Ciezkowski
---
src/keymanager/keymanager_instance.cc | 62 ++++++++++++++++++++++++++--
src/keymanager/keymanager_instance.h | 8 ++++
src/keymanager/keymanager_observers.cc | 75 ++++++++++++++++++++++++++++++++++
src/keymanager/keymanager_observers.h | 31 ++++++++++++++
4 files changed, 172 insertions(+), 4 deletions(-)
diff --git a/src/keymanager/keymanager_instance.cc b/src/keymanager/keymanager_instance.cc
index b20c9b7..fd9e491 100644
--- a/src/keymanager/keymanager_instance.cc
+++ b/src/keymanager/keymanager_instance.cc
@@ -8,6 +8,7 @@
#include
#include
#include
+#include
#include "common/logger.h"
#include "common/picojson.h"
@@ -43,6 +44,8 @@ KeyManagerInstance::KeyManagerInstance() {
std::bind(&KeyManagerInstance::GetCertificate, this, _1, _2));
RegisterSyncHandler("KeyManager_saveCertificate",
std::bind(&KeyManagerInstance::SaveCertificate, this, _1, _2));
+ RegisterSyncHandler("KeyManager_loadCertificateFromFile",
+ std::bind(&KeyManagerInstance::LoadCertificateFromFile, this, _1, _2));
}
KeyManagerInstance::~KeyManagerInstance() {
@@ -335,6 +338,21 @@ void KeyManagerInstance::SaveCertificate(const picojson::value& args,
password = crt.get("password").get();
}
std::string base64 = args.get("rawCert").get();
+
+ SaveCert(base64,
+ password,
+ alias,
+ crt.get("extractable").get(),
+ args.get("callbackId").get());
+ ReportSuccess(out);
+}
+
+void KeyManagerInstance::SaveCert(std::string &base64,
+ const std::string &password,
+ const std::string &alias,
+ bool extractable,
+ double callbackId) {
+ LoggerD("Enter");
pcrecpp::RE_Options opt;
opt.set_multiline(true);
//remove first line and last line
@@ -347,12 +365,10 @@ void KeyManagerInstance::SaveCertificate(const picojson::value& args,
CKM::Password pass(password.c_str());
CKM::CertificateShPtr cert = CKM::Certificate::create(rawBuffer,
CKM::DataFormat::FORM_DER);
- CKM::Policy policy(pass, crt.get("extractable").get());
+ CKM::Policy policy(pass, extractable);
CKM::ManagerAsync::ObserverPtr observer(new SaveCertObserver(this,
- args.get("callbackId").get()));
+ callbackId));
m_manager.saveCertificate(observer, alias, cert, policy);
-
- ReportSuccess(out);
}
void KeyManagerInstance::OnSaveCert(double callbackId,
@@ -368,5 +384,43 @@ void KeyManagerInstance::OnSaveCert(double callbackId,
PostMessage(res.serialize().c_str());
}
+void KeyManagerInstance::LoadCertificateFromFile(const picojson::value& args,
+ picojson::object& out) {
+ LoggerD("Enter");
+
+ const picojson::value& crt = args.get("certificate");
+ const std::string& file = args.get("fileURI").get();
+ std::string password;
+ if (crt.get("password").is()) {
+ password = crt.get("password").get();
+ }
+ LoadFileCert* reader = new LoadFileCert(this,
+ args.get("callbackId").get(),
+ password,
+ crt.get("name").get(),
+ crt.get("extractable").get());
+ reader->LoadFileAsync(file);
+
+ ReportSuccess(out);
+}
+
+void KeyManagerInstance::OnCertFileLoaded(LoadFileCert* reader,
+ const common::PlatformResult& result) {
+ LoggerD("Enter");
+
+ if (result.IsError()) {
+ LoggerE("There was an error");
+ picojson::value::object dict;
+ dict["callbackId"] = picojson::value(reader->callbackId);
+ ReportError(result, &dict);
+ picojson::value res(dict);
+ PostMessage(res.serialize().c_str());
+ } else {
+ SaveCert(reader->fileContent, reader->password, reader->alias,
+ reader->extractable, reader->callbackId);
+ }
+ delete reader;
+}
+
} // namespace keymanager
} // namespace extension
diff --git a/src/keymanager/keymanager_instance.h b/src/keymanager/keymanager_instance.h
index 2421c58..391e5e0 100644
--- a/src/keymanager/keymanager_instance.h
+++ b/src/keymanager/keymanager_instance.h
@@ -22,6 +22,8 @@ class KeyManagerInstance :
void OnSaveKey(double callbackId, const common::PlatformResult& result);
void OnCreateKeyPair(double callbackId, const common::PlatformResult& result);
void OnSaveCert(double callbackId, const common::PlatformResult& result);
+ void OnCertFileLoaded(LoadFileCert* reader,
+ const common::PlatformResult& result);
private:
void GetAliasList(std::function coreFunc,
picojson::object& out);
@@ -35,6 +37,12 @@ class KeyManagerInstance :
void GenerateKeyPair(const picojson::value& args, picojson::object& out);
void GetCertificate(const picojson::value& args, picojson::object& out);
void SaveCertificate(const picojson::value& args, picojson::object& out);
+ void LoadCertificateFromFile(const picojson::value& args, picojson::object& out);
+ void SaveCert(std::string &base64,
+ const std::string &password,
+ const std::string &alias,
+ bool extractable,
+ double callbackId);
CKM::ManagerAsync m_manager;
};
diff --git a/src/keymanager/keymanager_observers.cc b/src/keymanager/keymanager_observers.cc
index 763d524..0bd51f1 100644
--- a/src/keymanager/keymanager_observers.cc
+++ b/src/keymanager/keymanager_observers.cc
@@ -113,5 +113,80 @@ void SaveCertObserver::ReceivedSaveCertificate() {
PlatformResult(ErrorCode::NO_ERROR)));
}
+LoadFileCert::LoadFileCert(KeyManagerListener* _listener,
+ double callbackId,
+ const std::string &_password,
+ const std::string &_alias,
+ bool _extractable):
+ callbackId(callbackId),
+ password(_password),
+ alias(_alias),
+ extractable(_extractable),
+ fileContent(""),
+ buffer(NULL),
+ listener(_listener) {}
+
+void LoadFileCert::LoadFileAsync(const std::string& fileUri) {
+ LoggerD("Enter");
+ GFile* file = g_file_new_for_uri(fileUri.c_str());
+ g_file_read_async(file, G_PRIORITY_DEFAULT, NULL, OnFileRead, this);
+}
+
+void LoadFileCert::OnFileRead(GObject* source_object,
+ GAsyncResult* res, gpointer user_data) {
+ LoggerD("Enter");
+ LoadFileCert* This = static_cast(user_data);
+ GError* err = NULL;
+ GFileInputStream* stream = g_file_read_finish(G_FILE(source_object),
+ res, &err);
+ g_object_unref(source_object);
+ if (stream == NULL) {
+ LoggerE("Failed to read file: %d", err->code);
+ if (err->code == G_FILE_ERROR_NOENT) {
+ This->listener->OnCertFileLoaded(This,
+ PlatformResult(ErrorCode::NOT_FOUND_ERR, "Certificate file not found"));
+ } else {
+ This->listener->OnCertFileLoaded(This,
+ PlatformResult(ErrorCode::IO_ERR, "Failed to load certificate file"));
+ }
+ return;
+ }
+
+ This->buffer = new guint8[4096];
+ g_input_stream_read_async(G_INPUT_STREAM(stream), This->buffer, 4096,
+ G_PRIORITY_DEFAULT, NULL, OnStreamRead, This);
+}
+
+void LoadFileCert::OnStreamRead(GObject* source_object,
+ GAsyncResult* res, gpointer user_data) {
+ LoggerD("Enter");
+
+ LoadFileCert* This = static_cast(user_data);
+ gssize size = g_input_stream_read_finish(G_INPUT_STREAM(source_object),
+ res, NULL);
+ switch (size){
+ case -1:
+ LoggerE("Error occured");
+ This->listener->OnCertFileLoaded(This,
+ PlatformResult(ErrorCode::IO_ERR, "Failed to load certificate file"));
+ g_object_unref(source_object);
+ break;
+ case 0:
+ LoggerD("End of file");
+ This->listener->OnCertFileLoaded(This,
+ PlatformResult(ErrorCode::NO_ERROR));
+ g_object_unref(source_object);
+ break;
+ default:
+ This->fileContent.append(This->buffer, This->buffer + size);
+ g_input_stream_read_async(G_INPUT_STREAM(source_object), This->buffer,
+ 4096, G_PRIORITY_DEFAULT, NULL, OnStreamRead, This);
+ }
+}
+
+LoadFileCert::~LoadFileCert() {
+ delete[] buffer;
+}
+
} // namespace keymanager
} // namespace extension
diff --git a/src/keymanager/keymanager_observers.h b/src/keymanager/keymanager_observers.h
index 4c9f51c..7e02c71 100644
--- a/src/keymanager/keymanager_observers.h
+++ b/src/keymanager/keymanager_observers.h
@@ -6,16 +6,21 @@
#define KEYMANAGER_KEYMANAGER_OBSERVERS_H_
#include
+#include
#include "common/platform_result.h"
namespace extension {
namespace keymanager {
+class LoadFileCert;
+
class KeyManagerListener {
public:
virtual void OnSaveKey(double callbackId, const common::PlatformResult& result) = 0;
virtual void OnCreateKeyPair(double callbackId, const common::PlatformResult& result) = 0;
virtual void OnSaveCert(double callbackId, const common::PlatformResult& result) = 0;
+ virtual void OnCertFileLoaded(LoadFileCert* reader,
+ const common::PlatformResult& result) = 0;
virtual ~KeyManagerListener() {}
};
@@ -51,6 +56,32 @@ struct SaveCertObserver: public CommonObserver {
void ReceivedSaveCertificate();
};
+struct LoadFileCert {
+ LoadFileCert(KeyManagerListener* listener,
+ double callbackId,
+ const std::string &password,
+ const std::string &alias,
+ bool extractable);
+ void LoadFileAsync(const std::string &fileUri);
+ virtual ~LoadFileCert();
+
+ double callbackId;
+ std::string password;
+ const std::string alias;
+ bool extractable;
+ std::string fileContent;
+private:
+ guint8* buffer;
+ KeyManagerListener* listener;
+
+ static void OnFileRead(GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data);
+ static void OnStreamRead(GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data);
+};
+
} // namespace keymanager
} // namespace extension
--
2.7.4