#include "common/logger.h"
#include "common/picojson.h"
-#include "common/task-queue.h"
namespace extension {
namespace ppm {
const std::string kPPMCheckResultAllow = "PPM_ALLOW";
const std::string kPPMCheckResultDeny = "PPM_DENY";
const std::string kPPMCheckResultAsk = "PPM_ASK";
+const std::string kPPMCheckRequestResultAllowForever = "PPM_ALLOW_FOREVER";
+const std::string kPPMCheckRequestResultDenyForever = "PPM_DENY_FOREVER";
+const std::string kPPMCheckRequestResultDenyOnce = "PPM_DENY_ONCE";
}
+struct ResponseCallbackData {
+ PPMInstance* _instance;
+ double callbackId;
+};
+
PPMInstance::PPMInstance() {
ScopeLogger();
using std::placeholders::_1;
ScopeLogger();
}
-common::PlatformResult PPMInstance::convertError(int err,
- const std::string& message) {
+common::PlatformResult PPMInstance::convertError(int err, const std::string& message) {
ScopeLogger();
char* error = nullptr;
error = (char*)message.c_str();
}
- switch(err) {
+ switch (err) {
case PRIVACY_PRIVILEGE_MANAGER_ERROR_INVALID_PARAMETER:
return common::PlatformResult(common::ErrorCode::INVALID_VALUES_ERR, error);
case PRIVACY_PRIVILEGE_MANAGER_ERROR_IO_ERROR:
case PRIVACY_PRIVILEGE_MANAGER_ERROR_ALREADY_IN_PROGRESS:
case PRIVACY_PRIVILEGE_MANAGER_ERROR_OUT_OF_MEMORY:
case PRIVACY_PRIVILEGE_MANAGER_ERROR_UNKNOWN:
- return common::PlatformResult(common::ErrorCode::ABORT_ERR, message);
+ return common::PlatformResult(common::ErrorCode::ABORT_ERR, error);
default:
- return common::PlatformResult(common::ErrorCode::ABORT_ERR, "Unknown error.");
+ return common::PlatformResult(common::ErrorCode::ABORT_ERR, "Abort error.");
}
}
std::string PPMInstance::CheckResultToString(ppm_check_result_e result) {
ScopeLogger();
- switch(result) {
+ switch (result) {
case PRIVACY_PRIVILEGE_MANAGER_CHECK_RESULT_ALLOW:
return kPPMCheckResultAllow;
- case PRIVACY_PRIVILEGE_MANAGER_CHECK_RESULT_DENY:
- return kPPMCheckResultDeny;
case PRIVACY_PRIVILEGE_MANAGER_CHECK_RESULT_ASK:
return kPPMCheckResultAsk;
+ case PRIVACY_PRIVILEGE_MANAGER_CHECK_RESULT_DENY:
default:
return kPPMCheckResultDeny;
}
}
+std::string PPMInstance::CheckRequestResultToString(ppm_request_result_e result) {
+ ScopeLogger();
+
+ switch (result) {
+ case PRIVACY_PRIVILEGE_MANAGER_REQUEST_RESULT_ALLOW_FOREVER:
+ return kPPMCheckRequestResultAllowForever;
+ case PRIVACY_PRIVILEGE_MANAGER_REQUEST_RESULT_DENY_FOREVER:
+ return kPPMCheckRequestResultDenyForever;
+ case PRIVACY_PRIVILEGE_MANAGER_REQUEST_RESULT_DENY_ONCE:
+ default:
+ return kPPMCheckRequestResultDenyOnce;
+ }
+}
+
+void PPMInstance::ResponseCallback(ppm_call_cause_e cause, ppm_request_result_e result,
+ const char* privilege, void* user_data) {
+ ScopeLogger();
+
+ std::unique_ptr<ResponseCallbackData> data{static_cast<ResponseCallbackData*>(user_data)};
+
+ picojson::value event = picojson::value(picojson::object());
+ picojson::object& obj = event.get<picojson::object>();
+
+ obj.insert(std::make_pair("callbackId", picojson::value(data->callbackId)));
+
+ if (PRIVACY_PRIVILEGE_MANAGER_CALL_CAUSE_ANSWER == cause) {
+ obj.insert(std::make_pair("result", picojson::value(CheckRequestResultToString(result))));
+ obj.insert(std::make_pair("privilege", picojson::value(privilege)));
+ } else {
+ LogAndReportError(
+ common::PlatformResult(common::ErrorCode::ABORT_ERR, "Get callback data failed"), &obj);
+ }
+ common::Instance::PostMessage(data->_instance, event.serialize().c_str());
+}
+
void PPMInstance::checkPermission(const picojson::value& args, picojson::object& out) {
ScopeLogger();
const std::string& privilege = args.get("privilege").get<std::string>();
int ret = ppm_check_permission(privilege.c_str(), &result);
if (PRIVACY_PRIVILEGE_MANAGER_ERROR_NONE != ret) {
- LogAndReportError(convertError(ret), &out, ("checkPermission error: %d (%s)",
- ret, get_error_message(ret)));
+ LogAndReportError(convertError(ret), &out,
+ ("checkPermission error: %d (%s)", ret, get_error_message(ret)));
return;
}
- ReportSuccess(picojson::value(CheckResultToString(result)),out);
+ ReportSuccess(picojson::value(CheckResultToString(result)), out);
}
void PPMInstance::requestPermission(const picojson::value& args, picojson::object& out) {
const std::string& privilege = args.get("privilege").get<std::string>();
LoggerD("Requesting privilege: %s ", privilege.c_str());
- auto get = [this, privilege,
- callback_id](const std::shared_ptr<picojson::value>& response) -> void {
- ScopeLogger("Entered into asynchronous function, get");
-
- picojson::object& obj = response->get<picojson::object>();
+ ResponseCallbackData* user_data{new ResponseCallbackData()};
+ user_data->_instance = this;
+ user_data->callbackId = callback_id;
- ReportSuccess(obj);
- obj.insert(std::make_pair("callbackId", picojson::value(callback_id)));
- Instance::PostMessage(this, response->serialize().c_str());
- };
+ int ret =
+ ppm_request_permission(privilege.c_str(), ResponseCallback, static_cast<void*>(user_data));
- auto data = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
+ if (PRIVACY_PRIVILEGE_MANAGER_ERROR_NONE != ret) {
+ LogAndReportError(convertError(ret), &out,
+ ("checkPermission error: %d (%s)", ret, get_error_message(ret)));
+ return;
+ }
- common::TaskQueue::GetInstance().Async<picojson::value>(get, data);
+ ReportSuccess(out);
}
} // namespace ppm