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