From: Junghyun Yeon Date: Fri, 16 Jun 2017 04:51:21 +0000 (+0900) Subject: Remove dependency X-Git-Tag: accepted/tizen/unified/20170706.193108~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fappfw%2Fpkgmgr-server.git;a=commitdiff_plain;h=e4570caef09d1f9f446bedccf94e2fa8ef6010ad Remove dependency - Remove dependency and use some APIs with dynamically loaded shared library to reduce binary size Change-Id: I5c7a4658f253d80d238591f73e19b499c3494d2c Signed-off-by: Junghyun Yeon --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 75e72a4..a4396a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ ADD_DEFINITIONS(-DBACKEND_DIR="${BACKEND_DIR}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -g -Wall -fPIE") ## Linker flags -SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie -ldl") INCLUDE_DIRECTORIES(include) INCLUDE(FindPkgConfig) @@ -25,11 +25,8 @@ INCLUDE(FindPkgConfig) SET(PKGMGR_SERVER "pkgmgr-server") AUX_SOURCE_DIRECTORY(src SRCS) -SET(SERVER_CHECK_MODULES gio-2.0 glib-2.0 dlog pkgmgr-parser pkgmgr-info libtzplatform-config drm-service-core-tizen libgum sqlite3 pkgmgr pkgmgr-installer libsystemd aul +SET(SERVER_CHECK_MODULES gio-2.0 glib-2.0 dlog pkgmgr-parser pkgmgr-info libtzplatform-config libgum sqlite3 pkgmgr pkgmgr-installer libsystemd aul minizip deviced) -IF(TIZEN_FEATURE_CSR) - SET(SERVER_CHECK_MODULES "${SERVER_CHECK_MODULES} csr") -ENDIF(TIZEN_FEATURE_CSR) pkg_check_modules(SERVER_DEPS REQUIRED ${SERVER_CHECK_MODULES}) @@ -37,12 +34,8 @@ FOREACH(SERVER_FLAGS ${SERVER_DEPS_CFLAGS}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SERVER_FLAGS}") ENDFOREACH(SERVER_FLAGS) -IF(TIZEN_FEATURE_CSR) - ADD_DEFINITIONS("-DTIZEN_FEATURE_CSR") -ENDIF(TIZEN_FEATURE_CSR) - ADD_EXECUTABLE(${PKGMGR_SERVER} ${SRCS}) -TARGET_LINK_LIBRARIES(${PKGMGR_SERVER} pkgmgr_installer) +TARGET_LINK_LIBRARIES(${PKGMGR_SERVER} pkgmgr_installer dl) TARGET_LINK_LIBRARIES(${PKGMGR_SERVER} ${SERVER_DEPS_LDFLAGS}) CONFIGURE_FILE(org.tizen.pkgmgr.service.in org.tizen.pkgmgr.service @ONLY) diff --git a/packaging/pkgmgr-server.spec b/packaging/pkgmgr-server.spec index 112f53a..f4f53e3 100644 --- a/packaging/pkgmgr-server.spec +++ b/packaging/pkgmgr-server.spec @@ -19,7 +19,6 @@ BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgconfig(pkgmgr-parser) -BuildRequires: pkgconfig(drm-service-core-tizen) BuildRequires: pkgconfig(libgum) BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgconfig(libsystemd) @@ -27,10 +26,6 @@ BuildRequires: pkgconfig(minizip) BuildRequires: pkgconfig(deviced) BuildRequires: fdupes -%if "%{?TIZEN_PROFILE_TV}" != "1" -BuildRequires: pkgconfig(csr) -%endif - %description Packager Manager server package for packaging @@ -45,17 +40,10 @@ cp %{SOURCE1001} . %build sqlite3 restriction.db < ./restriction.sql -%if "%{?TIZEN_PROFILE_TV}" != "1" -_TIZEN_FEATURE_CSR=ON -%else -_TIZEN_FEATURE_CSR=OFF -%endif - %cmake . -DRUN_DIR=%{run_dir} \ -DDB_DIR=%{db_dir} \ -DBACKEND_DIR=%{backend_dir} \ - -DUNITDIR=%{_unitdir} \ - -DTIZEN_FEATURE_CSR:BOOL=${_TIZEN_FEATURE_CSR} + -DUNITDIR=%{_unitdir} %__make %{?_smp_mflags} diff --git a/src/pkgmgr-server.c b/src/pkgmgr-server.c index 0f349fe..197ad3d 100644 --- a/src/pkgmgr-server.c +++ b/src/pkgmgr-server.c @@ -33,7 +33,9 @@ #include #include #include +#include #include +#include #include #include @@ -42,17 +44,19 @@ #include #include #include -#include #include -#ifdef TIZEN_FEATURE_CSR -#include -#endif #include "pkgmgr_installer.h" #include "pkgmgr-server.h" #include "queue.h" #include "package-manager.h" +#define USRLIB "/usr/lib" + +#define PATH_LIBDRM_SVC_CORE \ + "/usr/lib/libdrm-service-core-tizen.so.0" +#define PATH_LIBCSR_CLIENT \ + "/usr/lib/libcsr-client.so.2" #define OWNER_ROOT 0 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) #define APPFW_UID 301 @@ -91,6 +95,17 @@ static guint swid; static GHashTable *backend_info_table; static GMainLoop *mainloop; +static int (*_drm_tizen_register_license) + (const char *pRespBuf, unsigned int respBufLen); +static int (*_drm_tizen_decrypt_package)(const char *pTADCFilepath, + int tadcFileLen, const char *pDecryptedFile, + int decryptedFileLen); +static int (*_drm_tizen_generate_license_request)(const char *pRespBuf, + unsigned int respBufLen, char *pReqBuf, + unsigned int *pReqBufLen, char *pLicenseUrl, + unsigned int *pLicenseUrlLen); +static void *drm_lib_handle; + static int __check_backend_status_for_exit(void); static int __check_queue_status_for_exit(void); static int __is_backend_busy(int position); @@ -335,33 +350,65 @@ gboolean exit_server(void *data) return TRUE; } -#ifdef TIZEN_FEATURE_CSR static int __check_csr(const char *path) { - csr_cs_context_h context = NULL; - csr_cs_malware_h detected = NULL; - int ret = -1; + int ret; + void *context; + void *malware; + void *lib_handle; + int (*_csr_cs_context_create)(void **handle); + int (*_csr_cs_scan_file)(void *handle, const char *file_path, void **malware); + int (*_csr_cs_context_destroy)(void *handle); + + lib_handle = dlopen(PATH_LIBCSR_CLIENT, RTLD_LAZY); + if (!lib_handle) { + DBG("Unable to open %s", PATH_LIBCSR_CLIENT); + return 0; + } - ret = csr_cs_context_create(&context); - if (ret != CSR_ERROR_NONE) { - ERR("Failed to create csr context"); - return -1; + _csr_cs_context_create = dlsym(lib_handle, "csr_cs_context_create"); + _csr_cs_scan_file = dlsym(lib_handle, "csr_cs_scan_file"); + _csr_cs_context_destroy = dlsym(lib_handle, "csr_cs_context_destroy"); + + if (!_csr_cs_context_create || !_csr_cs_scan_file || + !_csr_cs_context_destroy) { + ERR("Failed to load CSR symbols"); + ret = -1; + goto catch; } - if (context) { - ret = csr_cs_scan_file(context, path, &detected); + ret = _csr_cs_context_create(&context); + if (ret != 0) { + ERR("Failed to create context"); + ret = -1; + goto catch; + } + + ret = _csr_cs_scan_file(context, path, &malware); + if (ret != 0) { DBG("CSR result[%d]", ret); + ret = 0; + goto catch; + } - csr_cs_context_destroy(context); - if (detected != NULL) { - ERR("CSR Denied[%s] Installation", path); - return -1; - } + ret = _csr_cs_context_destroy(context); + if (ret != 0) { + ERR("Failed to destroy context"); + ret = -1; + goto catch; } - return 0; + if (malware != NULL) { + ERR("CSR denied[%d] installation", path); + ret = -1; + } + +catch: + if (lib_handle) + dlclose(lib_handle); + + return ret; } -#endif static int __kill_app(char *appid, uid_t uid) { @@ -1395,56 +1442,120 @@ static int __process_check(struct backend_job *job) return 0; } +static int __load_drm_library(void) +{ + if (drm_lib_handle) + return 0; + + drm_lib_handle = dlopen(PATH_LIBDRM_SVC_CORE, RTLD_LAZY); + if (!drm_lib_handle) { + DBG("Unable to open %s", PATH_LIBDRM_SVC_CORE); + return -1; + } + + _drm_tizen_generate_license_request = + dlsym(drm_lib_handle, "drm_tizen_generate_license_request"); + if (_drm_tizen_generate_license_request == NULL) { + ERR("_drm_tizen_generate_license_request() failed"); + goto catch; + } + + _drm_tizen_register_license = + dlsym(drm_lib_handle, "drm_tizen_register_license"); + if (_drm_tizen_register_license == NULL) { + ERR("_register_license() failed"); + goto catch; + } + + _drm_tizen_decrypt_package = + dlsym(drm_lib_handle, "drm_tizen_decrypt_package"); + if (_drm_tizen_decrypt_package == NULL) { + ERR("_drm_tizen_decrypt_package() failed"); + goto catch; + } + + return 0; +catch: + if (drm_lib_handle) { + dlclose(drm_lib_handle); + drm_lib_handle = NULL; + } + return -1; +} + +static void __unload_drm_library(void) +{ + if (drm_lib_handle) { + dlclose(drm_lib_handle); + drm_lib_handle = NULL; + } +} + static int __process_generate_license_request(struct backend_job *job) { - int ret; char *resp_data; char req_data[MAX_PKG_ARGS_LEN]; unsigned int req_data_len; char license_url[MAX_PKG_ARGS_LEN]; unsigned int license_url_len; + int ret; resp_data = job->args; req_data_len = sizeof(req_data); license_url_len = sizeof(license_url); - ret = drm_tizen_generate_license_request(resp_data, strlen(resp_data), - req_data, &req_data_len, license_url, &license_url_len); - if (ret != TADC_SUCCESS) { - ERR("drm_tizen_generate_license_request failed: %d", ret); - _return_value_to_caller(job->req_id, g_variant_new("(iss)", - PKGMGR_R_ESYSTEM, "", "")); - is_drm_busy = false; - return -1; + if (__load_drm_library() != 0) { + ERR("Failed to load library"); + goto catch; } + ret = _drm_tizen_generate_license_request(resp_data, strlen(resp_data), + req_data, &req_data_len, + license_url, &license_url_len); + if (ret != 1) { + ERR("drm_tizen_generate_license_request failed"); + goto catch; + } _return_value_to_caller(job->req_id, g_variant_new("(iss)", PKGMGR_R_OK, req_data, license_url)); is_drm_busy = true; return 0; + +catch: + _return_value_to_caller(job->req_id, g_variant_new("(iss)", + PKGMGR_R_ESYSTEM, "", "")); + is_drm_busy = false; + __unload_drm_library(); + return -1; } static int __process_register_license(struct backend_job *job) { - int ret; char *resp_data; + int ret; resp_data = job->args; - - ret = drm_tizen_register_license(resp_data, strlen(resp_data)); - if (ret != TADC_SUCCESS) { + if (!_drm_tizen_register_license) { + ERR("_drm_tizen_register_license is not loaded"); + goto catch; + } + ret = _drm_tizen_register_license(resp_data, strlen(resp_data)); + if (ret != 1) { ERR("drm_tizen_register_license failed: %d", ret); - _return_value_to_caller(job->req_id, - g_variant_new("(i)", PKGMGR_R_ESYSTEM)); - is_drm_busy = false; - return -1; + goto catch; } - _return_value_to_caller(job->req_id, g_variant_new("(i)", PKGMGR_R_OK)); - return 0; + +catch: + _return_value_to_caller(job->req_id, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); + is_drm_busy = false; + __unload_drm_library(); + + return -1; } static int __process_decrypt_package(struct backend_job *job) @@ -1457,21 +1568,28 @@ static int __process_decrypt_package(struct backend_job *job) decrypted_file_path = job->args; /* TODO: check ownership of decrypted file */ - ret = drm_tizen_decrypt_package(drm_file_path, strlen(drm_file_path), + if (!_drm_tizen_decrypt_package) { + ERR("drm_tizen_decrypt_package is not loaded"); + + goto catch; + } + ret = _drm_tizen_decrypt_package(drm_file_path, strlen(drm_file_path), decrypted_file_path, strlen(decrypted_file_path)); - if (ret != TADC_SUCCESS) { - ERR("drm_tizen_register_license failed: %d", ret); - _return_value_to_caller(job->req_id, - g_variant_new("(i)", PKGMGR_R_ESYSTEM)); - is_drm_busy = false; - return -1; + if (ret != 1) { + ERR("drm_tizen_decrypt_package failed: %d", ret); + goto catch; } - _return_value_to_caller(job->req_id, g_variant_new("(i)", PKGMGR_R_OK)); + return 0; + +catch: + _return_value_to_caller(job->req_id, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); is_drm_busy = false; + __unload_drm_library(); - return 0; + return -1; } static int __process_update_app_splash_screen(struct backend_job *job, int flag) @@ -1620,7 +1738,6 @@ gboolean queue_job(void *data) /* set current backend job */ DBG("handle request type [%d]", job->req_type); -#ifdef TIZEN_FEATURE_CSR if (job->req_type == REQUEST_TYPE_INSTALL || job->req_type == REQUEST_TYPE_MOUNT_INSTALL || job->req_type == REQUEST_TYPE_REINSTALL) { @@ -1632,7 +1749,6 @@ gboolean queue_job(void *data) return TRUE; } } -#endif switch (job->req_type) { case REQUEST_TYPE_INSTALL: