From b83dd014620f08ab7cdbbcd293cc05a480453b04 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 16 Apr 2015 14:11:02 +0900 Subject: [PATCH 02/15] [Title] add new package for download font --- CMakeLists.txt | 30 ++ LICENSE | 178 +++++++ download-fonts-service.manifest | 14 + packaging/download-fonts-service.spec | 45 ++ pkgmgr_font/CMakeLists.txt | 29 ++ pkgmgr_font/src/font_service_register.c | 852 ++++++++++++++++++++++++++++++++ 6 files changed, 1148 insertions(+) create mode 100755 CMakeLists.txt create mode 100644 LICENSE create mode 100755 download-fonts-service.manifest create mode 100755 packaging/download-fonts-service.spec create mode 100755 pkgmgr_font/CMakeLists.txt create mode 100755 pkgmgr_font/src/font_service_register.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..db48748 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,30 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(download-fonts-service C) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkg REQUIRED + dlog + fontconfig + capi-system-system-settings + elementary + pkgmgr-info +) + +SET(PACKAGE "${PROJECT_NAME}") +SET(CMAKE_C_FLAGS "-Wall -fpie -Winline -Werror -fno-builtin-malloc -fno-omit-frame-pointer -g") +SET(CMAKE_EXE_LINKER_FLAGS "-pie") + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +#ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DPATH_MAX=256") +ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") + +ADD_DEFINITIONS("-DNDEBUG") +#ADD_DEFINITIONS("-DFLOG") +ADD_DEFINITIONS(${pkg_CFLAGS}) +ADD_DEFINITIONS(${pkg_LDFLAGS}) + +# INCLUDE FOR BUILD & INSTALL .PO FILES +ADD_SUBDIRECTORY(pkgmgr_font) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..704a2ab --- /dev/null +++ b/LICENSE @@ -0,0 +1,178 @@ +Copyright (c) 2013 - 2014 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/download-fonts-service.manifest b/download-fonts-service.manifest new file mode 100755 index 0000000..b6c8305 --- /dev/null +++ b/download-fonts-service.manifest @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packaging/download-fonts-service.spec b/packaging/download-fonts-service.spec new file mode 100755 index 0000000..1dd3932 --- /dev/null +++ b/packaging/download-fonts-service.spec @@ -0,0 +1,45 @@ +Name: download-fonts-service +Summary: Master Download fonts service. +Version: 0.0.6 +Release: 1 +Group: TO_BE / FILLED_IN +License: Apache License, Version 2.0 +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake, gettext-tools, smack, coreutils +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(capi-system-system-settings) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(pkgmgr-info) + +%description +Master Download fonts service. + +%prep +%setup -q + +%build +%if 0%{?sec_build_binary_debug_enable} +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" +%endif +%if 0%{?tizen_build_binary_release_type_eng} +export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE" +export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE" +%endif +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DPRODUCT=private + +CFLAGS="${CFLAGS} -Wall -Winline -Werror" LDFLAGS="${LDFLAGS}" make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +%files -n download-fonts-service +%manifest download-fonts-service.manifest +%defattr(-,root,root,-) +%{_prefix}/etc/package-manager/parserlib/category/* + +# End of a file diff --git a/pkgmgr_font/CMakeLists.txt b/pkgmgr_font/CMakeLists.txt new file mode 100755 index 0000000..7086af2 --- /dev/null +++ b/pkgmgr_font/CMakeLists.txt @@ -0,0 +1,29 @@ +PROJECT(downloadable_font C) + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/pkgmgr_font/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(bin_pkgs REQUIRED + dlog + fontconfig + capi-system-system-settings + elementary + pkgmgr-info +) + +FOREACH(flag ${bin_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -g -Wall -Werror") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED + src/font_service_register.c +) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${bin_pkgs_LDFLAGS}) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION "etc/package-manager/parserlib/category") +# End of a file diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c new file mode 100755 index 0000000..4de31df --- /dev/null +++ b/pkgmgr_font/src/font_service_register.c @@ -0,0 +1,852 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * + * Contact: Minsu Seo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "system_settings.h" + + +#define FONT_SERVICE_TAG "FONT_SERVICE" +#define DEBUG_LOG(frmt, args...) \ + do { SLOG(LOG_DEBUG,FONT_SERVICE_TAG, "[font_service] %s: "frmt"\n",\ + __func__, ##args);} while (0) +#define DEBUG_WARNING(frmt, args...) \ + do { SLOG(LOG_WARN,FONT_SERVICE_TAG, "[font_service] %s: "frmt"\n",\ + __func__, ##args);} while (0) +#define DEBUG_ERROR(frmt, args...) \ + do { SLOG(LOG_ERROR,FONT_SERVICE_TAG, "[font_service] %s: "frmt"\n",\ + __func__, ##args);} while (0) + +static const char *PARENT_PATH = "/opt/share/fonts"; +static const char *DOWNLOAD_PATH = "/opt/share/fonts/download"; +static const char *PRELOADED_PATH = "/opt/share/fonts/preloaded"; + +static const char *ELM_PROFILE_CFG = "/opt/home/app/.elementary/config/profile.cfg"; +#define MAX_FILE_LEN 4096 +#define APP_OWNER_ID 5000 +#define APP_GROUP_ID 5000 + +static int make_dir(const char *path); +static int symbolic_link(const char *srcpath, const char *destpath); +static int do_install(const char *parent, const char *appid, const char *rootpath, pkgmgrinfo_pkginfo_h handle); +static int do_uninstall(const char *deletedir); +static int move_file(const char *srcpath, const char *destpath); +static const char* check_preloaded(const char *app_root_path); +#ifdef CHECK_FAMILY_NAME +static int check_family_name(const char *srcpath); +#endif + +static const char* check_preloaded(const char *app_root_path) +{ + char tpk_path[MAX_FILE_LEN]; + char wgt_path[MAX_FILE_LEN]; + + sprintf(tpk_path, "%s/preloaded", app_root_path); + sprintf(wgt_path, "%s/res/wgt/preloaded", app_root_path); + + if ((access(tpk_path, F_OK) == 0) || (access(wgt_path, F_OK) == 0)) + { + return PRELOADED_PATH; + } + + return DOWNLOAD_PATH; +} + +static int make_dir(const char *path) +{ + int ret = 0; + + if (access(path, F_OK) == 0) + { + return ret; + } + else + { + ret = mkdir(path, 0755); + if (ret < 0) + { + DEBUG_ERROR("make current directory %s is failed \n",path); + return ret; + } + + ret = chmod (path, 0755); + if (ret < 0) + { + DEBUG_ERROR("chmod is failed %s\n",path); + rmdir(path); + return ret; + } + } + ret = lsetxattr(path, "security.SMACK64", "_", 1, 0); + + if (ret < 0) + { + DEBUG_ERROR("lsetxattr is failed %s\n",path); + return ret; + } + + return ret; +} + +static int symbolic_link(const char *srcpath, const char *destpath) +{ + DIR *d; + struct dirent *e; + int ret = 0; + + d = opendir(srcpath); + while ((e = readdir (d))) + { + if (e->d_name[0] != '.' && strlen((char *)e->d_name) < MAX_FILE_LEN) + { + char srcdir[MAX_FILE_LEN]; + char destdir[MAX_FILE_LEN]; + struct stat statb; + + if (strlen (srcpath) + strlen ((char *)e->d_name) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("srcdir length is not available \n"); + goto FAIL; + } + + if (strlen (destpath) + strlen ((char *)e->d_name) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("destdir length is not available \n"); + goto FAIL; + } + + sprintf(srcdir,"%s/%s",srcpath,(char *) e->d_name); + sprintf(destdir,"%s/%s",destpath,(char *) e->d_name); + if (stat (srcdir, &statb) == -1) + { + DEBUG_ERROR("stat %s is failed \n",srcdir); + goto FAIL; + } + + if (S_ISDIR (statb.st_mode)) + { + if (make_dir(destdir)<0) + { + DEBUG_ERROR("make current directory %s is failed \n",destdir); + goto FAIL; + } + ret = symbolic_link(srcdir,destdir); + if (ret < 0) + { + DEBUG_ERROR("symlink is failed \n"); + goto FAIL; + } + continue; + } + DEBUG_LOG("srcdir =%s\n",(char *) srcdir); + DEBUG_LOG("destdir =%s\n",(char *) destdir); + DEBUG_LOG("file name =%s\n",(char *) e->d_name); + + ret = symlink((const char *)srcdir,(const char *)destdir); + if (ret < 0) + { + DEBUG_ERROR("symlink is failed \n"); + goto FAIL; + } + + ret = lsetxattr(destdir, "security.SMACK64", "_", 1, 0); + + if (ret < 0) + { + DEBUG_ERROR("lsetxattr is failed %s\n",destdir); + goto FAIL; + } + } + } + closedir (d); + return ret; + +FAIL: + closedir (d); + return -1; +} + + +static int move_file(const char *srcpath, const char *destpath) +{ + DIR *d; + struct dirent *e; + int ret = 0; + + d = opendir (srcpath); + while ((e = readdir (d))) + { + if (e->d_name[0] != '.' && strlen((char *)e->d_name) < MAX_FILE_LEN) + { + char srcdir[MAX_FILE_LEN]; + char destdir[MAX_FILE_LEN]; + struct stat statb; + + if (strlen (srcpath) + strlen ((char *)e->d_name) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("srcdir length is not available \n"); + goto FAIL; + } + + if (strlen (destpath) + strlen ((char *)e->d_name) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("destdir length is not available \n"); + goto FAIL; + } + + sprintf(srcdir,"%s/%s",srcpath,(char *) e->d_name); + sprintf(destdir,"%s/%s",destpath,(char *) e->d_name); + if (stat (srcdir, &statb) == -1) + { + DEBUG_ERROR("stat %s is failed \n",srcdir); + goto FAIL; + } + + if (S_ISDIR (statb.st_mode)) + { + if (make_dir(destdir)<0) + { + DEBUG_ERROR("make current directory %s is failed \n",destdir); + goto FAIL; + } + continue; + } + DEBUG_LOG("srcdir =%s\n",(char *) srcdir); + DEBUG_LOG("destdir =%s\n",(char *) destdir); + DEBUG_LOG("file name =%s\n",(char *) e->d_name); + + ret = rename((const char *)srcdir,(const char *)destdir); + if (ret < 0) + { + DEBUG_ERROR("symlink is failed \n"); + goto FAIL; + } + + ret = lsetxattr(destdir, "security.SMACK64", "_", 1, 0); + + if (ret < 0) + { + DEBUG_ERROR("lsetxattr is failed %s\n",destdir); + goto FAIL; + } + } + } + closedir (d); + return ret; + +FAIL: + closedir (d); + return -1; +} + +#ifdef CHECK_FAMILY_NAME +static int check_family_name(const char *srcpath) +{ + FcObjectSet *os = NULL; + FcFontSet* fs = NULL; + FcPattern* pat = NULL; + FcConfig* font_config = NULL; + bool is_only_one_family = false; + + font_config = FcInitLoadConfigAndFonts(); + + if(font_config == NULL) { + DEBUG_ERROR("Failed: FcInitLoadConfigAndFonts"); + return -1; + } + + pat = FcPatternCreate(); + + os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char *) 0); + + if (os) { + fs = FcFontList(font_config, pat, os); + FcObjectSetDestroy(os); + os = NULL; + } + + if (pat) { + FcPatternDestroy(pat); + pat = NULL; + } + + if (fs) + { + int j; + char* only_one_family = NULL; + + for (j = 0; j < fs->nfont; j++) + { + FcChar8 *family = NULL; + FcChar8 *file = NULL; + + if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) + { + int font_path_len = strlen(srcpath); + + /* always shown for src path */ + if (strncmp((const char*)file, srcpath, font_path_len) == 0) + { + if (FcPatternGetString(fs->fonts[j], FC_FAMILY, 0, &family) != FcResultMatch) + { + DEBUG_ERROR("Family name is invalid"); + continue; + } + //DEBUG_ERROR("-------- FOUND FONT - family = %s", (char *)family); + + // first found family name + if (only_one_family == NULL && strlen((char *)family) > 0) + { + is_only_one_family = true; + only_one_family = (char *)family; + //DEBUG_ERROR("--------First FOUND FONT - family = %s", only_one_family); + } + else if (only_one_family != NULL && strlen((char *)family) > 0)// after first + { + if (strcmp(only_one_family, (char *)family) != 0) + { + DEBUG_ERROR("Not supported various font famliy. only one font famliy. %s %s", only_one_family, (char *)family); + is_only_one_family = false; + break; + } + } + else + { + DEBUG_ERROR("invalid fonts"); + break; + } + } + } + } + + FcFontSetDestroy(fs); + fs = NULL; + } + + FcConfigDestroy(font_config); + font_config = NULL; + + if (is_only_one_family == false) + { + //DEBUG_ERROR("Not supported various font famliy. only one font famliy"); + return -1; + } + + return 0; +} +#endif + +static int do_install(const char *parent, const char *appid, const char *rootpath, pkgmgrinfo_pkginfo_h handle) +{ + char destdir[MAX_FILE_LEN]; + char path[MAX_FILE_LEN]; + char *type = NULL; + int ret = 0; + + if (strlen (parent) + strlen (appid) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("appid length is not available \n"); + return -1; + } + + sprintf(destdir,"%s/%s",parent,appid); + ret = make_dir(destdir); + if (ret < 0) + { + DEBUG_ERROR("make current directory %s is failed \n", destdir); + goto FAIL; + } + + if (strlen (rootpath) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("rootpath length is not available \n"); + goto FAIL; + } + + ret = pkgmgrinfo_pkginfo_get_type(handle, &type); + if (ret < 0) + { + DEBUG_ERROR("pkgmgrinfo_pkginfo_get_type is failed\n"); + goto FAIL; + } + + sprintf(path,"%s/shared/res", rootpath); + + if (!strcmp(type,"wgt")) + { + char srcpath[MAX_FILE_LEN]; + sprintf(srcpath,"%s/res/wgt/shared/res", rootpath); + ret = move_file(srcpath, path); + } + + if (ret < 0) + { + DEBUG_ERROR("move_file is failed\n"); + goto FAIL; + } + + ret = symbolic_link(path, destdir); + + if (ret < 0) + { + DEBUG_ERROR("install is failed \n", destdir); + goto FAIL; + } + +#ifdef CHECK_FAMILY_NAME + ret = check_family_name(destdir); + + if (ret < 0) + { + DEBUG_ERROR("Invaid font files\n"); + goto FAIL; + } +#endif + + return ret; + +FAIL: + do_uninstall(destdir); + return -1; +} + + +static int do_uninstall(const char *deletedir) +{ + DIR *d; + struct dirent *e; + + d = opendir(deletedir); + while((e = readdir (d))) + { + if (e->d_name[0] != '.') + { + char destfile[MAX_FILE_LEN]; + struct stat statb; + + if (strlen (deletedir) + strlen ((char *) e->d_name) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("destfile length is not available \n"); + goto FAIL; + } + + sprintf(destfile,"%s/%s",deletedir,(char *) e->d_name); + if (lstat (destfile, &statb) == -1) + { + DEBUG_ERROR("lstat %s is failed \n",destfile); + goto FAIL; + } + + if (S_ISDIR (statb.st_mode)) + { + if (do_uninstall(destfile)<0) + goto FAIL; + } + else if (unlink(destfile) < 0) + { + DEBUG_ERROR("unlink is failed %s\n",destfile); + goto FAIL; + } + DEBUG_LOG("destfile =%s\n",destfile); + } + } + + closedir (d); + + if (rmdir(deletedir) < 0) + { + DEBUG_ERROR("rmdir is failed \n"); + return -1; + } + + DEBUG_LOG("rmdir =%s\n",deletedir); + return 0; + +FAIL: + closedir (d); + return -1; +} + + +int COMMON_PKGMGR_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list) +{ + int ret; + pkgmgrinfo_pkginfo_h handle = NULL; + const char *app_root_path = NULL; + const char *dest_path = NULL; + + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret < 0) + { + DEBUG_ERROR("pkgid[%s] handle get fail", pkgid); + return -1; + } + + ret = pkgmgrinfo_pkginfo_get_root_path(handle, (char **)&app_root_path); + if (ret < 0) + { + DEBUG_ERROR("pkgid[%s] path get fail", pkgid); + goto FAIL; + } + + if (appid == NULL) + { + DEBUG_ERROR("appid is NULL \n"); + goto FAIL; + } + + ret = make_dir(PARENT_PATH); + + if (ret < 0) + { + DEBUG_ERROR("make current directory is failed \n"); + goto FAIL; + } + + dest_path = check_preloaded(app_root_path); + + if (make_dir(dest_path)<0) + { + DEBUG_ERROR("make current directory is failed \n"); + return -1; + } + + ret = do_install(dest_path,appid, app_root_path, handle); + if (ret < 0) + { + DEBUG_ERROR("font install is failed \n"); + goto FAIL; + } + + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return ret; + +FAIL: + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; +} + + +int COMMON_PKGMGR_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list) +{ + char deletedir[MAX_FILE_LEN]; + int ret = 0; + pkgmgrinfo_pkginfo_h handle = NULL; + const char* app_root_path = NULL; + const char* dest_path = NULL; + + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret < 0) + { + DEBUG_ERROR("pkgid[%s] handle get fail", pkgid); + return -1; + } + + ret = pkgmgrinfo_pkginfo_get_root_path(handle, (char **)&app_root_path); + if (ret < 0) + { + DEBUG_ERROR("pkgid[%s] path get fail", pkgid); + goto FAIL; + } + + if (appid == NULL) + { + DEBUG_ERROR("appid is NULL \n"); + goto FAIL; + } + + dest_path = check_preloaded(app_root_path); + + if (strlen (dest_path) + strlen (appid) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("appid length is not available \n"); + goto FAIL; + } + + sprintf(deletedir,"%s/%s", dest_path, appid); + + if (access(deletedir, F_OK) == -1) + { + DEBUG_ERROR("dest directory is not exist \n"); + goto FAIL; + } + + ret = do_uninstall(deletedir); + if (ret < 0) + { + DEBUG_ERROR("do_uninstall is failed \n"); + goto FAIL; + } + + ret = make_dir(PARENT_PATH); + + if (ret < 0) + { + DEBUG_ERROR("make current directory is failed \n"); + goto FAIL; + } + + ret = make_dir(dest_path); + + if (ret < 0) + { + DEBUG_ERROR("make current directory is failed \n"); + goto FAIL; + } + + ret = do_install(dest_path, appid, app_root_path, handle); + if (ret < 0) + { + DEBUG_ERROR("do_install is failed \n"); + goto FAIL; + } + + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return ret; + +FAIL: + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return -1; +} + + + +int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list) +{ + char deletedir[MAX_FILE_LEN]; + FcObjectSet *os = NULL; + FcPattern *pat = NULL; + FcFontSet *fs = NULL; + const char* app_root_path = NULL; + const char *dest_path = NULL; + int ret; + + elm_init(0, NULL); + + if (appid == NULL) + { + DEBUG_ERROR("appid is NULL \n"); + return -1; + } + + pkgmgrinfo_pkginfo_h handle = NULL; + + + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); + if (ret < 0) + { + DEBUG_ERROR("pkgid[%s] handle get fail", pkgid); + return -1; + } + + ret = pkgmgrinfo_pkginfo_get_root_path(handle, (char **)&app_root_path); + if (ret < 0) + { + DEBUG_ERROR("pkgid[%s] path get fail", pkgid); + goto FAIL; + } + + dest_path = check_preloaded(app_root_path); + + if (strlen (dest_path) + strlen (appid) + 2 >= MAX_FILE_LEN ) + { + DEBUG_ERROR("appid length is not available \n"); + goto FAIL; + } + + sprintf(deletedir,"%s/%s", dest_path, appid); + + //check if current using font is same with uninstall font + int deletedir_len = strlen(deletedir); + + pat = FcPatternCreate(); + if (pat == NULL) + { + DEBUG_ERROR("FcPatternCreate is NULL \n"); + goto FAIL; + } + + char *current_font_name = NULL; + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, ¤t_font_name); + if (ret < 0) + { + DEBUG_ERROR("Get current font is failed \n"); + goto FAIL; + } + + DEBUG_LOG("current_font_name =%s\n",current_font_name); + + FcInitLoadConfigAndFonts(); + FcPatternAddString (pat, FC_FAMILY,(FcChar8*)current_font_name); + os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char *) 0); + fs = FcFontList(NULL, pat, os); + + FcPatternDestroy(pat); + free(current_font_name); + + if (fs) + { + int j; + for (j = 0; j < fs->nfont; j++) + { + FcChar8 *file = NULL; + if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) + { + DEBUG_LOG("file =%s\n",file); + if (strncmp((const char*)file , deletedir , deletedir_len) == 0 ) + { + DEBUG_LOG("change to default font\n"); + char *default_font_name = NULL; + + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_DEFAULT_FONT_TYPE, &default_font_name); + if (ret < 0) + { + DEBUG_ERROR("Get default font is failed \n"); + goto FAIL; + } + + DEBUG_LOG("default_font_name = %s \n",default_font_name); + setenv("HOME", "/opt/home/app", 1); + + ret = system_settings_set_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, default_font_name); + if (ret < 0) + { + DEBUG_ERROR("Set default font is failed ret=%d \n",ret); + free(default_font_name); + break; + } + + char *elm_profile_path = (char*)elm_config_profile_dir_get(elm_config_profile_get(), EINA_TRUE); + + setenv("HOME", "/root", 1); + + ret = chown(ELM_PROFILE_CFG, APP_OWNER_ID, APP_GROUP_ID); + if (ret < 0) + { + chmod (ELM_PROFILE_CFG, 0777); + } + + ret = lsetxattr(ELM_PROFILE_CFG, "security.SMACK64", "system::homedir", 15, 0); + if (ret < 0) + { + chmod (ELM_PROFILE_CFG, 0777); + } + + DIR *d; + struct dirent *e; + + d = opendir (elm_profile_path); + + while ((e = readdir (d))) + { + if (e->d_name[0] != '.' && (strstr(e->d_name, ".cfg") != 0 || strstr(e->d_name, ".CFG") != 0)) + { + char file_full_path[100]; + + sprintf(file_full_path, "%s/%s", elm_profile_path, e->d_name); + + ret = chown(file_full_path, APP_OWNER_ID, APP_GROUP_ID); + if (ret < 0) + { + DEBUG_LOG("chown is failed %s", file_full_path); + chmod (file_full_path, 0777); + } + + ret = lsetxattr(file_full_path, "security.SMACK64", "system::homedir", 15, 0); + if (ret < 0) + { + DEBUG_LOG("chsmack is failed %s", file_full_path); + chmod (file_full_path, 0777); + } + } + } + + closedir (d); + + free(default_font_name); + free(elm_profile_path); + DEBUG_LOG("success change to default font\n"); + break; + } + } + } + } + + if (access(deletedir, F_OK) == -1) + { + DEBUG_ERROR("dest directory(%s) is not exist \n", deletedir); + goto FAIL; + } + + elm_shutdown(); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return do_uninstall(deletedir); + +FAIL: + elm_shutdown(); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + + return -1; +} + +#if USE_META_DATA +int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list) +{ + return COMMON_PKGMGR_PLUGIN_INSTALL(pkgid, appid, list); +} + +int PKGMGR_MDPARSER_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list) +{ + return COMMON_PKGMGR_PLUGIN_UPGRADE(pkgid, appid, list); +} + +int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list) +{ + return COMMON_PKGMGR_PLUGIN_UNINSTALL(pkgid, appid, list); +} +#endif + +int PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list) +{ + return COMMON_PKGMGR_PLUGIN_INSTALL(pkgid, appid, list); +} + +int PKGMGR_CATEGORY_PARSER_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list) +{ + return COMMON_PKGMGR_PLUGIN_UPGRADE(pkgid, appid, list); +} + +int PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list) +{ + return COMMON_PKGMGR_PLUGIN_UNINSTALL(pkgid, appid, list); +} + + +/* End of a file */ -- 2.7.4 From 1904d900de511a865934c73e10267af066348c50 Mon Sep 17 00:00:00 2001 From: Sung-Taek Hong Date: Fri, 31 Jul 2015 16:22:11 +0900 Subject: [PATCH 03/15] [License] apply SPDX identifier and update copyright Change-Id: I35fb2f8fe8f0e0dfdc99eff785a7c0f61727987c Signed-off-by: Sung-Taek Hong --- LICENSE | 2 +- packaging/download-fonts-service.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 704a2ab..e7ef455 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013 - 2014 Samsung Electronics Co., Ltd. All rights reserved. +Copyright (c) 2013 - 2015 Samsung Electronics Co., Ltd. All rights reserved. Apache License Version 2.0, January 2004 diff --git a/packaging/download-fonts-service.spec b/packaging/download-fonts-service.spec index 1dd3932..40f9693 100755 --- a/packaging/download-fonts-service.spec +++ b/packaging/download-fonts-service.spec @@ -3,7 +3,7 @@ Summary: Master Download fonts service. Version: 0.0.6 Release: 1 Group: TO_BE / FILLED_IN -License: Apache License, Version 2.0 +License: Apache-2.0 Source0: %{name}-%{version}.tar.gz BuildRequires: cmake, gettext-tools, smack, coreutils BuildRequires: pkgconfig(dlog) -- 2.7.4 From 5890a539f18d338710ae39039ff1dac986344eb1 Mon Sep 17 00:00:00 2001 From: WooHyun Jung Date: Thu, 2 Jul 2015 21:24:55 +0900 Subject: [PATCH 04/15] add null check for opendir Change-Id: I75a648b03f54ceb9ef25b09da96fb63ce0cb3182 --- pkgmgr_font/src/font_service_register.c | 42 ++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index 4de31df..9c45c3c 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -758,36 +758,40 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * chmod (ELM_PROFILE_CFG, 0777); } - DIR *d; + DIR *d = NULL; struct dirent *e; - d = opendir (elm_profile_path); + if (elm_profile_path) + d = opendir (elm_profile_path); - while ((e = readdir (d))) + if (d) { - if (e->d_name[0] != '.' && (strstr(e->d_name, ".cfg") != 0 || strstr(e->d_name, ".CFG") != 0)) + while ((e = readdir (d))) { - char file_full_path[100]; + if (e->d_name[0] != '.' && (strstr(e->d_name, ".cfg") != 0 || strstr(e->d_name, ".CFG") != 0)) + { + char file_full_path[100]; - sprintf(file_full_path, "%s/%s", elm_profile_path, e->d_name); + sprintf(file_full_path, "%s/%s", elm_profile_path, e->d_name); - ret = chown(file_full_path, APP_OWNER_ID, APP_GROUP_ID); - if (ret < 0) - { - DEBUG_LOG("chown is failed %s", file_full_path); - chmod (file_full_path, 0777); - } + ret = chown(file_full_path, APP_OWNER_ID, APP_GROUP_ID); + if (ret < 0) + { + DEBUG_LOG("chown is failed %s", file_full_path); + chmod (file_full_path, 0777); + } - ret = lsetxattr(file_full_path, "security.SMACK64", "system::homedir", 15, 0); - if (ret < 0) - { - DEBUG_LOG("chsmack is failed %s", file_full_path); - chmod (file_full_path, 0777); + ret = lsetxattr(file_full_path, "security.SMACK64", "system::homedir", 15, 0); + if (ret < 0) + { + DEBUG_LOG("chsmack is failed %s", file_full_path); + chmod (file_full_path, 0777); + } } } - } - closedir (d); + closedir (d); + } free(default_font_name); free(elm_profile_path); -- 2.7.4 From 5d8bac7379a5fee02ca05a9d1161740166350e0a Mon Sep 17 00:00:00 2001 From: Thiep Ha Date: Thu, 3 Sep 2015 14:04:38 +0900 Subject: [PATCH 05/15] bump version up Change-Id: I27fdd77b69cbf7f3533438eb8fd6192c80d5ef7c --- packaging/download-fonts-service.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/download-fonts-service.spec b/packaging/download-fonts-service.spec index 40f9693..238d2c2 100755 --- a/packaging/download-fonts-service.spec +++ b/packaging/download-fonts-service.spec @@ -1,6 +1,6 @@ Name: download-fonts-service Summary: Master Download fonts service. -Version: 0.0.6 +Version: 0.0.7 Release: 1 Group: TO_BE / FILLED_IN License: Apache-2.0 -- 2.7.4 From 9dc5040e9a3caa546be16f703e1f2c61716c95df Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Wed, 23 Sep 2015 19:13:40 +0900 Subject: [PATCH 06/15] Fixed to use security_server_label_access() instead of lsetxattr(). Change-Id: I8ba5996064fd73bebd2aaff228efdf5682d1637a --- CMakeLists.txt | 1 + packaging/download-fonts-service.spec | 1 + pkgmgr_font/src/font_service_register.c | 17 +++++++++-------- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index db48748..cc300bf 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ pkg_check_modules(pkg REQUIRED capi-system-system-settings elementary pkgmgr-info + security-server ) SET(PACKAGE "${PROJECT_NAME}") diff --git a/packaging/download-fonts-service.spec b/packaging/download-fonts-service.spec index 238d2c2..68db2e0 100755 --- a/packaging/download-fonts-service.spec +++ b/packaging/download-fonts-service.spec @@ -11,6 +11,7 @@ BuildRequires: pkgconfig(fontconfig) BuildRequires: pkgconfig(capi-system-system-settings) BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(pkgmgr-info) +BuildRequires: pkgconfig(security-server) %description Master Download fonts service. diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index 9c45c3c..31e62e7 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "system_settings.h" @@ -102,11 +103,11 @@ static int make_dir(const char *path) return ret; } } - ret = lsetxattr(path, "security.SMACK64", "_", 1, 0); + ret = security_server_label_access(path, "_"); if (ret < 0) { - DEBUG_ERROR("lsetxattr is failed %s\n",path); + DEBUG_ERROR("security_server_label_access is failed %s\n",path); return ret; } @@ -174,11 +175,11 @@ static int symbolic_link(const char *srcpath, const char *destpath) goto FAIL; } - ret = lsetxattr(destdir, "security.SMACK64", "_", 1, 0); + ret = security_server_label_access(destdir, "_"); if (ret < 0) { - DEBUG_ERROR("lsetxattr is failed %s\n",destdir); + DEBUG_ERROR("security_server_label_access is failed %s\n",destdir); goto FAIL; } } @@ -247,11 +248,11 @@ static int move_file(const char *srcpath, const char *destpath) goto FAIL; } - ret = lsetxattr(destdir, "security.SMACK64", "_", 1, 0); + ret = security_server_label_access(destdir, "_"); if (ret < 0) { - DEBUG_ERROR("lsetxattr is failed %s\n",destdir); + DEBUG_ERROR("security_server_label_access is failed %s\n",destdir); goto FAIL; } } @@ -752,7 +753,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * chmod (ELM_PROFILE_CFG, 0777); } - ret = lsetxattr(ELM_PROFILE_CFG, "security.SMACK64", "system::homedir", 15, 0); + ret = security_server_label_access(ELM_PROFILE_CFG, "system::homedir"); if (ret < 0) { chmod (ELM_PROFILE_CFG, 0777); @@ -781,7 +782,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * chmod (file_full_path, 0777); } - ret = lsetxattr(file_full_path, "security.SMACK64", "system::homedir", 15, 0); + ret = security_server_label_access(file_full_path, "system::homedir"); if (ret < 0) { DEBUG_LOG("chsmack is failed %s", file_full_path); -- 2.7.4 From cb50cea2028becdb682d9d3681c5febee182fff2 Mon Sep 17 00:00:00 2001 From: Sung-Taek Hong Date: Fri, 25 Sep 2015 19:18:44 +0900 Subject: [PATCH 07/15] update version to 0.0.8 Signed-off-by: Sung-Taek Hong Change-Id: I1d160b94beef18ebda4d3082d7eb1d2b4e20d0fb --- packaging/download-fonts-service.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/download-fonts-service.spec b/packaging/download-fonts-service.spec index 68db2e0..3e3986e 100755 --- a/packaging/download-fonts-service.spec +++ b/packaging/download-fonts-service.spec @@ -1,6 +1,6 @@ Name: download-fonts-service Summary: Master Download fonts service. -Version: 0.0.7 +Version: 0.0.8 Release: 1 Group: TO_BE / FILLED_IN License: Apache-2.0 -- 2.7.4 From 3ea6bd7b1ba605d7b9e52b281355842e1e0a53ff Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 10 Oct 2016 17:35:37 +0900 Subject: [PATCH 08/15] Fix download-fonts-service package for Tizen 3.0 Change-Id: I49354bbab76c71d33ccd2c3b2c82f626664930d4 --- CMakeLists.txt | 2 +- download-fonts-service.manifest | 14 ------ packaging/download-fonts-service.manifest | 5 ++ packaging/download-fonts-service.spec | 16 ++++--- pkgmgr_font/CMakeLists.txt | 5 +- pkgmgr_font/src/font_service_register.c | 78 +++++++++++-------------------- 6 files changed, 45 insertions(+), 75 deletions(-) delete mode 100755 download-fonts-service.manifest create mode 100644 packaging/download-fonts-service.manifest mode change 100755 => 100644 packaging/download-fonts-service.spec diff --git a/CMakeLists.txt b/CMakeLists.txt index cc300bf..a6faea3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ pkg_check_modules(pkg REQUIRED capi-system-system-settings elementary pkgmgr-info - security-server + pkgmgr-installer ) SET(PACKAGE "${PROJECT_NAME}") diff --git a/download-fonts-service.manifest b/download-fonts-service.manifest deleted file mode 100755 index b6c8305..0000000 --- a/download-fonts-service.manifest +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packaging/download-fonts-service.manifest b/packaging/download-fonts-service.manifest new file mode 100644 index 0000000..a76fdba --- /dev/null +++ b/packaging/download-fonts-service.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/download-fonts-service.spec b/packaging/download-fonts-service.spec old mode 100755 new mode 100644 index 3e3986e..174fadd --- a/packaging/download-fonts-service.spec +++ b/packaging/download-fonts-service.spec @@ -1,23 +1,25 @@ Name: download-fonts-service -Summary: Master Download fonts service. -Version: 0.0.8 +Summary: Master Download fonts service +Version: 1.0.0 Release: 1 -Group: TO_BE / FILLED_IN +Group: Base/Package Management License: Apache-2.0 Source0: %{name}-%{version}.tar.gz +Source1001: download-fonts-service.manifest BuildRequires: cmake, gettext-tools, smack, coreutils BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(fontconfig) BuildRequires: pkgconfig(capi-system-system-settings) BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(pkgmgr-info) -BuildRequires: pkgconfig(security-server) +BuildRequires: pkgconfig(pkgmgr-installer) %description Master Download fonts service. %prep %setup -q +cp %{SOURCE1001} . %build %if 0%{?sec_build_binary_debug_enable} @@ -30,7 +32,7 @@ export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE" export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE" export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE" %endif -cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DPRODUCT=private +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} CFLAGS="${CFLAGS} -Wall -Winline -Werror" LDFLAGS="${LDFLAGS}" make %{?jobs:-j%jobs} @@ -38,9 +40,11 @@ CFLAGS="${CFLAGS} -Wall -Winline -Werror" LDFLAGS="${LDFLAGS}" make %{?jobs:-j%j rm -rf %{buildroot} %make_install +mkdir -p %{buildroot}%{_tmpfilesdir} + %files -n download-fonts-service %manifest download-fonts-service.manifest %defattr(-,root,root,-) -%{_prefix}/etc/package-manager/parserlib/category/* +/etc/package-manager/parserlib/category/* # End of a file diff --git a/pkgmgr_font/CMakeLists.txt b/pkgmgr_font/CMakeLists.txt index 7086af2..5d6424e 100755 --- a/pkgmgr_font/CMakeLists.txt +++ b/pkgmgr_font/CMakeLists.txt @@ -8,14 +8,13 @@ pkg_check_modules(bin_pkgs REQUIRED fontconfig capi-system-system-settings elementary - pkgmgr-info ) FOREACH(flag ${bin_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -g -Wall -Werror") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -g -Wall") ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") @@ -25,5 +24,5 @@ ADD_LIBRARY(${PROJECT_NAME} SHARED TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${bin_pkgs_LDFLAGS}) -INSTALL(TARGETS ${PROJECT_NAME} DESTINATION "etc/package-manager/parserlib/category") +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION "/etc/package-manager/parserlib/category") # End of a file diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index 31e62e7..3147a7d 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include "system_settings.h" @@ -49,8 +49,8 @@ static const char *PRELOADED_PATH = "/opt/share/fonts/preloaded"; static const char *ELM_PROFILE_CFG = "/opt/home/app/.elementary/config/profile.cfg"; #define MAX_FILE_LEN 4096 -#define APP_OWNER_ID 5000 -#define APP_GROUP_ID 5000 +#define APP_OWNER_ID 5001 +#define APP_GROUP_ID 100 static int make_dir(const char *path); static int symbolic_link(const char *srcpath, const char *destpath); @@ -95,7 +95,14 @@ static int make_dir(const char *path) return ret; } - ret = chmod (path, 0755); + ret = chown(path, getuid(), APP_GROUP_ID); + if (ret < 0) + { + DEBUG_ERROR("chown is failed %s\n",path); + return ret; + } + + ret = chmod(path, 0755); if (ret < 0) { DEBUG_ERROR("chmod is failed %s\n",path); @@ -103,13 +110,6 @@ static int make_dir(const char *path) return ret; } } - ret = security_server_label_access(path, "_"); - - if (ret < 0) - { - DEBUG_ERROR("security_server_label_access is failed %s\n",path); - return ret; - } return ret; } @@ -174,14 +174,6 @@ static int symbolic_link(const char *srcpath, const char *destpath) DEBUG_ERROR("symlink is failed \n"); goto FAIL; } - - ret = security_server_label_access(destdir, "_"); - - if (ret < 0) - { - DEBUG_ERROR("security_server_label_access is failed %s\n",destdir); - goto FAIL; - } } } closedir (d); @@ -247,14 +239,6 @@ static int move_file(const char *srcpath, const char *destpath) DEBUG_ERROR("symlink is failed \n"); goto FAIL; } - - ret = security_server_label_access(destdir, "_"); - - if (ret < 0) - { - DEBUG_ERROR("security_server_label_access is failed %s\n",destdir); - goto FAIL; - } } } closedir (d); @@ -500,8 +484,11 @@ int COMMON_PKGMGR_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *li pkgmgrinfo_pkginfo_h handle = NULL; const char *app_root_path = NULL; const char *dest_path = NULL; + uid_t uid = 0; + + pkgmgr_installer_info_get_target_uid(&uid); + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); if (ret < 0) { DEBUG_ERROR("pkgid[%s] handle get fail", pkgid); @@ -561,8 +548,11 @@ int COMMON_PKGMGR_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *li pkgmgrinfo_pkginfo_h handle = NULL; const char* app_root_path = NULL; const char* dest_path = NULL; + uid_t uid = 0; + + pkgmgr_installer_info_get_target_uid(&uid); + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); if (ret < 0) { DEBUG_ERROR("pkgid[%s] handle get fail", pkgid); @@ -594,7 +584,7 @@ int COMMON_PKGMGR_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *li if (access(deletedir, F_OK) == -1) { - DEBUG_ERROR("dest directory is not exist \n"); + DEBUG_ERROR("dest directory(%s) is not exist: %s\n", deletedir, strerror(errno)); goto FAIL; } @@ -606,18 +596,16 @@ int COMMON_PKGMGR_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *li } ret = make_dir(PARENT_PATH); - if (ret < 0) { - DEBUG_ERROR("make current directory is failed \n"); + DEBUG_ERROR("make current directory(%s) is failed: %s\n", PARENT_PATH, strerror(errno)); goto FAIL; } ret = make_dir(dest_path); - if (ret < 0) { - DEBUG_ERROR("make current directory is failed \n"); + DEBUG_ERROR("make current directory(%s) is failed: %s\n", dest_path, strerror(errno)); goto FAIL; } @@ -644,9 +632,11 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * FcObjectSet *os = NULL; FcPattern *pat = NULL; FcFontSet *fs = NULL; + pkgmgrinfo_pkginfo_h handle = NULL; const char* app_root_path = NULL; const char *dest_path = NULL; int ret; + uid_t uid = 0; elm_init(0, NULL); @@ -656,10 +646,9 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * return -1; } - pkgmgrinfo_pkginfo_h handle = NULL; - + pkgmgr_installer_info_get_target_uid(&uid); + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); if (ret < 0) { DEBUG_ERROR("pkgid[%s] handle get fail", pkgid); @@ -753,12 +742,6 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * chmod (ELM_PROFILE_CFG, 0777); } - ret = security_server_label_access(ELM_PROFILE_CFG, "system::homedir"); - if (ret < 0) - { - chmod (ELM_PROFILE_CFG, 0777); - } - DIR *d = NULL; struct dirent *e; @@ -781,13 +764,6 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * DEBUG_LOG("chown is failed %s", file_full_path); chmod (file_full_path, 0777); } - - ret = security_server_label_access(file_full_path, "system::homedir"); - if (ret < 0) - { - DEBUG_LOG("chsmack is failed %s", file_full_path); - chmod (file_full_path, 0777); - } } } @@ -805,7 +781,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * if (access(deletedir, F_OK) == -1) { - DEBUG_ERROR("dest directory(%s) is not exist \n", deletedir); + DEBUG_ERROR("dest directory(%s) is not exist: %s\n", deletedir, strerror(errno)); goto FAIL; } -- 2.7.4 From b916cd2a37b93bf9e659689d830bc81d6d658c15 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 5 Jan 2017 12:34:01 +0900 Subject: [PATCH 09/15] remove changing permission for ELM_PROFILE_CFG file It was a legacy code for old Tizen 2.x. The configure files for EFL will be cared in each user sessions. So, we don't need to care permisson and owner of the configure files. Change-Id: Ia3d0b2efe917320ffc6976e3f1081363cb6488be --- pkgmgr_font/src/font_service_register.c | 48 +++------------------------------ 1 file changed, 3 insertions(+), 45 deletions(-) diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index 3147a7d..55f072f 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -31,7 +31,6 @@ #include #include "system_settings.h" - #define FONT_SERVICE_TAG "FONT_SERVICE" #define DEBUG_LOG(frmt, args...) \ do { SLOG(LOG_DEBUG,FONT_SERVICE_TAG, "[font_service] %s: "frmt"\n",\ @@ -47,7 +46,6 @@ static const char *PARENT_PATH = "/opt/share/fonts"; static const char *DOWNLOAD_PATH = "/opt/share/fonts/download"; static const char *PRELOADED_PATH = "/opt/share/fonts/preloaded"; -static const char *ELM_PROFILE_CFG = "/opt/home/app/.elementary/config/profile.cfg"; #define MAX_FILE_LEN 4096 #define APP_OWNER_ID 5001 #define APP_GROUP_ID 100 @@ -703,13 +701,14 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * if (fs) { int j; + for (j = 0; j < fs->nfont; j++) { FcChar8 *file = NULL; if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) { - DEBUG_LOG("file =%s\n",file); - if (strncmp((const char*)file , deletedir , deletedir_len) == 0 ) + DEBUG_LOG("file =%s, deletedir =%s\n", file, deletedir); + if (strncmp((const char*)file, deletedir, deletedir_len) == 0) { DEBUG_LOG("change to default font\n"); char *default_font_name = NULL; @@ -722,8 +721,6 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * } DEBUG_LOG("default_font_name = %s \n",default_font_name); - setenv("HOME", "/opt/home/app", 1); - ret = system_settings_set_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, default_font_name); if (ret < 0) { @@ -732,46 +729,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * break; } - char *elm_profile_path = (char*)elm_config_profile_dir_get(elm_config_profile_get(), EINA_TRUE); - - setenv("HOME", "/root", 1); - - ret = chown(ELM_PROFILE_CFG, APP_OWNER_ID, APP_GROUP_ID); - if (ret < 0) - { - chmod (ELM_PROFILE_CFG, 0777); - } - - DIR *d = NULL; - struct dirent *e; - - if (elm_profile_path) - d = opendir (elm_profile_path); - - if (d) - { - while ((e = readdir (d))) - { - if (e->d_name[0] != '.' && (strstr(e->d_name, ".cfg") != 0 || strstr(e->d_name, ".CFG") != 0)) - { - char file_full_path[100]; - - sprintf(file_full_path, "%s/%s", elm_profile_path, e->d_name); - - ret = chown(file_full_path, APP_OWNER_ID, APP_GROUP_ID); - if (ret < 0) - { - DEBUG_LOG("chown is failed %s", file_full_path); - chmod (file_full_path, 0777); - } - } - } - - closedir (d); - } - free(default_font_name); - free(elm_profile_path); DEBUG_LOG("success change to default font\n"); break; } -- 2.7.4 From 0488c025920a8e7d774a1c09a7498284ca65834c Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 5 Jan 2017 12:39:57 +0900 Subject: [PATCH 10/15] fix setting a default font issue in wrong cases Even if a deleted font is not related to current font, The download font service changes current font to a default font in some cases. It is caused by using strncmp without "/" character at end of delete dir path. ex. Current Font Path - /opt/share/fonts/org.tizen.downloadablefont1/myfont.ttf Delete Font Path - /opt/share/fonts/org.tizen.downloadablefont The path for comparing should have "/" at end of the path. Change-Id: I76bbd3b06a835edb987093f4ee3226c2eb0c01ac --- pkgmgr_font/src/font_service_register.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index 55f072f..726a57c 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -633,7 +633,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * pkgmgrinfo_pkginfo_h handle = NULL; const char* app_root_path = NULL; const char *dest_path = NULL; - int ret; + int ret, deletedir_len; uid_t uid = 0; elm_init(0, NULL); @@ -668,10 +668,12 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * goto FAIL; } - sprintf(deletedir,"%s/%s", dest_path, appid); + /* It must contain "/" character at end of the delete dir path. + * It prevents file path comparing issues when there are many similar path. */ + sprintf(deletedir,"%s/%s/", dest_path, appid); //check if current using font is same with uninstall font - int deletedir_len = strlen(deletedir); + deletedir_len = strlen(deletedir); pat = FcPatternCreate(); if (pat == NULL) -- 2.7.4 From 75f316df35401bbd15839f8e8a7846414c8fe543 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 2 Feb 2017 16:00:26 +0900 Subject: [PATCH 11/15] copy file when move font file to proper shared path It resolve smack issue when .wgt font application is installed. Change-Id: I3ea71a0ffbbac0eea15526ad31e22c42a5544daa --- pkgmgr_font/src/font_service_register.c | 119 ++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 22 deletions(-) diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index 726a57c..b059dbb 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -54,7 +54,7 @@ static int make_dir(const char *path); static int symbolic_link(const char *srcpath, const char *destpath); static int do_install(const char *parent, const char *appid, const char *rootpath, pkgmgrinfo_pkginfo_h handle); static int do_uninstall(const char *deletedir); -static int move_file(const char *srcpath, const char *destpath); +static int move_path(const char *srcpath, const char *destpath); static const char* check_preloaded(const char *app_root_path); #ifdef CHECK_FAMILY_NAME static int check_family_name(const char *srcpath); @@ -182,68 +182,143 @@ FAIL: return -1; } +#define COPY_BUF_SIZE 16777216 -static int move_file(const char *srcpath, const char *destpath) +static int copy_file(const char *srcpath, const char *destpath) { + FILE *in, *out; + char *buf; + size_t len; + + if (!srcpath || !destpath) + { + DEBUG_ERROR("copyfile is failed. A given param is NULL ... srcpath[%s], destpath[%s]\n", srcpath, destpath); + goto FAIL; + } + + if (!strcmp(srcpath, destpath)) + { + DEBUG_ERROR("copyfile is failed. The both path are same ... srcpath[%s], destpath[%s]\n", srcpath, destpath); + goto FAIL; + } + + if ((in = fopen(srcpath, "rb")) == NULL) + { + DEBUG_ERROR("copyfile is failed. The srcpath[%s] is not opened with read permission. fopen(): %s\n", srcpath, strerror(errno)); + goto FAIL; + } + + if ((out = fopen(destpath, "wb")) == NULL) + { + DEBUG_ERROR("copyfile is failed. The destpath[%s] is not opened with write permission. fopen(): %s\n", destpath, strerror(errno)); + goto FAIL; + } + + if ((buf = (char *) malloc(COPY_BUF_SIZE)) == NULL) + { + DEBUG_ERROR("copyfile is failed. Memory allocation for copy buffer is failed. Request size [%d]. malloc(): %s\n", COPY_BUF_SIZE, strerror(errno)); + goto FAIL; + } + + while ((len = fread(buf, sizeof(char), sizeof(buf), in)) != 0) + { + if (fwrite(buf, sizeof(char), len, out) == 0) + { + /* Reads "len" string. But, it fails to write file. + We need to remove wrong result. */ + DEBUG_ERROR("copyfile is failed. fwrite fails to write. fwrite(): %s\n", strerror(errno)); + + fclose(out); + out = NULL; + + if (remove(destpath) == -1) + DEBUG_ERROR("removing copied file with error is failed. remove(): %s\n", strerror(errno)); + + goto FAIL; + } + } + + /* Copy file DONE! */ + if (in) fclose(in); + if (out) fclose(out); + if (buf) free(buf); + return 0; + +FAIL: + if (in) fclose(in); + if (out) fclose(out); + if (buf) free(buf); + return -1; +} + +static int move_path(const char *srcpath, const char *destpath) { DIR *d; struct dirent *e; int ret = 0; - d = opendir (srcpath); - while ((e = readdir (d))) + d = opendir(srcpath); + while ((e = readdir(d))) { if (e->d_name[0] != '.' && strlen((char *)e->d_name) < MAX_FILE_LEN) { char srcdir[MAX_FILE_LEN]; char destdir[MAX_FILE_LEN]; - struct stat statb; + struct stat statb; - if (strlen (srcpath) + strlen ((char *)e->d_name) + 2 >= MAX_FILE_LEN ) + if (strlen(srcpath) + strlen((char *)e->d_name) + 2 >= MAX_FILE_LEN) { DEBUG_ERROR("srcdir length is not available \n"); goto FAIL; } - if (strlen (destpath) + strlen ((char *)e->d_name) + 2 >= MAX_FILE_LEN ) + if (strlen(destpath) + strlen((char *)e->d_name) + 2 >= MAX_FILE_LEN) { DEBUG_ERROR("destdir length is not available \n"); goto FAIL; } - sprintf(srcdir,"%s/%s",srcpath,(char *) e->d_name); - sprintf(destdir,"%s/%s",destpath,(char *) e->d_name); - if (stat (srcdir, &statb) == -1) + sprintf(srcdir, "%s/%s", srcpath, (char *)e->d_name); + sprintf(destdir, "%s/%s", destpath, (char *)e->d_name); + + if (stat(srcdir, &statb) == -1) { DEBUG_ERROR("stat %s is failed \n",srcdir); goto FAIL; } - if (S_ISDIR (statb.st_mode)) + if (S_ISDIR(statb.st_mode)) { - if (make_dir(destdir)<0) + if (make_dir(destdir) < 0) { - DEBUG_ERROR("make current directory %s is failed \n",destdir); + DEBUG_ERROR("make current directory %s is failed \n", destdir); goto FAIL; } continue; } - DEBUG_LOG("srcdir =%s\n",(char *) srcdir); - DEBUG_LOG("destdir =%s\n",(char *) destdir); - DEBUG_LOG("file name =%s\n",(char *) e->d_name); - ret = rename((const char *)srcdir,(const char *)destdir); + DEBUG_LOG("srcdir =%s\n", (char *)srcdir); + DEBUG_LOG("destdir =%s\n", (char *)destdir); + DEBUG_LOG("file name =%s\n", (char *)e->d_name); + + /* We need copy font file instead of rename() function. + To apply smack label of parent directory, we need create new file to the path. */ + ret = copy_file(srcdir, destdir); if (ret < 0) { - DEBUG_ERROR("symlink is failed \n"); + DEBUG_ERROR("copy_file is failed \n"); goto FAIL; } + + if (remove(srcdir) == -1) + DEBUG_ERROR("removing src file[%s] is failed. remove(): %s\n", srcdir, strerror(errno)); } } - closedir (d); + + closedir(d); return ret; FAIL: - closedir (d); + closedir(d); return -1; } @@ -384,12 +459,12 @@ static int do_install(const char *parent, const char *appid, const char *rootpat { char srcpath[MAX_FILE_LEN]; sprintf(srcpath,"%s/res/wgt/shared/res", rootpath); - ret = move_file(srcpath, path); + ret = move_path(srcpath, path); } if (ret < 0) { - DEBUG_ERROR("move_file is failed\n"); + DEBUG_ERROR("move_path is failed\n"); goto FAIL; } -- 2.7.4 From a48fac2edbac930a86955ad2ae0f169e22672c7f Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 16 Mar 2017 10:44:02 +0900 Subject: [PATCH 12/15] fix memory leak and uninitialized local variable issues - Memory leak from FontConfig Pattern pointer. - Uninitialized local variable can be problem when it checks address for free and file close. Change-Id: I5a23fbf2fa484a70cceaab9eb6cbda5d86cb02f1 --- pkgmgr_font/src/font_service_register.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index b059dbb..d36446a 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -185,8 +185,8 @@ FAIL: #define COPY_BUF_SIZE 16777216 static int copy_file(const char *srcpath, const char *destpath) { - FILE *in, *out; - char *buf; + FILE *in = NULL, *out = NULL; + char *buf = NULL; size_t len; if (!srcpath || !destpath) @@ -773,7 +773,9 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * fs = FcFontList(NULL, pat, os); FcPatternDestroy(pat); + pat = NULL; free(current_font_name); + current_font_name = NULL; if (fs) { @@ -826,6 +828,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * return do_uninstall(deletedir); FAIL: + if (pat) FcPatternDestroy(pat); elm_shutdown(); pkgmgrinfo_pkginfo_destroy_pkginfo(handle); -- 2.7.4 From 075e1f6e8ecafd8d9447b5a7afe7abb588bcf81e Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 20 Mar 2017 12:18:25 +0900 Subject: [PATCH 13/15] replace sprintf() to snprintf() for better security Change-Id: I25508293e1daa8aeb95b9133298d088e2353b6c8 --- pkgmgr_font/src/font_service_register.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index d36446a..78529a3 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -65,8 +65,8 @@ static const char* check_preloaded(const char *app_root_path) char tpk_path[MAX_FILE_LEN]; char wgt_path[MAX_FILE_LEN]; - sprintf(tpk_path, "%s/preloaded", app_root_path); - sprintf(wgt_path, "%s/res/wgt/preloaded", app_root_path); + snprintf(tpk_path, sizeof(tpk_path), "%s/preloaded", app_root_path); + snprintf(wgt_path, sizeof(wgt_path), "%s/res/wgt/preloaded", app_root_path); if ((access(tpk_path, F_OK) == 0) || (access(wgt_path, F_OK) == 0)) { @@ -139,8 +139,8 @@ static int symbolic_link(const char *srcpath, const char *destpath) goto FAIL; } - sprintf(srcdir,"%s/%s",srcpath,(char *) e->d_name); - sprintf(destdir,"%s/%s",destpath,(char *) e->d_name); + snprintf(srcdir, sizeof(srcdir), "%s/%s", srcpath, (char *)e->d_name); + snprintf(destdir, sizeof(destdir), "%s/%s", destpath, (char *)e->d_name); if (stat (srcdir, &statb) == -1) { DEBUG_ERROR("stat %s is failed \n",srcdir); @@ -277,8 +277,8 @@ static int move_path(const char *srcpath, const char *destpath) goto FAIL; } - sprintf(srcdir, "%s/%s", srcpath, (char *)e->d_name); - sprintf(destdir, "%s/%s", destpath, (char *)e->d_name); + snprintf(srcdir, sizeof(srcdir), "%s/%s", srcpath, (char *)e->d_name); + snprintf(destdir, sizeof(destdir), "%s/%s", destpath, (char *)e->d_name); if (stat(srcdir, &statb) == -1) { @@ -432,7 +432,7 @@ static int do_install(const char *parent, const char *appid, const char *rootpat return -1; } - sprintf(destdir,"%s/%s",parent,appid); + snprintf(destdir, sizeof(destdir), "%s/%s", parent, appid); ret = make_dir(destdir); if (ret < 0) { @@ -453,12 +453,12 @@ static int do_install(const char *parent, const char *appid, const char *rootpat goto FAIL; } - sprintf(path,"%s/shared/res", rootpath); + snprintf(path, sizeof(path), "%s/shared/res", rootpath); if (!strcmp(type,"wgt")) { char srcpath[MAX_FILE_LEN]; - sprintf(srcpath,"%s/res/wgt/shared/res", rootpath); + snprintf(srcpath, sizeof(srcpath), "%s/res/wgt/shared/res", rootpath); ret = move_path(srcpath, path); } @@ -513,7 +513,7 @@ static int do_uninstall(const char *deletedir) goto FAIL; } - sprintf(destfile,"%s/%s",deletedir,(char *) e->d_name); + snprintf(destfile, sizeof(destfile), "%s/%s", deletedir, (char *)e->d_name); if (lstat (destfile, &statb) == -1) { DEBUG_ERROR("lstat %s is failed \n",destfile); @@ -653,7 +653,7 @@ int COMMON_PKGMGR_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *li goto FAIL; } - sprintf(deletedir,"%s/%s", dest_path, appid); + snprintf(deletedir, sizeof(deletedir), "%s/%s", dest_path, appid); if (access(deletedir, F_OK) == -1) { @@ -745,7 +745,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * /* It must contain "/" character at end of the delete dir path. * It prevents file path comparing issues when there are many similar path. */ - sprintf(deletedir,"%s/%s/", dest_path, appid); + snprintf(deletedir, sizeof(deletedir), "%s/%s/", dest_path, appid); //check if current using font is same with uninstall font deletedir_len = strlen(deletedir); -- 2.7.4 From 3d33e89ad8462061cad76ee8db7b49cba7765478 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 20 Mar 2017 13:13:45 +0900 Subject: [PATCH 14/15] replace strerror() to strerror_r() for thread safety It adds a macro to print error information of errno. Change-Id: Ic68c0b40bea361788917618e7263f6ed30e04e03 --- pkgmgr_font/src/font_service_register.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/pkgmgr_font/src/font_service_register.c b/pkgmgr_font/src/font_service_register.c index 78529a3..e78d85d 100755 --- a/pkgmgr_font/src/font_service_register.c +++ b/pkgmgr_font/src/font_service_register.c @@ -41,6 +41,12 @@ #define DEBUG_ERROR(frmt, args...) \ do { SLOG(LOG_ERROR,FONT_SERVICE_TAG, "[font_service] %s: "frmt"\n",\ __func__, ##args);} while (0) +#define DEBUG_ERROR_ERRNO(frmt, args...) \ + do { \ + char error_string[255] = { 0 }; \ + strerror_r(errno, error_string, sizeof(error_string)); \ + SLOG(LOG_ERROR,FONT_SERVICE_TAG, "[font_service] %s: "frmt": %s\n",\ + __func__, ##args, error_string);} while (0) static const char *PARENT_PATH = "/opt/share/fonts"; static const char *DOWNLOAD_PATH = "/opt/share/fonts/download"; @@ -203,19 +209,19 @@ static int copy_file(const char *srcpath, const char *destpath) { if ((in = fopen(srcpath, "rb")) == NULL) { - DEBUG_ERROR("copyfile is failed. The srcpath[%s] is not opened with read permission. fopen(): %s\n", srcpath, strerror(errno)); + DEBUG_ERROR_ERRNO("copyfile is failed. The srcpath[%s] is not opened with read permission. fopen()", srcpath); goto FAIL; } if ((out = fopen(destpath, "wb")) == NULL) { - DEBUG_ERROR("copyfile is failed. The destpath[%s] is not opened with write permission. fopen(): %s\n", destpath, strerror(errno)); + DEBUG_ERROR_ERRNO("copyfile is failed. The destpath[%s] is not opened with write permission. fopen()", destpath); goto FAIL; } if ((buf = (char *) malloc(COPY_BUF_SIZE)) == NULL) { - DEBUG_ERROR("copyfile is failed. Memory allocation for copy buffer is failed. Request size [%d]. malloc(): %s\n", COPY_BUF_SIZE, strerror(errno)); + DEBUG_ERROR_ERRNO("copyfile is failed. Memory allocation for copy buffer is failed. Request size [%d]. malloc()", COPY_BUF_SIZE); goto FAIL; } @@ -225,13 +231,13 @@ static int copy_file(const char *srcpath, const char *destpath) { { /* Reads "len" string. But, it fails to write file. We need to remove wrong result. */ - DEBUG_ERROR("copyfile is failed. fwrite fails to write. fwrite(): %s\n", strerror(errno)); + DEBUG_ERROR_ERRNO("copyfile is failed. fwrite fails to write. fwrite()"); fclose(out); out = NULL; if (remove(destpath) == -1) - DEBUG_ERROR("removing copied file with error is failed. remove(): %s\n", strerror(errno)); + DEBUG_ERROR_ERRNO("removing copied file with error is failed. remove()"); goto FAIL; } @@ -310,7 +316,7 @@ static int move_path(const char *srcpath, const char *destpath) } if (remove(srcdir) == -1) - DEBUG_ERROR("removing src file[%s] is failed. remove(): %s\n", srcdir, strerror(errno)); + DEBUG_ERROR_ERRNO("removing src file[%s] is failed. remove()", srcdir); } } @@ -657,7 +663,7 @@ int COMMON_PKGMGR_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *li if (access(deletedir, F_OK) == -1) { - DEBUG_ERROR("dest directory(%s) is not exist: %s\n", deletedir, strerror(errno)); + DEBUG_ERROR_ERRNO("dest directory(%s) is not exist", deletedir); goto FAIL; } @@ -671,14 +677,14 @@ int COMMON_PKGMGR_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *li ret = make_dir(PARENT_PATH); if (ret < 0) { - DEBUG_ERROR("make current directory(%s) is failed: %s\n", PARENT_PATH, strerror(errno)); + DEBUG_ERROR_ERRNO("make current directory(%s) is failed", PARENT_PATH); goto FAIL; } ret = make_dir(dest_path); if (ret < 0) { - DEBUG_ERROR("make current directory(%s) is failed: %s\n", dest_path, strerror(errno)); + DEBUG_ERROR_ERRNO("make current directory(%s) is failed", dest_path); goto FAIL; } @@ -818,7 +824,7 @@ int COMMON_PKGMGR_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList * if (access(deletedir, F_OK) == -1) { - DEBUG_ERROR("dest directory(%s) is not exist: %s\n", deletedir, strerror(errno)); + DEBUG_ERROR_ERRNO("dest directory(%s) is not exist", deletedir); goto FAIL; } -- 2.7.4 From abb049a066dbce4d87325c7ad2a92970d32c4b78 Mon Sep 17 00:00:00 2001 From: Jeeyong Um Date: Tue, 28 Mar 2017 14:34:25 +0900 Subject: [PATCH 15/15] license: Add macro to copy license file Signed-Off-By: Jeeyong Um Change-Id: Ia3d3b76b7a4a1ee8c760146ce55117b954ad3d55 --- packaging/download-fonts-service.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/packaging/download-fonts-service.spec b/packaging/download-fonts-service.spec index 174fadd..e25270c 100644 --- a/packaging/download-fonts-service.spec +++ b/packaging/download-fonts-service.spec @@ -45,6 +45,7 @@ mkdir -p %{buildroot}%{_tmpfilesdir} %files -n download-fonts-service %manifest download-fonts-service.manifest %defattr(-,root,root,-) +%license LICENSE /etc/package-manager/parserlib/category/* # End of a file -- 2.7.4