summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandeep Singh <randeep.s@samsung.com>2019-09-27 05:21:51 +0000
committerRandeep Singh <randeep.s@samsung.com>2019-09-27 05:21:51 +0000
commit17300a008de6945b675bee77f21f005124a76d00 (patch)
treeab130f29d0143a0cec66e6616fbd76966e8a7b32
parent3026248cf34aad012eb486f287adcd33d4d3578f (diff)
downloademail-service-17300a008de6945b675bee77f21f005124a76d00.tar.gz
email-service-17300a008de6945b675bee77f21f005124a76d00.tar.bz2
email-service-17300a008de6945b675bee77f21f005124a76d00.zip
This reverts commit 3026248cf34aad012eb486f287adcd33d4d3578f. Change-Id: Id66fac61bc5739411968c8953bf76d5df7de5e6c
-rwxr-xr-xemail-api/email-api-smime.c8
-rwxr-xr-xemail-common-use/include/email-internal-types.h1
-rwxr-xr-xemail-core/CMakeLists.txt8
-rwxr-xr-xemail-core/email-core-smime.c15
-rwxr-xr-xemail-core/include/email-core-smime.h3
-rwxr-xr-xemail-daemon/CMakeLists.txt6
-rw-r--r--email-daemon/email-daemon-event.c60
-rwxr-xr-xemail-daemon/email-daemon-init.c14
-rwxr-xr-xemail-daemon/include/email-daemon-event.h5
-rwxr-xr-xpackaging/email-service.spec2
10 files changed, 114 insertions, 8 deletions
diff --git a/email-api/email-api-smime.c b/email-api/email-api-smime.c
index 07c8d18..40b9fcf 100755
--- a/email-api/email-api-smime.c
+++ b/email-api/email-api-smime.c
@@ -137,10 +137,13 @@ EXPORT_API int email_get_decrypt_message(int mail_id, email_mail_data_t **output
}
if (p_output_mail_data->smime_type == EMAIL_SMIME_ENCRYPTED || p_output_mail_data->smime_type == EMAIL_SMIME_SIGNED_AND_ENCRYPTED) {
+ emcore_init_openssl_library();
if (!emcore_smime_get_decrypt_message(p_output_attachment_data[i].attachment_path, p_account_tbl->certificate_path, &decrypt_filepath, &err)) {
EM_DEBUG_EXCEPTION("emcore_smime_get_decrypt_message failed");
+ emcore_clean_openssl_library();
goto FINISH_OFF;
}
+ emcore_clean_openssl_library();
} else if (p_output_mail_data->smime_type == EMAIL_PGP_ENCRYPTED) {
if ((err = emcore_pgp_get_decrypted_message(p_output_attachment_data[i].attachment_path, p_output_mail_data->pgp_password, false, &decrypt_filepath, verify)) != EMAIL_ERROR_NONE) {
EM_DEBUG_EXCEPTION("emcore_pgp_get_decrypted_message failed : [%d]", err);
@@ -247,10 +250,13 @@ EXPORT_API int email_get_decrypt_message_ex(email_mail_data_t *input_mail_data,
}
if (input_mail_data->smime_type == EMAIL_SMIME_ENCRYPTED || input_mail_data->smime_type == EMAIL_SMIME_SIGNED_AND_ENCRYPTED) {
+ emcore_init_openssl_library();
if (!emcore_smime_get_decrypt_message(input_attachment_data[i].attachment_path, p_account_tbl->certificate_path, &decrypt_filepath, &err)) {
EM_DEBUG_EXCEPTION("emcore_smime_get_decrypt_message failed");
+ emcore_clean_openssl_library();
goto FINISH_OFF;
}
+ emcore_clean_openssl_library();
} else if (input_mail_data->smime_type == EMAIL_PGP_ENCRYPTED) {
if ((err = emcore_pgp_get_decrypted_message(input_attachment_data[i].attachment_path, input_mail_data->pgp_password, false, &decrypt_filepath, verify)) != EMAIL_ERROR_NONE) {
EM_DEBUG_EXCEPTION("emcore_pgp_get_decrypted_message failed : [%d]", err);
@@ -374,9 +380,11 @@ EXPORT_API int email_verify_signature_ex(email_mail_data_t *input_mail_data, ema
}
if (input_mail_data->smime_type == EMAIL_SMIME_SIGNED) {
+ emcore_init_openssl_library();
if (!emcore_verify_signature(input_attachment_data[count].attachment_path, input_mail_data->file_path_mime_entity, verify, &err))
EM_DEBUG_EXCEPTION("emcore_verify_signature failed : [%d]", err);
+ emcore_clean_openssl_library();
} else if (input_mail_data->smime_type == EMAIL_PGP_SIGNED) {
if ((err = emcore_pgp_get_verify_signature(input_attachment_data[count].attachment_path, input_mail_data->file_path_mime_entity, input_mail_data->digest_type, verify)) != EMAIL_ERROR_NONE)
EM_DEBUG_EXCEPTION("emcore_pgp_get_verify_siganture failed : [%d]", err);
diff --git a/email-common-use/include/email-internal-types.h b/email-common-use/include/email-internal-types.h
index 6c8b691..a9d839a 100755
--- a/email-common-use/include/email-internal-types.h
+++ b/email-common-use/include/email-internal-types.h
@@ -90,6 +90,7 @@ extern "C"
#define __FEATURE_BODY_SEARCH__
#define __FEATURE_ACCESS_CONTROL__
#define __FEATURE_UPDATE_DB_TABLE_SCHEMA__
+#define __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__
/* #define __FEATURE_COMPARE_DOMAIN__ */
/* #define __FEATURE_FORK_FOR_CURL__ */
/* #define __FEATURE_USE_DRM_API__ */
diff --git a/email-core/CMakeLists.txt b/email-core/CMakeLists.txt
index f4bd068..6a111cc 100755
--- a/email-core/CMakeLists.txt
+++ b/email-core/CMakeLists.txt
@@ -71,7 +71,7 @@ INCLUDE_DIRECTORIES(
INCLUDE(FindPkgConfig)
-pkg_check_modules(storage_pkgs REQUIRED glib-2.0 dlog openssl1.1 vconf dbus-1 contacts-service2 libtzplatform-config)
+pkg_check_modules(storage_pkgs REQUIRED glib-2.0 dlog openssl vconf dbus-1 contacts-service2 libtzplatform-config)
set(EXTRA_CFLAGS "")
FOREACH(flag ${storage_pkgs_CFLAGS})
@@ -110,7 +110,7 @@ INCLUDE_DIRECTORIES(
)
INCLUDE(FindPkgConfig)
-pkg_check_modules(network_pkgs REQUIRED glib-2.0 uw-imap-toolkit dbus-1 vconf dlog openssl1.1)
+pkg_check_modules(network_pkgs REQUIRED glib-2.0 uw-imap-toolkit dbus-1 vconf dlog openssl)
FOREACH(flag ${network_pkgs_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
@@ -234,8 +234,8 @@ INCLUDE_DIRECTORIES(
INCLUDE(FindPkgConfig)
SET(PKG_MODULES glib-2.0 dlog dbus-1 gthread-2.0 key-manager tpkp-curl
- uw-imap-toolkit vconf vconf-internal-keys contacts-service2
- openssl1.1 accounts-svc alarm-service notification libcurl libxml-2.0
+ uw-imap-toolkit vconf vconf-internal-keys contacts-service2
+ openssl accounts-svc alarm-service notification libcurl libxml-2.0
cert-svc-vcore badge capi-appfw-application icu-i18n gmime-2.6 storage dpm cryptsvc)
pkg_check_modules(core_pkgs REQUIRED ${PKG_MODULES})
diff --git a/email-core/email-core-smime.c b/email-core/email-core-smime.c
index 2127d34..3ee8862 100755
--- a/email-core/email-core-smime.c
+++ b/email-core/email-core-smime.c
@@ -1038,3 +1038,18 @@ FINISH_OFF:
return err;
}
+INTERNAL_FUNC void emcore_init_openssl_library()
+{
+ EM_DEBUG_FUNC_BEGIN();
+ SSL_library_init();
+ ERR_load_crypto_strings();
+ EM_DEBUG_FUNC_END();
+}
+
+INTERNAL_FUNC void emcore_clean_openssl_library()
+{
+ EM_DEBUG_FUNC_BEGIN();
+ ERR_free_strings();
+ EVP_cleanup();
+ EM_DEBUG_FUNC_END();
+}
diff --git a/email-core/include/email-core-smime.h b/email-core/include/email-core-smime.h
index 1af0872..5aa3587 100755
--- a/email-core/include/email-core-smime.h
+++ b/email-core/include/email-core-smime.h
@@ -47,4 +47,7 @@ INTERNAL_FUNC int emcore_smime_get_decrypt_message(char *encrypt_message, char *
INTERNAL_FUNC int emcore_convert_mail_data_to_smime_data(char *multi_user_name, emstorage_account_tbl_t *account_tbl_item, email_mail_data_t *input_mail_data, email_attachment_data_t *input_attachment_data_list, int input_attachment_count, email_mail_data_t **output_mail_data, email_attachment_data_t **output_attachment_data_list, int *output_attachment_count);
+INTERNAL_FUNC void emcore_init_openssl_library();
+INTERNAL_FUNC void emcore_clean_openssl_library();
+
#endif /* EM_CORE_SMIME_H_ */
diff --git a/email-daemon/CMakeLists.txt b/email-daemon/CMakeLists.txt
index fa6f7dc..e697880 100755
--- a/email-daemon/CMakeLists.txt
+++ b/email-daemon/CMakeLists.txt
@@ -48,9 +48,9 @@ INCLUDE_DIRECTORIES(
)
INCLUDE(FindPkgConfig)
-SET(PKG_MODULES glib-2.0 dlog dbus-1 gthread-2.0 uw-imap-toolkit
- vconf vconf-internal-keys contacts-service2 alarm-service
- msg-service libwbxml2 libsmack notification
+SET(PKG_MODULES glib-2.0 dlog dbus-1 gthread-2.0 openssl uw-imap-toolkit
+ vconf vconf-internal-keys contacts-service2 alarm-service
+ msg-service libwbxml2 libsmack notification
capi-network-connection gmime-2.6)
pkg_check_modules(main_pkgs REQUIRED ${PKG_MODULES})
diff --git a/email-daemon/email-daemon-event.c b/email-daemon/email-daemon-event.c
index 8409a26..a7d9e70 100644
--- a/email-daemon/email-daemon-event.c
+++ b/email-daemon/email-daemon-event.c
@@ -130,6 +130,66 @@ extern email_event_t *sync_failed_event_data;
static gpointer partial_body_download_thread(gpointer data);
+#ifdef __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__
+
+#include <openssl/crypto.h>
+
+#define MAX_THREAD_NUMBER 100
+
+static pthread_mutex_t *lock_cs;
+static long *lock_count;
+
+void pthreads_locking_callback(int mode, int type, char *file, int line)
+{
+ if (mode & CRYPTO_LOCK) {
+ pthread_mutex_lock(&(lock_cs[type]));
+ lock_count[type]++;
+ } else {
+ pthread_mutex_unlock(&(lock_cs[type]));
+ }
+}
+
+unsigned long pthreads_thread_id(void)
+{
+ return (unsigned long)pthread_self();
+}
+
+INTERNAL_FUNC void emdaemon_setup_handler_for_open_ssl_multithread(void)
+{
+ EM_DEBUG_FUNC_BEGIN();
+ int i = 0;
+
+ lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
+ lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
+
+ for (i = 0; i < CRYPTO_num_locks(); i++) {
+ lock_count[i] = 0;
+ pthread_mutex_init(&(lock_cs[i]), NULL);
+ }
+
+ CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id);
+ CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback);
+ EM_DEBUG_FUNC_END();
+}
+
+INTERNAL_FUNC void emdaemon_cleanup_handler_for_open_ssl_multithread(void)
+{
+ EM_DEBUG_FUNC_BEGIN();
+ int i = 0;
+
+ CRYPTO_set_locking_callback(NULL);
+ for (i = 0; i < CRYPTO_num_locks(); i++) {
+ pthread_mutex_destroy(&(lock_cs[i]));
+ EM_DEBUG_LOG("%8ld:%s", lock_count[i], CRYPTO_get_lock_name(i));
+ }
+ OPENSSL_free(lock_cs);
+ OPENSSL_free(lock_count);
+
+ EM_DEBUG_FUNC_END();
+}
+
+#endif /* __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__ */
+
/* start api event_data loop */
INTERNAL_FUNC int emdaemon_start_event_loop(int *err_code)
{
diff --git a/email-daemon/email-daemon-init.c b/email-daemon/email-daemon-init.c
index 96745b8..f61de58 100755
--- a/email-daemon/email-daemon-init.c
+++ b/email-daemon/email-daemon-init.c
@@ -99,6 +99,10 @@ static int _emdaemon_load_email_core()
if (!emdaemon_core_init(&err))
goto FINISH_OFF;
+#ifdef __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__
+ emdaemon_setup_handler_for_open_ssl_multithread();
+#endif /* __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__ */
+
if (emdaemon_start_event_loop(&err) < 0)
goto FINISH_OFF;
@@ -152,6 +156,10 @@ static int _emdaemon_unload_email_core()
emcore_stop_auto_download_loop(&err);
#endif
+#ifdef __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__
+ emdaemon_cleanup_handler_for_open_ssl_multithread();
+#endif /* __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__ */
+
EM_DEBUG_FUNC_END("err [%d]", err);
return err;
}
@@ -651,6 +659,9 @@ INTERNAL_FUNC int emdaemon_finalize(int* err_code)
goto FINISH_OFF;
}
+ /* Openssl clean up */
+ emcore_clean_openssl_library();
+
ret = true;
FINISH_OFF:
@@ -738,6 +749,9 @@ INTERNAL_FUNC int emdaemon_core_init(int *err_code)
emdaemon_init_alarm_data_list();
+ /* Openssl library init */
+ emcore_init_openssl_library();
+
if (err_code)
*err_code = EMAIL_ERROR_NONE;
diff --git a/email-daemon/include/email-daemon-event.h b/email-daemon/include/email-daemon-event.h
index 13cfd22..799338e 100755
--- a/email-daemon/include/email-daemon-event.h
+++ b/email-daemon/include/email-daemon-event.h
@@ -34,6 +34,11 @@ INTERNAL_FUNC int emdaemon_start_event_loop(int *err_code);
INTERNAL_FUNC int emdaemon_start_event_loop_for_sending_mails(int *err_code);
INTERNAL_FUNC int emdaemon_start_thread_for_downloading_partial_body(int *err_code);
+#ifdef __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__
+INTERNAL_FUNC void emdaemon_setup_handler_for_open_ssl_multithread(void);
+INTERNAL_FUNC void emdaemon_cleanup_handler_for_open_ssl_multithread(void);
+#endif /* __FEATURE_OPEN_SSL_MULTIHREAD_HANDLE__ */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/packaging/email-service.spec b/packaging/email-service.spec
index 387a5f6..3f93a85 100755
--- a/packaging/email-service.spec
+++ b/packaging/email-service.spec
@@ -31,7 +31,7 @@ BuildRequires: pkgconfig(vconf)
BuildRequires: pkgconfig(dlog)
BuildRequires: pkgconfig(dbus-1)
BuildRequires: pkgconfig(uw-imap-toolkit)
-BuildRequires: pkgconfig(openssl1.1)
+BuildRequires: pkgconfig(openssl)
BuildRequires: pkgconfig(alarm-service)
BuildRequires: pkgconfig(key-manager)
BuildRequires: pkgconfig(notification)