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.
31 #include "app2sd_internals.h"
33 #define MAX_QUERY_LEN 4096
34 #define PASSWORD_LENGTH 64
38 ########### Internal APIs ##################
42 #define APP2SD_DB_FILE tzplatform_mkpath(TZ_SYS_DB, ".app2sd.db")
43 static sqlite3 *app2sd_db;
44 #define QUERY_CREATE_TABLE_APP2SD "CREATE TABLE IF NOT EXISTS app2sd_info " \
45 "(pkgid TEXT NOT NULL, password TEXT NOT NULL, " \
46 "filename TEXT NOT NULL, uid INTEGER, PRIMARY KEY(pkgid, uid))"
48 static int _app2sd_db_change_perm(const char *db_file)
52 char journal_file[BUFSIZE];
56 uid_t uid = APPFW_UID;
57 struct passwd userinfo;
58 struct passwd *result;
59 files[0] = (char *)db_file;
60 files[1] = journal_file;
67 if (getuid() != OWNER_ROOT) {
68 _E("not allowed user");
72 snprintf(journal_file, sizeof(journal_file), "%s%s", db_file,
75 ret = getpwuid_r(uid, &userinfo, pwuid_buf, sizeof(pwuid_buf), &result);
76 if (ret != 0 || result == NULL) {
77 _E("user(%d) doesn't exist", uid);
81 for (i = 0; files[i]; i++) {
82 fd = open(files[i], O_RDONLY);
84 err_str = strerror_r(errno, buf, sizeof(buf));
85 _E("failed to open %s : %s", files[i], err_str);
89 ret = fchown(fd, uid, userinfo.pw_gid);
91 err_str = strerror_r(errno, buf, sizeof(buf));
92 _E("failed to fchown %s %d.%d : %s", files[i], uid,
93 userinfo.pw_gid, err_str);
98 ret = fchmod(fd, 0644);
100 err_str = strerror_r(errno, buf, sizeof(buf));
101 _E("failed to fchmod %s : %s", files[i], err_str);
110 int _app2sd_initialize_db(void)
112 char *error_message = NULL;
116 fp = fopen(APP2SD_DB_FILE, "r");
119 ret = db_util_open(APP2SD_DB_FILE, &app2sd_db,
120 DB_UTIL_REGISTER_HOOK_METHOD);
122 if (ret != SQLITE_OK) {
123 _E("connect menu_db [%s] failed", APP2SD_DB_FILE);
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 ret = sqlite3_exec(app2sd_db, QUERY_CREATE_TABLE_APP2SD, NULL, NULL,
140 if (ret != SQLITE_OK) {
141 _E("don't execute query = (%s), error message = (%s)",
142 QUERY_CREATE_TABLE_APP2SD, error_message);
143 sqlite3_free(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)
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);
183 val = (const char *)sqlite3_column_text(stmt, 0);
185 sqlite3_finalize(stmt);
191 int _app2sd_set_info_in_db(const char *pkgid, const char *passwd,
192 const char *loopback_device, uid_t uid)
194 char *error_message = NULL;
198 ret = _app2sd_check_existing_info(pkgid, uid);
200 _E("failed to get existing info");
201 return APP2EXT_ERROR_SQLITE_REGISTRY;
205 query = sqlite3_mprintf("insert into app2sd_info "
206 "(pkgid, password, filename, uid) "
207 "values (%Q, %Q, %Q, %d)",
208 pkgid, passwd, loopback_device, uid);
210 query = sqlite3_mprintf("update app2sd_info "
211 "set password=%Q, filename=%Q "
212 "where pkgid=%Q and uid=%d",
213 passwd, loopback_device, pkgid, uid);
215 ret = sqlite3_exec(app2sd_db, query, NULL, NULL, &error_message);
216 if (ret != SQLITE_OK) {
217 _E("failed to execute query(%s), error message(%s)",
218 query, error_message);
220 sqlite3_free(error_message);
221 return APP2EXT_ERROR_SQLITE_REGISTRY;
225 return APP2EXT_SUCCESS;
228 int _app2sd_remove_info_from_db(const char *pkgid, uid_t uid)
230 char *error_message = NULL;
234 query = sqlite3_mprintf("delete from app2sd_info " \
235 "where pkgid=%Q and uid=%d", pkgid, uid);
237 ret = sqlite3_exec(app2sd_db, query, NULL, NULL, &error_message);
238 if (ret != SQLITE_OK) {
239 _E("failed to execute query(%s), error message(%s)",
240 query, error_message);
242 sqlite3_free(error_message);
243 return APP2EXT_ERROR_SQLITE_REGISTRY;
247 return APP2EXT_SUCCESS;
250 int _app2sd_get_info_from_db(const char *filename, char **pkgid, uid_t *uid)
253 sqlite3_stmt *stmt = NULL;
254 int ret = APP2EXT_SUCCESS;
256 _D("filename(%s)", filename);
257 query = sqlite3_mprintf("select * from app2sd_info " \
258 "where filename=%Q", filename);
260 _E("failed to make a query");
261 return APP2EXT_ERROR_SQLITE_REGISTRY;
264 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
265 if (ret != SQLITE_OK) {
266 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
270 return APP2EXT_ERROR_SQLITE_REGISTRY;
273 ret = sqlite3_step(stmt);
274 if (ret != SQLITE_ROW || ret == SQLITE_DONE) {
275 _W("no records found");
276 ret = APP2EXT_SUCCESS;
280 *pkgid = strdup((const char *)sqlite3_column_text(stmt, 0));
281 if (*pkgid == NULL) {
283 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
287 *uid = sqlite3_column_int(stmt, 3);
288 if (*uid != GLOBAL_USER && *uid < REGULAR_USER) {
290 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
294 if (SQLITE_OK != sqlite3_finalize(stmt)) {
295 _E("error : sqlite3_finalize");
296 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
301 return APP2EXT_SUCCESS;
310 sqlite3_finalize(stmt);
316 int _app2sd_get_foreach_info_from_db(app2sd_info_cb cb_func)
319 sqlite3_stmt *stmt = NULL;
320 const char *pkgid = NULL;
324 query = sqlite3_mprintf("select * from app2sd_info");
326 _E("failed to make a query");
327 return APP2EXT_ERROR_SQLITE_REGISTRY;
330 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
331 if (ret != SQLITE_OK) {
332 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
334 return APP2EXT_ERROR_SQLITE_REGISTRY;
337 ret = APP2EXT_SUCCESS;
338 while (sqlite3_step(stmt) == SQLITE_ROW) {
339 pkgid = (const char *)sqlite3_column_text(stmt, 0);
340 uid = sqlite3_column_int(stmt, 3);
342 ret = cb_func(pkgid, (uid_t)uid);
344 _E("app2sd info callback error");
349 if (SQLITE_OK != sqlite3_finalize(stmt)) {
350 _E("error : sqlite3_finalize");
351 ret = APP2EXT_ERROR_SQLITE_REGISTRY;
358 char *_app2sd_get_password_from_db(const char *pkgid, uid_t uid)
362 sqlite3_stmt *stmt = NULL;
365 query = sqlite3_mprintf("select password from app2sd_info " \
366 "where pkgid=%Q and uid=%d", pkgid, uid);
368 _E("failed to make a query");
372 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
373 if (ret != SQLITE_OK) {
374 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
379 ret = sqlite3_step(stmt);
380 if (ret != SQLITE_ROW || ret == SQLITE_DONE) {
381 _W("no records found");
385 passwd = strdup((const char *)sqlite3_column_text(stmt, 0));
387 _E("memory allocation failed");
390 if (strlen(passwd) == 0) {
394 if (SQLITE_OK != sqlite3_finalize(stmt)) {
395 _E("error : sqlite3_finalize");
406 sqlite3_finalize(stmt);
412 char *_app2sd_get_filename_from_db(const char *pkgid, uid_t uid)
415 char *filename = NULL;
416 sqlite3_stmt *stmt = NULL;
419 query = sqlite3_mprintf("select filename from app2sd_info " \
420 "where pkgid=%Q and uid=%d", pkgid, uid);
422 _E("failed to make a query");
426 ret = sqlite3_prepare_v2(app2sd_db, query, strlen(query), &stmt, NULL);
427 if (ret != SQLITE_OK) {
428 _E("prepare failed (%s)", sqlite3_errmsg(app2sd_db));
433 ret = sqlite3_step(stmt);
434 if (ret != SQLITE_ROW || ret == SQLITE_DONE) {
435 _W("no records found");
439 filename = strdup((const char *)sqlite3_column_text(stmt, 0));
441 _E("memory allocation failed");
444 if (strlen(filename) == 0) {
448 if (SQLITE_OK != sqlite3_finalize(stmt)) {
449 _E("error : sqlite3_finalize");
460 sqlite3_finalize(stmt);