#include <errno.h>
#include <dirent.h>
#include <fcntl.h>
+#include <linux/limits.h>
#ifndef EXPORT_API
#define EXPORT_API __attribute__((visibility("default")))
#endif
#define LOG_TAG "STICKER_PARSER"
-#define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data")
+#define STICKER_DIRECTORY "/opt/usr/share/sticker-data"
#define STICKER_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_info(sticker_info_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL, thumbnail TEXT, description TEXT, group_name TEXT NOT NULL, date TEXT NOT NULL, display_type INTEGER)"
#define STICKER_KEYWORD_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_keyword_info(keyword_id INTEGER PRIMARY KEY AUTOINCREMENT, sticker_info_id INTEGER, keyword TEXT NOT NULL, FOREIGN KEY (sticker_info_id) REFERENCES sticker_info(sticker_info_id) ON DELETE CASCADE)"
#define STICKER_WHITELIST_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_whitelist_info(whitelist_id INTEGER PRIMARY KEY AUTOINCREMENT, provider_id TEXT NOT NULL, consumer_id TEXT NOT NULL)"
+#define STICKER_RECENT_HISTORY_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_recent_history_info(history_id INTEGER PRIMARY KEY AUTOINCREMENT, sticker_info_id INTEGER, count INTEGER NOT NULL, timestamp TEXT NOT NULL, FOREIGN KEY (sticker_info_id) REFERENCES sticker_info(sticker_info_id) ON DELETE CASCADE)"
#define UIFW_ID 502
#define APPFW_ID 301
#define MAX_ERROR_BUFFER 256
goto cleanup;
}
+ ret = sqlite3_exec(db, STICKER_RECENT_HISTORY_INFO_CREATE_TABLE, NULL, NULL, &err);
+ if (ret != SQLITE_OK) {
+ LOGE("Failed to create sticker_recent_history_info table : %s", err);
+ goto cleanup;
+ }
+
is_corrupted = FALSE;
cleanup:
goto cleanup;
}
+ ret = sqlite3_exec(db, STICKER_RECENT_HISTORY_INFO_CREATE_TABLE, NULL, NULL, &err);
+ if (ret != SQLITE_OK) {
+ LOGE("Failed to create sticker_recent_history_info table : %s", err);
+ goto cleanup;
+ }
+
ret = sqlite3_exec(db, "PRAGMA journal_mode = WAL", NULL, NULL, &err);
if (ret != SQLITE_OK) {
LOGE("Failed to set journal_mode : %s", err);
return ret;
}
-static char* __convert_sticker_uri(const char *uri, const char *appid, const char *app_path)
+static char* __convert_sticker_uri(char *uri, const char *appid, const char *app_path)
{
int ret;
- char *rel_path = strdup(uri);
+ char *copy_uri = (char *)calloc(PATH_MAX, sizeof(char));
+ if (copy_uri == NULL) {
+ LOGE("failed to allocate memory");
+ return NULL;
+ }
- __remove_app_path(rel_path, app_path);
- int len = strlen(STICKER_DIRECTORY) + strlen(appid) + strlen(rel_path) + 2;
+ strncpy(copy_uri, uri, PATH_MAX - 1);
+ __remove_app_path(uri, app_path);
+ int len = strlen(STICKER_DIRECTORY) + strlen(appid) + strlen(uri) + 2;
char *new_path = (char *)calloc(len, sizeof(char));
if (new_path == NULL) {
- free(rel_path);
- rel_path = NULL;
- return NULL;
+ LOGE("failed to allocate memory");
+ ret = -1;
+ goto cleanup;
}
- snprintf(new_path, len, "%s/%s%s",STICKER_DIRECTORY, appid, rel_path);
+ snprintf(new_path, len, "%s/%s%s",STICKER_DIRECTORY, appid, uri);
if (access(new_path, F_OK) == 0) {
LOGE("sticker file already exists");
goto cleanup;
}
- if (__file_copy(uri, new_path) == -1) {
+ if (__file_copy(copy_uri, new_path) == -1) {
strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
LOGE("failed to copy sticker file : %s", error_buffer);
ret = -1;
goto cleanup;
}
- ret = unlink(uri);
+ ret = unlink(copy_uri);
if (ret != 0) {
strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
LOGE("failed to remove sticker file : %s", error_buffer);
LOGE("failed to change ownership");
cleanup:
- free(rel_path);
- rel_path = NULL;
+ free(copy_uri);
+ copy_uri = NULL;
if (ret == 0) {
return new_path;
} else {
- free(new_path);
- new_path = NULL;
+ if (new_path) {
+ free(new_path);
+ new_path = NULL;
+ }
return NULL;
}
}
return;
}
-static void __insert_sticker_whitelist_info(const char *provider, const char *consumer) {
+static void __insert_sticker_allowlist_info(const char *provider, const char *consumer) {
int ret;
sqlite3 *db = NULL;
sqlite3_stmt *stmt = NULL;
sqlite3_finalize(stmt);
sqlite3_close(db);
} else {
- LOGE("fail to insert sticker whiltelist : %s", sqlite3_errmsg(db));
+ LOGE("fail to insert sticker allowlist : %s", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
}
char *uri = NULL;
char *group = NULL;
char *description = NULL;
- char *thumbnail = NULL;
+ char *thumbnail_path = NULL;
char *uri_path = NULL;
parser = json_parser_new();
goto cleanup;
}
- JsonArray *whitelist_arr = json_object_get_array_member(root_obj, "whitelist");
- if (whitelist_arr != NULL) {
- for (int i = 0; i < json_array_get_length(whitelist_arr); i++) {
- __insert_sticker_whitelist_info(appid, json_array_get_string_element(whitelist_arr, i));
+ JsonArray *allowlist_arr = json_object_get_array_member(root_obj, "whitelist");
+ if (allowlist_arr != NULL) {
+ for (int i = 0; i < json_array_get_length(allowlist_arr); i++) {
+ __insert_sticker_allowlist_info(appid, json_array_get_string_element(allowlist_arr, i));
}
}
if (!group)
goto free_memory;
- thumbnail = __get_string_from_object(info_object, "thumbnail");
- if (thumbnail)
- thumbnail = __convert_sticker_uri(thumbnail, appid, app_path);
+ char *rel_thumbnail = __get_string_from_object(info_object, "thumbnail");
+ if (rel_thumbnail) {
+ if (rel_thumbnail[0] != '\0') {
+ if (access(rel_thumbnail, F_OK) == 0) {
+ thumbnail_path = __convert_sticker_uri(rel_thumbnail, appid, app_path);
+ } else {
+ int len = strlen(app_path) + strlen(rel_thumbnail) + 2;
+ char *new_thumbnail_path = (char *)calloc(len, sizeof(char));
+ if (new_thumbnail_path) {
+ if (rel_thumbnail[0] == '/')
+ snprintf(new_thumbnail_path, len, "%s%s",app_path, rel_thumbnail);
+ else
+ snprintf(new_thumbnail_path, len, "%s%s%s",app_path, "/", rel_thumbnail);
+
+ if (access(new_thumbnail_path, F_OK) == 0)
+ thumbnail_path = __convert_sticker_uri(new_thumbnail_path, appid, app_path);
+
+ free(new_thumbnail_path);
+ new_thumbnail_path = NULL;
+ }
+ }
+ }
+
+ free(rel_thumbnail);
+ rel_thumbnail = NULL;
+ }
description = __get_string_from_object(info_object, "description");
int disp_type = __get_int_from_object(info_object, "display_type");
char *new_uri = __convert_sticker_uri(uri, appid, app_path);
if (!new_uri)
goto free_memory;
- __insert_sticker_info(appid, type, new_uri, group, thumbnail, description, disp_type);
+ __insert_sticker_info(appid, type, new_uri, group, thumbnail_path, description, disp_type);
if (new_uri) {
free(new_uri);
uri_path = NULL;
goto free_memory;
}
- __insert_sticker_info(appid, type, new_uri, group, thumbnail, description, disp_type);
+ __insert_sticker_info(appid, type, new_uri, group, thumbnail_path, description, disp_type);
free(new_uri);
new_uri = NULL;
}
}
} else {
- __insert_sticker_info(appid, type, uri, group, thumbnail, description, disp_type);
+ __insert_sticker_info(appid, type, uri, group, thumbnail_path, description, disp_type);
}
for (int j = 0; j < keyword_arr_len; j++) {
group = NULL;
}
- if (thumbnail) {
- free(thumbnail);
- thumbnail = NULL;
+ if (thumbnail_path) {
+ free(thumbnail_path);
+ thumbnail_path = NULL;
}
if (description) {
return ret;
}
-static void __delete_sticker_whitelist(const char *db_path, const char *app_id)
+static void __delete_sticker_allowlist(const char *db_path, const char *app_id)
{
int ret;
sqlite3 *db = NULL;
ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_whitelist_info WHERE provider_id = ?", -1, &stmt, NULL);
if (ret != SQLITE_OK) {
- LOGE("failed to delete sticker whitelist : %s", sqlite3_errmsg(db));
+ LOGE("failed to delete sticker allowlist : %s", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
goto cleanup;
sqlite3_close(db);
}
- __delete_sticker_whitelist(db_path, appid);
+ __delete_sticker_allowlist(db_path, appid);
return 0;
}