Use TryCatch() for exception catching in admin library 82/28782/2
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 16 Oct 2014 06:25:04 +0000 (08:25 +0200)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 16 Oct 2014 11:24:37 +0000 (13:24 +0200)
Change-Id: I01d0b075c7d9cb5d94cadfe2c1dc5da7bd326027

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

index 0df64f3..e444b7a 100644 (file)
@@ -28,6 +28,7 @@
 #include <vector>
 
 #include <common.h>
+#include <exceptions/TryCatch.h>
 #include <log/log.h>
 #include <types/Policy.h>
 #include <types/PolicyBucket.h>
@@ -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<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)
@@ -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<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;
+    });
 }
index 683a2cf..72c40bf 100644 (file)
@@ -62,53 +62,45 @@ bool Logic::ensureConnection(void) {
 
 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,
@@ -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<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