Add cynara external plugins 64/27464/13
authorZofia Abramowska <z.abramowska@samsung.com>
Thu, 18 Sep 2014 16:37:40 +0000 (18:37 +0200)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 16 Oct 2014 10:05:26 +0000 (03:05 -0700)
Add interface for creating external cynara plugin to enable custom
policy types support.

Change-Id: I43bd31a3e48f9667964107dd243f2286e7ffae8a

packaging/cynara.spec
pkgconfig/CMakeLists.txt
pkgconfig/cynara-plugin/CMakeLists.txt [new file with mode: 0644]
pkgconfig/cynara-plugin/cynara-plugin.pc.in [new file with mode: 0644]
src/common/CMakeLists.txt
src/include/CMakeLists.txt
src/include/cynara-plugin.h [new file with mode: 0644]

index c25347f..6abd205 100644 (file)
@@ -141,6 +141,14 @@ Requires:   libcynara-commons = %{version}-%{release}
 cynara common library (devel) with common functionalities
 
 #######################################################
+%package -n libcynara-plugin-devel
+Summary:    Cynara - cynara plugin library (devel)
+Requires:   libcynara-commons-devel = %{version}-%{release}
+
+%description -n libcynara-plugin-devel
+cynara plugin library (devel) with plugin definitions
+
+#######################################################
 %package -n libcynara-creds-commons
 Summary:    Base library for cynara credentials helpers
 
@@ -451,8 +459,14 @@ fi
 %{_libdir}/libcynara-commons.so.*
 
 %files -n libcynara-commons-devel
+%{_includedir}/cynara/types/PolicyResult.h
+%{_includedir}/cynara/types/PolicyType.h
 %{_libdir}/libcynara-commons.so
 
+%files -n libcynara-plugin-devel
+%{_includedir}/cynara/cynara-plugin.h
+%{_libdir}/pkgconfig/cynara-plugin.pc
+
 %files -n cynara-tests
 %manifest cynara-tests.manifest
 %attr(755,root,root) /usr/bin/cynara-tests
index 9d4600f..a93ae55 100644 (file)
@@ -23,4 +23,5 @@ ADD_SUBDIRECTORY(cynara-admin)
 ADD_SUBDIRECTORY(cynara-creds-commons)
 ADD_SUBDIRECTORY(cynara-creds-dbus)
 ADD_SUBDIRECTORY(cynara-creds-socket)
+ADD_SUBDIRECTORY(cynara-plugin)
 ADD_SUBDIRECTORY(cynara-session)
diff --git a/pkgconfig/cynara-plugin/CMakeLists.txt b/pkgconfig/cynara-plugin/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1ea74a5
--- /dev/null
@@ -0,0 +1,25 @@
+# Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+# @file        CMakeLists.txt
+# @author      Zofia Abramowska <z.abramowska@samsung.com>
+#
+
+CONFIGURE_FILE(cynara-plugin.pc.in cynara-plugin.pc @ONLY)
+
+INSTALL(FILES
+    ${CMAKE_BINARY_DIR}/pkgconfig/cynara-plugin/cynara-plugin.pc
+    DESTINATION
+    ${LIB_INSTALL_DIR}/pkgconfig
+    )
diff --git a/pkgconfig/cynara-plugin/cynara-plugin.pc.in b/pkgconfig/cynara-plugin/cynara-plugin.pc.in
new file mode 100644 (file)
index 0000000..c14de16
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=@LIB_INSTALL_DIR@
+includedir=${prefix}/include
+
+Name: cynara-plugin
+Description: Cynara plugin definition package
+Version: @CYNARA_VERSION@
+Requires:
+Libs: -L${libdir} -lcynara-commons
+Cflags: -I${includedir}/cynara
index 461450a..77c7d56 100644 (file)
@@ -82,3 +82,8 @@ TARGET_LINK_LIBRARIES(${TARGET_CYNARA_COMMON}
     )
 
 INSTALL(TARGETS ${TARGET_CYNARA_COMMON} DESTINATION ${LIB_INSTALL_DIR})
