Add ApiInterface for libcynara-admin 32/24632/1
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 17 Jul 2014 11:28:08 +0000 (13:28 +0200)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 17 Jul 2014 11:58:26 +0000 (13:58 +0200)
Implement ApiInterface in Logic class with stub functions.
Interpret CAPI parameters and use ApiInterface in admin-api.cpp.

Change-Id: I2fb617e23fe00a7183281e666388c4153c3d00f0

src/admin/api/ApiInterface.h
src/admin/api/admin-api.cpp
src/admin/logic/Logic.cpp
src/admin/logic/Logic.h

index 5a9acbc..9c513f6 100644 (file)
 #ifndef SRC_ADMIN_API_APIINTERFACE_H_
 #define SRC_ADMIN_API_APIINTERFACE_H_
 
+#include <map>
 #include <string>
+#include <vector>
+
+#include <types/Policy.h>
+#include <types/PolicyBucketId.h>
+#include <types/PolicyKey.h>
+#include <types/PolicyResult.h>
 
 #include <cynara-admin.h>
 
@@ -33,6 +40,12 @@ class ApiInterface {
 public:
     ApiInterface() = default;
     virtual ~ApiInterface() = default;
+
+    virtual int setPolicies(const std::map<PolicyBucketId, std::vector<Policy>> &insertOrUpdate,
+                    const std::map<PolicyBucketId, std::vector<PolicyKey>> &remove) noexcept = 0;
+    virtual int insertOrUpdateBucket(const PolicyBucketId &bucket, const PolicyResult &policyResult)
+                    noexcept = 0;
+    virtual int removeBucket(const PolicyBucketId &bucket) noexcept = 0;
 };
 
 } // namespace Cynara
index 0809232..5c2e2e6 100644 (file)
  * @brief       Implementation of external libcynara-admin API
  */
 
+#include <map>
 #include <new>
+#include <string>
+#include <vector>
 
 #include <common.h>
+#include <types/Policy.h>
+#include <types/PolicyBucketId.h>
+#include <types/PolicyKey.h>
+#include <types/PolicyResult.h>
+#include <types/PolicyType.h>
+
 #include <cynara-admin.h>
 
 #include <api/ApiInterface.h>
