}
}
+CynaraAdmin::TypeToDescriptionMap CynaraAdmin::TypeToDescription;
+CynaraAdmin::DescriptionToTypeMap CynaraAdmin::DescriptionToType;
+
CynaraAdmin::CynaraAdmin()
+ : m_policyDescriptionsInitialized(false)
{
checkCynaraError(
cynara_admin_initialize(&m_CynaraAdmin),
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(
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();
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();
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