}
static int _parse_support_type(xmlNode* node, sqlite3* db, const char* pkgid,
- const char* appid, const char* providerid, int period) {
+ const char* appid, const char* providerid, int period, bool trusted) {
int ret;
int idx;
int support_type = 0;
static const char query[] =
"INSERT INTO complication_provider ( "
- "pkgid, appid, provider_id, period, "
+ "pkgid, appid, provider_id, trusted, period, "
"support_type, default_data) "
- "VALUES (?, ?, ?, ?, ?, ?)";
+ "VALUES (?, ?, ?, ?, ?, ?, ?)";
if (node->children == NULL)
return -1;
sqlite3_bind_text(stmt, idx++, pkgid, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, idx++, appid, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, idx++, providerid, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_int(stmt, idx++, trusted ? 1 : 0);
sqlite3_bind_int(stmt, idx++, period);
sqlite3_bind_int(stmt, idx++, support_type);
sqlite3_bind_text(stmt, idx, (char*)raw, -1, SQLITE_TRANSIENT);
}
static int _parse_complication(xmlNode* node, sqlite3* db, const char* pkgid,
- const char* appid, const char* providerid, const char* setup_appid) {
+ const char* appid, const char* providerid, const char* setup_appid, bool trusted) {
int period = -1;
xmlNode* tmp = NULL;
}
if (_parse_support_type(support_type_node, db, pkgid,
- appid, providerid, period)) {
+ appid, providerid, period, trusted)) {
LOGE("parse support type fail");
return -1;
}
char* appid;
char* providerid;
char* setup_appid;
+ char* trusted_str;
+ bool trusted;
xmlNode* tmp;
sqlite3* db;
}
setup_appid = _get_attribute(tmp, "setup-appid");
+ trusted_str = _get_attribute(tmp, "trusted");
+ if (trusted_str != NULL && strcasecmp(trusted_str, "true") == 0)
+ trusted = true;
+ else
+ trusted = false;
if (_parse_complication(tmp, db, pkgid, appid,
- providerid, setup_appid)) {
+ providerid, setup_appid, trusted)) {
LOGE("parse complication error");
sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
if (setup_appid)
free(setup_appid);
+ if (trusted_str)
+ free(trusted_str);
goto out;
}
if (setup_appid)
free(setup_appid);
+ if (trusted_str)
+ free(trusted_str);
}
}
#include <cynara-client.h>
#include <cynara-creds-gdbus.h>
#include <cynara-session.h>
+#include <pkgmgr-info.h>
#include <system_info.h>
#include <string>
+#include <map>
#include "watchface-common/watchface-util.h"
#include "watchface-common/include/watchface-common.h"
#define MAX_PACKAGE_STR_SIZE 512
#define SMACK_LABEL_LEN 255
+#define MAX_CACHE_COUNT 10
#define LOG_TAG "WATCHFACE_COMPLICATION"
}
}
+ bool CheckCertificate(const std::string& provider_app_id) {
+ static std::map<std::string, bool> cache;
+ bool ret;
+
+ auto cp = cache.find(provider_app_id);
+ if (cp != cache.end())
+ return cp->second;
+
+ pkgmgrinfo_cert_compare_result_type_e res;
+ char* app_id = GetAppID();
+ int cert_ret = pkgmgrinfo_pkginfo_compare_usr_app_cert_info(app_id,
+ provider_app_id.c_str(), getuid(), &res);
+ if (cert_ret < 0) {
+ LOGE("CheckCertificate() Failed %d", cert_ret);
+ return false;
+ }
+ if (res == PMINFO_CERT_COMPARE_MATCH) {
+ ret = true;
+ } else {
+ ret = false;
+ LOGI("CheckCertificate() Failed : CERTIFICATE_NOT_MATCH");
+ }
+
+ if (cache.size() >= MAX_CACHE_COUNT)
+ cache.clear();
+
+ cache[provider_app_id] = ret;
+
+ return ret;
+ }
+
+ char* GetAppID() {
+ int pid = getpid();
+ int ret = 0;
+ char buffer[MAX_PACKAGE_STR_SIZE] = {0, };
+ static char* app_id = NULL;
+
+ if (app_id == NULL) {
+ ret = aul_app_get_appid_bypid(pid, buffer, sizeof(buffer));
+ if (ret != AUL_R_OK) {
+ LOGE("Failed to get the application ID: %d", ret);
+ return NULL;
+ }
+
+ app_id = strdup(buffer);
+ }
+
+ return app_id;
+ }
} // namespace util
} // namespace watchface_complication
#include <vconf.h>
#include "watchface-complication/db-manager.h"
+#include "watchface-common/watchface-util.h"
#ifdef LOG_TAG
#undef LOG_TAG
sqlite3_stmt* stmt;
sqlite3* db;
int ret;
+ int trusted;
+ std::string provider_app_id;
static const char query[] =
- "SELECT default_data FROM complication_provider "
+ "SELECT trusted, appid, default_data FROM complication_provider "
"WHERE provider_id=? AND support_type=?";
db = OpenDB();
sqlite3_bind_int(stmt, 2, support_type);
if (sqlite3_step(stmt) == SQLITE_ROW) {
- raw_data = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0));
+ trusted = sqlite3_column_int(stmt, 0);
+ provider_app_id = std::string((char*)sqlite3_column_text(stmt, 1));
+ if (trusted &&
+ util::CheckCertificate(provider_app_id) == false) {
+ sqlite3_finalize(stmt);
+ CloseDB(db);
+ return nullptr;
+ }
+ raw_data = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 2));
default_data = std::unique_ptr<Bundle>(new Bundle(std::string(raw_data)));
}
bool DBManager::IsProviderExist(std::string& provider_id,
int support_type) {
int ret;
- std::string appid;
sqlite3_stmt* stmt = NULL;
sqlite3* db;
bool is_exist = false;
+ int trusted;
+ std::string provider_app_id;
static const char query[] =
- "SELECT DISTINCT appid FROM complication_provider "
+ "SELECT trusted, appid FROM complication_provider "
"WHERE provider_id=? AND support_type=?";
db = OpenDB();
sqlite3_bind_text(stmt, 1, provider_id.c_str(), -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, support_type);
- if (sqlite3_step(stmt) == SQLITE_ROW)
- is_exist = true;
+ if (sqlite3_step(stmt) == SQLITE_ROW) {
+ trusted = sqlite3_column_int(stmt, 0);
+ provider_app_id = std::string((char*)sqlite3_column_text(stmt, 1));
+ if (trusted &&
+ util::CheckCertificate(provider_app_id) == false)
+ is_exist = false;
+ else
+ is_exist = true;
+ }
sqlite3_finalize(stmt);
CloseDB(db);
std::string DBManager::GetProviderAppId(const char* provider_id) {
int ret;
- std::string appid;
sqlite3_stmt* stmt = NULL;
sqlite3* db;
+ int trusted;
+ std::string provider_app_id;
static const char query[] =
- "SELECT DISTINCT appid FROM complication_provider "
+ "SELECT trusted, appid FROM complication_provider "
"WHERE provider_id=?";
db = OpenDB();
sqlite3_bind_text(stmt, 1, provider_id, -1, SQLITE_TRANSIENT);
- if (sqlite3_step(stmt) == SQLITE_ROW)
- appid = std::string((char*)sqlite3_column_text(stmt, 0));
+ if (sqlite3_step(stmt) == SQLITE_ROW) {
+ trusted = sqlite3_column_int(stmt, 0);
+ provider_app_id = std::string((char*)sqlite3_column_text(stmt, 1));
+ if (trusted &&
+ util::CheckCertificate(provider_app_id) == false) {
+ sqlite3_finalize(stmt);
+ CloseDB(db);
+ return std::string();
+ }
+ }
sqlite3_finalize(stmt);
CloseDB(db);
- return appid;
+ return provider_app_id;
}
std::list<std::unique_ptr<DBManager::ProviderInfo>>
DBManager::GetProviderListWithTypes(int supported_types) {
int ret;
char* provider_id = NULL;
- int types = 0;
+ int type = 0;
sqlite3_stmt* stmt;
sqlite3* db = NULL;
std::list<std::unique_ptr<DBManager::ProviderInfo>> provider_list;
+ int trusted;
+ std::string provider_app_id;
static const char query[] =
- "SELECT provider_id, SUM(support_type) FROM complication_provider "
- "WHERE (support_type & ?) > 0 GROUP BY provider_id";
+ "SELECT trusted, appid, provider_id, support_type FROM complication_provider "
+ "WHERE (support_type & ?) > 0";
db = OpenDB();
if (db == NULL) {
sqlite3_bind_int(stmt, 1, supported_types);
while (sqlite3_step(stmt) == SQLITE_ROW) {
- provider_id = (char*)sqlite3_column_text(stmt, 0);
- types = sqlite3_column_int(stmt, 1);
+ trusted = sqlite3_column_int(stmt, 0);
+ provider_app_id = std::string((char*)sqlite3_column_text(stmt, 1));
+ if (trusted && util::CheckCertificate(provider_app_id) == false)
+ continue;
+
+ provider_id = (char*)sqlite3_column_text(stmt, 2);
+ type = sqlite3_column_int(stmt, 3);
provider_list.emplace_back(
- std::unique_ptr<ProviderInfo>(new ProviderInfo(provider_id, types)));
+ std::unique_ptr<ProviderInfo>(new ProviderInfo(provider_id, type)));
}
if (stmt)
sqlite3_stmt* stmt;
sqlite3* db;
std::list<std::string> provider_list;
+ int trusted;
+ std::string provider_app_id;
static const char query[] =
- "SELECT DISTINCT provider_id FROM complication_provider "
+ "SELECT trusted, appid, provider_id FROM complication_provider "
"WHERE support_type=?";
db = OpenDB();
sqlite3_bind_int(stmt, 1, support_type);
while (sqlite3_step(stmt) == SQLITE_ROW) {
- provider_id = (char*)sqlite3_column_text(stmt, 0);
+ trusted = sqlite3_column_int(stmt, 0);
+ provider_app_id = std::string((char*)sqlite3_column_text(stmt, 1));
+ if (trusted && util::CheckCertificate(provider_app_id) == false)
+ continue;
+
+ provider_id = (char*)sqlite3_column_text(stmt, 2);
provider_list.push_back(std::string(provider_id));
}
}
std::list<std::string> DBManager::GetProviderListWithAppId(
- const char* provider_id) {
+ const char* provider_app_id) {
int ret;
char* provider = NULL;
sqlite3_stmt* stmt;
return provider_list;
}
- sqlite3_bind_text(stmt, 1, provider_id, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text(stmt, 1, provider_app_id, -1, SQLITE_TRANSIENT);
while (sqlite3_step(stmt) == SQLITE_ROW) {
provider = (char*)sqlite3_column_text(stmt, 0);
int supported_types = 0;
sqlite3_stmt* stmt;
sqlite3* db;
+ int trusted;
+ std::string provider_app_id;
static const char query[] =
- "SELECT SUM(support_type) FROM complication_provider "
+ "SELECT trusted, appid, SUM(support_type) FROM complication_provider "
"WHERE provider_id = ?";
db = OpenDB();
sqlite3_bind_text(stmt, 1, provider_id.c_str(), -1, SQLITE_TRANSIENT);
- while (sqlite3_step(stmt) == SQLITE_ROW)
- supported_types = sqlite3_column_int(stmt, 0);
+ if (sqlite3_step(stmt) == SQLITE_ROW) {
+ trusted = sqlite3_column_int(stmt, 0);
+ provider_app_id = std::string((char*)sqlite3_column_text(stmt, 1));
+ if (trusted && util::CheckCertificate(provider_app_id) == false)
+ supported_types = 0;
+ else
+ supported_types = sqlite3_column_int(stmt, 2);
+ }
sqlite3_finalize(stmt);
CloseDB(db);
return path;
}
+int DBManager::GetTrustedInfo(std::string& provider_id, bool* trusted) {
+ int ret = WATCHFACE_COMPLICATION_ERROR_NONE;
+ int trusted_info;
+ sqlite3_stmt* stmt;
+ sqlite3* db;
+
+ static const char query[] =
+ "SELECT trusted FROM complication_provider "
+ "WHERE provider_id = ?";
+
+ db = OpenDB();
+ if (db == NULL) {
+ LOGE("parser db not exist");
+ return WATCHFACE_COMPLICATION_ERROR_DB;
+ }
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query),
+ &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ LOGE("prepare error: %s", sqlite3_errmsg(db));
+ CloseDB(db);
+ return WATCHFACE_COMPLICATION_ERROR_DB;
+ }
+
+ sqlite3_bind_text(stmt, 1, provider_id.c_str(), -1, SQLITE_TRANSIENT);
+
+ if (sqlite3_step(stmt) == SQLITE_ROW) {
+ trusted_info = sqlite3_column_int(stmt, 0);
+ if (trusted_info == 0)
+ *trusted = false;
+ else if (trusted_info == 1)
+ *trusted = true;
+ else
+ ret = WATCHFACE_COMPLICATION_ERROR_DB;
+ } else {
+ ret = WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+ }
+
+ sqlite3_finalize(stmt);
+ CloseDB(db);
+
+ return ret;
+}
+
} // namespace watchface_complication