Implement checking policies with Cynara 23/26923/4
authorRafal Krypa <r.krypa@samsung.com>
Tue, 2 Sep 2014 09:45:51 +0000 (11:45 +0200)
committerRafal Krypa <r.krypa@samsung.com>
Fri, 12 Sep 2014 15:02:24 +0000 (17:02 +0200)
Support calling libcynara-client to check for applications permissions.

Change-Id: Icb44dc9a24f0ef519863075203b3be8eb0b07c2c
Signed-off-by: Rafal Krypa <r.krypa@samsung.com>
packaging/security-manager.spec
src/server/CMakeLists.txt
src/server/service/cynara.cpp
src/server/service/include/cynara.h

index c4552c9..4f36bc5 100644 (file)
@@ -20,6 +20,7 @@ BuildRequires: pkgconfig(libtzplatform-config)
 BuildRequires: pkgconfig(sqlite3)
 BuildRequires: pkgconfig(db-util)
 BuildRequires: pkgconfig(cynara-admin)
+BuildRequires: pkgconfig(cynara-client)
 BuildRequires: boost-devel
 %{?systemd_requires}
 
index 8595111..8049cbe 100644 (file)
@@ -7,6 +7,7 @@ PKG_CHECK_MODULES(SERVER_DEP
     sqlite3
     db-util
     cynara-admin
+    cynara-client
     )
 
 FIND_PACKAGE(Boost REQUIRED)
index 6050444..6db3e9e 100644 (file)
@@ -208,5 +208,45 @@ void CynaraAdmin::UpdatePackagePolicy(
     cynaraAdmin.SetPolicies(policies);
 }
 
+static bool checkCynaraError(int result, const std::string &msg)
+{
+    // TODO: Cynara client error codes are being currently refactored
+    // This function must be updated when the refactor is finished.
+    switch (result) {
+        case CYNARA_API_SUCCESS:
+            return true;
+        case CYNARA_API_ACCESS_DENIED:
+            return false;
+        case CYNARA_API_OUT_OF_MEMORY:
+            ThrowMsg(CynaraException::OutOfMemory, msg);
+        case CYNARA_API_INVALID_PARAM:
+            ThrowMsg(CynaraException::InvalidParam, msg);
+        case CYNARA_API_SERVICE_NOT_AVAILABLE:
+            ThrowMsg(CynaraException::ServiceNotAvailable, msg);
+        default:
+            ThrowMsg(CynaraException::UnknownError, msg);
+    }
+}
+
+Cynara::Cynara()
+{
+    checkCynaraError(
+        cynara_initialize(&m_Cynara, nullptr),
+        "Cannot connect to Cynara policy interface.");
+}
+
+Cynara::~Cynara()
+{
+    cynara_finish(m_Cynara);
+}
+
+bool Cynara::check(const std::string &label, const std::string &privilege,
+        const std::string &user, const std::string &session)
+{
+    return checkCynaraError(
+        cynara_check(m_Cynara,
+            label.c_str(), session.c_str(), user.c_str(), privilege.c_str()),
+        "Cannot check permission with Cynara.");
+}
 
 } // namespace SecurityManager
index 187b53f..c660a2e 100644 (file)
@@ -24,6 +24,7 @@
 #ifndef _SECURITY_MANAGER_CYNARA_
 #define _SECURITY_MANAGER_CYNARA_
 
+#include <cynara-client.h>
 #include <cynara-admin.h>
 #include <dpl/exception.h>
 #include <string>
@@ -106,6 +107,29 @@ private:
     struct cynara_admin *m_CynaraAdmin;
 };
 
+class Cynara
+{
+public:
+    Cynara();
+    virtual ~Cynara();
+
+    /**
+     * Ask Cynara for permission.
+     *
+     * @param label application Smack label
+     * @param privilege privilege identifier
+     * @param user user identifier (uid)
+     * @param session session identifier
+     * @return true if access is permitted, false if denied
+     */
+    bool check(const std::string &label, const std::string &privilege,
+        const std::string &user, const std::string &session);
+
+private:
+    struct cynara *m_Cynara;
+};
+
+
 } // namespace SecurityManager
 
 #endif // _SECURITY_MANAGER_CYNARA_