2 * Copyright (c) 2000 - 2016 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>
33 #include "badge_log.h"
34 #include "badge_error.h"
35 #include "badge_internal.h"
36 #include "badge_ipc.h"
39 #define BADGE_PKGNAME_LEN 512
40 #define BADGE_TABLE_NAME "badge_data"
41 #define BADGE_OPTION_TABLE_NAME "badge_option"
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 long _get_max_len(void)
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)
81 pkgname = malloc(max);
84 ERR("fail 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;
135 return BADGE_ERROR_INVALID_PARAMETER;
137 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
138 "pkgname = %Q AND uid = %d",
139 BADGE_TABLE_NAME, pkgname, uid);
142 /* LCOV_EXCL_START */
143 ERR("fail to alloc sql query");
144 return BADGE_ERROR_OUT_OF_MEMORY;
148 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
149 if (sqlret != SQLITE_OK) {
150 /* LCOV_EXCL_START */
151 ERR("DB err [%s]", sqlite3_errmsg(db));
152 ERR("query[%s]", sqlbuf);
153 result = BADGE_ERROR_FROM_DB;
154 goto free_and_return;
158 sqlret = sqlite3_step(stmt);
159 if (sqlret == SQLITE_ROW)
160 count = sqlite3_column_int(stmt, 0);
164 DBG("[%s], DB search result[%d]", sqlbuf, count);
167 result = BADGE_ERROR_ALREADY_EXIST;
169 result = BADGE_ERROR_NOT_EXIST;
173 sqlite3_free(sqlbuf);
176 sqlite3_finalize(stmt);
181 static int _badge_check_option_inserted(const char *pkgname,
182 sqlite3 *db, uid_t uid)
184 sqlite3_stmt *stmt = NULL;
186 int result = BADGE_ERROR_NONE;
191 return BADGE_ERROR_INVALID_PARAMETER;
194 return BADGE_ERROR_INVALID_PARAMETER;
196 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
197 "pkgname = %Q AND uid = %d",
198 BADGE_OPTION_TABLE_NAME, pkgname, uid);
201 /* LCOV_EXCL_START */
202 ERR("fail to alloc sql query");
203 return BADGE_ERROR_OUT_OF_MEMORY;
207 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
208 if (sqlret != SQLITE_OK) {
209 /* LCOV_EXCL_START */
210 ERR("DB err [%s]", sqlite3_errmsg(db));
211 ERR("query[%s]", sqlbuf);
212 result = BADGE_ERROR_FROM_DB;
213 goto free_and_return;
217 sqlret = sqlite3_step(stmt);
218 if (sqlret == SQLITE_ROW)
219 count = sqlite3_column_int(stmt, 0);
223 DBG("[%s], DB search result[%d]", sqlbuf, count);
226 result = BADGE_ERROR_ALREADY_EXIST;
228 result = BADGE_ERROR_NOT_EXIST;
232 sqlite3_free(sqlbuf);
235 sqlite3_finalize(stmt);
240 static int _is_same_certinfo(const char *caller, const char *pkgname)
242 int ret = PACKAGE_MANAGER_ERROR_NONE;
243 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
251 ret = package_manager_compare_package_cert_info(pkgname, caller, &compare_result);
252 if (ret == PACKAGE_MANAGER_ERROR_NONE &&
253 compare_result == PACKAGE_MANAGER_COMPARE_MATCH)
259 static int _badge_check_writable(const char *caller,
260 const char *pkgname, sqlite3 *db, uid_t uid)
262 sqlite3_stmt *stmt = NULL;
264 int result = BADGE_ERROR_NONE;
269 return BADGE_ERROR_INVALID_PARAMETER;
272 return BADGE_ERROR_INVALID_PARAMETER;
275 return BADGE_ERROR_INVALID_PARAMETER;
277 if (g_strcmp0(caller, pkgname) == 0)
278 return BADGE_ERROR_NONE;
280 /* LCOV_EXCL_START */
281 if (_is_same_certinfo(caller, pkgname) == 1)
282 return BADGE_ERROR_NONE;
284 sqlbuf = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE " \
285 "pkgname = %Q AND writable_pkgs LIKE '%%%q%%'" \
288 pkgname, caller, uid);
290 ERR("fail to alloc sql query");
291 return BADGE_ERROR_OUT_OF_MEMORY;
294 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
295 if (sqlret != SQLITE_OK) {
296 ERR("DB err [%s]", sqlite3_errmsg(db));
297 ERR("query[%s]", sqlbuf);
298 result = BADGE_ERROR_FROM_DB;
299 goto free_and_return;
302 sqlret = sqlite3_step(stmt);
303 if (sqlret == SQLITE_ROW)
304 count = sqlite3_column_int(stmt, 0);
308 DBG("[%s], DB search result[%d]", sqlbuf, count);
311 result = BADGE_ERROR_PERMISSION_DENIED;
315 sqlite3_free(sqlbuf);
318 sqlite3_finalize(stmt);
324 int _badge_is_existing(const char *pkgname, bool *existing, uid_t uid)
328 int result = BADGE_ERROR_NONE;
330 if (!pkgname || !existing) {
331 /* LCOV_EXCL_START */
332 ERR("pkgname : %s, existing : %p", pkgname, existing);
333 return BADGE_ERROR_INVALID_PARAMETER;
337 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
338 if (sqlret != SQLITE_OK || !db) {
339 /* LCOV_EXCL_START */
340 ERR("fail to db_util_open - [%d]", sqlret);
341 if (sqlret == SQLITE_PERM)
342 return BADGE_ERROR_PERMISSION_DENIED;
343 return BADGE_ERROR_FROM_DB;
347 result = _badge_check_data_inserted(pkgname, db, uid);
348 if (result == BADGE_ERROR_ALREADY_EXIST) {
350 result = BADGE_ERROR_NONE;
351 } else if (result == BADGE_ERROR_NOT_EXIST) {
353 result = BADGE_ERROR_NONE;
356 sqlret = db_util_close(db);
357 if (sqlret != SQLITE_OK)
358 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
363 int _badge_get_list(GList **badge_list, uid_t uid)
366 int result = BADGE_ERROR_NONE;
368 sqlite3_stmt *stmt = NULL;
371 unsigned int badge_count;
372 badge_info_s *badge_info;
374 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
375 if (sqlret != SQLITE_OK || !db) {
376 /* LCOV_EXCL_START */
377 ERR("fail to db_util_open - [%d]", sqlret);
378 return BADGE_ERROR_FROM_DB;
382 sqlbuf = sqlite3_mprintf("SELECT pkgname, badge FROM %q WHERE uid = %d",
383 BADGE_TABLE_NAME, uid);
385 /* LCOV_EXCL_START */
386 ERR("fail to alloc sql query");
387 result = BADGE_ERROR_OUT_OF_MEMORY;
388 goto free_and_return;
392 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
393 if (sqlret != SQLITE_OK) {
394 /* LCOV_EXCL_START */
395 ERR("fail to sqlite3_prepare_v2 - [%s]", sqlite3_errmsg(db));
396 ERR("query[%s]", sqlbuf);
397 result = BADGE_ERROR_FROM_DB;
398 goto free_and_return;
402 sqlret = sqlite3_step(stmt);
403 if (sqlret == SQLITE_DONE) {
404 INFO("badge db has no data");
405 result = BADGE_ERROR_NOT_EXIST;
406 goto free_and_return;
407 } else if (sqlret != SQLITE_ROW) {
408 ERR("fail to sqlite3_step : %d", sqlret);
409 result = BADGE_ERROR_FROM_DB;
410 goto free_and_return;
414 pkg = (const char *)sqlite3_column_text(stmt, 0);
415 badge_count = (unsigned int)sqlite3_column_int(stmt, 1);
417 badge_info = (badge_info_s *)calloc(sizeof(badge_info_s), 1);
418 if (badge_info == NULL) {
419 /* LCOV_EXCL_START */
420 ERR("alloc badge_info fail");
421 result = BADGE_ERROR_OUT_OF_MEMORY;
425 badge_info->pkg = strdup(pkg);
426 badge_info->badge_count = badge_count;
427 *badge_list = g_list_append(*badge_list, badge_info);
429 /* LCOV_EXCL_START */
430 ERR("db has invaild data");
431 result = BADGE_ERROR_FROM_DB;
434 } while (sqlite3_step(stmt) == SQLITE_ROW);
438 sqlite3_free(sqlbuf);
441 sqlite3_finalize(stmt);
443 sqlret = db_util_close(db);
444 if (sqlret != SQLITE_OK)
445 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
450 int _badge_insert(badge_h *badge, uid_t uid)
454 int ret = BADGE_ERROR_NONE;
455 int result = BADGE_ERROR_NONE;
458 if (!badge || !badge->pkgname || !badge->writable_pkgs)
459 return BADGE_ERROR_INVALID_PARAMETER;
461 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
462 if (sqlret != SQLITE_OK || !db) {
463 /* LCOV_EXCL_START */
464 ERR("fail to db_util_open - [%s][%d]", BADGE_DB_PATH, sqlret);
465 return BADGE_ERROR_FROM_DB;
469 /* Check pkgname & id */
470 ret = _badge_check_data_inserted(badge->pkgname, db, uid);
471 if (ret != BADGE_ERROR_NOT_EXIST) {
472 /* LCOV_EXCL_START */
474 goto return_close_db;
478 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
485 badge->pkgname, badge->writable_pkgs, uid);
487 /* LCOV_EXCL_START */
488 ERR("fail to alloc query");
489 result = BADGE_ERROR_OUT_OF_MEMORY;
490 goto return_close_db;
494 ret = badge_db_exec(db, sqlbuf, NULL);
495 if (ret != BADGE_ERROR_NONE) {
496 /* LCOV_EXCL_START */
497 ERR("failed to insert badge[%s], err[%d]",
498 badge->pkgname, ret);
500 goto return_close_db;
504 /* inserting badge options */
505 ret = _badge_check_option_inserted(badge->pkgname, db, uid);
506 if (ret != BADGE_ERROR_NOT_EXIST) {
508 goto return_close_db;
511 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
516 BADGE_OPTION_TABLE_NAME,
517 badge->pkgname, uid);
519 /* LCOV_EXCL_START */
520 ERR("fail to alloc query");
521 result = BADGE_ERROR_OUT_OF_MEMORY;
522 goto return_close_db;
526 ret = badge_db_exec(db, sqlbuf, NULL);
527 if (ret != BADGE_ERROR_NONE) {
528 /* LCOV_EXCL_START */
529 ERR("failed to insert badge option[%s], err[%d]",
530 badge->pkgname, sqlret);
532 goto return_close_db;
538 sqlite3_free(sqlbuf);
540 sqlret = db_util_close(db);
541 if (sqlret != SQLITE_OK)
542 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
547 int _badge_remove(const char *caller, const char *pkgname, uid_t uid)
549 int ret = BADGE_ERROR_NONE;
550 int result = BADGE_ERROR_NONE;
556 return BADGE_ERROR_INVALID_PARAMETER;
559 return BADGE_ERROR_INVALID_PARAMETER;
561 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
562 if (sqlret != SQLITE_OK || !db) {
563 /* LCOV_EXCL_START */
564 ERR("fail to db_util_open - [%d]", sqlret);
565 return BADGE_ERROR_FROM_DB;
569 ret = _badge_check_data_inserted(pkgname, db, uid);
570 if (ret != BADGE_ERROR_ALREADY_EXIST) {
572 goto return_close_db;
575 ret = _badge_check_writable(caller, pkgname, db, uid);
576 if (ret != BADGE_ERROR_NONE) {
578 goto return_close_db;
581 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
582 BADGE_TABLE_NAME, pkgname, uid);
584 /* LCOV_EXCL_START */
585 ERR("fail to alloc query");
586 result = BADGE_ERROR_OUT_OF_MEMORY;
587 goto return_close_db;
591 ret = badge_db_exec(db, sqlbuf, NULL);
592 if (ret != BADGE_ERROR_NONE) {
593 ERR("failed to remove badge[%s], err[%d]",
596 goto return_close_db;
599 /* treating option table */
600 ret = _badge_check_option_inserted(pkgname, db, uid);
601 if (ret != BADGE_ERROR_ALREADY_EXIST) {
603 goto return_close_db;
606 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q AND uid = %d",
607 BADGE_OPTION_TABLE_NAME, pkgname, uid);
609 /* LCOV_EXCL_START */
610 ERR("fail to alloc query");
611 result = BADGE_ERROR_OUT_OF_MEMORY;
612 goto return_close_db;
616 ret = badge_db_exec(db, sqlbuf, NULL);
617 if (ret != BADGE_ERROR_NONE) {
618 /* LCOV_EXCL_START */
619 ERR("failed to remove badge option[%s], err[%d]",
622 goto return_close_db;
628 sqlite3_free(sqlbuf);
630 sqlret = db_util_close(db);
631 if (sqlret != SQLITE_OK)
632 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
637 int _badge_set_count(const char *caller, const char *pkgname,
638 unsigned int count, uid_t uid)
640 int ret = BADGE_ERROR_NONE;
641 int result = BADGE_ERROR_NONE;
647 return BADGE_ERROR_INVALID_PARAMETER;
650 return BADGE_ERROR_INVALID_PARAMETER;
652 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
653 if (sqlret != SQLITE_OK || !db) {
654 /* LCOV_EXCL_START */
655 ERR("fail to db_util_open - [%d]", sqlret);
656 return BADGE_ERROR_FROM_DB;
660 ret = _badge_check_data_inserted(pkgname, db, uid);
661 if (ret != BADGE_ERROR_ALREADY_EXIST) {
663 goto return_close_db;
666 ret = _badge_check_writable(caller, pkgname, db, uid);
667 if (ret != BADGE_ERROR_NONE) {
669 goto return_close_db;
672 sqlbuf = sqlite3_mprintf("UPDATE %q SET badge = %d " \
673 "WHERE pkgname = %Q AND uid = %d",
674 BADGE_TABLE_NAME, count, pkgname, uid);
676 /* LCOV_EXCL_START */
677 ERR("fail to alloc query");
678 result = BADGE_ERROR_OUT_OF_MEMORY;
679 goto return_close_db;
683 ret = badge_db_exec(db, sqlbuf, NULL);
684 if (ret != BADGE_ERROR_NONE) {
685 /* LCOV_EXCL_START */
686 ERR("failed to set badge[%s] count[%d], err[%d]",
687 pkgname, count, ret);
689 goto return_close_db;
695 sqlite3_free(sqlbuf);
697 sqlret = db_util_close(db);
698 if (sqlret != SQLITE_OK)
699 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
704 int _badge_get_count(const char *pkgname, unsigned int *count, uid_t uid)
706 int ret = BADGE_ERROR_NONE;
707 int result = BADGE_ERROR_NONE;
710 sqlite3_stmt *stmt = NULL;
714 return BADGE_ERROR_INVALID_PARAMETER;
717 return BADGE_ERROR_INVALID_PARAMETER;
719 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
720 if (sqlret != SQLITE_OK || !db) {
721 /* LCOV_EXCL_START */
722 ERR("fail to db_util_open - [%d]", sqlret);
723 if (sqlret == SQLITE_PERM)
724 return BADGE_ERROR_PERMISSION_DENIED;
726 return BADGE_ERROR_FROM_DB;
730 ret = _badge_check_data_inserted(pkgname, db, uid);
731 if (ret != BADGE_ERROR_ALREADY_EXIST) {
733 goto return_close_db;
736 sqlbuf = sqlite3_mprintf("SELECT badge FROM %q " \
737 "WHERE pkgname = %Q AND uid = %d",
738 BADGE_TABLE_NAME, pkgname, uid);
740 /* LCOV_EXCL_START */
741 ERR("fail to alloc query");
742 result = BADGE_ERROR_OUT_OF_MEMORY;
743 goto return_close_db;
747 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
748 if (sqlret != SQLITE_OK) {
749 /* LCOV_EXCL_START */
750 ERR("fail to prepare %s - [%s]",
751 sqlbuf, sqlite3_errmsg(db));
752 result = BADGE_ERROR_FROM_DB;
753 goto return_close_db;
757 sqlret = sqlite3_step(stmt);
758 if (sqlret == SQLITE_ROW)
759 *count = (unsigned int)sqlite3_column_int(stmt, 0);
761 *count = (unsigned int)0;
765 sqlite3_free(sqlbuf);
768 sqlite3_finalize(stmt);
770 sqlret = db_util_close(db);
771 if (sqlret != SQLITE_OK)
772 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
777 int _badge_set_display(const char *pkgname, unsigned int is_display, uid_t uid)
779 int ret = BADGE_ERROR_NONE;
780 int result = BADGE_ERROR_NONE;
786 return BADGE_ERROR_INVALID_PARAMETER;
788 if (is_display != 0 && is_display != 1)
789 return BADGE_ERROR_INVALID_PARAMETER;
791 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
792 if (sqlret != SQLITE_OK || !db) {
793 /* LCOV_EXCL_START */
794 ERR("fail to db_util_open - [%d]", sqlret);
795 return BADGE_ERROR_FROM_DB;
799 #if 0 /* Temporary */
800 ret = _badge_check_data_inserted(pkgname, db, uid);
801 if (ret != BADGE_ERROR_ALREADY_EXIST) {
803 goto return_close_db;
806 ret = _badge_check_option_inserted(pkgname, db, uid);
807 if (ret == BADGE_ERROR_ALREADY_EXIST) {
808 sqlbuf = sqlite3_mprintf("UPDATE %q SET display = %d " \
809 "WHERE pkgname = %Q AND uid = %d",
810 BADGE_OPTION_TABLE_NAME, is_display, pkgname, uid);
812 /* LCOV_EXCL_START */
813 ERR("fail to alloc query");
814 result = BADGE_ERROR_OUT_OF_MEMORY;
815 goto return_close_db;
819 ret = badge_db_exec(db, sqlbuf, NULL);
820 if (ret != BADGE_ERROR_NONE) {
821 /* LCOV_EXCL_START */
822 ERR("failed to set badge[%s] option[%d], err[%d]",
823 pkgname, is_display, ret);
825 goto return_close_db;
829 } else if (ret == BADGE_ERROR_NOT_EXIST) {
830 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
836 BADGE_OPTION_TABLE_NAME,
837 pkgname, is_display, uid);
839 /* LCOV_EXCL_START */
840 ERR("fail to alloc query");
841 result = BADGE_ERROR_OUT_OF_MEMORY;
842 goto return_close_db;
846 ret = badge_db_exec(db, sqlbuf, NULL);
847 if (ret != BADGE_ERROR_NONE) {
848 /* LCOV_EXCL_START */
849 ERR("failed to set badge[%s] option[%d], err[%d]",
850 pkgname, is_display, ret);
852 goto return_close_db;
857 goto return_close_db;
862 sqlite3_free(sqlbuf);
864 sqlret = db_util_close(db);
865 if (sqlret != SQLITE_OK)
866 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
871 int _badge_get_display(const char *pkgname, unsigned int *is_display, uid_t uid)
873 int ret = BADGE_ERROR_NONE;
874 int result = BADGE_ERROR_NONE;
877 sqlite3_stmt *stmt = NULL;
881 return BADGE_ERROR_INVALID_PARAMETER;
884 return BADGE_ERROR_INVALID_PARAMETER;
886 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
887 if (sqlret != SQLITE_OK || !db) {
888 /* LCOV_EXCL_START */
889 ERR("fail to db_util_open - [%d]", sqlret);
890 if (sqlret == SQLITE_PERM)
891 return BADGE_ERROR_PERMISSION_DENIED;
893 return BADGE_ERROR_FROM_DB;
897 ret = _badge_check_option_inserted(pkgname, db, uid);
898 if (ret != BADGE_ERROR_ALREADY_EXIST) {
899 if (ret == BADGE_ERROR_NOT_EXIST)
903 goto return_close_db;
906 sqlbuf = sqlite3_mprintf("SELECT display FROM %q " \
907 "WHERE pkgname = %Q AND uid = %d",
908 BADGE_OPTION_TABLE_NAME, pkgname, uid);
910 /* LCOV_EXCL_START */
911 ERR("fail to alloc query");
912 result = BADGE_ERROR_OUT_OF_MEMORY;
913 goto return_close_db;
917 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
918 if (sqlret != SQLITE_OK) {
919 /* LCOV_EXCL_START */
920 ERR("fail to prepare %s - [%s]",
921 sqlbuf, sqlite3_errmsg(db));
922 result = BADGE_ERROR_FROM_DB;
923 goto return_close_db;
927 sqlret = sqlite3_step(stmt);
928 if (sqlret == SQLITE_ROW)
929 *is_display = (unsigned int)sqlite3_column_int(stmt, 0);
931 *is_display = (unsigned int)1;
935 sqlite3_free(sqlbuf);
938 sqlite3_finalize(stmt);
940 sqlret = db_util_close(db);
941 if (sqlret != SQLITE_OK)
942 WARN("fail to db_util_close - [%d]", sqlret); /* LCOV_EXCL_LINE */
947 void badge_changed_cb_call(unsigned int action, const char *pkgname,
948 unsigned int count, uid_t uid)
950 GList *badge_cb_list = NULL;
951 struct _badge_cb_data *bd = NULL;
953 DBG("call badge_change_cb");
955 if (_badge_cb_hash == NULL)
958 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
960 if (badge_cb_list == NULL) {
965 badge_cb_list = g_list_first(badge_cb_list);
967 for (; badge_cb_list != NULL; badge_cb_list = badge_cb_list->next) {
968 bd = badge_cb_list->data;
970 if (bd != NULL && bd->callback != NULL) {
971 DBG("call badge_change_cb : action %d, pkgname %s, count %d",
972 action, pkgname, count);
973 bd->callback(action, pkgname, count, bd->data);
978 static int _badge_changed_monitor_init(uid_t uid)
980 return badge_ipc_monitor_init(uid);
983 static void _badge_chanaged_monitor_fini()
985 badge_ipc_monitor_fini();
988 static gint _badge_data_compare(gconstpointer a, gconstpointer b)
990 const struct _badge_cb_data *bd = NULL;
994 bd = (struct _badge_cb_data *)a;
996 if (bd->callback == b)
1002 static struct _badge_cb_data *__malloc_badge_cb_data(badge_change_cb callback, void *data)
1004 struct _badge_cb_data *bd = NULL;
1005 bd = (struct _badge_cb_data *)malloc(sizeof(struct _badge_cb_data));
1007 ERR("failed malloc badge_cb_data");
1011 bd->callback = callback;
1017 int _badge_register_changed_cb(badge_change_cb callback, void *data, uid_t uid)
1019 struct _badge_cb_data *bd = NULL;
1020 GList *badge_cb_list = NULL;
1021 GList *badge_found_list = NULL;
1024 if (callback == NULL)
1025 return BADGE_ERROR_INVALID_PARAMETER;
1027 if (_badge_cb_hash == NULL)
1028 _badge_cb_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
1030 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1032 if (badge_cb_list == NULL) {
1033 bd = __malloc_badge_cb_data(callback, data);
1035 return BADGE_ERROR_OUT_OF_MEMORY;
1037 badge_cb_list = g_list_append(badge_cb_list, bd);
1038 g_hash_table_insert(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1040 badge_found_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1041 (GCompareFunc)_badge_data_compare);
1042 if (badge_found_list) {
1043 bd = g_list_nth_data(badge_found_list, 0);
1046 bd = __malloc_badge_cb_data(callback, data);
1048 return BADGE_ERROR_OUT_OF_MEMORY;
1049 badge_cb_list = g_list_append(badge_cb_list, bd);
1053 ret = _badge_changed_monitor_init(uid);
1054 if (ret == BADGE_ERROR_NONE) {
1055 ret = badge_ipc_init_badge(uid);
1056 if (ret != BADGE_ERROR_NONE && ret != BADGE_ERROR_NOT_EXIST)
1059 /* LCOV_EXCL_START */
1060 ERR("badge_ipc_monitor_init err : %d", ret);
1061 _badge_unregister_changed_cb(callback, uid);
1063 /* LCOV_EXCL_STOP */
1065 return BADGE_ERROR_NONE;
1068 int _badge_unregister_changed_cb(badge_change_cb callback, uid_t uid)
1070 GList *badge_cb_list = NULL;
1071 GList *badge_delete_list = NULL;
1072 struct _badge_cb_data *bd = NULL;
1074 if (callback == NULL)
1075 return BADGE_ERROR_INVALID_PARAMETER;
1077 if (_badge_cb_hash == NULL)
1078 return BADGE_ERROR_INVALID_PARAMETER;
1080 badge_cb_list = (GList *)g_hash_table_lookup(_badge_cb_hash, GUINT_TO_POINTER(uid));
1082 if (badge_cb_list == NULL)
1083 return BADGE_ERROR_INVALID_PARAMETER;
1085 badge_delete_list = g_list_find_custom(g_list_first(badge_cb_list), (gconstpointer)callback,
1086 (GCompareFunc)_badge_data_compare);
1088 if (badge_delete_list) {
1089 bd = g_list_nth_data(badge_delete_list, 0);
1090 badge_cb_list = g_list_delete_link(badge_cb_list, badge_delete_list);
1093 return BADGE_ERROR_INVALID_PARAMETER;
1096 if (badge_cb_list == NULL)
1097 g_hash_table_steal(_badge_cb_hash, GUINT_TO_POINTER(uid));
1099 g_hash_table_replace(_badge_cb_hash, GUINT_TO_POINTER(uid), badge_cb_list);
1101 if (g_hash_table_size(_badge_cb_hash) == 0)
1102 _badge_chanaged_monitor_fini();
1104 return BADGE_ERROR_NONE;
1107 int _badge_free(badge_h *badge)
1110 return BADGE_ERROR_INVALID_PARAMETER;
1113 free(badge->pkgname);
1115 if (badge->writable_pkgs)
1116 free(badge->writable_pkgs);
1120 return BADGE_ERROR_NONE;
1123 badge_h *_badge_new(const char *pkgname, const char *writable_pkgs,
1126 badge_h *badge = NULL;
1129 ERR("PKGNAME is NULL");
1131 *err = BADGE_ERROR_INVALID_PARAMETER;
1135 if (!writable_pkgs) {
1136 ERR("writable_pkgs is NULL");
1138 *err = BADGE_ERROR_INVALID_PARAMETER;
1143 badge = (badge_h *)malloc(sizeof(struct _badge_h));
1145 ERR("fail to alloc handle");
1147 *err = BADGE_ERROR_OUT_OF_MEMORY;
1151 badge->pkgname = strdup(pkgname);
1152 badge->writable_pkgs = strdup(writable_pkgs);
1154 *err = BADGE_ERROR_NONE;
1159 char *_badge_pkgs_new(int *err, const char *pkg1, ...)
1161 char *caller_pkgname = NULL;
1163 char *result = NULL;
1167 char *new_pkgs = NULL;
1170 *err = BADGE_ERROR_NONE;
1172 caller_pkgname = _badge_get_pkgname_by_pid();
1173 if (!caller_pkgname) {
1174 ERR("fail to get caller pkgname");
1176 *err = BADGE_ERROR_PERMISSION_DENIED;
1181 WARN("pkg1 is NULL");
1182 return caller_pkgname;
1185 length = strlen(pkg1);
1186 va_start(args, pkg1);
1187 s = va_arg(args, char *);
1189 length += strlen(s) ;
1190 s = va_arg(args, char *);
1195 WARN("length is %d", length);
1196 return caller_pkgname;
1199 result = g_new0(char, length + 1); /* 1 for null terminate */
1201 /* LCOV_EXCL_START */
1202 ERR("fail to alloc memory");
1204 *err = BADGE_ERROR_OUT_OF_MEMORY;
1205 free(caller_pkgname);
1207 /* LCOV_EXCL_STOP */
1211 ptr = g_stpcpy(ptr, pkg1);
1212 va_start(args, pkg1);
1213 s = va_arg(args, char *);
1215 ptr = g_stpcpy(ptr, s);
1216 s = va_arg(args, char *);
1220 if (g_strstr_len(result, -1, caller_pkgname) == NULL) {
1221 new_pkgs = g_strdup_printf("%s%s", caller_pkgname, result);
1223 ERR("fail to alloc memory");
1225 *err = BADGE_ERROR_OUT_OF_MEMORY;
1228 free(caller_pkgname);
1235 free(caller_pkgname);
1241 int badge_create_for_uid(const char *pkgname, const char *writable_pkg, uid_t uid)
1243 char *caller = NULL;
1244 int err = BADGE_ERROR_NONE;
1246 if (pkgname == NULL)
1247 return BADGE_ERROR_INVALID_PARAMETER;
1250 caller = _badge_get_pkgname_by_pid();
1252 ERR("fail to get caller pkgname");
1253 return BADGE_ERROR_PERMISSION_DENIED;
1256 err = badge_ipc_request_insert(pkgname, writable_pkg, caller, uid);
1263 int badge_new_for_uid(const char *writable_app_id, uid_t uid)
1265 char *caller = NULL;
1266 int err = BADGE_ERROR_NONE;
1268 caller = _badge_get_pkgname_by_pid();
1270 ERR("fail to get caller pkgname");
1271 return BADGE_ERROR_PERMISSION_DENIED;
1274 err = badge_ipc_request_insert(caller, writable_app_id, caller, uid);
1281 int badge_add_for_uid(const char *badge_app_id, uid_t uid)
1283 char *caller = NULL;
1284 int err = BADGE_ERROR_NONE;
1286 caller = _badge_get_pkgname_by_pid();
1288 ERR("fail to get caller pkgname");
1289 return BADGE_ERROR_PERMISSION_DENIED;
1292 if (badge_app_id == NULL) {
1293 badge_app_id = caller;
1295 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
1296 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
1298 pkgmgr_ret = package_manager_compare_app_cert_info(badge_app_id, caller, &compare_result);
1300 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE || compare_result != PACKAGE_MANAGER_COMPARE_MATCH) {
1301 err = BADGE_ERROR_INVALID_PACKAGE;
1306 err = badge_ipc_request_insert(badge_app_id, caller, caller, uid);
1315 int badge_remove_for_uid(const char *app_id, uid_t uid)
1317 char *caller = NULL;
1318 int result = BADGE_ERROR_NONE;
1321 return BADGE_ERROR_INVALID_PARAMETER;
1323 caller = _badge_get_pkgname_by_pid();
1325 ERR("fail to get caller pkgname");
1326 result = BADGE_ERROR_PERMISSION_DENIED;
1330 result = badge_ipc_request_delete(app_id, caller, uid);
1339 int badge_is_existing_for_uid(const char *app_id, bool *existing, uid_t uid)
1341 return badge_ipc_request_is_existing(app_id, existing, uid);
1345 int badge_foreach_for_uid(badge_foreach_cb callback, void *user_data, uid_t uid)
1347 int result = BADGE_ERROR_NONE;
1348 result = badge_ipc_request_get_list(callback, user_data, uid);
1349 if (result == BADGE_ERROR_IO_ERROR)
1350 result = BADGE_ERROR_FROM_DB;
1355 int badge_set_count_for_uid(const char *app_id, unsigned int count, uid_t uid)
1357 char *caller = NULL;
1358 int result = BADGE_ERROR_NONE;
1361 return BADGE_ERROR_INVALID_PARAMETER;
1363 DBG("app_id %s, count %d", app_id, count);
1365 caller = _badge_get_pkgname_by_pid();
1367 ERR("fail to get caller pkgname");
1368 result = BADGE_ERROR_PERMISSION_DENIED;
1372 result = badge_ipc_request_set_count(app_id, caller, count, uid);
1380 int badge_get_count_for_uid(const char *app_id, unsigned int *count, uid_t uid)
1382 int result = BADGE_ERROR_NONE;
1383 if (app_id == NULL || count == NULL)
1384 return BADGE_ERROR_INVALID_PARAMETER;
1386 result = badge_ipc_request_get_count(app_id, count, uid);
1387 if (result == BADGE_ERROR_IO_ERROR)
1388 result = BADGE_ERROR_FROM_DB;
1394 int badge_set_display_for_uid(const char *app_id, unsigned int is_display, uid_t uid)
1396 char *caller = NULL;
1397 int result = BADGE_ERROR_NONE;
1400 return BADGE_ERROR_INVALID_PARAMETER;
1402 caller = _badge_get_pkgname_by_pid();
1404 ERR("fail to get caller pkgname");
1405 result = BADGE_ERROR_PERMISSION_DENIED;
1409 result = badge_ipc_request_set_display(app_id, caller, is_display, uid);
1418 int badge_get_display_for_uid(const char *app_id, unsigned int *is_display, uid_t uid)
1420 int result = BADGE_ERROR_NONE;
1421 if (app_id == NULL || is_display == NULL)
1422 return BADGE_ERROR_INVALID_PARAMETER;
1424 result = badge_ipc_request_get_display(app_id, is_display, uid);
1425 if (result == BADGE_ERROR_IO_ERROR)
1426 result = BADGE_ERROR_FROM_DB;
1432 int badge_register_changed_cb_for_uid(badge_change_cb callback, void *data, uid_t uid)
1434 if (callback == NULL)
1435 return BADGE_ERROR_INVALID_PARAMETER;
1437 return _badge_register_changed_cb(callback, data, uid);
1441 int badge_unregister_changed_cb_for_uid(badge_change_cb callback, uid_t uid)
1443 if (callback == NULL)
1444 return BADGE_ERROR_INVALID_PARAMETER;
1446 return _badge_unregister_changed_cb(callback, uid);