Add function to check if appid exists 90/151390/3
authorSeungha Son <seungha.son@samsung.com>
Thu, 21 Sep 2017 00:09:57 +0000 (09:09 +0900)
committerSeungha Son <seungha.son@samsung.com>
Thu, 21 Sep 2017 04:06:38 +0000 (13:06 +0900)
 Fixed the problem that badge can be created for nonexistent app

Signed-off-by: Seungha Son <seungha.son@samsung.com>
Change-Id: I69ed9b55d06559d76e8332e35313b552a4ae9bfe

include/badge_setting_service.h
src/badge_internal.c
src/badge_setting_service.c

index 9c38a4f..130ca2e 100644 (file)
@@ -43,6 +43,7 @@ int badge_setting_insert_package_for_uid(const char *pkgname, uid_t uid);
 int badge_setting_delete_package_for_uid(const char *pkgname, uid_t uid);
 int badge_setting_refresh_setting_table(uid_t uid);
 int badge_db_update_setting(char *pkgname, char *appid, int allow_to_display, uid_t uid);
+int badge_setting_is_existed_appid(const char *appid, bool *is_existed, uid_t uid);
 
 /**
  * @}
index 7a63b1f..b625a28 100755 (executable)
@@ -37,6 +37,7 @@
 #include "badge_ipc.h"
 #include "badge_db.h"
 #include "badge_private.h"
+#include "badge_setting_service.h"
 
 #define BADGE_PKGNAME_LEN 512
 #define BADGE_TABLE_NAME "badge_data"
@@ -473,10 +474,21 @@ int _badge_insert(badge_h *badge, uid_t uid)
        int ret = BADGE_ERROR_NONE;
        int result = BADGE_ERROR_NONE;
        char *sqlbuf = NULL;
+       bool is_existed = false;
 
        if (!badge || !badge->pkgname || !badge->writable_pkgs)
                return BADGE_ERROR_INVALID_PARAMETER;
 
+       ret = badge_setting_is_existed_appid(badge->pkgname, &is_existed, uid);
+       if (ret == BADGE_ERROR_NONE && is_existed == false) {
+               result = BADGE_ERROR_INVALID_PACKAGE;
+               goto return_close_db;
+       } else if (ret != BADGE_ERROR_NONE) {
+               ERR("Failed to check existed appid [%d]", ret);
+               result = ret;
+               goto return_close_db;
+       }
+
        sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
        if (sqlret != SQLITE_OK || !db) {
                /* LCOV_EXCL_START */
index 706cc05..ff22bc4 100644 (file)
@@ -272,6 +272,68 @@ out:
        return ret;
 }
 
+EXPORT_API int badge_setting_is_existed_appid(const char *appid, bool *is_existed, uid_t uid)
+{
+       int ret = BADGE_ERROR_NONE;
+       int sqlret;
+       sqlite3 *db = NULL;
+       sqlite3_stmt *stmt = NULL;
+       char *sqlbuf = NULL;
+       int count = 0;
+
+       if (appid == NULL || is_existed == NULL) {
+               ERR("Invalid parameter");
+               return BADGE_ERROR_INVALID_PARAMETER;
+       }
+
+       sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
+       if (sqlret != SQLITE_OK || !db) {
+               ERR("Failed to db_util_open [%d]", sqlret);
+               if (sqlret == SQLITE_PERM)
+                       return BADGE_ERROR_PERMISSION_DENIED;
+               return BADGE_ERROR_FROM_DB;
+       }
+
+       sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
+                               "appid = %Q AND uid = %d",
+                               BADGE_SETTING_DB_TABLE, appid, uid);
+       if (!sqlbuf) {
+               ERR("Failed to alloc query");
+               ret = BADGE_ERROR_OUT_OF_MEMORY;
+               goto out;
+       }
+
+       sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
+       if (sqlret != SQLITE_OK) {
+               ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
+                                       sqlite3_errmsg(db));
+               ret = BADGE_ERROR_FROM_DB;
+               goto out;
+       }
+
+       sqlret = sqlite3_step(stmt);
+       if (sqlret == SQLITE_ROW)
+               count = sqlite3_column_int(stmt, 0);
+
+       if (count > 0)
+               *is_existed = true;
+       else
+               *is_existed = false;
+
+out:
+       if (sqlbuf)
+               sqlite3_free(sqlbuf);
+       if (stmt)
+               sqlite3_finalize(stmt);
+       if (db) {
+               sqlret = db_util_close(db);
+               if (sqlret != SQLITE_OK)
+                       WARN("Failed to db_util_close [%d]", sqlret);
+       }
+
+       return ret;
+}
+
 static bool _is_package_in_setting_table(sqlite3 *db, const char *pkgname, const char* appid, uid_t uid)
 {
        sqlite3_stmt *db_statement = NULL;