From 7f9ca9097697d1c4d3f2454068eea5a0dec895b9 Mon Sep 17 00:00:00 2001 From: Lukasz Wojciechowski Date: Thu, 17 Jul 2014 13:28:08 +0200 Subject: [PATCH] Add ApiInterface for libcynara-admin 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 | 13 ++++++++ src/admin/api/admin-api.cpp | 77 ++++++++++++++++++++++++++++++++++++++++---- src/admin/logic/Logic.cpp | 23 +++++++++++++ src/admin/logic/Logic.h | 7 ++++ 4 files changed, 113 insertions(+), 7 deletions(-) diff --git a/src/admin/api/ApiInterface.h b/src/admin/api/ApiInterface.h index 5a9acbc..9c513f6 100644 --- a/src/admin/api/ApiInterface.h +++ b/src/admin/api/ApiInterface.h @@ -23,7 +23,14 @@ #ifndef SRC_ADMIN_API_APIINTERFACE_H_ #define SRC_ADMIN_API_APIINTERFACE_H_ +#include #include +#include + +#include +#include +#include +#include #include @@ -33,6 +40,12 @@ class ApiInterface { public: ApiInterface() = default; virtual ~ApiInterface() = default; + + virtual int setPolicies(const std::map> &insertOrUpdate, + const std::map> &remove) noexcept = 0; + virtual int insertOrUpdateBucket(const PolicyBucketId &bucket, const PolicyResult &policyResult) + noexcept = 0; + virtual int removeBucket(const PolicyBucketId &bucket) noexcept = 0; }; } // namespace Cynara diff --git a/src/admin/api/admin-api.cpp b/src/admin/api/admin-api.cpp index 0809232..5c2e2e6 100644 --- a/src/admin/api/admin-api.cpp +++ b/src/admin/api/admin-api.cpp @@ -20,9 +20,18 @@ * @brief Implementation of external libcynara-admin API */ +#include #include +#include +#include #include +#include +#include +#include +#include +#include + #include #include @@ -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> insertOrUpdate; + std::map> 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; diff --git a/src/admin/logic/Logic.cpp b/src/admin/logic/Logic.cpp index 25b7e5e..d01353f 100644 --- a/src/admin/logic/Logic.cpp +++ b/src/admin/logic/Logic.cpp @@ -22,6 +22,7 @@ #include +#include #include #include #include @@ -37,4 +38,26 @@ Logic::Logic() { std::make_shared()); } +ProtocolFrameSequenceNumber generateSequenceNumber(void) { + static ProtocolFrameSequenceNumber sequenceNumber = 0; + return ++sequenceNumber; +} + +int Logic::setPolicies(const std::map> &insertOrUpdate UNUSED, + const std::map> &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 diff --git a/src/admin/logic/Logic.h b/src/admin/logic/Logic.h index ac3dba2..2cc22fc 100644 --- a/src/admin/logic/Logic.h +++ b/src/admin/logic/Logic.h @@ -38,6 +38,13 @@ private: public: Logic(); virtual ~Logic() = default; + + virtual int setPolicies(const std::map> &insertOrUpdate, + const std::map> &remove) noexcept; + virtual int insertOrUpdateBucket(const PolicyBucketId &bucket, const PolicyResult &policyResult) + noexcept; + virtual int removeBucket(const PolicyBucketId &bucket) noexcept; + }; } // namespace Cynara -- 2.7.4