From 45c717d1a2f1091ad025fc617dd3af6ab67ef095 Mon Sep 17 00:00:00 2001 From: Lukasz Wojciechowski Date: Thu, 16 Oct 2014 08:25:04 +0200 Subject: [PATCH] Use TryCatch() for exception catching in admin library Change-Id: I01d0b075c7d9cb5d94cadfe2c1dc5da7bd326027 --- src/admin/api/admin-api.cpp | 141 +++++++++++++++++++++++--------------------- src/admin/logic/Logic.cpp | 133 ++++++++++++++++++----------------------- 2 files changed, 130 insertions(+), 144 deletions(-) diff --git a/src/admin/api/admin-api.cpp b/src/admin/api/admin-api.cpp index 0df64f3..e444b7a 100644 --- a/src/admin/api/admin-api.cpp +++ b/src/admin/api/admin-api.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -57,17 +58,15 @@ int cynara_admin_initialize(struct cynara_admin **pp_cynara_admin) { 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 @@ -85,24 +84,24 @@ int cynara_admin_set_policies(struct cynara_admin *p_cynara_admin, if (!policies) return CYNARA_API_INVALID_PARAM; - std::map> insertOrUpdate; - std::map> remove; + return Cynara::tryCatch([&]() { + std::map> insertOrUpdate; + std::map> 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) @@ -133,11 +132,9 @@ int cynara_admin_set_policies(struct cynara_admin *p_cynara_admin, 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 @@ -148,31 +145,29 @@ int cynara_admin_set_bucket(struct cynara_admin *p_cynara_admin, const char *buc 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 @@ -189,28 +184,38 @@ int cynara_admin_check(struct cynara_admin *p_cynara_admin, 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(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(policyResult.policyType()); + *result_extra = str; - return CYNARA_API_SUCCESS; + return CYNARA_API_SUCCESS; + }); } diff --git a/src/admin/logic/Logic.cpp b/src/admin/logic/Logic.cpp index 683a2cf..72c40bf 100644 --- a/src/admin/logic/Logic.cpp +++ b/src/admin/logic/Logic.cpp @@ -62,53 +62,45 @@ bool Logic::ensureConnection(void) { template 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(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(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(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(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(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(codeResponse->m_code)); + return CYNARA_API_UNKNOWN_ERROR; + } } int Logic::setPolicies(const std::map> &insertOrUpdate, @@ -127,47 +119,36 @@ int Logic::removeBucket(const PolicyBucketId &bucket) { 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(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(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(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(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 -- 2.7.4