#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>
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
* @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>
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;
#include <memory>
+#include <common.h>
#include <protocol/Protocol.h>
#include <protocol/ProtocolAdmin.h>
#include <sockets/SocketClient.h>
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