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>
29 #include <package_manager.h>
30 #include <tzplatform_config.h>
31 #include <sys/smack.h>
33 #include "badge_log.h"
34 #include "badge_error.h"
35 #include "badge_internal.h"
36 #include "badge_ipc.h"
38 #include "badge_private.h"
39 #include "badge_setting_service.h"
41 #define BADGE_PKGNAME_LEN 512
43 #define BADGE_CHANGED_NOTI "badge_changed"
50 struct _badge_cb_data {
51 badge_change_cb callback;
55 static GHashTable *_badge_cb_hash = NULL;
57 static inline unsigned long _get_max_len(void)
59 unsigned long max = 0;
60 long path_max_len = 4096;
63 max = (pathconf("/", _PC_PATH_MAX) < 1 ? path_max_len
64 : pathconf("/", _PC_PATH_MAX));
65 #else /* _PC_PATH_MAX */
67 #endif /* _PC_PATH_MAX */
71 char *_badge_get_pkgname_by_pid(void)
77 unsigned long max = 0;
81 pkgname = malloc(max);
84 ERR("Failed to alloc memory");
88 memset(pkgname, 0x00, max);
90 ret = aul_app_get_pkgname_bypid(pid, pkgname, max);
91 if (ret != AUL_R_OK) {
92 fd = open("/proc/self/cmdline", O_RDONLY);
100 ret = read(fd, pkgname, max - 1);
102 /* LCOV_EXCL_START */
112 if (pkgname[0] == '\0') {
113 /* LCOV_EXCL_START */
122 static int _badge_check_data_inserted(const char *pkgname,
123 sqlite3 *db, uid_t uid)
125 sqlite3_stmt *stmt = NULL;
127 int result = BADGE_ERROR_NONE;
132 return BADGE_ERROR_INVALID_PARAMETER;
134 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
135 "pkgname = %Q AND uid = %d",
136 BADGE_TABLE_NAME, pkgname, uid);
138 /* LCOV_EXCL_START */
139 ERR("Failed to alloc query");
140 return BADGE_ERROR_OUT_OF_MEMORY;
144 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
145 if (sqlret != SQLITE_OK) {
146 /* LCOV_EXCL_START */
147 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
149 result = BADGE_ERROR_FROM_DB;
150 goto free_and_return;
154 sqlret = sqlite3_step(stmt);
155 if (sqlret == SQLITE_ROW)
156 count = sqlite3_column_int(stmt, 0);
160 DBG("[%s], DB search result[%d]", sqlbuf, count);
163 result = BADGE_ERROR_ALREADY_EXIST;
165 result = BADGE_ERROR_NOT_EXIST;
169 sqlite3_free(sqlbuf);
172 sqlite3_finalize(stmt);
177 static int _badge_check_option_inserted(const char *pkgname,
178 sqlite3 *db, uid_t uid)
180 sqlite3_stmt *stmt = NULL;
182 int result = BADGE_ERROR_NONE;
187 return BADGE_ERROR_INVALID_PARAMETER;
189 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
190 "pkgname = %Q AND uid = %d",
191 BADGE_OPTION_TABLE_NAME, pkgname, uid);
193 /* LCOV_EXCL_START */
194 ERR("Failed to alloc query");
195 return BADGE_ERROR_OUT_OF_MEMORY;
199 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
200 if (sqlret != SQLITE_OK) {
201 /* LCOV_EXCL_START */
202 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
204 result = BADGE_ERROR_FROM_DB;
205 goto free_and_return;
209 sqlret = sqlite3_step(stmt);
210 if (sqlret == SQLITE_ROW)
211 count = sqlite3_column_int(stmt, 0);
215 DBG("[%s], DB search result[%d]", sqlbuf, count);
218 result = BADGE_ERROR_ALREADY_EXIST;
220 result = BADGE_ERROR_NOT_EXIST;
224 sqlite3_free(sqlbuf);
227 sqlite3_finalize(stmt);
232 static int _is_same_certinfo(const char *caller, const char *pkgname)
234 int ret = PACKAGE_MANAGER_ERROR_NONE;
235 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
237 if (!caller || !pkgname)
240 ret = package_manager_compare_package_cert_info(pkgname, caller, &compare_result);
241 if (ret == PACKAGE_MANAGER_ERROR_NONE &&
242 compare_result == PACKAGE_MANAGER_COMPARE_MATCH)
248 static bool __check_label(pid_t pid)
250 #define SMACK_LABEL_LEN 255
251 #define COMPARE_LABEL_COUNT 3
257 char check_label[COMPARE_LABEL_COUNT][SMACK_LABEL_LEN+1] = { "System", "System::Privileged", "User"};
259 len = smack_new_label_from_process(pid, &label);
260 if (len < 0 || label == NULL)
263 for (i = 0; i < COMPARE_LABEL_COUNT; i++) {
264 if (g_strcmp0(label, check_label[i]) == 0) {
277 static int _badge_check_writable(const char *caller,
278 const char *pkgname, sqlite3 *db, uid_t uid, pid_t pid)
280 sqlite3_stmt *stmt = NULL;
282 int result = BADGE_ERROR_NONE;
286 if (!db || !caller || !pkgname)
287 return BADGE_ERROR_INVALID_PARAMETER;
289 if (g_strcmp0(caller, pkgname) == 0)
290 return BADGE_ERROR_NONE;
292 if (__check_label(pid) == true)
293 return BADGE_ERROR_NONE;
295 /* LCOV_EXCL_START */
296 if (_is_same_certinfo(caller, pkgname) == 1)
297 return BADGE_ERROR_NONE;
299 sqlbuf = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE " \
300 "pkgname = %Q AND writable_pkgs LIKE '%%%q%%'" \
303 pkgname, caller, uid);
305 ERR("Failed to alloc query");
306 return BADGE_ERROR_OUT_OF_MEMORY;
309 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
310 if (sqlret != SQLITE_OK) {
311 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
313 result = BADGE_ERROR_FROM_DB;
314 goto free_and_return;
317 sqlret = sqlite3_step(stmt);
318 if (sqlret == SQLITE_ROW)
319 count = sqlite3_column_int(stmt, 0);
323 DBG("[%s], DB search result[%d]", sqlbuf, count);
326 result = BADGE_ERROR_PERMISSION_DENIED;
330 sqlite3_free(sqlbuf);
333 sqlite3_finalize(stmt);
339 int _badge_is_existing(const char *pkgname, bool *existing, uid_t uid)
343 int result = BADGE_ERROR_NONE;
345 if (!pkgname || !existing) {
346 /* LCOV_EXCL_START */
347 ERR("pkgname : %s, existing : %p", pkgname, existing);
348 return BADGE_ERROR_INVALID_PARAMETER;
352 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
353 if (sqlret != SQLITE_OK || !db) {
354 /* LCOV_EXCL_START */
355 ERR("Failed to db_util_open [%d]", sqlret);
356 if (sqlret == SQLITE_PERM)
357 return BADGE_ERROR_PERMISSION_DENIED;
358 return BADGE_ERROR_FROM_DB;
362 result = _badge_check_data_inserted(pkgname, db, uid);
363 if (result == BADGE_ERROR_ALREADY_EXIST) {
365 result = BADGE_ERROR_NONE;
366 } else if (result == BADGE_ERROR_NOT_EXIST) {
368 result = BADGE_ERROR_NONE;
371 sqlret = db_util_close(db);
372 if (sqlret != SQLITE_OK)
373 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
378 int _badge_get_list(GList **badge_list, uid_t uid)
381 int result = BADGE_ERROR_NONE;
383 sqlite3_stmt *stmt = NULL;
386 unsigned int badge_count;
387 badge_info_s *badge_info;
389 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
390 if (sqlret != SQLITE_OK || !db) {
391 /* LCOV_EXCL_START */
392 ERR("Failed to db_util_open [%d]", sqlret);
393 return BADGE_ERROR_FROM_DB;
397 sqlbuf = sqlite3_mprintf("SELECT pkgname, badge FROM %q WHERE uid = %d",
398 BADGE_TABLE_NAME, uid);
400 /* LCOV_EXCL_START */
401 ERR("Failed to alloc query");
402 result = BADGE_ERROR_OUT_OF_MEMORY;
403 goto free_and_return;
407 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
408 if (sqlret != SQLITE_OK) {
409 /* LCOV_EXCL_START */
410 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
412 result = BADGE_ERROR_FROM_DB;
413 goto free_and_return;
417 sqlret = sqlite3_step(stmt);
418 if (sqlret == SQLITE_DONE) {
419 INFO("badge db has no data");
420 result = BADGE_ERROR_NOT_EXIST;
421 goto free_and_return;
422 } else if (sqlret != SQLITE_ROW) {
423 ERR("Failed to sqlite3_step [%d]", sqlret);
424 result = BADGE_ERROR_FROM_DB;
425 goto free_and_return;
429 pkg = (const char *)sqlite3_column_text(stmt, 0);
430 badge_count = (unsigned int)sqlite3_column_int(stmt, 1);
432 badge_info = (badge_info_s *)calloc(sizeof(badge_info_s), 1);
433 if (badge_info == NULL) {
434 /* LCOV_EXCL_START */
435 ERR("alloc badge_info failed");
436 result = BADGE_ERROR_OUT_OF_MEMORY;
440 badge_info->pkg = strdup(pkg);
441 badge_info->badge_count = badge_count;
442 *badge_list = g_list_append(*badge_list, badge_info);
444 /* LCOV_EXCL_START */
445 ERR("db has invaild data");
446 result = BADGE_ERROR_FROM_DB;
449 } while (sqlite3_step(stmt) == SQLITE_ROW);
453 sqlite3_free(sqlbuf);
456 sqlite3_finalize(stmt);
458 sqlret = db_util_close(db);
459 if (sqlret != SQLITE_OK)
460 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
465 int _badge_insert(badge_h *badge, uid_t uid)
469 int ret = BADGE_ERROR_NONE;
470 int result = BADGE_ERROR_NONE;
472 bool is_existed = false;
474 if (!badge || !badge->pkgname || !badge->writable_pkgs)
475 return BADGE_ERROR_INVALID_PARAMETER;
477 ret = badge_setting_is_existed_appid(badge->pkgname, &is_existed, uid);
478 if (ret == BADGE_ERROR_NONE && is_existed == false) {
479 result = BADGE_ERROR_INVALID_PACKAGE;
480 goto return_close_db;
481 } else if (ret != BADGE_ERROR_NONE) {
482 ERR("Failed to check existed appid [%d]", ret);
484 goto return_close_db;
487 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
488 if (sqlret != SQLITE_OK || !db) {
489 /* LCOV_EXCL_START */
490 ERR("Failed to db_util_open [%s][%d]", BADGE_DB_PATH, sqlret);
491 return BADGE_ERROR_FROM_DB;
495 /* Check pkgname & id */
496 ret = _badge_check_data_inserted(badge->pkgname, db, uid);
497 if (ret != BADGE_ERROR_NOT_EXIST) {
498 /* LCOV_EXCL_START */
500 goto return_close_db;
504 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
505 "(pkgname, writable_pkgs, uid) VALUES (%Q, %Q, %d);",
507 badge->pkgname, badge->writable_pkgs, uid);
509 /* LCOV_EXCL_START */
510 ERR("Failed to alloc query");
511 result = BADGE_ERROR_OUT_OF_MEMORY;
512 goto return_close_db;
516 ret = badge_db_exec(db, sqlbuf, NULL);
517 if (ret != BADGE_ERROR_NONE) {
518 /* LCOV_EXCL_START */
519 ERR("Failed to insert badge[%s], err[%d]",
520 badge->pkgname, ret);
522 goto return_close_db;
526 /* inserting badge options */
527 ret = _badge_check_option_inserted(badge->pkgname, db, uid);
528 if (ret != BADGE_ERROR_NOT_EXIST) {
530 goto return_close_db;
533 sqlite3_free(sqlbuf);
535 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
536 "(pkgname, uid) VALUES (%Q, %d);",
537 BADGE_OPTION_TABLE_NAME,
538 badge->pkgname, uid);
540 /* LCOV_EXCL_START */
541 ERR("Failed to alloc query");
542 result = BADGE_ERROR_OUT_OF_MEMORY;
543 goto return_close_db;
547 ret = badge_db_exec(db, sqlbuf, NULL);
548 if (ret != BADGE_ERROR_NONE) {
549 /* LCOV_EXCL_START */
550 ERR("Failed to insert badge option[%s], err[%d]",
551 badge->pkgname, sqlret);
553 goto return_close_db;
559 sqlite3_free(sqlbuf);
561 sqlret = db_util_close(db);
562 if (sqlret != SQLITE_OK)
563 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
568 int _badge_remove(const char *caller, const char *pkgname, uid_t uid, pid_t pid)
570 int ret = BADGE_ERROR_NONE;
571 int result = BADGE_ERROR_NONE;
576 if (!caller || !pkgname)
577 return BADGE_ERROR_INVALID_PARAMETER;
579 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
580 if (sqlret != SQLITE_OK || !db) {
581 /* LCOV_EXCL_START */
582 ERR("Failed to db_util_open [%d]", sqlret);
583 return BADGE_ERROR_FROM_DB;
587 ret = _badge_check_data_inserted(pkgname, db, uid);
588 if (ret != BADGE_ERROR_ALREADY_EXIST) {
590 goto return_close_db;
593 ret = _badge_check_writable(caller, pkgname, db, uid, pid);
594 if (ret != BADGE_ERROR_NONE) {
596 goto return_close_db;
599 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
600 BADGE_TABLE_NAME, pkgname, uid);
602 /* LCOV_EXCL_START */
603 ERR("Failed to alloc query");
604 result = BADGE_ERROR_OUT_OF_MEMORY;
605 goto return_close_db;
609 ret = badge_db_exec(db, sqlbuf, NULL);
610 if (ret != BADGE_ERROR_NONE) {
611 ERR("Failed to remove badge[%s], err[%d]",
614 goto return_close_db;
617 /* treating option table */
618 ret = _badge_check_option_inserted(pkgname, db, uid);
619 if (ret != BADGE_ERROR_ALREADY_EXIST) {
621 goto return_close_db;
624 sqlite3_free(sqlbuf);
626 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
627 BADGE_OPTION_TABLE_NAME, pkgname, uid);
629 /* LCOV_EXCL_START */
630 ERR("Failed to alloc query");
631 result = BADGE_ERROR_OUT_OF_MEMORY;
632 goto return_close_db;
636 ret = badge_db_exec(db, sqlbuf, NULL);
637 if (ret != BADGE_ERROR_NONE) {
638 /* LCOV_EXCL_START */
639 ERR("Failed to remove badge option[%s], err[%d]",
642 goto return_close_db;
648 sqlite3_free(sqlbuf);
650 sqlret = db_util_close(db);
651 if (sqlret != SQLITE_OK)
652 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
657 static int _badge_remove_by_appid(const char *appid, uid_t uid, sqlite3 *db)
659 int ret = BADGE_ERROR_NONE;
660 int result = BADGE_ERROR_NONE;
663 ret = _badge_check_data_inserted(appid, db, uid);
664 if (ret != BADGE_ERROR_ALREADY_EXIST) {
666 goto return_close_db;
669 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
670 BADGE_TABLE_NAME, appid, uid);
672 /* LCOV_EXCL_START */
673 ERR("Failed to alloc query");
674 result = BADGE_ERROR_OUT_OF_MEMORY;
675 goto return_close_db;
679 ret = badge_db_exec(db, sqlbuf, NULL);
680 if (ret != BADGE_ERROR_NONE) {
681 /* LCOV_EXCL_START */
682 ERR("Failed to remove badge[%s], err[%d]", appid, ret);
684 goto return_close_db;
688 /* treating option table */
689 ret = _badge_check_option_inserted(appid, db, uid);
690 if (ret != BADGE_ERROR_ALREADY_EXIST) {
692 goto return_close_db;
695 sqlite3_free(sqlbuf);
697 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
698 BADGE_OPTION_TABLE_NAME, appid, uid);
700 /* LCOV_EXCL_START */
701 ERR("Failed to alloc query");
702 result = BADGE_ERROR_OUT_OF_MEMORY;
703 goto return_close_db;
707 ret = badge_db_exec(db, sqlbuf, NULL);
708 if (ret != BADGE_ERROR_NONE) {
709 /* LCOV_EXCL_START */
710 ERR("Failed to remove badge option[%s], err[%d]",
713 goto return_close_db;
719 sqlite3_free(sqlbuf);
724 static bool _get_table_field_data_string(char **table, char **buf, int ucs2, int index)
730 if (table == NULL || buf == NULL || index < 0) {
731 /* LCOV_EXCL_START */
732 ERR("table[%p], buf[%p], index[%d]", table, buf, index);
737 pTemp = table[index];
739 *buf = NULL; /* LCOV_EXCL_LINE */
741 sLen = strlen(pTemp);
743 *buf = (char *)malloc(sLen + 1);
745 ERR("malloc is failed"); /* LCOV_EXCL_LINE */
748 memset(*buf, 0, sLen + 1);
749 strncpy(*buf, pTemp, sLen + 1);
751 *buf = NULL; /* LCOV_EXCL_LINE */
761 int _badge_remove_by_pkgname(const char *pkgname, uid_t uid)
763 int ret = BADGE_ERROR_NONE;
769 char *sql_query = NULL;
770 char **query_result = NULL;
774 sql_ret = db_util_open(BADGE_DB_PATH, &db, 0);
775 if (sql_ret != SQLITE_OK || db == NULL) {
776 ERR("Failed db util open [%s][%d]", BADGE_DB_PATH, sql_ret);
777 return BADGE_ERROR_FROM_DB;
780 sql_query = sqlite3_mprintf("SELECT appid FROM %s WHERE pkgname = %Q" \
781 "AND (uid = %d OR uid = %d) ORDER BY uid DESC;",
782 BADGE_SETTING_DB_TABLE, pkgname, uid,
783 tzplatform_getuid(TZ_SYS_GLOBALAPP_USER));
785 /* LCOV_EXCL_START */
786 ERR("Failed to alloc query");
787 ret = BADGE_ERROR_FROM_DB;
792 sql_ret = sqlite3_get_table(db, sql_query, &query_result, &row_count, &col_count, NULL);
793 if (sql_ret != SQLITE_OK && sql_ret != -1) {
794 /* LCOV_EXCL_START */
795 ERR("sqlite3_get_table failed [%d][%s]", sql_ret,
797 ret = BADGE_ERROR_FROM_DB;
803 DBG("No setting found for [%s]", pkgname);
804 ret = BADGE_ERROR_NOT_EXIST;
808 col_index = col_count;
810 for (index = 0; index < row_count; index++) {
811 _get_table_field_data_string(query_result, &appid, 1, col_index++);
813 _badge_remove_by_appid(appid, uid, db);
821 sqlite3_free_table(query_result);
823 sqlite3_free(sql_query);
825 sql_ret = db_util_close(db);
826 if (sql_ret != SQLITE_OK)
827 WARN("Failed to db_util_close");
833 int _badge_set_count(const char *caller, const char *pkgname,
834 unsigned int count, uid_t uid, pid_t pid)
836 int ret = BADGE_ERROR_NONE;
837 int result = BADGE_ERROR_NONE;
842 if (!caller || !pkgname)
843 return BADGE_ERROR_INVALID_PARAMETER;
845 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
846 if (sqlret != SQLITE_OK || !db) {
847 /* LCOV_EXCL_START */
848 ERR("Failed to db_util_open [%d]", sqlret);
849 return BADGE_ERROR_FROM_DB;
853 ret = _badge_check_data_inserted(pkgname, db, uid);
854 if (ret != BADGE_ERROR_ALREADY_EXIST) {
856 goto return_close_db;
859 ret = _badge_check_writable(caller, pkgname, db, uid, pid);
860 if (ret != BADGE_ERROR_NONE) {
862 goto return_close_db;
865 sqlbuf = sqlite3_mprintf("UPDATE %q SET badge = %d " \
866 "WHERE pkgname = %Q AND uid = %d",
867 BADGE_TABLE_NAME, count, pkgname, uid);
869 /* LCOV_EXCL_START */
870 ERR("Failed to alloc query");
871 result = BADGE_ERROR_OUT_OF_MEMORY;
872 goto return_close_db;
876 ret = badge_db_exec(db, sqlbuf, NULL);
877 if (ret != BADGE_ERROR_NONE) {
878 /* LCOV_EXCL_START */
879 ERR("Failed to set badge[%s] count[%d], err[%d]",
880 pkgname, count, ret);
882 goto return_close_db;
888 sqlite3_free(sqlbuf);
890 sqlret = db_util_close(db);
891 if (sqlret != SQLITE_OK)
892 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
897 int _badge_get_count(const char *pkgname, unsigned int *count, uid_t uid)
899 int ret = BADGE_ERROR_NONE;
900 int result = BADGE_ERROR_NONE;
903 sqlite3_stmt *stmt = NULL;
906 if (!pkgname || !count)
907 return BADGE_ERROR_INVALID_PARAMETER;
909 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
910 if (sqlret != SQLITE_OK || !db) {
911 /* LCOV_EXCL_START */
912 ERR("Failed to db_util_open [%d]", sqlret);
913 if (sqlret == SQLITE_PERM)
914 return BADGE_ERROR_PERMISSION_DENIED;
916 return BADGE_ERROR_FROM_DB;
920 ret = _badge_check_data_inserted(pkgname, db, uid);
921 if (ret != BADGE_ERROR_ALREADY_EXIST) {
923 goto return_close_db;
926 sqlbuf = sqlite3_mprintf("SELECT badge FROM %q " \
927 "WHERE pkgname = %Q AND uid = %d",
928 BADGE_TABLE_NAME, pkgname, uid);
930 /* LCOV_EXCL_START */
931 ERR("Failed to alloc query");
932 result = BADGE_ERROR_OUT_OF_MEMORY;
933 goto return_close_db;
937 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
938 if (sqlret != SQLITE_OK) {
939 /* LCOV_EXCL_START */
940 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
942 result = BADGE_ERROR_FROM_DB;
943 goto return_close_db;
947 sqlret = sqlite3_step(stmt);
948 if (sqlret == SQLITE_ROW)
949 *count = (unsigned int)sqlite3_column_int(stmt, 0);
951 *count = (unsigned int)0;
955 sqlite3_free(sqlbuf);
958 sqlite3_finalize(stmt);
960 sqlret = db_util_close(db);
961 if (sqlret != SQLITE_OK)
962 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
967 int _badge_set_display(const char *pkgname, unsigned int is_display, uid_t uid)
969 int ret = BADGE_ERROR_NONE;
970 int result = BADGE_ERROR_NONE;
976 return BADGE_ERROR_INVALID_PARAMETER;
978 if (is_display != 0 && is_display != 1)
979 return BADGE_ERROR_INVALID_PARAMETER;
981 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
982 if (sqlret != SQLITE_OK || !db) {
983 /* LCOV_EXCL_START */
984 ERR("Failed to db_util_open [%d]", sqlret);
985 return BADGE_ERROR_FROM_DB;
989 ret = _badge_check_data_inserted(pkgname, db, uid);
990 if (ret != BADGE_ERROR_ALREADY_EXIST) {
992 goto return_close_db;
995 ret = _badge_check_option_inserted(pkgname, db, uid);
996 if (ret == BADGE_ERROR_ALREADY_EXIST) {
997 sqlbuf = sqlite3_mprintf("UPDATE %q SET display = %d " \
998 "WHERE pkgname = %Q AND uid = %d",
999 BADGE_OPTION_TABLE_NAME, is_display, pkgname, uid);
1001 /* LCOV_EXCL_START */
1002 ERR("Failed to alloc query");
1003 result = BADGE_ERROR_OUT_OF_MEMORY;
1004 goto return_close_db;
1005 /* LCOV_EXCL_STOP */
1008 ret = badge_db_exec(db, sqlbuf, NULL);
1009 if (ret != BADGE_ERROR_NONE) {
1010 /* LCOV_EXCL_START */
1011 ERR("Failed to set badge[%s] option[%d], err[%d]",
1012 pkgname, is_display, ret);
1014 goto return_close_db;
1015 /* LCOV_EXCL_STOP */
1018 } else if (ret == BADGE_ERROR_NOT_EXIST) {
1019 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
1020 "(pkgname, display, uid) VALUES (%Q, %d, %d);",
1021 BADGE_OPTION_TABLE_NAME,
1022 pkgname, is_display, uid);
1024 /* LCOV_EXCL_START */
1025 ERR("Failed to alloc query");
1026 result = BADGE_ERROR_OUT_OF_MEMORY;
1027 goto return_close_db;
1028 /* LCOV_EXCL_STOP */
1031 ret = badge_db_exec(db, sqlbuf, NULL);
1032 if (ret != BADGE_ERROR_NONE) {
1033 /* LCOV_EXCL_START */
1034 ERR("Failed to set badge[%s] option[%d], err[%d]",
1035 pkgname, is_display, ret);
1037 goto return_close_db;
1038 /* LCOV_EXCL_STOP */
1042 goto return_close_db;
1047 sqlite3_free(sqlbuf);
1049 sqlret = db_util_close(db);
1050 if (sqlret != SQLITE_OK)
1051 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
1056 int _badge_get_display(const char *pkgname, unsigned int *is_display, uid_t uid)
1058 int ret = BADGE_ERROR_NONE;
1059 int result = BADGE_ERROR_NONE;
1061 char *sqlbuf = NULL;
1062 sqlite3_stmt *stmt = NULL;
1065 if (!pkgname || !is_display)
1066 return BADGE_ERROR_INVALID_PARAMETER;
1068 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
1069 if (sqlret != SQLITE_OK || !db) {
1070 /* LCOV_EXCL_START */
1071 ERR("Failed to db_util_open [%d]", sqlret);
1072 if (sqlret == SQLITE_PERM)
1073 return BADGE_ERROR_PERMISSION_DENIED;
1075 return BADGE_ERROR_FROM_DB;
1076 /* LCOV_EXCL_STOP */
1079 ret = _badge_check_option_inserted(pkgname, db, uid);
1080 if (ret != BADGE_ERROR_ALREADY_EXIST) {
1081 if (ret == BADGE_ERROR_NOT_EXIST)
1085 goto return_close_db;
1088 sqlbuf = sqlite3_mprintf("SELECT display FROM %q " \
1089 "WHERE pkgname = %Q AND uid = %d",
1090 BADGE_OPTION_TABLE_NAME, pkgname, uid);
1092 /* LCOV_EXCL_START */
1093 ERR("Failed to alloc query");
1094 result = BADGE_ERROR_OUT_OF_MEMORY;
1095 goto return_close_db;
1096 /* LCOV_EXCL_STOP */
1099 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
1100 if (sqlret != SQLITE_OK) {
1101 /* LCOV_EXCL_START */
1102 ERR("Failed to prepare [%d][%s]", sqlret, sqlite3_errmsg(db));
1103 result = BADGE_ERROR_FROM_DB;
1104 goto return_close_db;
1105 /* LCOV_EXCL_STOP */
1108 sqlret = sqlite3_step(stmt);
1109 if (sqlret == SQLITE_ROW)
1110 *is_display = (unsigned int)sqlite3_column_int(stmt, 0);
1112 *is_display = (unsigned int)1;
1116 sqlite3_free(sqlbuf);
1119 sqlite3_finalize(stmt);
1121 sqlret = db_util_close(db);
1122 if (sqlret != SQLITE_OK)
1123 WARN("Failed to db_util_close [%d]", sqlret); /* LCOV_EXCL_LINE */
1128 void badge_changed_cb_call(unsigned int action, const char *pkgname,
1129 unsigned int count, uid_t uid)
1131 GList *badge_cb_list = NULL;
1132 struct _badge_cb_data *bd = NULL;
1134 DBG("call badge_change_cb");
1136 if (_badge_cb_hash == NULL)
1139 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1141 if (badge_cb_list == NULL) {
1142 ERR("invalid data");
1146 badge_cb_list = g_list_first(badge_cb_list);
1148 for (; badge_cb_list != NULL; badge_cb_list = badge_cb_list->next) {
1149 bd = badge_cb_list->data;
1151 if (bd != NULL && bd->callback != NULL) {
1152 DBG("call badge_change_cb : action %d, pkgname %s, count %d",
1153 action, pkgname, count);
1154 bd->callback(action, pkgname, count, bd->data);
1159 static int _badge_changed_monitor_init(uid_t uid)
1161 return badge_ipc_monitor_init(uid);
1164 static void _badge_chanaged_monitor_fini(void)
1166 badge_ipc_monitor_fini();
1169 static gint _badge_data_compare(gconstpointer a, gconstpointer b)
1171 const struct _badge_cb_data *bd = NULL;
1175 bd = (struct _badge_cb_data *)a;
1177 if (bd->callback == b)
1183 static struct _badge_cb_data *__malloc_badge_cb_data(badge_change_cb callback, void *data)
1185 struct _badge_cb_data *bd = NULL;
1187 bd = (struct _badge_cb_data *)malloc(sizeof(struct _badge_cb_data));
1189 /* LCOV_EXCL_START */
1190 ERR("Failed malloc badge_cb_data");
1192 /* LCOV_EXCL_STOP */
1195 bd->callback = callback;
1201 int _badge_free(badge_h *badge)
1204 return BADGE_ERROR_INVALID_PARAMETER;
1207 free(badge->pkgname);
1209 if (badge->writable_pkgs)
1210 free(badge->writable_pkgs);
1214 return BADGE_ERROR_NONE;
1217 badge_h *_badge_new(const char *pkgname, const char *writable_pkgs,
1220 badge_h *badge = NULL;
1222 if (!pkgname || !writable_pkgs) {
1223 ERR("Invalid parameters");
1225 *err = BADGE_ERROR_INVALID_PARAMETER;
1229 badge = (badge_h *)malloc(sizeof(struct _badge_h));
1231 /* LCOV_EXCL_START */
1232 ERR("Failed to alloc handle");
1234 *err = BADGE_ERROR_OUT_OF_MEMORY;
1236 /* LCOV_EXCL_STOP */
1239 badge->pkgname = strdup(pkgname);
1240 badge->writable_pkgs = strdup(writable_pkgs);
1242 *err = BADGE_ERROR_NONE;
1247 char *_badge_pkgs_new(int *err, const char *pkg1, ...)
1249 char *caller_pkgname = NULL;
1251 char *result = NULL;
1255 char *new_pkgs = NULL;
1258 *err = BADGE_ERROR_NONE;
1260 caller_pkgname = _badge_get_pkgname_by_pid();
1261 if (!caller_pkgname) {
1262 ERR("Failed to get caller pkgname");
1264 *err = BADGE_ERROR_PERMISSION_DENIED;
1269 WARN("pkg1 is NULL");
1270 return caller_pkgname;
1273 length = strlen(pkg1);
1274 va_start(args, pkg1);
1275 s = va_arg(args, char *);
1277 length += strlen(s);
1278 s = va_arg(args, char *);
1283 WARN("length is %zu", length);
1284 return caller_pkgname;
1287 result = g_new0(char, length + 1); /* 1 for null terminate */
1289 /* LCOV_EXCL_START */
1290 ERR("Failed to alloc memory");
1292 *err = BADGE_ERROR_OUT_OF_MEMORY;
1293 free(caller_pkgname);
1295 /* LCOV_EXCL_STOP */
1299 ptr = g_stpcpy(ptr, pkg1);
1300 va_start(args, pkg1);
1301 s = va_arg(args, char *);
1303 ptr = g_stpcpy(ptr, s);
1304 s = va_arg(args, char *);
1308 if (g_strstr_len(result, -1, caller_pkgname) == NULL) {
1309 new_pkgs = g_strdup_printf("%s%s", caller_pkgname, result);
1311 ERR("Failed to alloc memory");
1313 *err = BADGE_ERROR_OUT_OF_MEMORY;
1316 free(caller_pkgname);
1323 free(caller_pkgname);
1329 int badge_create_for_uid(const char *pkgname, const char *writable_pkg, uid_t uid)
1331 CHECK_BADGE_FEATURE();
1332 char *caller = NULL;
1333 int err = BADGE_ERROR_NONE;
1335 caller = _badge_get_pkgname_by_pid();
1337 ERR("Failed to get caller pkgname");
1338 return BADGE_ERROR_PERMISSION_DENIED;
1341 err = badge_ipc_request_insert(pkgname, writable_pkg, caller, uid);
1348 int badge_new_for_uid(const char *writable_app_id, uid_t uid)
1350 CHECK_BADGE_FEATURE();
1351 char *caller = NULL;
1352 int err = BADGE_ERROR_NONE;
1354 caller = _badge_get_pkgname_by_pid();
1356 ERR("Failed to get caller pkgname");
1357 return BADGE_ERROR_PERMISSION_DENIED;
1360 err = badge_ipc_request_insert(caller, writable_app_id, caller, uid);
1366 int badge_new_for_for_uid(const char *badge_app_id, const char *writable_app_id, uid_t uid)
1368 CHECK_BADGE_FEATURE();
1369 char *caller = NULL;
1370 int err = BADGE_ERROR_NONE;
1372 caller = _badge_get_pkgname_by_pid();
1374 ERR("Failed to get caller pkgname");
1375 return BADGE_ERROR_PERMISSION_DENIED;
1378 if (badge_app_id == NULL) {
1379 badge_app_id = caller;
1381 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
1382 package_manager_compare_result_type_e compare_result =
1383 PACKAGE_MANAGER_COMPARE_MISMATCH;
1385 pkgmgr_ret = package_manager_compare_app_cert_info(badge_app_id,
1386 caller, &compare_result);
1388 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE ||
1389 compare_result != PACKAGE_MANAGER_COMPARE_MATCH) {
1390 err = BADGE_ERROR_INVALID_PACKAGE;
1395 err = badge_ipc_request_insert(badge_app_id, writable_app_id, caller, uid);
1403 int badge_new_for(const char *badge_app_id, const char *writable_app_id)
1405 CHECK_BADGE_FEATURE();
1406 if (writable_app_id == NULL)
1407 return BADGE_ERROR_INVALID_PARAMETER;
1409 return badge_new_for_for_uid(badge_app_id, writable_app_id, getuid());
1413 int badge_add_for_uid(const char *badge_app_id, uid_t uid)
1415 CHECK_BADGE_FEATURE();
1416 char *caller = NULL;
1417 int err = BADGE_ERROR_NONE;
1419 caller = _badge_get_pkgname_by_pid();
1421 ERR("Failed to get caller pkgname");
1422 return BADGE_ERROR_PERMISSION_DENIED;
1425 if (badge_app_id == NULL) {
1426 badge_app_id = caller;
1428 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
1429 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
1431 pkgmgr_ret = package_manager_compare_app_cert_info(badge_app_id, caller, &compare_result);
1433 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE || compare_result != PACKAGE_MANAGER_COMPARE_MATCH) {
1434 err = BADGE_ERROR_INVALID_PACKAGE;
1439 err = badge_ipc_request_insert(badge_app_id, caller, caller, uid);
1448 int badge_remove_for_uid(const char *app_id, uid_t uid)
1450 CHECK_BADGE_FEATURE();
1451 char *caller = NULL;
1452 int result = BADGE_ERROR_NONE;
1454 caller = _badge_get_pkgname_by_pid();
1456 ERR("Failed to get caller pkgname");
1457 result = BADGE_ERROR_PERMISSION_DENIED;
1461 result = badge_ipc_request_delete(app_id, caller, uid);
1470 int badge_is_existing_for_uid(const char *app_id, bool *existing, uid_t uid)
1472 CHECK_BADGE_FEATURE();
1473 return badge_ipc_request_is_existing(app_id, existing, uid);
1477 int badge_foreach_for_uid(badge_foreach_cb callback, void *user_data, uid_t uid)
1479 CHECK_BADGE_FEATURE();
1480 int result = BADGE_ERROR_NONE;
1482 result = badge_ipc_request_get_list(callback, user_data, uid);
1483 if (result == BADGE_ERROR_IO_ERROR)
1484 result = BADGE_ERROR_FROM_DB;
1489 int badge_set_count_for_uid(const char *app_id, unsigned int count, uid_t uid)
1491 CHECK_BADGE_FEATURE();
1492 char *caller = NULL;
1493 int result = BADGE_ERROR_NONE;
1495 DBG("app_id %s, count %d", app_id, count);
1497 caller = _badge_get_pkgname_by_pid();
1499 ERR("Failed to get caller pkgname");
1500 result = BADGE_ERROR_PERMISSION_DENIED;
1504 result = badge_ipc_request_set_count(app_id, caller, count, uid);
1512 int badge_get_count_for_uid(const char *app_id, unsigned int *count, uid_t uid)
1514 CHECK_BADGE_FEATURE();
1515 int result = BADGE_ERROR_NONE;
1517 result = badge_ipc_request_get_count(app_id, count, uid);
1518 if (result == BADGE_ERROR_IO_ERROR)
1519 result = BADGE_ERROR_FROM_DB;
1525 int badge_set_display_for_uid(const char *app_id, unsigned int is_display, uid_t uid)
1527 CHECK_BADGE_FEATURE();
1528 char *caller = NULL;
1529 int result = BADGE_ERROR_NONE;
1531 caller = _badge_get_pkgname_by_pid();
1533 ERR("Failed to get caller pkgname");
1534 result = BADGE_ERROR_PERMISSION_DENIED;
1538 result = badge_ipc_request_set_display(app_id, caller, is_display, uid);
1547 int badge_get_display_for_uid(const char *app_id, unsigned int *is_display, uid_t uid)
1549 CHECK_BADGE_FEATURE();
1550 int result = BADGE_ERROR_NONE;
1552 result = badge_ipc_request_get_display(app_id, is_display, uid);
1553 if (result == BADGE_ERROR_IO_ERROR)
1554 result = BADGE_ERROR_FROM_DB;
1560 int badge_register_changed_cb_for_uid(badge_change_cb callback, void *data, uid_t uid)
1562 CHECK_BADGE_FEATURE();
1563 struct _badge_cb_data *bd = NULL;
1564 GList *badge_cb_list = NULL;
1565 GList *badge_found_list = NULL;
1568 if (_badge_cb_hash == NULL)
1569 _badge_cb_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
1571 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1573 if (badge_cb_list == NULL) {
1574 bd = __malloc_badge_cb_data(callback, data);
1576 return BADGE_ERROR_OUT_OF_MEMORY;
1578 badge_cb_list = g_list_append(badge_cb_list, bd);
1579 g_hash_table_insert(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1581 badge_found_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1582 (GCompareFunc)_badge_data_compare);
1583 if (badge_found_list) {
1584 bd = g_list_nth_data(badge_found_list, 0);
1587 bd = __malloc_badge_cb_data(callback, data);
1589 return BADGE_ERROR_OUT_OF_MEMORY;
1590 badge_cb_list = g_list_append(badge_cb_list, bd);
1594 ret = _badge_changed_monitor_init(uid);
1595 if (ret == BADGE_ERROR_NONE) {
1596 ret = badge_ipc_init_badge(uid);
1597 if (ret != BADGE_ERROR_NONE && ret != BADGE_ERROR_NOT_EXIST) {
1598 badge_unregister_changed_cb_for_uid(callback, uid);
1599 return BADGE_ERROR_IO_ERROR;
1602 /* LCOV_EXCL_START */
1603 ERR("badge_ipc_monitor_init err [%d]", ret);
1604 badge_unregister_changed_cb_for_uid(callback, uid);
1606 /* LCOV_EXCL_STOP */
1608 return BADGE_ERROR_NONE;
1612 int badge_unregister_changed_cb_for_uid(badge_change_cb callback, uid_t uid)
1614 CHECK_BADGE_FEATURE();
1615 GList *badge_cb_list = NULL;
1616 GList *badge_delete_list = NULL;
1617 struct _badge_cb_data *bd = NULL;
1619 if (_badge_cb_hash == NULL)
1620 return BADGE_ERROR_INVALID_PARAMETER;
1622 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1624 if (badge_cb_list == NULL)
1625 return BADGE_ERROR_INVALID_PARAMETER;
1627 badge_delete_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1628 (GCompareFunc)_badge_data_compare);
1630 if (badge_delete_list) {
1631 bd = g_list_nth_data(badge_delete_list, 0);
1632 badge_cb_list = g_list_delete_link(badge_cb_list, badge_delete_list);
1635 return BADGE_ERROR_INVALID_PARAMETER;
1638 if (badge_cb_list == NULL)
1639 g_hash_table_steal(_badge_cb_hash, GUINT_TO_POINTER(uid));
1641 g_hash_table_replace(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1643 if (g_hash_table_size(_badge_cb_hash) == 0)
1644 _badge_chanaged_monitor_fini();
1646 return BADGE_ERROR_NONE;
1650 int badge_is_service_ready(void)
1652 CHECK_BADGE_FEATURE();
1653 return badge_ipc_is_master_ready();
1657 int badge_add_deferred_task(
1658 void (*badge_add_deferred_task)(void *data), void *user_data)
1660 CHECK_BADGE_FEATURE();
1661 return badge_ipc_add_deferred_task(badge_add_deferred_task, user_data);
1665 int badge_del_deferred_task(
1666 void (*badge_add_deferred_task)(void *data))
1668 CHECK_BADGE_FEATURE();
1669 return badge_ipc_del_deferred_task(badge_add_deferred_task);
1673 int badge_is_existing(const char *app_id, bool *existing)
1675 CHECK_BADGE_FEATURE();
1676 if (app_id == NULL || existing == NULL)
1677 return BADGE_ERROR_INVALID_PARAMETER;
1679 return badge_is_existing_for_uid(app_id, existing, getuid());
1683 int badge_create(const char *pkgname, const char *writable_pkg)
1685 CHECK_BADGE_FEATURE();
1686 if (pkgname == NULL)
1687 return BADGE_ERROR_INVALID_PARAMETER;
1689 return badge_create_for_uid(pkgname, writable_pkg, getuid());