From: Lukasz Bardeli Date: Tue, 2 Oct 2018 10:06:01 +0000 (+0200) Subject: [PPM] Add checkPermissions and requestPermissions implementation X-Git-Tag: submit/tizen/20181010.065230~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1f2402d32999ac360e5adc427e6813e7fc0b306a;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [PPM] Add checkPermissions and requestPermissions implementation Added two new methods to ProvacyPrivilegeManager [Verification] Code compiles without error. Tested in console var p = ["http://tizen.org/privilege/filesystem.read", "http://tizen.org/privilege/alarm"]; var a = tizen.ppm.checkPermissions(p); for(v in a){ alert(a[v].privilege+" - "+ a[v].type); } function permissionSuccess(result) { for(v in result){ alert(result[v].privilege+" - "+ result[v].result); } } var p = ["http://tizen.org/privilege/contact.read", "http://tizen.org/privilege/contact.write"]; tizen.ppm.requestPermissions(p, permissionSuccess); Change-Id: I21e00110d99b832e56035ed375d6b5af75a890c2 Signed-off-by: Lukasz Bardeli --- diff --git a/src/ppm/ppm_api.js b/src/ppm/ppm_api.js index 6bc52a06..3193a7df 100644 --- a/src/ppm/ppm_api.js +++ b/src/ppm/ppm_api.js @@ -23,6 +23,13 @@ var native_ = new xwalk.utils.NativeManager(extension); function PPMManager() { } +function RequestStatus(privilege, result_) { + Object.defineProperties(this, { + privilege : {value: privilege, writable: false}, + result : {value: result_, writable: false} + }); +}; + PPMManager.prototype.checkPermission = function() { var args = validator_.validateArgs(arguments, [ { name: 'privilege', type: types_.STRING } @@ -41,6 +48,32 @@ PPMManager.prototype.checkPermission = function() { return native_.getResultObject(result); }; +PPMManager.prototype.checkPermissions = function() { + var args = validator_.validateArgs(arguments, [ + { name: 'privileges', type: types_.ARRAY, values: types_.STRING } + ]); + + var callArgs = { + privileges: args.privileges + }; + + var result = native_.callSync('PPMManager_checkPermissions', callArgs); + + var data = []; + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } else { + var obj = native_.getResultObject(result); + + obj.forEach(function (o) { + data.push({'privilege':o.privilege, 'type':o.type}); + }); + } + + return data; +}; + PPMManager.prototype.requestPermission = function() { var args = validator_.validateArgs(arguments, [ { name: 'privilege', type: types_.STRING }, @@ -67,5 +100,37 @@ PPMManager.prototype.requestPermission = function() { } }; +PPMManager.prototype.requestPermissions = function() { + var args = validator_.validateArgs(arguments, [ + { name: 'privileges', type: types_.ARRAY, values: types_.STRING }, + { name: 'successCallback', type: types_.FUNCTION }, + { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true } + ]); + + var callback = function(result) { + if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + } else { + var data = []; + var obj = native_.getResultObject(result); + + obj.forEach(function (o) { + data.push(new RequestStatus(o.privilege, o.result)); + }); + args.successCallback(data); + } + }; + + var callArgs = { + privileges: args.privileges + }; + + var result = native_.call('PPMManager_requestPermissions', callArgs, callback); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } +}; + // Exports exports = new PPMManager(); \ No newline at end of file diff --git a/src/ppm/ppm_instance.cc b/src/ppm/ppm_instance.cc index 7f419a32..5e3c7515 100644 --- a/src/ppm/ppm_instance.cc +++ b/src/ppm/ppm_instance.cc @@ -46,7 +46,9 @@ PPMInstance::PPMInstance() { #define REGISTER(c, x) RegisterSyncHandler(c, std::bind(&PPMInstance::x, this, _1, _2)); REGISTER("PPMManager_checkPermission", checkPermission); + REGISTER("PPMManager_checkPermissions", checkPermissions); REGISTER("PPMManager_requestPermission", requestPermission); + REGISTER("PPMManager_requestPermissions", requestPermissions); #undef REGISTER } @@ -127,6 +129,37 @@ void PPMInstance::ResponseCallback(ppm_call_cause_e cause, ppm_request_result_e common::Instance::PostMessage(data->_instance, event.serialize().c_str()); } +void PPMInstance::ResponseMultipleCallback(ppm_call_cause_e cause, const ppm_request_result_e *result, + const char** privileges, size_t privileges_count, void* user_data) { + ScopeLogger(); + + std::unique_ptr data{static_cast(user_data)}; + + picojson::value event = picojson::value(picojson::object()); + picojson::object& obj = event.get(); + + obj.insert(std::make_pair("callbackId", picojson::value(data->callbackId))); + + if (PRIVACY_PRIVILEGE_MANAGER_CALL_CAUSE_ANSWER == cause) { + picojson::value result_array = picojson::value(picojson::array()); + picojson::array& array_obj = result_array.get(); + + for (size_t i = 0; i < privileges_count; i++) { + picojson::value result_elem = picojson::value(picojson::object()); + picojson::object& obj = result_elem.get(); + obj["privilege"] = picojson::value(privileges[i]); + obj["result"] = picojson::value(CheckRequestResultToString(result[i])); + array_obj.push_back(result_elem); + } + obj.insert(std::make_pair("result", result_array)); + } 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(); @@ -145,6 +178,45 @@ void PPMInstance::checkPermission(const picojson::value& args, picojson::object& ReportSuccess(picojson::value(CheckResultToString(result)), out); } +void PPMInstance::checkPermissions(const picojson::value& args, picojson::object& out) { + ScopeLogger(); + + const picojson::array& privileges = args.get("privileges").get(); + unsigned int size = static_cast(privileges.size()); + + std::vector privilege_array; + size_t i = 0; + + for (auto iter = privileges.begin(); iter != privileges.end(); ++iter, ++i) { + privilege_array.push_back(iter->get().c_str()); + } + + std::vector results(size); + int ret = ppm_check_permissions(privilege_array.data(), size, results.data()); + + if (PRIVACY_PRIVILEGE_MANAGER_ERROR_NONE != ret) { + LogAndReportError(convertError(ret), &out, + ("checkPermission error: %d (%s)", ret, get_error_message(ret))); + + return; + } + + picojson::value result_array = picojson::value(picojson::array()); + picojson::array& array_obj = result_array.get(); + + for (size_t i = 0; i < size; i++) { + picojson::value result_elem = picojson::value(picojson::object()); + picojson::object& obj = result_elem.get(); + + obj["privilege"] = picojson::value(privilege_array[i]); + obj["type"] = picojson::value(CheckResultToString(results[i])); + + array_obj.push_back(result_elem); + } + + ReportSuccess(result_array, out); +} + void PPMInstance::requestPermission(const picojson::value& args, picojson::object& out) { ScopeLogger(); @@ -169,5 +241,36 @@ void PPMInstance::requestPermission(const picojson::value& args, picojson::objec ReportSuccess(out); } +void PPMInstance::requestPermissions(const picojson::value& args, picojson::object& out) { + ScopeLogger(); + + const double callback_id = args.get("callbackId").get(); + + const picojson::array& privileges = args.get("privileges").get(); + unsigned int size = static_cast(privileges.size()); + + std::vector privilege_array; + size_t i = 0; + + for (auto iter = privileges.begin(); iter != privileges.end(); ++iter, ++i) { + privilege_array.push_back(iter->get().c_str()); + } + + ResponseCallbackData* user_data{new ResponseCallbackData()}; + user_data->_instance = this; + user_data->callbackId = callback_id; + + int ret = + ppm_request_permissions(privilege_array.data(), size, ResponseMultipleCallback, static_cast(user_data)); + + if (PRIVACY_PRIVILEGE_MANAGER_ERROR_NONE != ret) { + LogAndReportError(convertError(ret), &out, + ("checkPermission error: %d (%s)", ret, get_error_message(ret))); + return; + } + + ReportSuccess(out); +} + } // namespace ppm } // namespace extension diff --git a/src/ppm/ppm_instance.h b/src/ppm/ppm_instance.h index 9d1825ce..3a2103ff 100644 --- a/src/ppm/ppm_instance.h +++ b/src/ppm/ppm_instance.h @@ -34,14 +34,19 @@ class PPMInstance : public common::ParsedInstance { virtual ~PPMInstance(); private: - void checkPermission(const picojson::value& args, picojson::object& out); + void checkPermission(const picojson::value& args, picojson::object& out);\ + void checkPermissions(const picojson::value& args, picojson::object& out); void requestPermission(const picojson::value& args, picojson::object& out); + void requestPermissions(const picojson::value& args, picojson::object& out); static common::PlatformResult convertError(int err, const std::string& message = ""); static std::string CheckResultToString(ppm_check_result_e result); static std::string CheckRequestResultToString(ppm_request_result_e result); static void ResponseCallback(ppm_call_cause_e cause, ppm_request_result_e result, const char* privilege, void* user_data); + static void ResponseMultipleCallback(ppm_call_cause_e cause, const ppm_request_result_e* result, + const char** privileges, size_t privileges_count, + void* user_data); }; } // namespace ppm