#include <bundle.h>
#include <map>
+#include <vector>
+#include "common/capability.h"
+#include "common/db_manager.h"
#include "common/utils/logging.h"
namespace {
return true;
}
+bool AppControlManager::CheckRemoteAppControl(const std::string& device_id,
+ const unsigned char* appcontrol, size_t len) {
+ bundle* b = bundle_decode(appcontrol, len);
+ if (!b) {
+ LOG(ERROR) << "Invalid bundle data!";
+ return false;
+ }
+
+ const char* appid_cstr = aul_svc_get_appid(b);
+ if (!appid_cstr) {
+ LOG(ERROR) << "Failed to get appid!";
+ bundle_free(b);
+ return false;
+ }
+
+ std::string appid(appid_cstr);
+ std::vector<Capability> cap_list = DBManager::SelectCapabilites(device_id);
+ for (auto& cap : cap_list) {
+ if (appid == cap.appid()) {
+ LOG(INFO) << "Found the appcontrol!";
+ bundle_free(b);
+ return true;
+ }
+ }
+
+ LOG(ERROR) << "Invalid appcontrol!";
+ bundle_free(b);
+ return false;
+}
+
int AppControlManager::AulHandler(aul_type type, bundle* kb, void* data) {
return 0;
}
#include <boost/signals2.hpp>
#include <functional>
+#include <string>
#include "common/capability.h"
+#include "common/capability_manager.h"
namespace capmgr {
}
bool LaunchApplication(const unsigned char* bundle_data, size_t len,
void* data);
+ bool CheckRemoteAppControl(const std::string& device_id,
+ const unsigned char* appcontrol, size_t len);
private:
class AppControlReplyHandler {
const char kQueryDeleteCap[] =
"DELETE FROM capabilities WHERE device_id=? AND operation=? AND uri=? AND "
" mime=? AND appid=?";
+const char kQuerySelectCap[] =
+ "SELECT operation, uri, mime, appid, pkgid FROM capabilities "
+ "WHERE device_id=?";
const char kQueryInsertRemoteApp[] =
"INSERT INTO remote_app_info (device_id, appid, pkgid, label, version) "
"VALUES (?, ?, ?, ?, ?)";
return true;
}
+std::vector<Capability> DBManager::SelectCapabilites(
+ const std::string& device_id) {
+ auto guard = Instance().sql_conn_->GetTransactionGuard();
+ std::shared_ptr<SQLStatement> stmt = Instance().sql_conn_->PrepareStatement(
+ kQuerySelectCap);
+ if (!stmt) {
+ LOG(ERROR) << "Failed to prepare statement";
+ return {};
+ }
+
+ if (!stmt->BindString(1, device_id))
+ return {};
+
+ std::vector<Capability> cap_list;
+ while (stmt->Step() == SQLStatement::StepResult::ROW) {
+ int idx = 0;
+ std::string operation = stmt->GetColumnString(idx++);
+ std::string uri = stmt->GetColumnString(idx++);
+ std::string mime = stmt->GetColumnString(idx++);
+ std::string appid = stmt->GetColumnString(idx++);
+ std::string pkgid = stmt->GetColumnString(idx++);
+
+ Capability cap(operation, uri, mime, appid, pkgid);
+ cap_list.push_back(cap);
+ }
+
+ return cap_list;
+}
+
bool DBManager::InsertRemotePackage(const std::string& device_id,
const RemotePackageInfo& remote_pkg_info) {
auto guard = Instance().sql_conn_->GetTransactionGuard();
const std::vector<Capability>& caps);
static bool DeleteCapability(const std::string& device_id,
const Capability& cap);
+ static std::vector<Capability> SelectCapabilites(
+ const std::string& device_id);
static bool InsertRemotePackage(const std::string& device_id,
const RemotePackageInfo& remote_pkg_info);
static bool DeleteRemotePackage(const std::string& device_id,
int MDGManager::SendAppControl(const std::string& device_id,
const unsigned char* appcontrol, size_t len) {
+ if (!AppControlManager::GetAppControlManager().CheckRemoteAppControl(
+ device_id, appcontrol, len))
+ return -1;
+
return SendData(device_id, Command::SEND_APPCONTROL, appcontrol, len);
}