summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichal Eljasiewicz <m.eljasiewic@samsung.com>2015-01-26 12:27:03 +0100
committerRafal Krypa <r.krypa@samsung.com>2015-02-05 18:07:08 +0100
commit9d2f5358901d8a982ac138982c0c1938adbbcaad (patch)
tree2f9337408e81039db51e2b47e5d898dde58be205 /src
parent4cae0fa1ae6c37b7ddca2c14cf48baf1c5a42e3d (diff)
downloadsecurity-manager-9d2f5358901d8a982ac138982c0c1938adbbcaad.tar.gz
security-manager-9d2f5358901d8a982ac138982c0c1938adbbcaad.tar.bz2
security-manager-9d2f5358901d8a982ac138982c0c1938adbbcaad.zip
Wrapper for cynara_admin_list_policies_descriptions
Change-Id: I6b07e4fb0b8e1395a3d867bcdecf1e79b3839772 Signed-off-by: Michal Eljasiewicz <m.eljasiewic@samsung.com>
Diffstat (limited to 'src')
-rw-r--r--src/common/cynara.cpp65
-rw-r--r--src/common/include/cynara.h51
2 files changed, 116 insertions, 0 deletions
diff --git a/src/common/cynara.cpp b/src/common/cynara.cpp
index 39b7e056..156ff264 100644
--- a/src/common/cynara.cpp
+++ b/src/common/cynara.cpp
@@ -205,7 +205,11 @@ static bool checkCynaraError(int result, const std::string &msg)
}
}
+CynaraAdmin::TypeToDescriptionMap CynaraAdmin::TypeToDescription;
+CynaraAdmin::DescriptionToTypeMap CynaraAdmin::DescriptionToType;
+
CynaraAdmin::CynaraAdmin()
+ : m_policyDescriptionsInitialized(false)
{
checkCynaraError(
cynara_admin_initialize(&m_CynaraAdmin),
@@ -380,6 +384,67 @@ void CynaraAdmin::EmptyBucket(const std::string &bucketName, bool recursive, con
client + ", " + user + ", " + privilege);
}
+void CynaraAdmin::FetchCynaraPolicyDescriptions(bool forceRefresh)
+{
+ struct cynara_admin_policy_descr **descriptions = nullptr;
+
+ if (!forceRefresh && m_policyDescriptionsInitialized)
+ return;
+
+ // fetch
+ checkCynaraError(
+ cynara_admin_list_policies_descriptions(m_CynaraAdmin, &descriptions),
+ "Error while getting list of policies descriptions from Cynara.");
+
+ if (descriptions[0] == nullptr) {
+ LogError("Fetching policies levels descriptions from Cynara returned empty list. "
+ "There should be at least 2 entries - Allow and Deny");
+ return;
+ }
+
+ // reset the state
+ m_policyDescriptionsInitialized = false;
+ DescriptionToType.clear();
+ TypeToDescription.clear();
+
+ // extract strings
+ for (int i = 0; descriptions[i] != nullptr; i++) {
+ std::string descriptionName(descriptions[i]->name);
+
+ DescriptionToType[descriptionName] = descriptions[i]->result;
+ TypeToDescription[descriptions[i]->result] = std::move(descriptionName);
+
+ free(descriptions[i]->name);
+ free(descriptions[i]);
+ }
+
+ free(descriptions);
+
+ m_policyDescriptionsInitialized = true;
+}
+
+void CynaraAdmin::ListPoliciesDescriptions(std::vector<std::string> &policiesDescriptions)
+{
+ FetchCynaraPolicyDescriptions(false);
+
+ for (auto it = TypeToDescription.rbegin(); it != TypeToDescription.rend(); ++it)
+ policiesDescriptions.push_back(it->second);
+}
+
+std::string CynaraAdmin::convertToPolicyDescription(const int policyType, bool forceRefresh)
+{
+ FetchCynaraPolicyDescriptions(forceRefresh);
+
+ return TypeToDescription.at(policyType);
+}
+
+int CynaraAdmin::convertToPolicyType(const std::string &policy, bool forceRefresh)
+{
+ FetchCynaraPolicyDescriptions(forceRefresh);
+
+ return DescriptionToType.at(policy);
+}
+
Cynara::Cynara()
{
checkCynaraError(
diff --git a/src/common/include/cynara.h b/src/common/include/cynara.h
index ce103f09..1f37f96e 100644
--- a/src/common/include/cynara.h
+++ b/src/common/include/cynara.h
@@ -91,6 +91,9 @@ public:
typedef std::map<Bucket, const std::string > BucketsMap;
static BucketsMap Buckets;
+ typedef std::map<int, std::string> TypeToDescriptionMap;
+ typedef std::map<std::string, int> DescriptionToTypeMap;
+
virtual ~CynaraAdmin();
static CynaraAdmin &getInstance();
@@ -159,6 +162,43 @@ public:
const std::string &privilege,
std::vector<CynaraAdminPolicy> &policies);
+ /**
+ * Wrapper for Cynara API function cynara_admin_list_policies_descriptions.
+ * It collects all policies descriptions, extracts names
+ * of policies and returns as std strings. Caller is responsible for clearing
+ * vector passed as argument.
+ *
+ * @param policiesDescriptions empty vector for policies descriptions.
+ */
+ void ListPoliciesDescriptions(std::vector<std::string> &policiesDescriptions);
+
+ /**
+ * Function translates internal Cynara policy type integer to string
+ * description. Descriptions are retrieved from Cynara using
+ * ListPoliciesDescriptions() function. Caller can force refetching of
+ * descriptions list from Cynara on each call.
+ *
+ * @throws std::out_of_range
+ *
+ * @param policyType Cynara policy result type.
+ * @param forceRefresh switch to force refetching of descriptions from Cynara.
+ */
+ std::string convertToPolicyDescription(const int policyType, bool forceRefresh = false);
+
+ /**
+ * Function translates Cynara policy result string
+ * description to internal Cynara policy type integer.
+ * Descriptions are retrieved from Cynara using
+ * ListPoliciesDescriptions() function. Caller can force refetching of
+ * descriptions list from Cynara on each call.
+ *
+ * @throws std::out_of_range
+ *
+ * @param policy Cynara policy result string description.
+ * @param forceRefresh switch to force refetching of descriptions from Cynara.
+ */
+ int convertToPolicyType(const std::string &policy, bool forceRefresh = false);
+
private:
CynaraAdmin();
@@ -174,7 +214,18 @@ private:
void EmptyBucket(const std::string &bucketName, bool recursive,
const std::string &client, const std::string &user, const std::string &privilege);
+ /**
+ * Get Cynara policies result descriptions and cache them in std::map
+ *
+ * @param forceRefresh true if you want to reinitialize mappings
+ */
+ void FetchCynaraPolicyDescriptions(bool forceRefresh = false);
+
struct cynara_admin *m_CynaraAdmin;
+
+ static TypeToDescriptionMap TypeToDescription;
+ static DescriptionToTypeMap DescriptionToType;
+ bool m_policyDescriptionsInitialized;
};
class Cynara