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"
40 #define BADGE_PKGNAME_LEN 512
41 #define BADGE_TABLE_NAME "badge_data"
42 #define BADGE_OPTION_TABLE_NAME "badge_option"
44 #define BADGE_CHANGED_NOTI "badge_changed"
51 struct _badge_cb_data {
52 badge_change_cb callback;
56 static GHashTable *_badge_cb_hash = NULL;
58 static inline long _get_max_len(void)
61 long path_max_len = 4096;
64 max = (pathconf("/", _PC_PATH_MAX) < 1 ? path_max_len
65 : pathconf("/", _PC_PATH_MAX));
66 #else /* _PC_PATH_MAX */
68 #endif /* _PC_PATH_MAX */
72 char *_badge_get_pkgname_by_pid(void)
82 pkgname = malloc(max);
85 ERR("fail to alloc memory");
89 memset(pkgname, 0x00, max);
91 ret = aul_app_get_pkgname_bypid(pid, pkgname, max);
92 if (ret != AUL_R_OK) {
93 fd = open("/proc/self/cmdline", O_RDONLY);
101 ret = read(fd, pkgname, max - 1);
103 /* LCOV_EXCL_START */
113 if (pkgname[0] == '\0') {
114 /* LCOV_EXCL_START */
123 static int _badge_check_data_inserted(const char *pkgname,
124 sqlite3 *db, uid_t uid)
126 sqlite3_stmt *stmt = NULL;
128 int result = BADGE_ERROR_NONE;
133 return BADGE_ERROR_INVALID_PARAMETER;
136 return BADGE_ERROR_INVALID_PARAMETER;
138 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
139 "pkgname = %Q AND uid = %d",
140 BADGE_TABLE_NAME, pkgname, uid);
143 /* LCOV_EXCL_START */
144 ERR("fail to alloc sql query");
145 return BADGE_ERROR_OUT_OF_MEMORY;
149 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
150 if (sqlret != SQLITE_OK) {
151 /* LCOV_EXCL_START */
152 ERR("DB err [%s]", sqlite3_errmsg(db));
153 ERR("query[%s]", sqlbuf);
154 result = BADGE_ERROR_FROM_DB;
155 goto free_and_return;
159 sqlret = sqlite3_step(stmt);
160 if (sqlret == SQLITE_ROW)
161 count = sqlite3_column_int(stmt, 0);
165 DBG("[%s], DB search result[%d]", sqlbuf, count);
168 result = BADGE_ERROR_ALREADY_EXIST;
170 result = BADGE_ERROR_NOT_EXIST;
174 sqlite3_free(sqlbuf);
177 sqlite3_finalize(stmt);
182 static int _badge_check_option_inserted(const char *pkgname,
183 sqlite3 *db, uid_t uid)
185 sqlite3_stmt *stmt = NULL;
187 int result = BADGE_ERROR_NONE;
192 return BADGE_ERROR_INVALID_PARAMETER;
195 return BADGE_ERROR_INVALID_PARAMETER;
197 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
198 "pkgname = %Q AND uid = %d",
199 BADGE_OPTION_TABLE_NAME, pkgname, uid);
202 /* LCOV_EXCL_START */
203 ERR("fail to alloc sql query");
204 return BADGE_ERROR_OUT_OF_MEMORY;
208 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
209 if (sqlret != SQLITE_OK) {
210 /* LCOV_EXCL_START */
211 ERR("DB err [%s]", sqlite3_errmsg(db));
212 ERR("query[%s]", sqlbuf);
213 result = BADGE_ERROR_FROM_DB;
214 goto free_and_return;
218 sqlret = sqlite3_step(stmt);
219 if (sqlret == SQLITE_ROW)
220 count = sqlite3_column_int(stmt, 0);
224 DBG("[%s], DB search result[%d]", sqlbuf, count);
227 result = BADGE_ERROR_ALREADY_EXIST;
229 result = BADGE_ERROR_NOT_EXIST;
233 sqlite3_free(sqlbuf);
236 sqlite3_finalize(stmt);
241 static int _is_same_certinfo(const char *caller, const char *pkgname)
243 int ret = PACKAGE_MANAGER_ERROR_NONE;
244 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
246 if (!caller || !pkgname)
249 ret = package_manager_compare_package_cert_info(pkgname, caller, &compare_result);
250 if (ret == PACKAGE_MANAGER_ERROR_NONE &&
251 compare_result == PACKAGE_MANAGER_COMPARE_MATCH)
257 static bool __check_label(pid_t pid)
259 #define SMACK_LABEL_LEN 255
260 #define COMPARE_LABEL_COUNT 3
266 char check_label[COMPARE_LABEL_COUNT][SMACK_LABEL_LEN+1] = { "System", "System::Privileged", "User"};
268 len = smack_new_label_from_process(pid, &label);
269 if (len < 0 || label == NULL)
272 for (i = 0; i < COMPARE_LABEL_COUNT; i++) {
273 if (g_strcmp0(label, check_label[i]) == 0) {
286 static int _badge_check_writable(const char *caller,
287 const char *pkgname, sqlite3 *db, uid_t uid, pid_t pid)
289 sqlite3_stmt *stmt = NULL;
291 int result = BADGE_ERROR_NONE;
295 if (!db || !caller || !pkgname)
296 return BADGE_ERROR_INVALID_PARAMETER;
298 if (g_strcmp0(caller, pkgname) == 0)
299 return BADGE_ERROR_NONE;
301 if (__check_label(pid) == true)
302 return BADGE_ERROR_NONE;
304 /* LCOV_EXCL_START */
305 if (_is_same_certinfo(caller, pkgname) == 1)
306 return BADGE_ERROR_NONE;
308 sqlbuf = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE " \
309 "pkgname = %Q AND writable_pkgs LIKE '%%%q%%'" \
312 pkgname, caller, uid);
314 ERR("fail to alloc sql query");
315 return BADGE_ERROR_OUT_OF_MEMORY;
318 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
319 if (sqlret != SQLITE_OK) {
320 ERR("DB err [%s]", sqlite3_errmsg(db));
321 ERR("query[%s]", sqlbuf);
322 result = BADGE_ERROR_FROM_DB;
323 goto free_and_return;
326 sqlret = sqlite3_step(stmt);
327 if (sqlret == SQLITE_ROW)
328 count = sqlite3_column_int(stmt, 0);
332 DBG("[%s], DB search result[%d]", sqlbuf, count);
335 result = BADGE_ERROR_PERMISSION_DENIED;
339 sqlite3_free(sqlbuf);
342 sqlite3_finalize(stmt);
348 int _badge_is_existing(const char *pkgname, bool *existing, uid_t uid)
352 int result = BADGE_ERROR_NONE;
354 if (!pkgname || !existing) {
355 /* LCOV_EXCL_START */
356 ERR("pkgname : %s, existing : %p", pkgname, existing);
357 return BADGE_ERROR_INVALID_PARAMETER;
361 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
362 if (sqlret != SQLITE_OK || !db) {
363 /* LCOV_EXCL_START */
364 ERR("fail to db_util_open - [%d]", sqlret);
365 if (sqlret == SQLITE_PERM)
366 return BADGE_ERROR_PERMISSION_DENIED;
367 return BADGE_ERROR_FROM_DB;
371 result = _badge_check_data_inserted(pkgname, db, uid);
372 if (result == BADGE_ERROR_ALREADY_EXIST) {
374 result = BADGE_ERROR_NONE;
375 } else if (result == BADGE_ERROR_NOT_EXIST) {
377 result = BADGE_ERROR_NONE;
380 sqlret = db_util_close(db);
381 if (sqlret != SQLITE_OK)
382 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
387 int _badge_get_list(GList **badge_list, uid_t uid)
390 int result = BADGE_ERROR_NONE;
392 sqlite3_stmt *stmt = NULL;
395 unsigned int badge_count;
396 badge_info_s *badge_info;
398 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
399 if (sqlret != SQLITE_OK || !db) {
400 /* LCOV_EXCL_START */
401 ERR("fail to db_util_open - [%d]", sqlret);
402 return BADGE_ERROR_FROM_DB;
406 sqlbuf = sqlite3_mprintf("SELECT pkgname, badge FROM %q WHERE uid = %d",
407 BADGE_TABLE_NAME, uid);
409 /* LCOV_EXCL_START */
410 ERR("fail to alloc sql query");
411 result = BADGE_ERROR_OUT_OF_MEMORY;
412 goto free_and_return;
416 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
417 if (sqlret != SQLITE_OK) {
418 /* LCOV_EXCL_START */
419 ERR("fail to sqlite3_prepare_v2 - [%s]", sqlite3_errmsg(db));
420 ERR("query[%s]", sqlbuf);
421 result = BADGE_ERROR_FROM_DB;
422 goto free_and_return;
426 sqlret = sqlite3_step(stmt);
427 if (sqlret == SQLITE_DONE) {
428 INFO("badge db has no data");
429 result = BADGE_ERROR_NOT_EXIST;
430 goto free_and_return;
431 } else if (sqlret != SQLITE_ROW) {
432 ERR("fail to sqlite3_step : %d", sqlret);
433 result = BADGE_ERROR_FROM_DB;
434 goto free_and_return;
438 pkg = (const char *)sqlite3_column_text(stmt, 0);
439 badge_count = (unsigned int)sqlite3_column_int(stmt, 1);
441 badge_info = (badge_info_s *)calloc(sizeof(badge_info_s), 1);
442 if (badge_info == NULL) {
443 /* LCOV_EXCL_START */
444 ERR("alloc badge_info fail");
445 result = BADGE_ERROR_OUT_OF_MEMORY;
449 badge_info->pkg = strdup(pkg);
450 badge_info->badge_count = badge_count;
451 *badge_list = g_list_append(*badge_list, badge_info);
453 /* LCOV_EXCL_START */
454 ERR("db has invaild data");
455 result = BADGE_ERROR_FROM_DB;
458 } while (sqlite3_step(stmt) == SQLITE_ROW);
462 sqlite3_free(sqlbuf);
465 sqlite3_finalize(stmt);
467 sqlret = db_util_close(db);
468 if (sqlret != SQLITE_OK)
469 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
474 int _badge_insert(badge_h *badge, uid_t uid)
478 int ret = BADGE_ERROR_NONE;
479 int result = BADGE_ERROR_NONE;
482 if (!badge || !badge->pkgname || !badge->writable_pkgs)
483 return BADGE_ERROR_INVALID_PARAMETER;
485 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
486 if (sqlret != SQLITE_OK || !db) {
487 /* LCOV_EXCL_START */
488 ERR("fail to db_util_open - [%s][%d]", BADGE_DB_PATH, sqlret);
489 return BADGE_ERROR_FROM_DB;
493 /* Check pkgname & id */
494 ret = _badge_check_data_inserted(badge->pkgname, db, uid);
495 if (ret != BADGE_ERROR_NOT_EXIST) {
496 /* LCOV_EXCL_START */
498 goto return_close_db;
502 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
509 badge->pkgname, badge->writable_pkgs, uid);
511 /* LCOV_EXCL_START */
512 ERR("fail to alloc query");
513 result = BADGE_ERROR_OUT_OF_MEMORY;
514 goto return_close_db;
518 ret = badge_db_exec(db, sqlbuf, NULL);
519 if (ret != BADGE_ERROR_NONE) {
520 /* LCOV_EXCL_START */
521 ERR("failed to insert badge[%s], err[%d]",
522 badge->pkgname, ret);
524 goto return_close_db;
528 /* inserting badge options */
529 ret = _badge_check_option_inserted(badge->pkgname, db, uid);
530 if (ret != BADGE_ERROR_NOT_EXIST) {
532 goto return_close_db;
535 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
540 BADGE_OPTION_TABLE_NAME,
541 badge->pkgname, uid);
543 /* LCOV_EXCL_START */
544 ERR("fail to alloc query");
545 result = BADGE_ERROR_OUT_OF_MEMORY;
546 goto return_close_db;
550 ret = badge_db_exec(db, sqlbuf, NULL);
551 if (ret != BADGE_ERROR_NONE) {
552 /* LCOV_EXCL_START */
553 ERR("failed to insert badge option[%s], err[%d]",
554 badge->pkgname, sqlret);
556 goto return_close_db;
562 sqlite3_free(sqlbuf);
564 sqlret = db_util_close(db);
565 if (sqlret != SQLITE_OK)
566 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
571 int _badge_remove(const char *caller, const char *pkgname, uid_t uid, pid_t pid)
573 int ret = BADGE_ERROR_NONE;
574 int result = BADGE_ERROR_NONE;
579 if (!caller || !pkgname)
580 return BADGE_ERROR_INVALID_PARAMETER;
582 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
583 if (sqlret != SQLITE_OK || !db) {
584 /* LCOV_EXCL_START */
585 ERR("fail to db_util_open - [%d]", sqlret);
586 return BADGE_ERROR_FROM_DB;
590 ret = _badge_check_data_inserted(pkgname, db, uid);
591 if (ret != BADGE_ERROR_ALREADY_EXIST) {
593 goto return_close_db;
596 ret = _badge_check_writable(caller, pkgname, db, uid, pid);
597 if (ret != BADGE_ERROR_NONE) {
599 goto return_close_db;
602 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
603 BADGE_TABLE_NAME, pkgname, uid);
605 /* LCOV_EXCL_START */
606 ERR("fail to alloc query");
607 result = BADGE_ERROR_OUT_OF_MEMORY;
608 goto return_close_db;
612 ret = badge_db_exec(db, sqlbuf, NULL);
613 if (ret != BADGE_ERROR_NONE) {
614 ERR("failed to remove badge[%s], err[%d]",
617 goto return_close_db;
620 /* treating option table */
621 ret = _badge_check_option_inserted(pkgname, db, uid);
622 if (ret != BADGE_ERROR_ALREADY_EXIST) {
624 goto return_close_db;
627 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
628 BADGE_OPTION_TABLE_NAME, pkgname, uid);
630 /* LCOV_EXCL_START */
631 ERR("fail to alloc query");
632 result = BADGE_ERROR_OUT_OF_MEMORY;
633 goto return_close_db;
637 ret = badge_db_exec(db, sqlbuf, NULL);
638 if (ret != BADGE_ERROR_NONE) {
639 /* LCOV_EXCL_START */
640 ERR("failed to remove badge option[%s], err[%d]",
643 goto return_close_db;
649 sqlite3_free(sqlbuf);
651 sqlret = db_util_close(db);
652 if (sqlret != SQLITE_OK)
653 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
658 static int _badge_remove_by_appid(const char *appid, uid_t uid, sqlite3 *db)
660 int ret = BADGE_ERROR_NONE;
661 int result = BADGE_ERROR_NONE;
664 ret = _badge_check_data_inserted(appid, db, uid);
665 if (ret != BADGE_ERROR_ALREADY_EXIST) {
667 goto return_close_db;
670 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
671 BADGE_TABLE_NAME, appid, uid);
673 /* LCOV_EXCL_START */
674 ERR("fail to alloc query");
675 result = BADGE_ERROR_OUT_OF_MEMORY;
676 goto return_close_db;
680 ret = badge_db_exec(db, sqlbuf, NULL);
681 if (ret != BADGE_ERROR_NONE) {
682 ERR("failed to remove badge[%s], err[%d]",
685 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 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
696 BADGE_OPTION_TABLE_NAME, appid, uid);
698 /* LCOV_EXCL_START */
699 ERR("fail to alloc query");
700 result = BADGE_ERROR_OUT_OF_MEMORY;
701 goto return_close_db;
705 ret = badge_db_exec(db, sqlbuf, NULL);
706 if (ret != BADGE_ERROR_NONE) {
707 /* LCOV_EXCL_START */
708 ERR("failed to remove badge option[%s], err[%d]",
711 goto return_close_db;
717 sqlite3_free(sqlbuf);
722 static bool _get_table_field_data_string(char **table, char **buf, int ucs2, int index)
728 if (table == NULL || buf == NULL || index < 0) {
729 /* LCOV_EXCL_START */
730 ERR("table[%p], buf[%p], index[%d]", table, buf, index);
735 pTemp = table[index];
737 *buf = NULL; /* LCOV_EXCL_LINE */
739 sLen = strlen(pTemp);
741 *buf = (char *)malloc(sLen + 1);
743 ERR("malloc is failed"); /* LCOV_EXCL_LINE */
746 memset(*buf, 0, sLen + 1);
747 strncpy(*buf, pTemp, sLen);
749 *buf = NULL; /* LCOV_EXCL_LINE */
759 int _badge_remove_by_pkgname(const char *pkgname, uid_t uid)
761 int ret = BADGE_ERROR_NONE;
767 char *sql_query = NULL;
768 char **query_result = NULL;
772 sql_ret = db_util_open(BADGE_DB_PATH, &db, 0);
773 if (sql_ret != SQLITE_OK || db == NULL) {
774 ERR("Failed db util open [%s][%d]", BADGE_DB_PATH, sql_ret);
775 return BADGE_ERROR_FROM_DB;
778 sql_query = sqlite3_mprintf("SELECT appid FROM %s WHERE pkgname = %Q" \
779 "AND (uid = %d OR uid = %d) ORDER BY uid DESC;",
780 BADGE_SETTING_DB_TABLE, pkgname, uid,
781 tzplatform_getuid(TZ_SYS_GLOBALAPP_USER));
783 ERR("fail to alloc query");
784 ret = BADGE_ERROR_FROM_DB;
788 sql_ret = sqlite3_get_table(db, sql_query, &query_result, &row_count, &col_count, NULL);
789 if (sql_ret != SQLITE_OK && sql_ret != -1) {
790 ERR("sqlite3_get_table failed [%d][%s]", sql_ret, sql_query);
791 ret = BADGE_ERROR_FROM_DB;
796 DBG("No setting found for [%s]", pkgname);
797 ret = BADGE_ERROR_NOT_EXIST;
801 col_index = col_count;
803 for (index = 0; index < row_count; index++) {
804 _get_table_field_data_string(query_result, &appid, 1, col_index++);
806 _badge_remove_by_appid(appid, uid, db);
814 sqlite3_free_table(query_result);
816 sqlite3_free(sql_query);
818 sql_ret = db_util_close(db);
819 if (sql_ret != SQLITE_OK)
820 WARN("fail to db_util_close");
826 int _badge_set_count(const char *caller, const char *pkgname,
827 unsigned int count, uid_t uid, pid_t pid)
829 int ret = BADGE_ERROR_NONE;
830 int result = BADGE_ERROR_NONE;
835 if (!caller || !pkgname)
836 return BADGE_ERROR_INVALID_PARAMETER;
838 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
839 if (sqlret != SQLITE_OK || !db) {
840 /* LCOV_EXCL_START */
841 ERR("fail to db_util_open - [%d]", sqlret);
842 return BADGE_ERROR_FROM_DB;
846 ret = _badge_check_data_inserted(pkgname, db, uid);
847 if (ret != BADGE_ERROR_ALREADY_EXIST) {
849 goto return_close_db;
852 ret = _badge_check_writable(caller, pkgname, db, uid, pid);
853 if (ret != BADGE_ERROR_NONE) {
855 goto return_close_db;
858 sqlbuf = sqlite3_mprintf("UPDATE %q SET badge = %d " \
859 "WHERE pkgname = %Q AND uid = %d",
860 BADGE_TABLE_NAME, count, pkgname, uid);
862 /* LCOV_EXCL_START */
863 ERR("fail to alloc query");
864 result = BADGE_ERROR_OUT_OF_MEMORY;
865 goto return_close_db;
869 ret = badge_db_exec(db, sqlbuf, NULL);
870 if (ret != BADGE_ERROR_NONE) {
871 /* LCOV_EXCL_START */
872 ERR("failed to set badge[%s] count[%d], err[%d]",
873 pkgname, count, ret);
875 goto return_close_db;
881 sqlite3_free(sqlbuf);
883 sqlret = db_util_close(db);
884 if (sqlret != SQLITE_OK)
885 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
890 int _badge_get_count(const char *pkgname, unsigned int *count, uid_t uid)
892 int ret = BADGE_ERROR_NONE;
893 int result = BADGE_ERROR_NONE;
896 sqlite3_stmt *stmt = NULL;
899 if (!pkgname || !count)
900 return BADGE_ERROR_INVALID_PARAMETER;
902 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
903 if (sqlret != SQLITE_OK || !db) {
904 /* LCOV_EXCL_START */
905 ERR("fail to db_util_open - [%d]", sqlret);
906 if (sqlret == SQLITE_PERM)
907 return BADGE_ERROR_PERMISSION_DENIED;
909 return BADGE_ERROR_FROM_DB;
913 ret = _badge_check_data_inserted(pkgname, db, uid);
914 if (ret != BADGE_ERROR_ALREADY_EXIST) {
916 goto return_close_db;
919 sqlbuf = sqlite3_mprintf("SELECT badge FROM %q " \
920 "WHERE pkgname = %Q AND uid = %d",
921 BADGE_TABLE_NAME, pkgname, uid);
923 /* LCOV_EXCL_START */
924 ERR("fail to alloc query");
925 result = BADGE_ERROR_OUT_OF_MEMORY;
926 goto return_close_db;
930 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
931 if (sqlret != SQLITE_OK) {
932 /* LCOV_EXCL_START */
933 ERR("fail to prepare %s - [%s]",
934 sqlbuf, sqlite3_errmsg(db));
935 result = BADGE_ERROR_FROM_DB;
936 goto return_close_db;
940 sqlret = sqlite3_step(stmt);
941 if (sqlret == SQLITE_ROW)
942 *count = (unsigned int)sqlite3_column_int(stmt, 0);
944 *count = (unsigned int)0;
948 sqlite3_free(sqlbuf);
951 sqlite3_finalize(stmt);
953 sqlret = db_util_close(db);
954 if (sqlret != SQLITE_OK)
955 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
960 int _badge_set_display(const char *pkgname, unsigned int is_display, uid_t uid)
962 int ret = BADGE_ERROR_NONE;
963 int result = BADGE_ERROR_NONE;
969 return BADGE_ERROR_INVALID_PARAMETER;
971 if (is_display != 0 && is_display != 1)
972 return BADGE_ERROR_INVALID_PARAMETER;
974 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
975 if (sqlret != SQLITE_OK || !db) {
976 /* LCOV_EXCL_START */
977 ERR("fail to db_util_open - [%d]", sqlret);
978 return BADGE_ERROR_FROM_DB;
982 ret = _badge_check_data_inserted(pkgname, db, uid);
983 if (ret != BADGE_ERROR_ALREADY_EXIST) {
985 goto return_close_db;
988 ret = _badge_check_option_inserted(pkgname, db, uid);
989 if (ret == BADGE_ERROR_ALREADY_EXIST) {
990 sqlbuf = sqlite3_mprintf("UPDATE %q SET display = %d " \
991 "WHERE pkgname = %Q AND uid = %d",
992 BADGE_OPTION_TABLE_NAME, is_display, pkgname, uid);
994 /* LCOV_EXCL_START */
995 ERR("fail to alloc query");
996 result = BADGE_ERROR_OUT_OF_MEMORY;
997 goto return_close_db;
1001 ret = badge_db_exec(db, sqlbuf, NULL);
1002 if (ret != BADGE_ERROR_NONE) {
1003 /* LCOV_EXCL_START */
1004 ERR("failed to set badge[%s] option[%d], err[%d]",
1005 pkgname, is_display, ret);
1007 goto return_close_db;
1008 /* LCOV_EXCL_STOP */
1011 } else if (ret == BADGE_ERROR_NOT_EXIST) {
1012 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
1018 BADGE_OPTION_TABLE_NAME,
1019 pkgname, is_display, uid);
1021 /* LCOV_EXCL_START */
1022 ERR("fail to alloc query");
1023 result = BADGE_ERROR_OUT_OF_MEMORY;
1024 goto return_close_db;
1025 /* LCOV_EXCL_STOP */
1028 ret = badge_db_exec(db, sqlbuf, NULL);
1029 if (ret != BADGE_ERROR_NONE) {
1030 /* LCOV_EXCL_START */
1031 ERR("failed to set badge[%s] option[%d], err[%d]",
1032 pkgname, is_display, ret);
1034 goto return_close_db;
1035 /* LCOV_EXCL_STOP */
1039 goto return_close_db;
1044 sqlite3_free(sqlbuf);
1046 sqlret = db_util_close(db);
1047 if (sqlret != SQLITE_OK)
1048 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
1053 int _badge_get_display(const char *pkgname, unsigned int *is_display, uid_t uid)
1055 int ret = BADGE_ERROR_NONE;
1056 int result = BADGE_ERROR_NONE;
1058 char *sqlbuf = NULL;
1059 sqlite3_stmt *stmt = NULL;
1062 if (!pkgname || !is_display)
1063 return BADGE_ERROR_INVALID_PARAMETER;
1065 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
1066 if (sqlret != SQLITE_OK || !db) {
1067 /* LCOV_EXCL_START */
1068 ERR("fail to db_util_open - [%d]", sqlret);
1069 if (sqlret == SQLITE_PERM)
1070 return BADGE_ERROR_PERMISSION_DENIED;
1072 return BADGE_ERROR_FROM_DB;
1073 /* LCOV_EXCL_STOP */
1076 ret = _badge_check_option_inserted(pkgname, db, uid);
1077 if (ret != BADGE_ERROR_ALREADY_EXIST) {
1078 if (ret == BADGE_ERROR_NOT_EXIST)
1082 goto return_close_db;
1085 sqlbuf = sqlite3_mprintf("SELECT display FROM %q " \
1086 "WHERE pkgname = %Q AND uid = %d",
1087 BADGE_OPTION_TABLE_NAME, pkgname, uid);
1089 /* LCOV_EXCL_START */
1090 ERR("fail to alloc query");
1091 result = BADGE_ERROR_OUT_OF_MEMORY;
1092 goto return_close_db;
1093 /* LCOV_EXCL_STOP */
1096 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
1097 if (sqlret != SQLITE_OK) {
1098 /* LCOV_EXCL_START */
1099 ERR("fail to prepare %s - [%s]",
1100 sqlbuf, sqlite3_errmsg(db));
1101 result = BADGE_ERROR_FROM_DB;
1102 goto return_close_db;
1103 /* LCOV_EXCL_STOP */
1106 sqlret = sqlite3_step(stmt);
1107 if (sqlret == SQLITE_ROW)
1108 *is_display = (unsigned int)sqlite3_column_int(stmt, 0);
1110 *is_display = (unsigned int)1;
1114 sqlite3_free(sqlbuf);
1117 sqlite3_finalize(stmt);
1119 sqlret = db_util_close(db);
1120 if (sqlret != SQLITE_OK)
1121 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
1126 void badge_changed_cb_call(unsigned int action, const char *pkgname,
1127 unsigned int count, uid_t uid)
1129 GList *badge_cb_list = NULL;
1130 struct _badge_cb_data *bd = NULL;
1132 DBG("call badge_change_cb");
1134 if (_badge_cb_hash == NULL)
1137 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1139 if (badge_cb_list == NULL) {
1140 ERR("invalid data");
1144 badge_cb_list = g_list_first(badge_cb_list);
1146 for (; badge_cb_list != NULL; badge_cb_list = badge_cb_list->next) {
1147 bd = badge_cb_list->data;
1149 if (bd != NULL && bd->callback != NULL) {
1150 DBG("call badge_change_cb : action %d, pkgname %s, count %d",
1151 action, pkgname, count);
1152 bd->callback(action, pkgname, count, bd->data);
1157 static int _badge_changed_monitor_init(uid_t uid)
1159 return badge_ipc_monitor_init(uid);
1162 static void _badge_chanaged_monitor_fini()
1164 badge_ipc_monitor_fini();
1167 static gint _badge_data_compare(gconstpointer a, gconstpointer b)
1169 const struct _badge_cb_data *bd = NULL;
1173 bd = (struct _badge_cb_data *)a;
1175 if (bd->callback == b)
1181 static struct _badge_cb_data *__malloc_badge_cb_data(badge_change_cb callback, void *data)
1183 struct _badge_cb_data *bd = NULL;
1184 bd = (struct _badge_cb_data *)malloc(sizeof(struct _badge_cb_data));
1186 ERR("failed malloc badge_cb_data");
1190 bd->callback = callback;
1196 int _badge_free(badge_h *badge)
1199 return BADGE_ERROR_INVALID_PARAMETER;
1202 free(badge->pkgname);
1204 if (badge->writable_pkgs)
1205 free(badge->writable_pkgs);
1209 return BADGE_ERROR_NONE;
1212 badge_h *_badge_new(const char *pkgname, const char *writable_pkgs,
1215 badge_h *badge = NULL;
1217 if (!pkgname || !writable_pkgs) {
1218 ERR("Invalid parameters");
1220 *err = BADGE_ERROR_INVALID_PARAMETER;
1224 badge = (badge_h *)malloc(sizeof(struct _badge_h));
1226 ERR("fail to alloc handle");
1228 *err = BADGE_ERROR_OUT_OF_MEMORY;
1232 badge->pkgname = strdup(pkgname);
1233 badge->writable_pkgs = strdup(writable_pkgs);
1235 *err = BADGE_ERROR_NONE;
1240 char *_badge_pkgs_new(int *err, const char *pkg1, ...)
1242 char *caller_pkgname = NULL;
1244 char *result = NULL;
1248 char *new_pkgs = NULL;
1251 *err = BADGE_ERROR_NONE;
1253 caller_pkgname = _badge_get_pkgname_by_pid();
1254 if (!caller_pkgname) {
1255 ERR("fail to get caller pkgname");
1257 *err = BADGE_ERROR_PERMISSION_DENIED;
1262 WARN("pkg1 is NULL");
1263 return caller_pkgname;
1266 length = strlen(pkg1);
1267 va_start(args, pkg1);
1268 s = va_arg(args, char *);
1270 length += strlen(s) ;
1271 s = va_arg(args, char *);
1276 WARN("length is %d", length);
1277 return caller_pkgname;
1280 result = g_new0(char, length + 1); /* 1 for null terminate */
1282 /* LCOV_EXCL_START */
1283 ERR("fail to alloc memory");
1285 *err = BADGE_ERROR_OUT_OF_MEMORY;
1286 free(caller_pkgname);
1288 /* LCOV_EXCL_STOP */
1292 ptr = g_stpcpy(ptr, pkg1);
1293 va_start(args, pkg1);
1294 s = va_arg(args, char *);
1296 ptr = g_stpcpy(ptr, s);
1297 s = va_arg(args, char *);
1301 if (g_strstr_len(result, -1, caller_pkgname) == NULL) {
1302 new_pkgs = g_strdup_printf("%s%s", caller_pkgname, result);
1304 ERR("fail to alloc memory");
1306 *err = BADGE_ERROR_OUT_OF_MEMORY;
1309 free(caller_pkgname);
1316 free(caller_pkgname);
1322 int badge_create_for_uid(const char *pkgname, const char *writable_pkg, uid_t uid)
1324 char *caller = NULL;
1325 int err = BADGE_ERROR_NONE;
1327 caller = _badge_get_pkgname_by_pid();
1329 ERR("fail to get caller pkgname");
1330 return BADGE_ERROR_PERMISSION_DENIED;
1333 err = badge_ipc_request_insert(pkgname, writable_pkg, caller, uid);
1340 int badge_new_for_uid(const char *writable_app_id, uid_t uid)
1342 char *caller = NULL;
1343 int err = BADGE_ERROR_NONE;
1345 caller = _badge_get_pkgname_by_pid();
1347 ERR("fail to get caller pkgname");
1348 return BADGE_ERROR_PERMISSION_DENIED;
1351 err = badge_ipc_request_insert(caller, writable_app_id, caller, uid);
1358 int badge_add_for_uid(const char *badge_app_id, uid_t uid)
1360 char *caller = NULL;
1361 int err = BADGE_ERROR_NONE;
1363 caller = _badge_get_pkgname_by_pid();
1365 ERR("fail to get caller pkgname");
1366 return BADGE_ERROR_PERMISSION_DENIED;
1369 if (badge_app_id == NULL) {
1370 badge_app_id = caller;
1372 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
1373 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
1375 pkgmgr_ret = package_manager_compare_app_cert_info(badge_app_id, caller, &compare_result);
1377 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE || compare_result != PACKAGE_MANAGER_COMPARE_MATCH) {
1378 err = BADGE_ERROR_INVALID_PACKAGE;
1383 err = badge_ipc_request_insert(badge_app_id, caller, caller, uid);
1392 int badge_remove_for_uid(const char *app_id, uid_t uid)
1394 char *caller = NULL;
1395 int result = BADGE_ERROR_NONE;
1397 caller = _badge_get_pkgname_by_pid();
1399 ERR("fail to get caller pkgname");
1400 result = BADGE_ERROR_PERMISSION_DENIED;
1404 result = badge_ipc_request_delete(app_id, caller, uid);
1413 int badge_is_existing_for_uid(const char *app_id, bool *existing, uid_t uid)
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 int result = BADGE_ERROR_NONE;
1422 result = badge_ipc_request_get_list(callback, user_data, uid);
1423 if (result == BADGE_ERROR_IO_ERROR)
1424 result = BADGE_ERROR_FROM_DB;
1429 int badge_set_count_for_uid(const char *app_id, unsigned int count, uid_t uid)
1431 char *caller = NULL;
1432 int result = BADGE_ERROR_NONE;
1434 DBG("app_id %s, count %d", app_id, count);
1436 caller = _badge_get_pkgname_by_pid();
1438 ERR("fail to get caller pkgname");
1439 result = BADGE_ERROR_PERMISSION_DENIED;
1443 result = badge_ipc_request_set_count(app_id, caller, count, uid);
1451 int badge_get_count_for_uid(const char *app_id, unsigned int *count, uid_t uid)
1453 int result = BADGE_ERROR_NONE;
1455 result = badge_ipc_request_get_count(app_id, count, uid);
1456 if (result == BADGE_ERROR_IO_ERROR)
1457 result = BADGE_ERROR_FROM_DB;
1463 int badge_set_display_for_uid(const char *app_id, unsigned int is_display, uid_t uid)
1465 char *caller = NULL;
1466 int result = BADGE_ERROR_NONE;
1468 caller = _badge_get_pkgname_by_pid();
1470 ERR("fail to get caller pkgname");
1471 result = BADGE_ERROR_PERMISSION_DENIED;
1475 result = badge_ipc_request_set_display(app_id, caller, is_display, uid);
1484 int badge_get_display_for_uid(const char *app_id, unsigned int *is_display, uid_t uid)
1486 int result = BADGE_ERROR_NONE;
1488 result = badge_ipc_request_get_display(app_id, is_display, uid);
1489 if (result == BADGE_ERROR_IO_ERROR)
1490 result = BADGE_ERROR_FROM_DB;
1496 int badge_register_changed_cb_for_uid(badge_change_cb callback, void *data, uid_t uid)
1498 struct _badge_cb_data *bd = NULL;
1499 GList *badge_cb_list = NULL;
1500 GList *badge_found_list = NULL;
1503 if (_badge_cb_hash == NULL)
1504 _badge_cb_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
1506 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1508 if (badge_cb_list == NULL) {
1509 bd = __malloc_badge_cb_data(callback, data);
1511 return BADGE_ERROR_OUT_OF_MEMORY;
1513 badge_cb_list = g_list_append(badge_cb_list, bd);
1514 g_hash_table_insert(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1516 badge_found_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1517 (GCompareFunc)_badge_data_compare);
1518 if (badge_found_list) {
1519 bd = g_list_nth_data(badge_found_list, 0);
1522 bd = __malloc_badge_cb_data(callback, data);
1524 return BADGE_ERROR_OUT_OF_MEMORY;
1525 badge_cb_list = g_list_append(badge_cb_list, bd);
1529 ret = _badge_changed_monitor_init(uid);
1530 if (ret == BADGE_ERROR_NONE) {
1531 ret = badge_ipc_init_badge(uid);
1532 if (ret != BADGE_ERROR_NONE && ret != BADGE_ERROR_NOT_EXIST)
1535 /* LCOV_EXCL_START */
1536 ERR("badge_ipc_monitor_init err : %d", ret);
1537 badge_unregister_changed_cb_for_uid(callback, uid);
1539 /* LCOV_EXCL_STOP */
1541 return BADGE_ERROR_NONE;
1545 int badge_unregister_changed_cb_for_uid(badge_change_cb callback, uid_t uid)
1547 GList *badge_cb_list = NULL;
1548 GList *badge_delete_list = NULL;
1549 struct _badge_cb_data *bd = NULL;
1551 if (_badge_cb_hash == NULL)
1552 return BADGE_ERROR_INVALID_PARAMETER;
1554 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1556 if (badge_cb_list == NULL)
1557 return BADGE_ERROR_INVALID_PARAMETER;
1559 badge_delete_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1560 (GCompareFunc)_badge_data_compare);
1562 if (badge_delete_list) {
1563 bd = g_list_nth_data(badge_delete_list, 0);
1564 badge_cb_list = g_list_delete_link(badge_cb_list, badge_delete_list);
1567 return BADGE_ERROR_INVALID_PARAMETER;
1570 if (badge_cb_list == NULL)
1571 g_hash_table_steal(_badge_cb_hash, GUINT_TO_POINTER(uid));
1573 g_hash_table_replace(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1575 if (g_hash_table_size(_badge_cb_hash) == 0)
1576 _badge_chanaged_monitor_fini();
1578 return BADGE_ERROR_NONE;
1582 int badge_is_service_ready(void)
1584 return badge_ipc_is_master_ready();
1588 int badge_add_deferred_task(
1589 void (*badge_add_deferred_task)(void *data), void *user_data)
1591 return badge_ipc_add_deferred_task(badge_add_deferred_task, user_data);
1595 int badge_del_deferred_task(
1596 void (*badge_add_deferred_task)(void *data))
1598 return badge_ipc_del_deferred_task(badge_add_deferred_task);
1602 int badge_is_existing(const char *app_id, bool *existing)
1604 if (app_id == NULL || existing == NULL)
1605 return BADGE_ERROR_INVALID_PARAMETER;
1607 return badge_is_existing_for_uid(app_id, existing, getuid());
1611 int badge_create(const char *pkgname, const char *writable_pkg)
1613 if (pkgname == NULL)
1614 return BADGE_ERROR_INVALID_PARAMETER;
1616 return badge_create_for_uid(pkgname, writable_pkg, getuid());