#include <vector>
#include <common.h>
+#include <exceptions/TryCatch.h>
#include <log/log.h>
#include <types/Policy.h>
#include <types/PolicyBucket.h>
if (!pp_cynara_admin)
return CYNARA_API_INVALID_PARAM;
- try {
+ return Cynara::tryCatch([&]() {
*pp_cynara_admin = new cynara_admin(new Cynara::Logic);
- } catch (const std::bad_alloc &ex) {
- return CYNARA_API_OUT_OF_MEMORY;
- }
- init_log();
+ init_log();
- LOGD("Cynara admin initialized");
+ LOGD("Cynara admin initialized");
- return CYNARA_API_SUCCESS;
+ return CYNARA_API_SUCCESS;
+ });
}
CYNARA_API
if (!policies)
return CYNARA_API_INVALID_PARAM;
- std::map<Cynara::PolicyBucketId, std::vector<Cynara::Policy>> insertOrUpdate;
- std::map<Cynara::PolicyBucketId, std::vector<Cynara::PolicyKey>> remove;
+ return Cynara::tryCatch([&]() {
+ std::map<Cynara::PolicyBucketId, std::vector<Cynara::Policy>> insertOrUpdate;
+ std::map<Cynara::PolicyBucketId, std::vector<Cynara::PolicyKey>> remove;
- auto key = ([](const cynara_admin_policy *policy)->Cynara::PolicyKey {
- std::string wildcard(CYNARA_ADMIN_WILDCARD);
+ auto key = ([](const cynara_admin_policy *policy)->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();
- });
+ 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(policy->client), feature(policy->user),
- feature(policy->privilege));
- });
+ return Cynara::PolicyKey(feature(policy->client), feature(policy->user),
+ feature(policy->privilege));
+ });
- try {
for (auto i = policies; *i; i++) {
const cynara_admin_policy *policy = *i;
if(!policy->bucket || !policy->client || !policy->user || !policy->privilege)
return CYNARA_API_INVALID_PARAM;
}
}
- } catch (const std::bad_alloc &ex) {
- return CYNARA_API_OUT_OF_MEMORY;
- }
- return p_cynara_admin->impl->setPolicies(insertOrUpdate, remove);
+ return p_cynara_admin->impl->setPolicies(insertOrUpdate, remove);
+ });
}
CYNARA_API
if (!bucket)
return CYNARA_API_INVALID_PARAM;
- std::string extraStr;
- try {
- extraStr = extra ? extra : "";
- } catch (const std::bad_alloc &ex) {
- return CYNARA_API_OUT_OF_MEMORY;
- }
- switch (operation) {
- case CYNARA_ADMIN_DELETE:
- 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:
- return p_cynara_admin->impl->insertOrUpdateBucket(bucket,
- Cynara::PolicyResult(Cynara::PredefinedPolicyType::ALLOW, extraStr));
- case CYNARA_ADMIN_NONE:
- if (bucket != Cynara::defaultPolicyBucketId) {
+ return Cynara::tryCatch([&]() {
+ std::string extraStr = extra ? extra : "";
+
+ switch (operation) {
+ case CYNARA_ADMIN_DELETE:
+ return p_cynara_admin->impl->removeBucket(bucket);
+ case CYNARA_ADMIN_DENY:
return p_cynara_admin->impl->insertOrUpdateBucket(bucket,
- Cynara::PolicyResult(Cynara::PredefinedPolicyType::NONE));
- }
- return CYNARA_API_OPERATION_NOT_ALLOWED;
- case CYNARA_ADMIN_BUCKET:
- default:
- return CYNARA_API_INVALID_PARAM;
- }
+ Cynara::PolicyResult(Cynara::PredefinedPolicyType::DENY, extraStr));
+ case CYNARA_ADMIN_ALLOW:
+ return p_cynara_admin->impl->insertOrUpdateBucket(bucket,
+ Cynara::PolicyResult(Cynara::PredefinedPolicyType::ALLOW, extraStr));
+ case CYNARA_ADMIN_NONE:
+ if (bucket != Cynara::defaultPolicyBucketId) {
+ return p_cynara_admin->impl->insertOrUpdateBucket(bucket,
+ Cynara::PolicyResult(Cynara::PredefinedPolicyType::NONE));
+ }
+ return CYNARA_API_OPERATION_NOT_ALLOWED;
+ case CYNARA_ADMIN_BUCKET:
+ default:
+ return CYNARA_API_INVALID_PARAM;
+ }
+ });
}
CYNARA_API
if (!result || !result_extra)
return CYNARA_API_INVALID_PARAM;
- Cynara::PolicyResult policyResult;
+ return Cynara::tryCatch([&]() {
+ Cynara::PolicyResult policyResult;
+ Cynara::PolicyBucketId startBucket;
+ std::string clientStr;
+ std::string userStr;
+ std::string privilegeStr;
+
+ try {
+ startBucket = start_bucket;
+ clientStr = client;
+ userStr = user;
+ privilegeStr = privilege;
+ } catch (const std::length_error &e) {
+ LOGE(e.what());
+ return CYNARA_API_INVALID_PARAM;
+ }
- try {
- int ret = p_cynara_admin->impl->adminCheck(start_bucket, recursive != 0,
- Cynara::PolicyKey(client, user, privilege),
- policyResult);
+ int ret = p_cynara_admin->impl->adminCheck(startBucket, recursive != 0,
+ Cynara::PolicyKey(clientStr, userStr,
+ privilegeStr), policyResult);
if (ret != CYNARA_API_SUCCESS)
return ret;
- } catch (const std::bad_alloc &ex) {
- return CYNARA_API_OUT_OF_MEMORY;
- } catch (const std::length_error &ex) {
- return CYNARA_API_INVALID_PARAM;
- }
- char *str = nullptr;
- if (!policyResult.metadata().empty()) {
- str = strdup(policyResult.metadata().c_str());
- if (!str)
- return CYNARA_API_OUT_OF_MEMORY;
- }
- *result = static_cast<int>(policyResult.policyType());
- *result_extra = str;
+ char *str = nullptr;
+ if (!policyResult.metadata().empty()) {
+ str = strdup(policyResult.metadata().c_str());
+ if (!str)
+ return CYNARA_API_OUT_OF_MEMORY;
+ }
+ *result = static_cast<int>(policyResult.policyType());
+ *result_extra = str;
- return CYNARA_API_SUCCESS;
+ return CYNARA_API_SUCCESS;
+ });
}
template<typename T, typename... Args>
int Logic::askCynaraAndInterpreteCodeResponse(Args... args) {
- try {
- if (!ensureConnection()) {
- LOGE("Cannot connect to cynara. Service not available.");
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
- }
+ if (!ensureConnection()) {
+ LOGE("Cannot connect to cynara. Service not available.");
+ return CYNARA_API_SERVICE_NOT_AVAILABLE;
+ }
- ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
+ ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
- //Ask cynara service
- CodeResponsePtr codeResponse;
+ //Ask cynara service
+ CodeResponsePtr codeResponse;
- RequestPtr request = std::make_shared<T>(args..., sequenceNumber);
- ResponsePtr response;
- while (!(response = m_socketClient->askCynaraServer(request))) {
- if (!m_socketClient->connect())
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
- }
+ RequestPtr request = std::make_shared<T>(args..., sequenceNumber);
+ ResponsePtr response;
+ while (!(response = m_socketClient->askCynaraServer(request))) {
+ if (!m_socketClient->connect())
+ return CYNARA_API_SERVICE_NOT_AVAILABLE;
+ }
- codeResponse = std::dynamic_pointer_cast<CodeResponse>(response);
- if (!codeResponse) {
- LOGC("Critical error. Casting Response to CodeResponse failed.");
- return CYNARA_API_UNKNOWN_ERROR;
- }
-
- LOGD("codeResponse: code [%" PRIu16 "]", codeResponse->m_code);
- switch (codeResponse->m_code) {
- case CodeResponse::Code::OK:
- LOGI("Policies set successfully.");
- return CYNARA_API_SUCCESS;
- case CodeResponse::Code::NOT_ALLOWED:
- LOGE("Cynara service answered: Operation not allowed.");
- return CYNARA_API_OPERATION_NOT_ALLOWED;
- case CodeResponse::Code::NO_BUCKET:
- LOGE("Trying to use unexisting bucket.");
- return CYNARA_API_BUCKET_NOT_FOUND;
- default:
- LOGE("Unexpected response code from server: [%d]",
- static_cast<int>(codeResponse->m_code));
- return CYNARA_API_UNKNOWN_ERROR;
- }
- } catch (const std::bad_alloc &ex) {
- LOGE("Cynara admin client out of memory.");
- return CYNARA_API_OUT_OF_MEMORY;
- } catch (const std::exception &ex) {
- LOGE("Unexpected client error: <%s>", ex.what());
+ codeResponse = std::dynamic_pointer_cast<CodeResponse>(response);
+ if (!codeResponse) {
+ LOGC("Critical error. Casting Response to CodeResponse failed.");
return CYNARA_API_UNKNOWN_ERROR;
}
+
+ LOGD("codeResponse: code [%" PRIu16 "]", codeResponse->m_code);
+ switch (codeResponse->m_code) {
+ case CodeResponse::Code::OK:
+ LOGI("Policies set successfully.");
+ return CYNARA_API_SUCCESS;
+ case CodeResponse::Code::NOT_ALLOWED:
+ LOGE("Cynara service answered: Operation not allowed.");
+ return CYNARA_API_OPERATION_NOT_ALLOWED;
+ case CodeResponse::Code::NO_BUCKET:
+ LOGE("Trying to use unexisting bucket.");
+ return CYNARA_API_BUCKET_NOT_FOUND;
+ default:
+ LOGE("Unexpected response code from server: [%d]",
+ static_cast<int>(codeResponse->m_code));
+ return CYNARA_API_UNKNOWN_ERROR;
+ }
}
int Logic::setPolicies(const std::map<PolicyBucketId, std::vector<Policy>> &insertOrUpdate,
int Logic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const PolicyKey &key,
PolicyResult &result) {
- try {
- if (!ensureConnection()) {
- LOGE("Cannot connect to cynara. Service not available.");
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
- }
-
- ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
+ if (!ensureConnection()) {
+ LOGE("Cannot connect to cynara. Service not available.");
+ return CYNARA_API_SERVICE_NOT_AVAILABLE;
+ }
- //Ask cynara service
- CheckResponsePtr checkResponse;
+ ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
- RequestPtr request = std::make_shared<AdminCheckRequest>(key, startBucket, recursive,
- sequenceNumber);
- ResponsePtr response;
- while (!(response = m_socketClient->askCynaraServer(request))) {
- if (!m_socketClient->connect())
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
- }
+ //Ask cynara service
+ CheckResponsePtr checkResponse;
- checkResponse = std::dynamic_pointer_cast<CheckResponse>(response);
- if (!checkResponse) {
- LOGC("Casting Response to CheckResponse failed.");
- return CYNARA_API_UNKNOWN_ERROR;
- }
-
- LOGD("checkResponse: policyType [%" PRIu16 "], metadata <%s>",
- checkResponse->m_resultRef.policyType(),
- checkResponse->m_resultRef.metadata().c_str());
+ RequestPtr request = std::make_shared<AdminCheckRequest>(key, startBucket, recursive,
+ sequenceNumber);
+ ResponsePtr response;
+ while (!(response = m_socketClient->askCynaraServer(request))) {
+ if (!m_socketClient->connect())
+ return CYNARA_API_SERVICE_NOT_AVAILABLE;
+ }
- result = checkResponse->m_resultRef;
- return CYNARA_API_SUCCESS;
- } catch (const UnexpectedErrorException &ex) {
- LOGE(ex.what());
- return CYNARA_API_UNKNOWN_ERROR;
- } catch (const std::bad_alloc &ex) {
- LOGE("Cynara admin client out of memory.");
- return CYNARA_API_OUT_OF_MEMORY;
- } catch (const std::exception &ex) {
- LOGE("Unexpected client error: <%s>", ex.what());
+ checkResponse = std::dynamic_pointer_cast<CheckResponse>(response);
+ if (!checkResponse) {
+ LOGC("Casting Response to CheckResponse failed.");
return CYNARA_API_UNKNOWN_ERROR;
}
+
+ LOGD("checkResponse: policyType [%" PRIu16 "], metadata <%s>",
+ checkResponse->m_resultRef.policyType(),
+ checkResponse->m_resultRef.metadata().c_str());
+
+ result = checkResponse->m_resultRef;
+ return CYNARA_API_SUCCESS;
}
} // namespace Cynara