4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Garima Shrivastava<garima.s@samsung.com>
7 * Jyotsna Dhumale <jyotsna.a@samsung.com>
8 * Venkatesha Sarpangala <sarpangala.v@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
30 #include "app2sd_internals.h"
32 #define MAX_QUERY_LEN 4096
33 #define PASSWORD_LENGTH 64
37 ########### Internal APIs ##################
41 #define APP2SD_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".app2sd.db")
43 #define QUERY_CREATE_TABLE_APP2SD "CREATE TABLE IF NOT EXISTS app2sd_info " \
44 "(pkgid TEXT NOT NULL, password TEXT NOT NULL, " \
45 "filename TEXT NOT NULL, uid INTEGER, PRIMARY KEY(pkgid, uid))"
47 static int _app2sd_db_change_perm(const char *db_file)
51 char journal_file[BUFSIZE];
55 uid_t uid = APPFW_UID;
56 struct passwd userinfo, *result = NULL;
57 files[0] = (char *)db_file;
58 files[1] = journal_file;
64 if (getuid() != OWNER_ROOT) {
65 _E("not allowed user");
69 snprintf(journal_file, sizeof(journal_file), "%s%s", db_file, "-journal");
71 ret = getpwuid_r(uid, &userinfo, pwuid_buf, sizeof(pwuid_buf), &result);
72 if (ret != 0 || result == NULL) {
73 _E("user(%d) doesn't exist", uid);
77 for (i = 0; files[i]; i++) {
78 fd = open(files[i], O_RDONLY);
80 if (strerror_r(errno, buf, sizeof(buf)))
81 strncpy(buf, "", BUFSIZE - 1);
82 _E("failed to open %s : %s", files[i], buf);
86 ret = fchown(fd, uid, userinfo.pw_gid);
88 if (strerror_r(errno, buf, sizeof(buf)))
89 strncpy(buf, "", BUFSIZE - 1);
90 _E("failed to fchown %s %d.%d : %s", files[i], uid,
91 userinfo.pw_gid, buf);
96 ret = fchmod(fd, 0644);
98 if (strerror_r(errno, buf, sizeof(buf)))
99 strncpy(buf, "", BUFSIZE - 1);
100 _E("failed to fchmod %s : %s", files[i], buf);
109 int _app2sd_initialize_db()
111 char *error_message = NULL;
115 fp = fopen(APP2SD_DB_FILE, "r");
118 ret = db_util_open(APP2SD_DB_FILE, &app2sd_db,
119 DB_UTIL_REGISTER_HOOK_METHOD);
121 if (ret != SQLITE_OK) {
122 _E("connect menu_db [%s] failed",
129 ret = db_util_open(APP2SD_DB_FILE, &app2sd_db,
130 DB_UTIL_REGISTER_HOOK_METHOD);
132 if (ret != SQLITE_OK) {
133 _E("connect menu_db [%s] failed",
138 if (SQLITE_OK != sqlite3_exec(app2sd_db,
139 QUERY_CREATE_TABLE_APP2SD, NULL, NULL,
141 _E("don't execute query = (%s), " \
142 "error message = (%s)",
143 QUERY_CREATE_TABLE_APP2SD, error_message);
147 if (_app2sd_db_change_perm(APP2SD_DB_FILE) < 0) {
148 _E("failed to change permissions");
155 static int _app2sd_check_existing_info(const char *pkgid, uid_t uid)
158 const char *val = NULL;
159 sqlite3_stmt *stmt = NULL;
162 query = sqlite3_mprintf("select count(*) from app2sd_info " \
163 "where pkgid=%Q and uid=%d", pkgid, uid);
165 _E("failed to make a query");
169 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
170 if (ret != SQLITE_OK) {
171 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
176 if (sqlite3_step(stmt) != SQLITE_ROW) {
177 _E("failed to step");
178 sqlite3_finalize(stmt);
182 val = (const char *)sqlite3_column_text(stmt, 0);
184 sqlite3_finalize(stmt);
189 int _app2sd_set_info_in_db(const char *pkgid, const char *passwd,
190 const char *loopback_device, uid_t uid)
192 char *error_message = NULL;
196 ret = _app2sd_check_existing_info(pkgid, uid);
198 _E("failed to get existing info");
199 return APP2EXT_ERROR_SQLITE_REGISTRY;
203 query = sqlite3_mprintf("insert into app2sd_info " \
204 "(pkgid, password, filename, uid) values (%Q, %Q, %Q, %d)",
205 pkgid, passwd, loopback_device, uid);
207 query = sqlite3_mprintf("update app2sd_info " \
208 "set password=%Q, filename=%Q where pkgid=%Q and uid=%d",
209 passwd, loopback_device, pkgid, uid);
211 ret = sqlite3_exec(app2sd_db, query, NULL, NULL, &error_message);
212 if (ret != SQLITE_OK) {
213 _E("failed to execute query(%s), error message(%s)",
214 query, error_message);
216 return APP2EXT_ERROR_SQLITE_REGISTRY;
220 return APP2EXT_SUCCESS;
223 int _app2sd_remove_info_from_db(const char *pkgid, uid_t uid)
225 char *error_message = NULL;
229 query = sqlite3_mprintf("delete from app2sd_info " \
230 "where pkgid=%Q and uid=%d", pkgid, uid);
232 ret = sqlite3_exec(app2sd_db, query, NULL, NULL, &error_message);
233 if (ret != SQLITE_OK) {
234 _E("failed to execute query(%s), error message(%s)",
235 query, error_message);
237 return APP2EXT_ERROR_SQLITE_REGISTRY;
241 return APP2EXT_SUCCESS;
244 int _app2sd_get_info_from_db(const char *filename, char **pkgid, uid_t *uid)
247 sqlite3_stmt *stmt = NULL;
248 int ret = APP2EXT_SUCCESS;
250 _D("filename(%s)", filename);
251 query = sqlite3_mprintf("select * from app2sd_info " \
252 "where filename=%Q", filename);
254 _E("failed to make a query");
255 return APP2EXT_ERROR_SQLITE_REGISTRY;
258 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
259 if (ret != SQLITE_OK) {
260 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
264 return APP2EXT_ERROR_SQLITE_REGISTRY;
267 ret = sqlite3_step(stmt);
268 if (ret != SQLITE_ROW || ret == SQLITE_DONE) {
269 _W("no records found");
270 ret = APP2EXT_SUCCESS;
274 *pkgid = strdup((const char *)sqlite3_column_text(stmt, 0));
275 if (*pkgid == NULL) {
277 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
281 *uid = sqlite3_column_int(stmt, 3);
282 if (*uid != GLOBAL_USER && *uid < REGULAR_USER) {
284 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
288 if (SQLITE_OK != sqlite3_finalize(stmt)) {
289 _E("error : sqlite3_finalize");
290 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
295 return APP2EXT_SUCCESS;
304 sqlite3_finalize(stmt);
310 int _app2sd_get_foreach_info_from_db(app2sd_info_cb cb_func)
313 sqlite3_stmt *stmt = NULL;
314 const char *pkgid = NULL;
318 query = sqlite3_mprintf("select * from app2sd_info");
320 _E("failed to make a query");
321 return APP2EXT_ERROR_SQLITE_REGISTRY;
324 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
325 if (ret != SQLITE_OK) {
326 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
328 return APP2EXT_ERROR_SQLITE_REGISTRY;
331 ret = APP2EXT_SUCCESS;
332 while (sqlite3_step(stmt) == SQLITE_ROW) {
333 pkgid = (const char *)sqlite3_column_text(stmt, 0);
334 uid = sqlite3_column_int(stmt, 3);
336 ret = cb_func(pkgid, (uid_t)uid);
338 _E("app2sd info callback error");
343 if (SQLITE_OK != sqlite3_finalize(stmt)) {
344 _E("error : sqlite3_finalize");
345 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
352 char *_app2sd_get_password_from_db(const char *pkgid, uid_t uid)
356 sqlite3_stmt *stmt = NULL;
359 query = sqlite3_mprintf("select password from app2sd_info " \
360 "where pkgid=%Q and uid=%d", pkgid, uid);
362 _E("failed to make a query");
366 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
367 if (ret != SQLITE_OK) {
368 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
373 ret = sqlite3_step(stmt);
374 if (ret != SQLITE_ROW || ret == SQLITE_DONE) {
375 _W("no records found");
379 passwd = strdup((const char *)sqlite3_column_text(stmt, 0));
381 _E("memory allocation failed");
384 if (strlen(passwd) == 0) {
388 if (SQLITE_OK != sqlite3_finalize(stmt)) {
389 _E("error : sqlite3_finalize");
400 sqlite3_finalize(stmt);
406 char *_app2sd_get_filename_from_db(const char *pkgid, uid_t uid)
409 char *filename = NULL;
410 sqlite3_stmt *stmt = NULL;
413 query = sqlite3_mprintf("select filename from app2sd_info " \
414 "where pkgid=%Q and uid=%d", pkgid, uid);
416 _E("failed to make a query");
420 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
421 if (ret != SQLITE_OK) {
422 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
427 ret = sqlite3_step(stmt);
428 if (ret != SQLITE_ROW || ret == SQLITE_DONE) {
429 _W("no records found");
433 filename = strdup((const char *)sqlite3_column_text(stmt, 0));
435 _E("memory allocation failed");
438 if (strlen(filename) == 0) {
442 if (SQLITE_OK != sqlite3_finalize(stmt)) {
443 _E("error : sqlite3_finalize");
454 sqlite3_finalize(stmt);