+INSTALL(FILES
+    ${COMMON_PATH}/types/PolicyResult.h
+    ${COMMON_PATH}/types/PolicyType.h
+    DESTINATION ${INCLUDE_INSTALL_DIR}/cynara/types
+    )
index 1be6e10..cb9d00c 100644 (file)
@@ -26,6 +26,7 @@ INSTALL(FILES
     ${CYNARA_PATH}/include/cynara-creds-commons.h
     ${CYNARA_PATH}/include/cynara-creds-dbus.h
     ${CYNARA_PATH}/include/cynara-creds-socket.h
+    ${CYNARA_PATH}/include/cynara-plugin.h
     ${CYNARA_PATH}/include/cynara-session.h
     DESTINATION ${INCLUDE_INSTALL_DIR}/cynara
     )
diff --git a/src/include/cynara-plugin.h b/src/include/cynara-plugin.h
new file mode 100644 (file)
index 0000000..83956fe
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/**
+ * @file        src/include/cynara-plugin.h
+ * @author      Zofia Abramowska <z.abramowska@samsung.com>
+ * @version     1.0
+ * @brief       This file defines cynara side external plugin interface
+ */
+
+#ifndef CYNARA_PLUGIN_H_
+#define CYNARA_PLUGIN_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include <types/PolicyResult.h>
+#include <types/PolicyType.h>
+
+namespace Cynara {
+
+class ExternalPluginInterface;
+
+extern "C" {
+typedef ExternalPluginInterface *(*createPlugin)(void);
+}
+
+//These typedefs will be defined in external headers
+typedef std::string PluginData;
+typedef std::string AgentType;
+typedef std::vector<PolicyType> PolicyTypes;
+
+/**
+ * A class defining external plugins interface.
+ * These plugins work inside of cynara and either can produce
+ * response through check instantly or require communication
+ * with given type of agent. Agent must be registered through
+ * cynara-agent API.
+ */
+
+class ExternalPluginInterface {
+public:
+    /**
+     * Enum indicating status of calling plugin method.
+     */
+    enum class PluginStatus {
+        SUCCESS,                /** < update() finished successfully*/
+        ANSWER_READY,           /** < check() returns answer immediately through argument*/
+        ANSWER_NOTREADY,        /** < check() cannot return answer immediately,
+                                    < communication with agent is required */
+        ERROR                   /** < either check() or update() fails */
+    };
+
+    /**
+     * Policy type supported by plugin.
+     */
+    virtual PolicyTypes getSupportedPolicyTypes(void) = 0;
+
+    /**
+     * Asks plugin, what kind of permission does client, user and privilege has.
+     *
+     * @param[in] client
+     * @param[in] user
+     * @param[in] privilege
+     * @param[out] result        Immediate response (if available)
+     * @param[out] requiredAgent When ANSWER_NOTREADY, required AgentType to communicate with
+     * @param[out] pluginData    Additional data, that will be passed to agent
+     * @return PluginStatus      In case of success - either ANSWER_READY or ANSWER_NOTREADY,
+     *                           in case of error - ERROR
+     */
+    virtual PluginStatus check(const std::string &client, const std::string &user,
+                               const std::string &privilege, PolicyResult &result,
+                               AgentType &requiredAgent, PluginData &pluginData) noexcept = 0;
+
+    /**
+     * Updates response returned by agent
+     * @param[in] client
+     * @param[in] user
+     * @param[in] privilege
+     * @param[in] agentData   Additional data, passed from agent
+     * @param[out] result     Response interpreted from agent
+     * @return PluginStatus   In case of success - SUCCESS, in case of error - ERROR
+     */
+    virtual PluginStatus update(const std::string &client, const std::string &user,
+                                const std::string &privilege, const PluginData &agentData,
+                                PolicyResult &result) noexcept = 0;
+
+    virtual ~ExternalPluginInterface() {};
+
+};
+
+} // namespace Cynara
+
+#endif /* CYNARA_PLUGIN_H_ */