13 #include "pkgmgr-info.h"
14 #include "pkgmgrinfo_debug.h"
15 #include "pkgmgrinfo_private.h"
16 #include "pkgmgr_parser.h"
18 typedef struct _pkgmgr_certinfo_x {
22 char *cert_info[MAX_CERT_TYPE]; /*certificate info*/
23 int cert_id[MAX_CERT_TYPE]; /*certificate ID in index table*/
26 typedef struct _pkgmgr_instcertinfo_x {
28 char *cert_info[MAX_CERT_TYPE]; /*certificate data*/
29 int is_new[MAX_CERT_TYPE]; /*whether already exist in table or not*/
30 int ref_count[MAX_CERT_TYPE]; /*reference count of certificate data*/
31 int cert_id[MAX_CERT_TYPE]; /*certificate ID in index table*/
32 } pkgmgr_instcertinfo_x;
34 typedef struct _pkgmgr_certindexinfo_x {
37 } pkgmgr_certindexinfo_x;
39 typedef struct _pkgmgr_cert_x {
44 static int __cert_cb(void *data, int ncols, char **coltxt, char **colname)
46 pkgmgr_cert_x *info = (pkgmgr_cert_x *)data;
49 for(i = 0; i < ncols; i++)
51 if (strcmp(colname[i], "author_signer_cert") == 0) {
53 info->cert_id = atoi(coltxt[i]);
56 } else if (strcmp(colname[i], "package") == 0) {
58 info->pkgid= strdup(coltxt[i]);
67 static int __validate_cb(void *data, int ncols, char **coltxt, char **colname)
74 API int pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(const char *lhs_package_id, const char *rhs_package_id, uid_t uid, pkgmgrinfo_cert_compare_result_type_e *compare_result)
76 int ret = PMINFO_R_OK;
77 char query[MAX_QUERY_LEN] = {'\0'};
78 char *error_message = NULL;
79 sqlite3_stmt *stmt = NULL;
80 char *lhs_certinfo = NULL;
81 char *rhs_certinfo = NULL;
87 *compare_result = PMINFO_CERT_COMPARE_ERROR;
89 retvm_if(lhs_package_id == NULL, PMINFO_R_EINVAL, "lhs package ID is NULL");
90 retvm_if(rhs_package_id == NULL, PMINFO_R_EINVAL, "rhs package ID is NULL");
91 retvm_if(compare_result == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
93 ret = __open_cert_db(uid, true);
98 _check_create_cert_db(GET_DB(cert_db));
99 snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", lhs_package_id);
101 sqlite3_exec(GET_DB(cert_db), query, __validate_cb, (void *)&exist, &error_message)) {
102 _LOGE("Don't execute query = %s error message = %s\n", query,
104 ret = PMINFO_R_ERROR;
109 snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_cert_info where package='%s')", rhs_package_id);
111 sqlite3_exec(GET_DB(cert_db), query, __validate_cb, (void *)&exist, &error_message)) {
112 _LOGE("Don't execute query = %s error message = %s\n", query,
114 ret = PMINFO_R_ERROR;
119 if (uid == GLOBAL_USER || uid == ROOT_UID) {
120 snprintf(query, MAX_QUERY_LEN, "select cert_info from package_cert_index_info where cert_id=(select author_signer_cert from package_cert_info where package=?)");
123 snprintf(query, MAX_QUERY_LEN, "select cert_info from package_cert_index_info where cert_id=(select author_signer_cert from package_cert_info where package=?) and for_all_users=(select for_all_users from package_cert_info where package=?)");
124 if (SQLITE_OK != sqlite3_prepare_v2(GET_DB(cert_db), query, strlen(query), &stmt, NULL)) {
125 _LOGE("sqlite3_prepare_v2 error: %s", sqlite3_errmsg(GET_DB(cert_db)));
126 ret = PMINFO_R_ERROR;
130 for (i = 1; i <= 2 - is_global; i++) {
131 if (SQLITE_OK != sqlite3_bind_text(stmt, i, lhs_package_id, -1, SQLITE_STATIC)) {
132 _LOGE("sqlite3_bind_text error: %s", sqlite3_errmsg(GET_DB(cert_db)));
133 ret = PMINFO_R_ERROR;
137 if (SQLITE_ROW != sqlite3_step(stmt) || sqlite3_column_text(stmt, 0) == NULL) {
138 _LOGE("sqlite3_step error: %s", sqlite3_errmsg(GET_DB(cert_db)));
139 ret = PMINFO_R_ERROR;
143 lhs_certinfo = strdup((const char *)sqlite3_column_text(stmt, 0));
145 sqlite3_clear_bindings(stmt);
147 for (i = 1; i <= 2 - is_global; i++) {
148 if (SQLITE_OK != sqlite3_bind_text(stmt, i, rhs_package_id, -1, SQLITE_STATIC)) {
149 _LOGE("sqlite3_bind_text error: %s", sqlite3_errmsg(GET_DB(cert_db)));
150 ret = PMINFO_R_ERROR;
154 if (SQLITE_ROW != sqlite3_step(stmt) || sqlite3_column_text(stmt, 0) == NULL) {
155 _LOGE("sqlite3_step error: %s", sqlite3_errmsg(GET_DB(cert_db)));
156 ret = PMINFO_R_ERROR;
160 rhs_certinfo = strdup((const char *)sqlite3_column_text(stmt, 0));
162 if ((lcert == 0) || (rcert == 0)) {
163 if ((lcert == 0) && (rcert == 0))
164 *compare_result = PMINFO_CERT_COMPARE_BOTH_NO_CERT;
166 *compare_result = PMINFO_CERT_COMPARE_LHS_NO_CERT;
168 *compare_result = PMINFO_CERT_COMPARE_RHS_NO_CERT;
170 if (lhs_certinfo && rhs_certinfo && !strcmp(lhs_certinfo, rhs_certinfo))
171 *compare_result = PMINFO_CERT_COMPARE_MATCH;
173 *compare_result = PMINFO_CERT_COMPARE_MISMATCH;
178 sqlite3_finalize(stmt);
183 sqlite3_free(error_message);
189 API int pkgmgrinfo_pkginfo_compare_pkg_cert_info(const char *lhs_package_id, const char *rhs_package_id, pkgmgrinfo_cert_compare_result_type_e *compare_result)
191 return pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lhs_package_id, rhs_package_id, GLOBAL_USER, compare_result);
194 API int pkgmgrinfo_pkginfo_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, pkgmgrinfo_cert_compare_result_type_e *compare_result)
196 int ret = PMINFO_R_OK;
197 char query[MAX_QUERY_LEN] = {'\0'};
198 char *error_message = NULL;
203 const char* user_pkg_parser = getUserPkgParserDBPath();
205 retvm_if(lhs_app_id == NULL, PMINFO_R_EINVAL, "lhs app ID is NULL");
206 retvm_if(rhs_app_id == NULL, PMINFO_R_EINVAL, "rhs app ID is NULL");
207 retvm_if(compare_result == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
209 info = (pkgmgr_cert_x *)calloc(1, sizeof(pkgmgr_cert_x));
210 retvm_if(info == NULL, PMINFO_R_ERROR, "Out of Memory!!!");
212 ret = db_util_open_with_options(user_pkg_parser, &GET_DB(manifest_db),
213 SQLITE_OPEN_READONLY, NULL);
214 if (ret != SQLITE_OK) {
215 _LOGE("connect db [%s] failed!\n", user_pkg_parser);
216 ret = PMINFO_R_ERROR;
220 snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_app_info where app_id='%s')", lhs_app_id);
222 sqlite3_exec(GET_DB(manifest_db), query, __validate_cb, (void *)&exist, &error_message)) {
223 _LOGE("Don't execute query = %s error message = %s\n", query,
225 ret = PMINFO_R_ERROR;
232 snprintf(query, MAX_QUERY_LEN, "select package from package_app_info where app_id='%s' ", lhs_app_id);
234 sqlite3_exec(GET_DB(manifest_db), query, __cert_cb, (void *)info, &error_message)) {
235 _LOGE("Don't execute query = %s error message = %s\n", query,
237 ret = PMINFO_R_ERROR;
240 lpkgid = strdup(info->pkgid);
241 if (lpkgid == NULL) {
242 _LOGE("Out of Memory\n");
243 ret = PMINFO_R_ERROR;
250 snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_app_info where app_id='%s')", rhs_app_id);
252 sqlite3_exec(GET_DB(manifest_db), query, __validate_cb, (void *)&exist, &error_message)) {
253 _LOGE("Don't execute query = %s error message = %s\n", query,
255 ret = PMINFO_R_ERROR;
262 snprintf(query, MAX_QUERY_LEN, "select package from package_app_info where app_id='%s' ", rhs_app_id);
264 sqlite3_exec(GET_DB(manifest_db), query, __cert_cb, (void *)info, &error_message)) {
265 _LOGE("Don't execute query = %s error message = %s\n", query,
267 ret = PMINFO_R_ERROR;
270 rpkgid = strdup(info->pkgid);
271 if (rpkgid == NULL) {
272 _LOGE("Out of Memory\n");
273 ret = PMINFO_R_ERROR;
279 ret = pkgmgrinfo_pkginfo_compare_pkg_cert_info(lpkgid, rpkgid, compare_result);
282 sqlite3_free(error_message);
283 __close_manifest_db();
303 API int pkgmgrinfo_pkginfo_compare_usr_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, uid_t uid, pkgmgrinfo_cert_compare_result_type_e *compare_result)
305 int ret = PMINFO_R_OK;
306 char query[MAX_QUERY_LEN] = {'\0'};
307 char *error_message = NULL;
313 retvm_if(lhs_app_id == NULL, PMINFO_R_EINVAL, "lhs app ID is NULL");
314 retvm_if(rhs_app_id == NULL, PMINFO_R_EINVAL, "rhs app ID is NULL");
315 retvm_if(compare_result == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
317 info = (pkgmgr_cert_x *)calloc(1, sizeof(pkgmgr_cert_x));
318 retvm_if(info == NULL, PMINFO_R_ERROR, "Out of Memory!!!");
320 ret = __open_manifest_db(uid, true);
321 if (ret != SQLITE_OK) {
322 _LOGE("connect db [%s] failed!\n", getUserPkgParserDBPathUID(uid));
323 ret = PMINFO_R_ERROR;
327 snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_app_info where app_id='%s')", lhs_app_id);
329 sqlite3_exec(GET_DB(manifest_db), query, __validate_cb, (void *)&exist, &error_message)) {
330 _LOGE("Don't execute query = %s error message = %s\n", query,
332 ret = PMINFO_R_ERROR;
339 snprintf(query, MAX_QUERY_LEN, "select package from package_app_info where app_id='%s' ", lhs_app_id);
341 sqlite3_exec(GET_DB(manifest_db), query, __cert_cb, (void *)info, &error_message)) {
342 _LOGE("Don't execute query = %s error message = %s\n", query,
344 ret = PMINFO_R_ERROR;
347 lpkgid = strdup(info->pkgid);
348 if (lpkgid == NULL) {
349 _LOGE("Out of Memory\n");
350 ret = PMINFO_R_ERROR;
357 snprintf(query, MAX_QUERY_LEN, "select exists(select * from package_app_info where app_id='%s')", rhs_app_id);
359 sqlite3_exec(GET_DB(manifest_db), query, __validate_cb, (void *)&exist, &error_message)) {
360 _LOGE("Don't execute query = %s error message = %s\n", query,
362 ret = PMINFO_R_ERROR;
369 snprintf(query, MAX_QUERY_LEN, "select package from package_app_info where app_id='%s' ", rhs_app_id);
371 sqlite3_exec(GET_DB(manifest_db), query, __cert_cb, (void *)info, &error_message)) {
372 _LOGE("Don't execute query = %s error message = %s\n", query,
374 ret = PMINFO_R_ERROR;
377 rpkgid = strdup(info->pkgid);
378 if (rpkgid == NULL) {
379 _LOGE("Out of Memory\n");
380 ret = PMINFO_R_ERROR;
386 ret = pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(lpkgid, rpkgid, uid, compare_result);
389 sqlite3_free(error_message);
390 __close_manifest_db();
410 API int pkgmgrinfo_pkginfo_create_certinfo(pkgmgrinfo_certinfo_h *handle)
412 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
413 pkgmgr_certinfo_x *certinfo = NULL;
414 certinfo = calloc(1, sizeof(pkgmgr_certinfo_x));
416 retvm_if(certinfo == NULL, PMINFO_R_ERROR, "Malloc Failed\n");
417 *handle = (void *)certinfo;
421 static int _pkginfo_get_cert(sqlite3 *db, int cert_id[],
424 static const char query[] =
425 "SELECT cert_info FROM package_cert_index_info WHERE cert_id=?";
430 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
431 if (ret != SQLITE_OK) {
432 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
433 return PMINFO_R_ERROR;
436 for (i = 0; i < MAX_CERT_TYPE; i++) {
437 ret = sqlite3_bind_int(stmt, 1, cert_id[i]);
438 if (ret != SQLITE_OK) {
439 sqlite3_finalize(stmt);
440 _LOGE("bind failed: %s", sqlite3_errmsg(db));
441 return PMINFO_R_ERROR;
444 ret = sqlite3_step(stmt);
445 if (ret == SQLITE_DONE) {
447 sqlite3_clear_bindings(stmt);
449 } else if (ret != SQLITE_ROW) {
450 _LOGE("step failed: %s", sqlite3_errmsg(db));
451 sqlite3_finalize(stmt);
452 return PMINFO_R_ERROR;
455 _save_column_str(stmt, 0, (const char **)&cert_info[i]);
457 sqlite3_clear_bindings(stmt);
460 sqlite3_finalize(stmt);
465 static int _pkginfo_get_certid(sqlite3 *db, const char *pkgid, int cert_id[])
467 static const char query[] =
468 "SELECT author_root_cert, author_im_cert, author_signer_cert, "
469 "dist_root_cert, dist_im_cert, dist_signer_cert, "
470 "dist2_root_cert, dist2_im_cert, dist2_signer_cert "
471 "FROM package_cert_info WHERE package=?";
476 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
477 if (ret != SQLITE_OK) {
478 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
479 return PMINFO_R_ERROR;
482 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_STATIC);
483 if (ret != SQLITE_OK) {
484 _LOGE("bind failed: %s", sqlite3_errmsg(db));
485 sqlite3_finalize(stmt);
486 return PMINFO_R_ERROR;
489 ret = sqlite3_step(stmt);
490 if (ret == SQLITE_DONE) {
491 sqlite3_finalize(stmt);
492 return PMINFO_R_ENOENT;
493 } else if (ret != SQLITE_ROW) {
494 _LOGE("step failed: %s", sqlite3_errmsg(db));
495 sqlite3_finalize(stmt);
496 return PMINFO_R_ERROR;
500 _save_column_int(stmt, idx++, &cert_id[PMINFO_AUTHOR_ROOT_CERT]);
501 _save_column_int(stmt, idx++,
502 &cert_id[PMINFO_AUTHOR_INTERMEDIATE_CERT]);
503 _save_column_int(stmt, idx++, &cert_id[PMINFO_AUTHOR_SIGNER_CERT]);
504 _save_column_int(stmt, idx++, &cert_id[PMINFO_DISTRIBUTOR_ROOT_CERT]);
505 _save_column_int(stmt, idx++,
506 &cert_id[PMINFO_DISTRIBUTOR_INTERMEDIATE_CERT]);
507 _save_column_int(stmt, idx++, &cert_id[PMINFO_DISTRIBUTOR_SIGNER_CERT]);
508 _save_column_int(stmt, idx++, &cert_id[PMINFO_DISTRIBUTOR2_ROOT_CERT]);
509 _save_column_int(stmt, idx++,
510 &cert_id[PMINFO_DISTRIBUTOR2_INTERMEDIATE_CERT]);
511 _save_column_int(stmt, idx++,
512 &cert_id[PMINFO_DISTRIBUTOR2_SIGNER_CERT]);
514 sqlite3_finalize(stmt);
519 static int _pkginfo_get_certinfo(const char *pkgid, uid_t uid,
520 pkgmgr_certinfo_x *info)
526 dbpath = getUserPkgCertDBPathUID(uid);
528 return PMINFO_R_ERROR;
530 ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READONLY, NULL);
531 if (ret != SQLITE_OK) {
532 _LOGE("failed to open db: %d", ret);
533 return PMINFO_R_ERROR;
536 ret = _pkginfo_get_certid(db, pkgid, info->cert_id);
537 if (ret != PMINFO_R_OK) {
538 sqlite3_close_v2(db);
542 ret = _pkginfo_get_cert(db, info->cert_id, info->cert_info);
543 if (ret != PMINFO_R_OK) {
544 sqlite3_close_v2(db);
551 API int pkgmgrinfo_pkginfo_load_certinfo(const char *pkgid, pkgmgrinfo_certinfo_h handle, uid_t uid)
554 pkgmgr_certinfo_x *info = (pkgmgr_certinfo_x *)handle;
556 if (pkgid == NULL || handle == NULL) {
557 _LOGE("invalid parameter");
558 return PMINFO_R_EINVAL;
561 ret = _pkginfo_get_certinfo(pkgid, uid, info);
562 if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
563 ret = _pkginfo_get_certinfo(pkgid, GLOBAL_USER, info);
565 if (ret != PMINFO_R_OK)
566 _LOGE("failed to get certinfo of %s for user %d", pkgid, uid);
571 API int pkgmgrinfo_pkginfo_get_cert_value(pkgmgrinfo_certinfo_h handle, pkgmgrinfo_cert_type cert_type, const char **cert_value)
573 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
574 retvm_if(cert_value == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
575 retvm_if(cert_type < PMINFO_AUTHOR_ROOT_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n");
576 retvm_if(cert_type > PMINFO_DISTRIBUTOR2_SIGNER_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n");
577 pkgmgr_certinfo_x *certinfo = NULL;
578 certinfo = (pkgmgr_certinfo_x *)handle;
579 if ((certinfo->cert_info)[cert_type])
580 *cert_value = (certinfo->cert_info)[cert_type];
586 API int pkgmgrinfo_pkginfo_destroy_certinfo(pkgmgrinfo_certinfo_h handle)
588 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
590 pkgmgr_certinfo_x *certinfo = NULL;
591 certinfo = (pkgmgr_certinfo_x *)handle;
592 if (certinfo->pkgid) {
593 free(certinfo->pkgid);
594 certinfo->pkgid = NULL;
596 for (i = 0; i < MAX_CERT_TYPE; i++) {
597 if ((certinfo->cert_info)[i]) {
598 free((certinfo->cert_info)[i]);
599 (certinfo->cert_info)[i] = NULL;
607 API int pkgmgrinfo_create_certinfo_set_handle(pkgmgrinfo_instcertinfo_h *handle)
609 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
610 pkgmgr_instcertinfo_x *certinfo = NULL;
612 certinfo = calloc(1, sizeof(pkgmgr_instcertinfo_x));
613 retvm_if(certinfo == NULL, PMINFO_R_ERROR, "Malloc Failed\n");
614 *handle = (void *)certinfo;
618 API int pkgmgrinfo_set_cert_value(pkgmgrinfo_instcertinfo_h handle, pkgmgrinfo_instcert_type cert_type, char *cert_value)
620 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
621 retvm_if(cert_value == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
622 retvm_if(cert_type < PMINFO_SET_AUTHOR_ROOT_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n");
623 retvm_if(cert_type > PMINFO_SET_DISTRIBUTOR2_SIGNER_CERT, PMINFO_R_EINVAL, "Invalid certificate type\n");
624 pkgmgr_instcertinfo_x *certinfo = NULL;
625 certinfo = (pkgmgr_instcertinfo_x *)handle;
626 (certinfo->cert_info)[cert_type] = strdup(cert_value);
630 static int _pkginfo_save_cert_info(sqlite3 *db, const char *pkgid,
633 static const char query[] =
634 "INSERT OR REPLACE INTO package_cert_info (package,"
635 " author_root_cert, author_im_cert, author_signer_cert,"
636 " dist_root_cert, dist_im_cert, dist_signer_cert,"
637 " dist2_root_cert, dist2_im_cert, dist2_signer_cert) "
640 " (SELECT cert_id FROM package_cert_index_info"
641 " WHERE cert_info=?),"
642 " (SELECT author_root_cert FROM package_cert_info"
643 " WHERE package=?))),"
645 " (SELECT cert_id FROM package_cert_index_info"
646 " WHERE cert_info=?),"
647 " (SELECT author_im_cert FROM package_cert_info"
648 " WHERE package=?))),"
650 " (SELECT cert_id FROM package_cert_index_info"
651 " WHERE cert_info=?),"
652 " (SELECT author_signer_cert FROM package_cert_info"
653 " WHERE package=?))),"
655 " (SELECT cert_id FROM package_cert_index_info"
656 " WHERE cert_info=?),"
657 " (SELECT dist_root_cert FROM package_cert_info"
658 " WHERE package=?))),"
660 " (SELECT cert_id FROM package_cert_index_info"
661 " WHERE cert_info=?),"
662 " (SELECT dist_im_cert FROM package_cert_info"
663 " WHERE package=?))),"
665 " (SELECT cert_id FROM package_cert_index_info"
666 " WHERE cert_info=?),"
667 " (SELECT dist_signer_cert FROM package_cert_info"
668 " WHERE package=?))),"
670 " (SELECT cert_id FROM package_cert_index_info"
671 " WHERE cert_info=?),"
672 " (SELECT dist2_root_cert FROM package_cert_info"
673 " WHERE package=?))),"
675 " (SELECT cert_id FROM package_cert_index_info"
676 " WHERE cert_info=?),"
677 " (SELECT dist2_im_cert FROM package_cert_info"
678 " WHERE package=?))),"
680 " (SELECT cert_id FROM package_cert_index_info"
681 " WHERE cert_info=?),"
682 " (SELECT dist2_signer_cert FROM package_cert_info"
683 " WHERE package=?))))";
689 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
690 if (ret != SQLITE_OK) {
691 _LOGE("prepare error: %s", sqlite3_errmsg(db));
692 return PMINFO_R_ERROR;
696 sqlite3_bind_text(stmt, idx++, pkgid, -1, SQLITE_STATIC);
697 for (i = 0; i < MAX_CERT_TYPE; i++) {
698 ret = sqlite3_bind_text(stmt, idx++, cert_info[i], -1,
700 if (ret != SQLITE_OK) {
701 _LOGE("bind error: %s", sqlite3_errmsg(db));
702 sqlite3_finalize(stmt);
703 return PMINFO_R_ERROR;
705 ret = sqlite3_bind_text(stmt, idx++, pkgid, -1,
707 if (ret != SQLITE_OK) {
708 _LOGE("bind error: %s", sqlite3_errmsg(db));
709 sqlite3_finalize(stmt);
710 return PMINFO_R_ERROR;
713 ret = sqlite3_step(stmt);
714 sqlite3_finalize(stmt);
715 if (ret != SQLITE_DONE) {
716 _LOGE("step error: %s", sqlite3_errmsg(db));
717 return PMINFO_R_ERROR;
723 static int _pkginfo_save_cert_index_info(sqlite3 *db, char *cert_info[])
725 static const char query[] =
726 "INSERT OR REPLACE INTO package_cert_index_info "
727 "(cert_info, cert_id, cert_ref_count) "
730 " (SELECT cert_id FROM package_cert_index_info "
731 " WHERE cert_info=?), "
733 " ((SELECT cert_ref_count FROM package_cert_index_info "
734 " WHERE cert_info=?) + 1), 1))";
740 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
741 if (ret != SQLITE_OK) {
742 _LOGE("prepare error: %s", sqlite3_errmsg(db));
743 return PMINFO_R_ERROR;
746 for (i = 0; i < MAX_CERT_TYPE; i++) {
747 if (cert_info[i] == NULL)
750 sqlite3_bind_text(stmt, idx++, cert_info[i], -1, SQLITE_STATIC);
751 sqlite3_bind_text(stmt, idx++, cert_info[i], -1, SQLITE_STATIC);
752 sqlite3_bind_text(stmt, idx++, cert_info[i], -1, SQLITE_STATIC);
754 ret = sqlite3_step(stmt);
755 if (ret != SQLITE_DONE) {
756 _LOGE("step failed: %s", sqlite3_errmsg(db));
757 sqlite3_finalize(stmt);
758 return PMINFO_R_ERROR;
762 sqlite3_clear_bindings(stmt);
765 sqlite3_finalize(stmt);
770 API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h handle, uid_t uid)
775 pkgmgr_instcertinfo_x *info = (pkgmgr_instcertinfo_x *)handle;
777 if (pkgid == NULL || handle == NULL) {
778 _LOGE("invalid parameter");
779 return PMINFO_R_EINVAL;
782 dbpath = getUserPkgCertDBPathUID(uid);
784 return PMINFO_R_ERROR;
786 ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READWRITE, NULL);
787 if (ret != SQLITE_OK) {
788 _LOGE("failed to open db: %d", ret);
789 return PMINFO_R_ERROR;
792 ret = sqlite3_exec(db, "BEGIN EXCLUSIVE", NULL, NULL, NULL);
793 if (ret != SQLITE_OK) {
794 _LOGE("failed to begin transaction");
795 sqlite3_close_v2(db);
796 return PMINFO_R_ERROR;
799 _check_create_cert_db(db);
801 if (_pkginfo_save_cert_index_info(db, info->cert_info)) {
802 _LOGE("failed to save cert index info");
803 sqlite3_close_v2(db);
804 return PMINFO_R_ERROR;
806 if (_pkginfo_save_cert_info(db, pkgid, info->cert_info)) {
807 _LOGE("failed to save cert info");
808 sqlite3_close_v2(db);
809 return PMINFO_R_ERROR;
812 ret = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
813 if (ret != SQLITE_OK) {
814 _LOGE("failed to commit transaction, rollback now");
815 sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
816 sqlite3_close_v2(db);
817 return PMINFO_R_ERROR;
820 sqlite3_close_v2(db);
825 API int pkgmgrinfo_destroy_certinfo_set_handle(pkgmgrinfo_instcertinfo_h handle)
827 retvm_if(handle == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
829 pkgmgr_instcertinfo_x *certinfo = NULL;
830 certinfo = (pkgmgr_instcertinfo_x *)handle;
831 if (certinfo->pkgid) {
832 free(certinfo->pkgid);
833 certinfo->pkgid = NULL;
835 for (i = 0; i < MAX_CERT_TYPE; i++) {
836 if ((certinfo->cert_info)[i]) {
837 free((certinfo->cert_info)[i]);
838 (certinfo->cert_info)[i] = NULL;
846 static int _pkginfo_delete_certinfo(sqlite3 *db, const char *pkgid)
848 static const char query[] =
849 "DELETE FROM package_cert_info WHERE package=?";
853 ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
854 if (ret != SQLITE_OK) {
855 _LOGE("prepare error: %s", sqlite3_errmsg(db));
856 return PMINFO_R_ERROR;
859 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_STATIC);
860 if (ret != SQLITE_OK) {
861 _LOGE("bind error: %s", sqlite3_errmsg(db));
862 sqlite3_finalize(stmt);
863 return PMINFO_R_ERROR;
866 ret = sqlite3_step(stmt);
867 sqlite3_finalize(stmt);
868 if (ret != SQLITE_DONE) {
869 _LOGE("step error: %s", sqlite3_errmsg(db));
870 return PMINFO_R_ERROR;
876 API int pkgmgrinfo_delete_usr_certinfo(const char *pkgid, uid_t uid)
883 _LOGE("invalid parameter");
884 return PMINFO_R_EINVAL;
887 dbpath = getUserPkgCertDBPathUID(uid);
889 return PMINFO_R_ERROR;
891 ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READWRITE, NULL);
892 if (ret != SQLITE_OK) {
893 _LOGE("failed to open db: %d", ret);
894 return PMINFO_R_ERROR;
897 ret = sqlite3_exec(db, "BEGIN EXCLUSIVE", NULL, NULL, NULL);
898 if (ret != SQLITE_OK) {
899 _LOGE("failed to begin transaction");
900 sqlite3_close_v2(db);
901 return PMINFO_R_ERROR;
904 if (_pkginfo_delete_certinfo(db, pkgid))
905 _LOGE("failed to delete certinfo of %s", pkgid);
907 ret = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
908 if (ret != SQLITE_OK) {
909 _LOGE("failed to commit transaction, rollback now");
910 sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
911 sqlite3_close_v2(db);
912 return PMINFO_R_ERROR;
915 sqlite3_close_v2(db);
920 API int pkgmgrinfo_delete_certinfo(const char *pkgid)
922 return pkgmgrinfo_delete_usr_certinfo(pkgid, GLOBAL_USER);