2 * Copyright (c) 2023 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
24 #include <sys/smack.h>
25 #include <linux/limits.h>
31 #include "pkgmgrinfo_basic.h"
32 #include "pkgmgrinfo_private.h"
33 #include "pkgmgrinfo_internal.h"
34 #include "pkgmgrinfo_debug.h"
35 #include "pkgmgr-info.h"
39 int GetCertInfo(const tizen_base::Database& db, int cert_id[],
41 auto q = tizen_base::Database::Sql(
43 "FROM package_cert_index_info WHERE cert_id=?");
44 auto r = db.Prepare(q);
46 _LOGE("db.Prepare() failed: %s", static_cast<const char*>(r));
47 return PMINFO_R_ERROR;
50 for (int i = 0; i < MAX_CERT_TYPE; i++) {
51 q.Reset().Bind(cert_id[i]);
53 _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
54 return PMINFO_R_ERROR;
57 auto rec = r.GetFirstRecord();
60 std::string str = static_cast<std::string>(rec->Get(0));
61 cert_info[i] = strdup(str.c_str());
67 int GetCertId(const tizen_base::Database& db,
68 std::string_view pkgid, int (&cert_id)[MAX_CERT_TYPE]) {
69 auto q = std::move(tizen_base::Database::Sql(
70 "SELECT author_root_cert, author_im_cert, "
71 "author_signer_cert, dist_root_cert, "
72 "dist_im_cert, dist_signer_cert, dist2_root_cert, "
73 "dist2_im_cert, dist2_signer_cert "
74 "FROM package_cert_info WHERE package=?")
75 .Bind(std::string(pkgid)));
79 _LOGE("Exec failed: %s", static_cast<const char*>(r));
80 return PMINFO_R_ERROR;
83 auto rec = r.GetFirstRecord();
85 return PMINFO_R_ERROR;
87 for (int i = 0; i < MAX_CERT_TYPE; i++) {
88 std::optional<int> id = rec->Get(i);
98 int GetCert(const tizen_base::Database& db,
99 std::string_view pkgid, pkgmgr_certinfo_x* info) {
102 ret = GetCertId(db, pkgid, info->cert_id);
103 if (ret != PMINFO_R_OK)
106 ret = GetCertInfo(db, info->cert_id, info->cert_info);
107 if (ret != PMINFO_R_OK)
113 int SaveCertIndex(const tizen_base::Database& db,
115 auto q = tizen_base::Database::Sql(
116 "INSERT OR REPLACE INTO package_cert_index_info "
117 "(cert_info, cert_id, cert_ref_count) "
120 " (SELECT cert_id FROM package_cert_index_info "
121 " WHERE cert_info=?), "
123 " ((SELECT cert_ref_count FROM package_cert_index_info "
124 " WHERE cert_info=?) + 1), 1))");
125 auto r = db.Prepare(q);
127 _LOGE("db.Prepare() failed: %s", static_cast<const char*>(r));
128 return PMINFO_R_ERROR;
131 for (int i = 0; i < MAX_CERT_TYPE; i++) {
132 if (cert_info[i] == nullptr)
138 if (!db.Exec(q, r)) {
139 _LOGE("db.Exec() failed: %s", static_cast<const char*>(r));
140 return PMINFO_R_ERROR;
147 int SaveCertInfo(const tizen_base::Database& db,
148 std::string_view pkgid, char* cert_info[]) {
149 auto q_insert = std::move(tizen_base::Database::Sql(
150 "INSERT OR REPLACE INTO package_cert_info (package,"
151 " author_root_cert, author_im_cert, author_signer_cert,"
152 " dist_root_cert, dist_im_cert, dist_signer_cert,"
153 " dist2_root_cert, dist2_im_cert, dist2_signer_cert) "
155 " (SELECT cert_id FROM package_cert_index_info"
156 " WHERE cert_info=?),"
157 " (SELECT cert_id FROM package_cert_index_info"
158 " WHERE cert_info=?),"
159 " (SELECT cert_id FROM package_cert_index_info"
160 " WHERE cert_info=?),"
161 " (SELECT cert_id FROM package_cert_index_info"
162 " WHERE cert_info=?),"
163 " (SELECT cert_id FROM package_cert_index_info"
164 " WHERE cert_info=?),"
165 " (SELECT cert_id FROM package_cert_index_info"
166 " WHERE cert_info=?),"
167 " (SELECT cert_id FROM package_cert_index_info"
168 " WHERE cert_info=?),"
169 " (SELECT cert_id FROM package_cert_index_info"
170 " WHERE cert_info=?),"
171 " (SELECT cert_id FROM package_cert_index_info"
172 " WHERE cert_info=?))")
173 .Bind(std::string(pkgid)));
175 for (int i = 0; i < MAX_CERT_TYPE; i++)
176 q_insert.Bind(cert_info[i]);
178 auto r = db.Exec(q_insert);
179 if (static_cast<int>(r) != SQLITE_DONE) {
180 _LOGE("error: %s", static_cast<const char*>(r));
181 return PMINFO_R_ERROR;
189 namespace pkgmgr_server::internal {
191 int CertInfoGet(const tizen_base::Database& db,
192 std::string_view pkgid, uid_t uid, pkgmgrinfo_certinfo_h certinfo) {
193 pkgmgr_certinfo_x* info = static_cast<pkgmgr_certinfo_x*>(certinfo);
195 if (pkgid.empty() || certinfo == nullptr)
196 return PMINFO_R_EINVAL;
200 ret = GetCert(db, pkgid, info);
201 if (ret != PMINFO_R_OK)
202 _LOGE("failed to get certinfo of %s ", pkgid.data());
203 } catch (const tizen_base::DbException& e) {
204 _LOGE("Exception: %s", e.msg());
205 return PMINFO_R_ERROR;
211 int CertInfoSet(const tizen_base::Database& db,
212 std::string_view pkgid, pkgmgrinfo_instcertinfo_h handle, uid_t uid) {
213 pkgmgr_certinfo_x* info = static_cast<pkgmgr_certinfo_x*>(handle);
215 if (pkgid.empty() || handle == nullptr) {
216 _LOGE("invalid parameter");
217 return PMINFO_R_EINVAL;
221 auto guard = db.CreateTransactionGuard();
223 if (SaveCertIndex(db, info->cert_info)) {
224 _LOGE("failed to save cert index info, rollback now");
225 return PMINFO_R_ERROR;
228 if (SaveCertInfo(db, pkgid, info->cert_info)) {
229 _LOGE("failed to save cert info, rollback now");
230 return PMINFO_R_ERROR;
234 } catch (const tizen_base::DbException& e) {
235 _LOGE("Exception: %s", e.msg());
236 return PMINFO_R_ERROR;
242 } // namespace pkgmgr_server::internal