2 * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
25 #include <dbus/dbus.h>
26 #include <dbus/dbus-glib-lowlevel.h>
30 #include <package_manager.h>
31 #include <tzplatform_config.h>
32 #include <sys/smack.h>
34 #include "badge_log.h"
35 #include "badge_error.h"
36 #include "badge_internal.h"
37 #include "badge_ipc.h"
39 #include "badge_private.h"
41 #define BADGE_PKGNAME_LEN 512
42 #define BADGE_TABLE_NAME "badge_data"
43 #define BADGE_OPTION_TABLE_NAME "badge_option"
45 #define BADGE_CHANGED_NOTI "badge_changed"
52 struct _badge_cb_data {
53 badge_change_cb callback;
57 static GHashTable *_badge_cb_hash = NULL;
59 static inline long _get_max_len(void)
62 long path_max_len = 4096;
65 max = (pathconf("/", _PC_PATH_MAX) < 1 ? path_max_len
66 : pathconf("/", _PC_PATH_MAX));
67 #else /* _PC_PATH_MAX */
69 #endif /* _PC_PATH_MAX */
73 char *_badge_get_pkgname_by_pid(void)
83 pkgname = malloc(max);
86 ERR("Failed to alloc memory");
90 memset(pkgname, 0x00, max);
92 ret = aul_app_get_pkgname_bypid(pid, pkgname, max);
93 if (ret != AUL_R_OK) {
94 fd = open("/proc/self/cmdline", O_RDONLY);
102 ret = read(fd, pkgname, max - 1);
104 /* LCOV_EXCL_START */
114 if (pkgname[0] == '\0') {
115 /* LCOV_EXCL_START */
124 static int _badge_check_data_inserted(const char *pkgname,
125 sqlite3 *db, uid_t uid)
127 sqlite3_stmt *stmt = NULL;
129 int result = BADGE_ERROR_NONE;
134 return BADGE_ERROR_INVALID_PARAMETER;
136 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
137 "pkgname = %Q AND uid = %d",
138 BADGE_TABLE_NAME, pkgname, uid);
141 /* LCOV_EXCL_START */
142 ERR("Failed to alloc query");
143 return BADGE_ERROR_OUT_OF_MEMORY;
147 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
148 if (sqlret != SQLITE_OK) {
149 /* LCOV_EXCL_START */
150 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
152 result = BADGE_ERROR_FROM_DB;
153 goto free_and_return;
157 sqlret = sqlite3_step(stmt);
158 if (sqlret == SQLITE_ROW)
159 count = sqlite3_column_int(stmt, 0);
163 DBG("[%s], DB search result[%d]", sqlbuf, count);
166 result = BADGE_ERROR_ALREADY_EXIST;
168 result = BADGE_ERROR_NOT_EXIST;
172 sqlite3_free(sqlbuf);
175 sqlite3_finalize(stmt);
180 static int _badge_check_option_inserted(const char *pkgname,
181 sqlite3 *db, uid_t uid)
183 sqlite3_stmt *stmt = NULL;
185 int result = BADGE_ERROR_NONE;
190 return BADGE_ERROR_INVALID_PARAMETER;
192 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
193 "pkgname = %Q AND uid = %d",
194 BADGE_OPTION_TABLE_NAME, pkgname, uid);
197 /* LCOV_EXCL_START */
198 ERR("Failed to alloc query");
199 return BADGE_ERROR_OUT_OF_MEMORY;
203 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
204 if (sqlret != SQLITE_OK) {
205 /* LCOV_EXCL_START */
206 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
208 result = BADGE_ERROR_FROM_DB;
209 goto free_and_return;
213 sqlret = sqlite3_step(stmt);
214 if (sqlret == SQLITE_ROW)
215 count = sqlite3_column_int(stmt, 0);
219 DBG("[%s], DB search result[%d]", sqlbuf, count);
222 result = BADGE_ERROR_ALREADY_EXIST;
224 result = BADGE_ERROR_NOT_EXIST;
228 sqlite3_free(sqlbuf);
231 sqlite3_finalize(stmt);
236 static int _is_same_certinfo(const char *caller, const char *pkgname)
238 int ret = PACKAGE_MANAGER_ERROR_NONE;
239 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
241 if (!caller || !pkgname)
244 ret = package_manager_compare_package_cert_info(pkgname, caller, &compare_result);
245 if (ret == PACKAGE_MANAGER_ERROR_NONE &&
246 compare_result == PACKAGE_MANAGER_COMPARE_MATCH)
252 static bool __check_label(pid_t pid)
254 #define SMACK_LABEL_LEN 255
255 #define COMPARE_LABEL_COUNT 3
261 char check_label[COMPARE_LABEL_COUNT][SMACK_LABEL_LEN+1] = { "System", "System::Privileged", "User"};
263 len = smack_new_label_from_process(pid, &label);
264 if (len < 0 || label == NULL)
267 for (i = 0; i < COMPARE_LABEL_COUNT; i++) {
268 if (g_strcmp0(label, check_label[i]) == 0) {
281 static int _badge_check_writable(const char *caller,
282 const char *pkgname, sqlite3 *db, uid_t uid, pid_t pid)
284 sqlite3_stmt *stmt = NULL;
286 int result = BADGE_ERROR_NONE;
290 if (!db || !caller || !pkgname)
291 return BADGE_ERROR_INVALID_PARAMETER;
293 if (g_strcmp0(caller, pkgname) == 0)
294 return BADGE_ERROR_NONE;
296 if (__check_label(pid) == true)
297 return BADGE_ERROR_NONE;
299 /* LCOV_EXCL_START */
300 if (_is_same_certinfo(caller, pkgname) == 1)
301 return BADGE_ERROR_NONE;
303 sqlbuf = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE " \
304 "pkgname = %Q AND writable_pkgs LIKE '%%%q%%'" \
307 pkgname, caller, uid);
309 ERR("Failed to alloc query");
310 return BADGE_ERROR_OUT_OF_MEMORY;
313 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
314 if (sqlret != SQLITE_OK) {
315 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
317 result = BADGE_ERROR_FROM_DB;
318 goto free_and_return;
321 sqlret = sqlite3_step(stmt);
322 if (sqlret == SQLITE_ROW)
323 count = sqlite3_column_int(stmt, 0);
327 DBG("[%s], DB search result[%d]", sqlbuf, count);
330 result = BADGE_ERROR_PERMISSION_DENIED;
334 sqlite3_free(sqlbuf);
337 sqlite3_finalize(stmt);
343 int _badge_is_existing(const char *pkgname, bool *existing, uid_t uid)
347 int result = BADGE_ERROR_NONE;
349 if (!pkgname || !existing) {
350 /* LCOV_EXCL_START */
351 ERR("pkgname : %s, existing : %p", pkgname, existing);
352 return BADGE_ERROR_INVALID_PARAMETER;
356 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
357 if (sqlret != SQLITE_OK || !db) {
358 /* LCOV_EXCL_START */
359 ERR("Failed to db_util_open [%d]", sqlret);
360 if (sqlret == SQLITE_PERM)
361 return BADGE_ERROR_PERMISSION_DENIED;
362 return BADGE_ERROR_FROM_DB;
366 result = _badge_check_data_inserted(pkgname, db, uid);
367 if (result == BADGE_ERROR_ALREADY_EXIST) {
369 result = BADGE_ERROR_NONE;
370 } else if (result == BADGE_ERROR_NOT_EXIST) {
372 result = BADGE_ERROR_NONE;
375 sqlret = db_util_close(db);
376 if (sqlret != SQLITE_OK)
377 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
382 int _badge_get_list(GList **badge_list, uid_t uid)
385 int result = BADGE_ERROR_NONE;
387 sqlite3_stmt *stmt = NULL;
390 unsigned int badge_count;
391 badge_info_s *badge_info;
393 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
394 if (sqlret != SQLITE_OK || !db) {
395 /* LCOV_EXCL_START */
396 ERR("Failed to db_util_open [%d]", sqlret);
397 return BADGE_ERROR_FROM_DB;
401 sqlbuf = sqlite3_mprintf("SELECT pkgname, badge FROM %q WHERE uid = %d",
402 BADGE_TABLE_NAME, uid);
404 /* LCOV_EXCL_START */
405 ERR("Failed to alloc query");
406 result = BADGE_ERROR_OUT_OF_MEMORY;
407 goto free_and_return;
411 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
412 if (sqlret != SQLITE_OK) {
413 /* LCOV_EXCL_START */
414 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
416 result = BADGE_ERROR_FROM_DB;
417 goto free_and_return;
421 sqlret = sqlite3_step(stmt);
422 if (sqlret == SQLITE_DONE) {
423 INFO("badge db has no data");
424 result = BADGE_ERROR_NOT_EXIST;
425 goto free_and_return;
426 } else if (sqlret != SQLITE_ROW) {
427 ERR("Failed to sqlite3_step [%d]", sqlret);
428 result = BADGE_ERROR_FROM_DB;
429 goto free_and_return;
433 pkg = (const char *)sqlite3_column_text(stmt, 0);
434 badge_count = (unsigned int)sqlite3_column_int(stmt, 1);
436 badge_info = (badge_info_s *)calloc(sizeof(badge_info_s), 1);
437 if (badge_info == NULL) {
438 /* LCOV_EXCL_START */
439 ERR("alloc badge_info failed");
440 result = BADGE_ERROR_OUT_OF_MEMORY;
444 badge_info->pkg = strdup(pkg);
445 badge_info->badge_count = badge_count;
446 *badge_list = g_list_append(*badge_list, badge_info);
448 /* LCOV_EXCL_START */
449 ERR("db has invaild data");
450 result = BADGE_ERROR_FROM_DB;
453 } while (sqlite3_step(stmt) == SQLITE_ROW);
457 sqlite3_free(sqlbuf);
460 sqlite3_finalize(stmt);
462 sqlret = db_util_close(db);
463 if (sqlret != SQLITE_OK)
464 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
469 int _badge_insert(badge_h *badge, uid_t uid)
473 int ret = BADGE_ERROR_NONE;
474 int result = BADGE_ERROR_NONE;
477 if (!badge || !badge->pkgname || !badge->writable_pkgs)
478 return BADGE_ERROR_INVALID_PARAMETER;
480 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
481 if (sqlret != SQLITE_OK || !db) {
482 /* LCOV_EXCL_START */
483 ERR("Failed to db_util_open [%s][%d]", BADGE_DB_PATH, sqlret);
484 return BADGE_ERROR_FROM_DB;
488 /* Check pkgname & id */
489 ret = _badge_check_data_inserted(badge->pkgname, db, uid);
490 if (ret != BADGE_ERROR_NOT_EXIST) {
491 /* LCOV_EXCL_START */
493 goto return_close_db;
497 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
504 badge->pkgname, badge->writable_pkgs, uid);
506 /* LCOV_EXCL_START */
507 ERR("Failed to alloc query");
508 result = BADGE_ERROR_OUT_OF_MEMORY;
509 goto return_close_db;
513 ret = badge_db_exec(db, sqlbuf, NULL);
514 if (ret != BADGE_ERROR_NONE) {
515 /* LCOV_EXCL_START */
516 ERR("Failed to insert badge[%s], err[%d]",
517 badge->pkgname, ret);
519 goto return_close_db;
523 /* inserting badge options */
524 ret = _badge_check_option_inserted(badge->pkgname, db, uid);
525 if (ret != BADGE_ERROR_NOT_EXIST) {
527 goto return_close_db;
530 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
535 BADGE_OPTION_TABLE_NAME,
536 badge->pkgname, uid);
538 /* LCOV_EXCL_START */
539 ERR("Failed to alloc query");
540 result = BADGE_ERROR_OUT_OF_MEMORY;
541 goto return_close_db;
545 ret = badge_db_exec(db, sqlbuf, NULL);
546 if (ret != BADGE_ERROR_NONE) {
547 /* LCOV_EXCL_START */
548 ERR("Failed to insert badge option[%s], err[%d]",
549 badge->pkgname, sqlret);
551 goto return_close_db;
557 sqlite3_free(sqlbuf);
559 sqlret = db_util_close(db);
560 if (sqlret != SQLITE_OK)
561 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
566 int _badge_remove(const char *caller, const char *pkgname, uid_t uid, pid_t pid)
568 int ret = BADGE_ERROR_NONE;
569 int result = BADGE_ERROR_NONE;
574 if (!caller || !pkgname)
575 return BADGE_ERROR_INVALID_PARAMETER;
577 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
578 if (sqlret != SQLITE_OK || !db) {
579 /* LCOV_EXCL_START */
580 ERR("Failed to db_util_open [%d]", sqlret);
581 return BADGE_ERROR_FROM_DB;
585 ret = _badge_check_data_inserted(pkgname, db, uid);
586 if (ret != BADGE_ERROR_ALREADY_EXIST) {
588 goto return_close_db;
591 ret = _badge_check_writable(caller, pkgname, db, uid, pid);
592 if (ret != BADGE_ERROR_NONE) {
594 goto return_close_db;
597 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
598 BADGE_TABLE_NAME, pkgname, uid);
600 /* LCOV_EXCL_START */
601 ERR("Failed to alloc query");
602 result = BADGE_ERROR_OUT_OF_MEMORY;
603 goto return_close_db;
607 ret = badge_db_exec(db, sqlbuf, NULL);
608 if (ret != BADGE_ERROR_NONE) {
609 ERR("Failed to remove badge[%s], err[%d]",
612 goto return_close_db;
615 /* treating option table */
616 ret = _badge_check_option_inserted(pkgname, db, uid);
617 if (ret != BADGE_ERROR_ALREADY_EXIST) {
619 goto return_close_db;
622 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
623 BADGE_OPTION_TABLE_NAME, pkgname, uid);
625 /* LCOV_EXCL_START */
626 ERR("Failed to alloc query");
627 result = BADGE_ERROR_OUT_OF_MEMORY;
628 goto return_close_db;
632 ret = badge_db_exec(db, sqlbuf, NULL);
633 if (ret != BADGE_ERROR_NONE) {
634 /* LCOV_EXCL_START */
635 ERR("Failed to remove badge option[%s], err[%d]",
638 goto return_close_db;
644 sqlite3_free(sqlbuf);
646 sqlret = db_util_close(db);
647 if (sqlret != SQLITE_OK)
648 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
653 static int _badge_remove_by_appid(const char *appid, uid_t uid, sqlite3 *db)
655 int ret = BADGE_ERROR_NONE;
656 int result = BADGE_ERROR_NONE;
659 ret = _badge_check_data_inserted(appid, db, uid);
660 if (ret != BADGE_ERROR_ALREADY_EXIST) {
662 goto return_close_db;
665 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
666 BADGE_TABLE_NAME, appid, uid);
668 /* LCOV_EXCL_START */
669 ERR("Failed to alloc query");
670 result = BADGE_ERROR_OUT_OF_MEMORY;
671 goto return_close_db;
675 ret = badge_db_exec(db, sqlbuf, NULL);
676 if (ret != BADGE_ERROR_NONE) {
677 ERR("Failed to remove badge[%s], err[%d]",
680 goto return_close_db;
683 /* treating option table */
684 ret = _badge_check_option_inserted(appid, db, uid);
685 if (ret != BADGE_ERROR_ALREADY_EXIST) {
687 goto return_close_db;
690 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
691 BADGE_OPTION_TABLE_NAME, appid, uid);
693 /* LCOV_EXCL_START */
694 ERR("Failed to alloc query");
695 result = BADGE_ERROR_OUT_OF_MEMORY;
696 goto return_close_db;
700 ret = badge_db_exec(db, sqlbuf, NULL);
701 if (ret != BADGE_ERROR_NONE) {
702 /* LCOV_EXCL_START */
703 ERR("Failed to remove badge option[%s], err[%d]",
706 goto return_close_db;
712 sqlite3_free(sqlbuf);
717 static bool _get_table_field_data_string(char **table, char **buf, int ucs2, int index)
723 if (table == NULL || buf == NULL || index < 0) {
724 /* LCOV_EXCL_START */
725 ERR("table[%p], buf[%p], index[%d]", table, buf, index);
730 pTemp = table[index];
732 *buf = NULL; /* LCOV_EXCL_LINE */
734 sLen = strlen(pTemp);
736 *buf = (char *)malloc(sLen + 1);
738 ERR("malloc is failed"); /* LCOV_EXCL_LINE */
741 memset(*buf, 0, sLen + 1);
742 strncpy(*buf, pTemp, sLen);
744 *buf = NULL; /* LCOV_EXCL_LINE */
754 int _badge_remove_by_pkgname(const char *pkgname, uid_t uid)
756 int ret = BADGE_ERROR_NONE;
762 char *sql_query = NULL;
763 char **query_result = NULL;
767 sql_ret = db_util_open(BADGE_DB_PATH, &db, 0);
768 if (sql_ret != SQLITE_OK || db == NULL) {
769 ERR("Failed db util open [%s][%d]", BADGE_DB_PATH, sql_ret);
770 return BADGE_ERROR_FROM_DB;
773 sql_query = sqlite3_mprintf("SELECT appid FROM %s WHERE pkgname = %Q" \
774 "AND (uid = %d OR uid = %d) ORDER BY uid DESC;",
775 BADGE_SETTING_DB_TABLE, pkgname, uid,
776 tzplatform_getuid(TZ_SYS_GLOBALAPP_USER));
778 ERR("Failed to alloc query");
779 ret = BADGE_ERROR_FROM_DB;
783 sql_ret = sqlite3_get_table(db, sql_query, &query_result, &row_count, &col_count, NULL);
784 if (sql_ret != SQLITE_OK && sql_ret != -1) {
785 ERR("sqlite3_get_table failed [%d][%s]", sql_ret,
787 ret = BADGE_ERROR_FROM_DB;
792 DBG("No setting found for [%s]", pkgname);
793 ret = BADGE_ERROR_NOT_EXIST;
797 col_index = col_count;
799 for (index = 0; index < row_count; index++) {
800 _get_table_field_data_string(query_result, &appid, 1, col_index++);
802 _badge_remove_by_appid(appid, uid, db);
810 sqlite3_free_table(query_result);
812 sqlite3_free(sql_query);
814 sql_ret = db_util_close(db);
815 if (sql_ret != SQLITE_OK)
816 WARN("Failed to db_util_close");
822 int _badge_set_count(const char *caller, const char *pkgname,
823 unsigned int count, uid_t uid, pid_t pid)
825 int ret = BADGE_ERROR_NONE;
826 int result = BADGE_ERROR_NONE;
831 if (!caller || !pkgname)
832 return BADGE_ERROR_INVALID_PARAMETER;
834 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
835 if (sqlret != SQLITE_OK || !db) {
836 /* LCOV_EXCL_START */
837 ERR("Failed to db_util_open [%d]", sqlret);
838 return BADGE_ERROR_FROM_DB;
842 ret = _badge_check_data_inserted(pkgname, db, uid);
843 if (ret != BADGE_ERROR_ALREADY_EXIST) {
845 goto return_close_db;
848 ret = _badge_check_writable(caller, pkgname, db, uid, pid);
849 if (ret != BADGE_ERROR_NONE) {
851 goto return_close_db;
854 sqlbuf = sqlite3_mprintf("UPDATE %q SET badge = %d " \
855 "WHERE pkgname = %Q AND uid = %d",
856 BADGE_TABLE_NAME, count, pkgname, uid);
858 /* LCOV_EXCL_START */
859 ERR("Failed to alloc query");
860 result = BADGE_ERROR_OUT_OF_MEMORY;
861 goto return_close_db;
865 ret = badge_db_exec(db, sqlbuf, NULL);
866 if (ret != BADGE_ERROR_NONE) {
867 /* LCOV_EXCL_START */
868 ERR("Failed to set badge[%s] count[%d], err[%d]",
869 pkgname, count, ret);
871 goto return_close_db;
877 sqlite3_free(sqlbuf);
879 sqlret = db_util_close(db);
880 if (sqlret != SQLITE_OK)
881 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
886 int _badge_get_count(const char *pkgname, unsigned int *count, uid_t uid)
888 int ret = BADGE_ERROR_NONE;
889 int result = BADGE_ERROR_NONE;
892 sqlite3_stmt *stmt = NULL;
895 if (!pkgname || !count)
896 return BADGE_ERROR_INVALID_PARAMETER;
898 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
899 if (sqlret != SQLITE_OK || !db) {
900 /* LCOV_EXCL_START */
901 ERR("Failed to db_util_open [%d]", sqlret);
902 if (sqlret == SQLITE_PERM)
903 return BADGE_ERROR_PERMISSION_DENIED;
905 return BADGE_ERROR_FROM_DB;
909 ret = _badge_check_data_inserted(pkgname, db, uid);
910 if (ret != BADGE_ERROR_ALREADY_EXIST) {
912 goto return_close_db;
915 sqlbuf = sqlite3_mprintf("SELECT badge FROM %q " \
916 "WHERE pkgname = %Q AND uid = %d",
917 BADGE_TABLE_NAME, pkgname, uid);
919 /* LCOV_EXCL_START */
920 ERR("Failed to alloc query");
921 result = BADGE_ERROR_OUT_OF_MEMORY;
922 goto return_close_db;
926 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
927 if (sqlret != SQLITE_OK) {
928 /* LCOV_EXCL_START */
929 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
931 result = BADGE_ERROR_FROM_DB;
932 goto return_close_db;
936 sqlret = sqlite3_step(stmt);
937 if (sqlret == SQLITE_ROW)
938 *count = (unsigned int)sqlite3_column_int(stmt, 0);
940 *count = (unsigned int)0;
944 sqlite3_free(sqlbuf);
947 sqlite3_finalize(stmt);
949 sqlret = db_util_close(db);
950 if (sqlret != SQLITE_OK)
951 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
956 int _badge_set_display(const char *pkgname, unsigned int is_display, uid_t uid)
958 int ret = BADGE_ERROR_NONE;
959 int result = BADGE_ERROR_NONE;
965 return BADGE_ERROR_INVALID_PARAMETER;
967 if (is_display != 0 && is_display != 1)
968 return BADGE_ERROR_INVALID_PARAMETER;
970 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
971 if (sqlret != SQLITE_OK || !db) {
972 /* LCOV_EXCL_START */
973 ERR("Failed to db_util_open [%d]", sqlret);
974 return BADGE_ERROR_FROM_DB;
978 ret = _badge_check_data_inserted(pkgname, db, uid);
979 if (ret != BADGE_ERROR_ALREADY_EXIST) {
981 goto return_close_db;
984 ret = _badge_check_option_inserted(pkgname, db, uid);
985 if (ret == BADGE_ERROR_ALREADY_EXIST) {
986 sqlbuf = sqlite3_mprintf("UPDATE %q SET display = %d " \
987 "WHERE pkgname = %Q AND uid = %d",
988 BADGE_OPTION_TABLE_NAME, is_display, pkgname, uid);
990 /* LCOV_EXCL_START */
991 ERR("Failed to alloc query");
992 result = BADGE_ERROR_OUT_OF_MEMORY;
993 goto return_close_db;
997 ret = badge_db_exec(db, sqlbuf, NULL);
998 if (ret != BADGE_ERROR_NONE) {
999 /* LCOV_EXCL_START */
1000 ERR("Failed to set badge[%s] option[%d], err[%d]",
1001 pkgname, is_display, ret);
1003 goto return_close_db;
1004 /* LCOV_EXCL_STOP */
1007 } else if (ret == BADGE_ERROR_NOT_EXIST) {
1008 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
1014 BADGE_OPTION_TABLE_NAME,
1015 pkgname, is_display, uid);
1017 /* LCOV_EXCL_START */
1018 ERR("Failed to alloc query");
1019 result = BADGE_ERROR_OUT_OF_MEMORY;
1020 goto return_close_db;
1021 /* LCOV_EXCL_STOP */
1024 ret = badge_db_exec(db, sqlbuf, NULL);
1025 if (ret != BADGE_ERROR_NONE) {
1026 /* LCOV_EXCL_START */
1027 ERR("Failed to set badge[%s] option[%d], err[%d]",
1028 pkgname, is_display, ret);
1030 goto return_close_db;
1031 /* LCOV_EXCL_STOP */
1035 goto return_close_db;
1040 sqlite3_free(sqlbuf);
1042 sqlret = db_util_close(db);
1043 if (sqlret != SQLITE_OK)
1044 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
1049 int _badge_get_display(const char *pkgname, unsigned int *is_display, uid_t uid)
1051 int ret = BADGE_ERROR_NONE;
1052 int result = BADGE_ERROR_NONE;
1054 char *sqlbuf = NULL;
1055 sqlite3_stmt *stmt = NULL;
1058 if (!pkgname || !is_display)
1059 return BADGE_ERROR_INVALID_PARAMETER;
1061 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
1062 if (sqlret != SQLITE_OK || !db) {
1063 /* LCOV_EXCL_START */
1064 ERR("Failed to db_util_open [%d]", sqlret);
1065 if (sqlret == SQLITE_PERM)
1066 return BADGE_ERROR_PERMISSION_DENIED;
1068 return BADGE_ERROR_FROM_DB;
1069 /* LCOV_EXCL_STOP */
1072 ret = _badge_check_option_inserted(pkgname, db, uid);
1073 if (ret != BADGE_ERROR_ALREADY_EXIST) {
1074 if (ret == BADGE_ERROR_NOT_EXIST)
1078 goto return_close_db;
1081 sqlbuf = sqlite3_mprintf("SELECT display FROM %q " \
1082 "WHERE pkgname = %Q AND uid = %d",
1083 BADGE_OPTION_TABLE_NAME, pkgname, uid);
1085 /* LCOV_EXCL_START */
1086 ERR("Failed to alloc query");
1087 result = BADGE_ERROR_OUT_OF_MEMORY;
1088 goto return_close_db;
1089 /* LCOV_EXCL_STOP */
1092 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
1093 if (sqlret != SQLITE_OK) {
1094 /* LCOV_EXCL_START */
1095 ERR("Failed to prepare [%d][%s]", sqlret, sqlite3_errmsg(db));
1096 result = BADGE_ERROR_FROM_DB;
1097 goto return_close_db;
1098 /* LCOV_EXCL_STOP */
1101 sqlret = sqlite3_step(stmt);
1102 if (sqlret == SQLITE_ROW)
1103 *is_display = (unsigned int)sqlite3_column_int(stmt, 0);
1105 *is_display = (unsigned int)1;
1109 sqlite3_free(sqlbuf);
1112 sqlite3_finalize(stmt);
1114 sqlret = db_util_close(db);
1115 if (sqlret != SQLITE_OK)
1116 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
1121 void badge_changed_cb_call(unsigned int action, const char *pkgname,
1122 unsigned int count, uid_t uid)
1124 GList *badge_cb_list = NULL;
1125 struct _badge_cb_data *bd = NULL;
1127 DBG("call badge_change_cb");
1129 if (_badge_cb_hash == NULL)
1132 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1134 if (badge_cb_list == NULL) {
1135 ERR("invalid data");
1139 badge_cb_list = g_list_first(badge_cb_list);
1141 for (; badge_cb_list != NULL; badge_cb_list = badge_cb_list->next) {
1142 bd = badge_cb_list->data;
1144 if (bd != NULL && bd->callback != NULL) {
1145 DBG("call badge_change_cb : action %d, pkgname %s, count %d",
1146 action, pkgname, count);
1147 bd->callback(action, pkgname, count, bd->data);
1152 static int _badge_changed_monitor_init(uid_t uid)
1154 return badge_ipc_monitor_init(uid);
1157 static void _badge_chanaged_monitor_fini()
1159 badge_ipc_monitor_fini();
1162 static gint _badge_data_compare(gconstpointer a, gconstpointer b)
1164 const struct _badge_cb_data *bd = NULL;
1168 bd = (struct _badge_cb_data *)a;
1170 if (bd->callback == b)
1176 static struct _badge_cb_data *__malloc_badge_cb_data(badge_change_cb callback, void *data)
1178 struct _badge_cb_data *bd = NULL;
1179 bd = (struct _badge_cb_data *)malloc(sizeof(struct _badge_cb_data));
1181 ERR("Failed malloc badge_cb_data");
1185 bd->callback = callback;
1191 int _badge_free(badge_h *badge)
1194 return BADGE_ERROR_INVALID_PARAMETER;
1197 free(badge->pkgname);
1199 if (badge->writable_pkgs)
1200 free(badge->writable_pkgs);
1204 return BADGE_ERROR_NONE;
1207 badge_h *_badge_new(const char *pkgname, const char *writable_pkgs,
1210 badge_h *badge = NULL;
1212 if (!pkgname || !writable_pkgs) {
1213 ERR("Invalid parameters");
1215 *err = BADGE_ERROR_INVALID_PARAMETER;
1219 badge = (badge_h *)malloc(sizeof(struct _badge_h));
1221 ERR("Failed to alloc handle");
1223 *err = BADGE_ERROR_OUT_OF_MEMORY;
1227 badge->pkgname = strdup(pkgname);
1228 badge->writable_pkgs = strdup(writable_pkgs);
1230 *err = BADGE_ERROR_NONE;
1235 char *_badge_pkgs_new(int *err, const char *pkg1, ...)
1237 char *caller_pkgname = NULL;
1239 char *result = NULL;
1243 char *new_pkgs = NULL;
1246 *err = BADGE_ERROR_NONE;
1248 caller_pkgname = _badge_get_pkgname_by_pid();
1249 if (!caller_pkgname) {
1250 ERR("Failed to get caller pkgname");
1252 *err = BADGE_ERROR_PERMISSION_DENIED;
1257 WARN("pkg1 is NULL");
1258 return caller_pkgname;
1261 length = strlen(pkg1);
1262 va_start(args, pkg1);
1263 s = va_arg(args, char *);
1265 length += strlen(s) ;
1266 s = va_arg(args, char *);
1271 WARN("length is %d", length);
1272 return caller_pkgname;
1275 result = g_new0(char, length + 1); /* 1 for null terminate */
1277 /* LCOV_EXCL_START */
1278 ERR("Failed to alloc memory");
1280 *err = BADGE_ERROR_OUT_OF_MEMORY;
1281 free(caller_pkgname);
1283 /* LCOV_EXCL_STOP */
1287 ptr = g_stpcpy(ptr, pkg1);
1288 va_start(args, pkg1);
1289 s = va_arg(args, char *);
1291 ptr = g_stpcpy(ptr, s);
1292 s = va_arg(args, char *);
1296 if (g_strstr_len(result, -1, caller_pkgname) == NULL) {
1297 new_pkgs = g_strdup_printf("%s%s", caller_pkgname, result);
1299 ERR("Failed to alloc memory");
1301 *err = BADGE_ERROR_OUT_OF_MEMORY;
1304 free(caller_pkgname);
1311 free(caller_pkgname);
1317 int badge_create_for_uid(const char *pkgname, const char *writable_pkg, uid_t uid)
1319 CHECK_BADGE_FEATURE();
1320 char *caller = NULL;
1321 int err = BADGE_ERROR_NONE;
1323 caller = _badge_get_pkgname_by_pid();
1325 ERR("Failed to get caller pkgname");
1326 return BADGE_ERROR_PERMISSION_DENIED;
1329 err = badge_ipc_request_insert(pkgname, writable_pkg, caller, uid);
1336 int badge_new_for_uid(const char *writable_app_id, uid_t uid)
1338 CHECK_BADGE_FEATURE();
1339 char *caller = NULL;
1340 int err = BADGE_ERROR_NONE;
1342 caller = _badge_get_pkgname_by_pid();
1344 ERR("Failed to get caller pkgname");
1345 return BADGE_ERROR_PERMISSION_DENIED;
1348 err = badge_ipc_request_insert(caller, writable_app_id, caller, uid);
1355 int badge_add_for_uid(const char *badge_app_id, uid_t uid)
1357 CHECK_BADGE_FEATURE();
1358 char *caller = NULL;
1359 int err = BADGE_ERROR_NONE;
1361 caller = _badge_get_pkgname_by_pid();
1363 ERR("Failed to get caller pkgname");
1364 return BADGE_ERROR_PERMISSION_DENIED;
1367 if (badge_app_id == NULL) {
1368 badge_app_id = caller;
1370 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
1371 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
1373 pkgmgr_ret = package_manager_compare_app_cert_info(badge_app_id, caller, &compare_result);
1375 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE || compare_result != PACKAGE_MANAGER_COMPARE_MATCH) {
1376 err = BADGE_ERROR_INVALID_PACKAGE;
1381 err = badge_ipc_request_insert(badge_app_id, caller, caller, uid);
1390 int badge_remove_for_uid(const char *app_id, uid_t uid)
1392 CHECK_BADGE_FEATURE();
1393 char *caller = NULL;
1394 int result = BADGE_ERROR_NONE;
1396 caller = _badge_get_pkgname_by_pid();
1398 ERR("Failed to get caller pkgname");
1399 result = BADGE_ERROR_PERMISSION_DENIED;
1403 result = badge_ipc_request_delete(app_id, caller, uid);
1412 int badge_is_existing_for_uid(const char *app_id, bool *existing, uid_t uid)
1414 CHECK_BADGE_FEATURE();
1415 return badge_ipc_request_is_existing(app_id, existing, uid);
1419 int badge_foreach_for_uid(badge_foreach_cb callback, void *user_data, uid_t uid)
1421 CHECK_BADGE_FEATURE();
1422 int result = BADGE_ERROR_NONE;
1423 result = badge_ipc_request_get_list(callback, user_data, uid);
1424 if (result == BADGE_ERROR_IO_ERROR)
1425 result = BADGE_ERROR_FROM_DB;
1430 int badge_set_count_for_uid(const char *app_id, unsigned int count, uid_t uid)
1432 CHECK_BADGE_FEATURE();
1433 char *caller = NULL;
1434 int result = BADGE_ERROR_NONE;
1436 DBG("app_id %s, count %d", app_id, count);
1438 caller = _badge_get_pkgname_by_pid();
1440 ERR("Failed to get caller pkgname");
1441 result = BADGE_ERROR_PERMISSION_DENIED;
1445 result = badge_ipc_request_set_count(app_id, caller, count, uid);
1453 int badge_get_count_for_uid(const char *app_id, unsigned int *count, uid_t uid)
1455 CHECK_BADGE_FEATURE();
1456 int result = BADGE_ERROR_NONE;
1458 result = badge_ipc_request_get_count(app_id, count, uid);
1459 if (result == BADGE_ERROR_IO_ERROR)
1460 result = BADGE_ERROR_FROM_DB;
1466 int badge_set_display_for_uid(const char *app_id, unsigned int is_display, uid_t uid)
1468 CHECK_BADGE_FEATURE();
1469 char *caller = NULL;
1470 int result = BADGE_ERROR_NONE;
1472 caller = _badge_get_pkgname_by_pid();
1474 ERR("Failed to get caller pkgname");
1475 result = BADGE_ERROR_PERMISSION_DENIED;
1479 result = badge_ipc_request_set_display(app_id, caller, is_display, uid);
1488 int badge_get_display_for_uid(const char *app_id, unsigned int *is_display, uid_t uid)
1490 CHECK_BADGE_FEATURE();
1491 int result = BADGE_ERROR_NONE;
1493 result = badge_ipc_request_get_display(app_id, is_display, uid);
1494 if (result == BADGE_ERROR_IO_ERROR)
1495 result = BADGE_ERROR_FROM_DB;
1501 int badge_register_changed_cb_for_uid(badge_change_cb callback, void *data, uid_t uid)
1503 CHECK_BADGE_FEATURE();
1504 struct _badge_cb_data *bd = NULL;
1505 GList *badge_cb_list = NULL;
1506 GList *badge_found_list = NULL;
1509 if (_badge_cb_hash == NULL)
1510 _badge_cb_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
1512 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1514 if (badge_cb_list == NULL) {
1515 bd = __malloc_badge_cb_data(callback, data);
1517 return BADGE_ERROR_OUT_OF_MEMORY;
1519 badge_cb_list = g_list_append(badge_cb_list, bd);
1520 g_hash_table_insert(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1522 badge_found_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1523 (GCompareFunc)_badge_data_compare);
1524 if (badge_found_list) {
1525 bd = g_list_nth_data(badge_found_list, 0);
1528 bd = __malloc_badge_cb_data(callback, data);
1530 return BADGE_ERROR_OUT_OF_MEMORY;
1531 badge_cb_list = g_list_append(badge_cb_list, bd);
1535 ret = _badge_changed_monitor_init(uid);
1536 if (ret == BADGE_ERROR_NONE) {
1537 ret = badge_ipc_init_badge(uid);
1538 if (ret != BADGE_ERROR_NONE && ret != BADGE_ERROR_NOT_EXIST) {
1539 badge_unregister_changed_cb_for_uid(callback, uid);
1540 return BADGE_ERROR_IO_ERROR;
1543 /* LCOV_EXCL_START */
1544 ERR("badge_ipc_monitor_init err [%d]", ret);
1545 badge_unregister_changed_cb_for_uid(callback, uid);
1547 /* LCOV_EXCL_STOP */
1549 return BADGE_ERROR_NONE;
1553 int badge_unregister_changed_cb_for_uid(badge_change_cb callback, uid_t uid)
1555 CHECK_BADGE_FEATURE();
1556 GList *badge_cb_list = NULL;
1557 GList *badge_delete_list = NULL;
1558 struct _badge_cb_data *bd = NULL;
1560 if (_badge_cb_hash == NULL)
1561 return BADGE_ERROR_INVALID_PARAMETER;
1563 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1565 if (badge_cb_list == NULL)
1566 return BADGE_ERROR_INVALID_PARAMETER;
1568 badge_delete_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1569 (GCompareFunc)_badge_data_compare);
1571 if (badge_delete_list) {
1572 bd = g_list_nth_data(badge_delete_list, 0);
1573 badge_cb_list = g_list_delete_link(badge_cb_list, badge_delete_list);
1576 return BADGE_ERROR_INVALID_PARAMETER;
1579 if (badge_cb_list == NULL)
1580 g_hash_table_steal(_badge_cb_hash, GUINT_TO_POINTER(uid));
1582 g_hash_table_replace(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1584 if (g_hash_table_size(_badge_cb_hash) == 0)
1585 _badge_chanaged_monitor_fini();
1587 return BADGE_ERROR_NONE;
1591 int badge_is_service_ready(void)
1593 CHECK_BADGE_FEATURE();
1594 return badge_ipc_is_master_ready();
1598 int badge_add_deferred_task(
1599 void (*badge_add_deferred_task)(void *data), void *user_data)
1601 CHECK_BADGE_FEATURE();
1602 return badge_ipc_add_deferred_task(badge_add_deferred_task, user_data);
1606 int badge_del_deferred_task(
1607 void (*badge_add_deferred_task)(void *data))
1609 CHECK_BADGE_FEATURE();
1610 return badge_ipc_del_deferred_task(badge_add_deferred_task);
1614 int badge_is_existing(const char *app_id, bool *existing)
1616 CHECK_BADGE_FEATURE();
1617 if (app_id == NULL || existing == NULL)
1618 return BADGE_ERROR_INVALID_PARAMETER;
1620 return badge_is_existing_for_uid(app_id, existing, getuid());
1624 int badge_create(const char *pkgname, const char *writable_pkg)
1626 CHECK_BADGE_FEATURE();
1627 if (pkgname == NULL)
1628 return BADGE_ERROR_INVALID_PARAMETER;
1630 return badge_create_for_uid(pkgname, writable_pkg, getuid());