From: Pawel Andruszkiewicz Date: Wed, 20 May 2015 14:29:59 +0000 (+0200) Subject: [Common] Added privilege implementation using Cynara. X-Git-Tag: submit/tizen_mobile/20150612.133019^2~2^2~126^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b9b0f7b7882f87f2382b7aaa06d703d6ebaeb249;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Common] Added privilege implementation using Cynara. [Verificiation] Common module compiled with 3.0 repository (http://download.tizen.org/snapshots/tizen/mobile/latest/repos/arm-wayland/packages/). Change-Id: I1d807f0c621bdac4481145d1ca534fcb8987da1d Signed-off-by: Pawel Andruszkiewicz --- diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index 046c6e64..4f79b5b1 100755 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -19,6 +19,8 @@ Source0: %{name}-%{version}.tar.gz #################################################################### %if "%{?tizen_profile_name}" == "mobile" +%define tizen_privilege_engine ACE + %define tizen_feature_account_support 1 %define tizen_feature_alarm_support 1 %define tizen_feature_application_support 1 @@ -128,6 +130,8 @@ Source0: %{name}-%{version}.tar.gz #################################################################### %if "%{?tizen_profile_name}" == "wearable" +%define tizen_privilege_engine ACE + # Account API is optional in Tizen Wearable Profile. %define tizen_feature_account_support 0 @@ -225,6 +229,8 @@ Source0: %{name}-%{version}.tar.gz #################################################################### %if "%{?tizen_profile_name}" == "tv" +%define tizen_privilege_engine ACE + %define tizen_feature_account_support 0 %define tizen_feature_alarm_support 1 %define tizen_feature_application_support 1 @@ -310,7 +316,15 @@ BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-appfw-package-manager) BuildRequires: pkgconfig(capi-content-media-content) BuildRequires: pkgconfig(capi-media-metadata-extractor) + +%if "%{?tizen_privilege_engine}" == "ACE" BuildRequires: pkgconfig(capi-security-privilege-manager) +%endif + +%if "%{?tizen_privilege_engine}" == "CYNARA" +BuildRequires: pkgconfig(cynara-client) +BuildRequires: pkgconfig(libsmack) +%endif %if 0%{?tizen_feature_account_support} BuildRequires: pkgconfig(accounts-svc) @@ -444,7 +458,7 @@ Tizen Web APIs implemented. %build export GYP_GENERATORS='ninja' -GYP_OPTIONS="--depth=. -Dtizen=1 -Dextension_build_type=Debug -Dextension_host_os=%{profile} -Dprivilege_engine=ACE" +GYP_OPTIONS="--depth=. -Dtizen=1 -Dextension_build_type=Debug -Dextension_host_os=%{profile} -Dprivilege_engine=%{tizen_privilege_engine}" GYP_OPTIONS="$GYP_OPTIONS -Ddisplay_type=x11" # feature flags diff --git a/src/common/common.gyp b/src/common/common.gyp index 9dede318..24337873 100644 --- a/src/common/common.gyp +++ b/src/common/common.gyp @@ -65,7 +65,6 @@ 'defines': ['PRIVILEGE_USE_ACE'], 'variables': { 'packages': [ - 'sqlite3', 'capi-security-privilege-manager', ], }, @@ -74,6 +73,8 @@ 'defines': ['PRIVILEGE_USE_CYNARA'], 'variables': { 'packages': [ + 'cynara-client', + 'libsmack', ], }, }], diff --git a/src/common/extension.cc b/src/common/extension.cc index ea9d4979..6fa97f5f 100644 --- a/src/common/extension.cc +++ b/src/common/extension.cc @@ -15,7 +15,10 @@ #elif PRIVILEGE_USE_ACE #include #elif PRIVILEGE_USE_CYNARA -// TODO +#include + +#include +#include #endif #include "common/logger.h" @@ -462,19 +465,66 @@ class AccessControlImpl { class AccessControlImpl { public: - AccessControlImpl() { + AccessControlImpl() : cynara_(nullptr) { LoggerD("Privilege access checked using Cynara."); - // TODO + + char* smack_label = nullptr; + int ret = smack_new_label_from_self(&smack_label); + + if (0 == ret && nullptr != smack_label) { + auto uid = getuid(); + + SLoggerD("uid: [%u]", uid); + SLoggerD("smack label: [%s]", smack_label); + + uid_ = std::to_string(uid); + smack_label_ = smack_label; + + free(smack_label); + } else { + LoggerE("Failed to get smack label"); + return; + } + + ret = cynara_initialize(&cynara_, nullptr); + if (CYNARA_API_SUCCESS != ret) { + LoggerE("Failed to initialize Cynara"); + cynara_ = nullptr; + } } ~AccessControlImpl() { - // TODO + if (cynara_) { + auto ret = cynara_finish(cynara_); + if (CYNARA_API_SUCCESS != ret) { + LoggerE("Failed to finalize Cynara"); + } + cynara_ = nullptr; + } } bool CheckAccess(const std::vector& privileges) { - // TODO - return false; + if (cynara_) { + for (const auto& privilege : privileges) { + if (CYNARA_API_ACCESS_ALLOWED != cynara_simple_check(cynara_, // p_cynara + smack_label_.c_str(), // client + "", // client_session + uid_.c_str(), // user + privilege.c_str() // privilege + )) { + return false; + } + } + return true; + } else { + return false; + } } + + private: + cynara* cynara_; + std::string uid_; + std::string smack_label_; }; #else