[Common] Added privilege implementation using Cynara.
authorPawel Andruszkiewicz <p.andruszkie@samsung.com>
Wed, 20 May 2015 14:29:59 +0000 (16:29 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Fri, 22 May 2015 10:04:25 +0000 (19:04 +0900)
[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 <p.andruszkie@samsung.com>
packaging/webapi-plugins.spec
src/common/common.gyp
src/common/extension.cc

index 046c6e64aed9a3c9086619b50381c43871fc7fc2..4f79b5b1532f685ac7b5657b2e2b6b7303f73d6a 100755 (executable)
@@ -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
index 9dede318016d13c77817e9b3c51377c10c13ccf1..24337873a137b0691d9a68db38caf0670b5ab51b 100644 (file)
@@ -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',
                 ],
               },
             }],
index ea9d4979c6acf54b541b8f0e23c7488b30712c5d..6fa97f5fddbc8fe1079ac940ae6bd0266b7250bf 100644 (file)
 #elif PRIVILEGE_USE_ACE
 #include <privilege_checker.h>
 #elif PRIVILEGE_USE_CYNARA
-// TODO
+#include <unistd.h>
+
+#include <cynara/cynara-client.h>
+#include <sys/smack.h>
 #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<std::string>& 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