@@ -67,25 +76,79 @@ int cynara_admin_set_policies(struct cynara_admin *p_cynara_admin,
     if (!policies)
         return CYNARA_ADMIN_API_INVALID_PARAM;
 
-    //todo This is a stub. Parameters should be passed to p_cynara_admin->impl
-    return CYNARA_ADMIN_API_SUCCESS;
+    std::map<Cynara::PolicyBucketId, std::vector<Cynara::Policy>> insertOrUpdate;
+    std::map<Cynara::PolicyBucketId, std::vector<Cynara::PolicyKey>> remove;
+
+    auto key = ([](const cynara_admin_policy *i)->Cynara::PolicyKey {
+        std::string wildcard(CYNARA_ADMIN_WILDCARD);
+
+        auto feature = ([&wildcard] (const char *str)->Cynara::PolicyKeyFeature {
+            if (wildcard.compare(str))
+                return Cynara::PolicyKeyFeature::create(str);
+            else
+                return Cynara::PolicyKeyFeature::createWildcard();
+        });
+
+        return Cynara::PolicyKey(feature(i->client), feature(i->user), feature(i->privilege));
+    });
+
+    try {
+        for (auto i = policies[0]; i; i++) {
+            if(!i->bucket || !i->client || !i->user || !i->privilege)
+                return CYNARA_ADMIN_API_INVALID_PARAM;
+
+            switch (i->result) {
+                case CYNARA_ADMIN_DELETE:
+                    remove[i->bucket].push_back(key(i));
+                    break;
+                case CYNARA_ADMIN_DENY:
+                    insertOrUpdate[i->bucket].push_back(Cynara::Policy(key(i),
+                                                        Cynara::PredefinedPolicyType::DENY));
+                    break;
+                case CYNARA_ADMIN_ALLOW:
+                    insertOrUpdate[i->bucket].push_back(Cynara::Policy(key(i),
+                                                        Cynara::PredefinedPolicyType::ALLOW));
+                    break;
+                case CYNARA_ADMIN_BUCKET:
+                    insertOrUpdate[i->bucket].push_back(Cynara::Policy(key(i),
+                                                        Cynara::PolicyResult(
+                                                        Cynara::PredefinedPolicyType::BUCKET,
+                                                        i->result_extra ? i->result_extra : "")));
+                    break;
+                default:
+                    return CYNARA_ADMIN_API_INVALID_PARAM;
+            }
+        }
+    } catch (std::bad_alloc ex) {
+        return CYNARA_ADMIN_API_OUT_OF_MEMORY;
+    }
+
+    return p_cynara_admin->impl->setPolicies(insertOrUpdate, remove);
 }
 
 CYNARA_API
 int cynara_admin_set_bucket(struct cynara_admin *p_cynara_admin, const char *bucket,
-                            int operation, const char *extra UNUSED) {
+                            int operation, const char *extra) {
     if (!p_cynara_admin || !p_cynara_admin->impl)
         return CYNARA_ADMIN_API_INVALID_PARAM;
     if (!bucket)
         return CYNARA_ADMIN_API_INVALID_PARAM;
+
+    std::string extraStr;
+    try {
+         extraStr = extra ? extra : "";
+    } catch (std::bad_alloc ex) {
+        return CYNARA_ADMIN_API_OUT_OF_MEMORY;
+    }
     switch (operation) {
         case CYNARA_ADMIN_DELETE:
-            //todo This is a stub. Parameters should be passed to p_cynara_admin->impl
-            return CYNARA_ADMIN_API_SUCCESS;
+            return p_cynara_admin->impl->removeBucket(bucket);
         case CYNARA_ADMIN_DENY:
+            return p_cynara_admin->impl->insertOrUpdateBucket(bucket,
+                Cynara::PolicyResult(Cynara::PredefinedPolicyType::DENY, extraStr));
         case CYNARA_ADMIN_ALLOW:
-            //todo This is a stub. Parameters should be passed to p_cynara_admin->impl
-            return CYNARA_ADMIN_API_SUCCESS;
+            return p_cynara_admin->impl->insertOrUpdateBucket(bucket,
+                Cynara::PolicyResult(Cynara::PredefinedPolicyType::ALLOW, extraStr));
         case CYNARA_ADMIN_BUCKET:
         default:
             return CYNARA_ADMIN_API_INVALID_PARAM;
index 25b7e5e..d01353f 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <memory>
 
+#include <common.h>
 #include <protocol/Protocol.h>
 #include <protocol/ProtocolAdmin.h>
 #include <sockets/SocketClient.h>
@@ -37,4 +38,26 @@ Logic::Logic() {
                                                     std::make_shared<ProtocolAdmin>());
 }
 
+ProtocolFrameSequenceNumber generateSequenceNumber(void) {
+    static ProtocolFrameSequenceNumber sequenceNumber = 0;
+    return ++sequenceNumber;
+}
+
+int Logic::setPolicies(const std::map<PolicyBucketId, std::vector<Policy>> &insertOrUpdate UNUSED,
+                const std::map<PolicyBucketId, std::vector<PolicyKey>> &remove UNUSED) noexcept {
+//todo this is only a stub
+    return CYNARA_ADMIN_API_SUCCESS;
+}
+
+int Logic::insertOrUpdateBucket(const PolicyBucketId &bucket UNUSED,
+                                const PolicyResult &policyResult UNUSED) noexcept {
+//todo this is only a stub
+    return CYNARA_ADMIN_API_SUCCESS;
+}
+
+int Logic::removeBucket(const PolicyBucketId &bucket UNUSED) noexcept {
+//todo this is only a stub
+    return CYNARA_ADMIN_API_SUCCESS;
+}
+
 } // namespace Cynara
index ac3dba2..2cc22fc 100644 (file)
@@ -38,6 +38,13 @@ private:
 public:
     Logic();
     virtual ~Logic() = default;
+
+    virtual int setPolicies(const std::map<PolicyBucketId, std::vector<Policy>> &insertOrUpdate,
+                    const std::map<PolicyBucketId, std::vector<PolicyKey>> &remove) noexcept;
+    virtual int insertOrUpdateBucket(const PolicyBucketId &bucket, const PolicyResult &policyResult)
+                    noexcept;
+    virtual int removeBucket(const PolicyBucketId &bucket) noexcept;
+
 };
 
 } // namespace Cynara