From f5c0ef94fa73c87474475a615b0ea68ada14cad8 Mon Sep 17 00:00:00 2001 From: "Yash Pandey (YP)" Date: Sun, 20 Jun 2021 08:27:18 +0530 Subject: [PATCH] feat: Added ABAC entity wrapper (#105) * feat: Added ABAC entity wrapper Signed-off-by: Yash Pandey (YP) * feat: renamed abac data Signed-off-by: Yash Pandey (YP) * feat: updated ABACData Signed-off-by: Yash Pandey (YP) * fix: added prelude Signed-off-by: Yash Pandey (YP) * feat: Configured VS project files Signed-off-by: EmperorYP7 * fix: Removed vector Signed-off-by: Yash Pandey (YP) --- casbin/abac_data.cpp | 82 +++++++++++++++++++++++++ casbin/abac_data.h | 109 ++++++++++++++++++++++++++++++++++ casbin/casbin.vcxproj | 4 ++ casbin/casbin.vcxproj.filters | 6 ++ casbin/enforcer.cpp | 7 --- 5 files changed, 201 insertions(+), 7 deletions(-) create mode 100644 casbin/abac_data.cpp create mode 100644 casbin/abac_data.h diff --git a/casbin/abac_data.cpp b/casbin/abac_data.cpp new file mode 100644 index 00000000..6eaed23a --- /dev/null +++ b/casbin/abac_data.cpp @@ -0,0 +1,82 @@ +/* +* Copyright 2021 The casbin Authors. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "pch.h" + +#ifndef ABAC_CPP +#define ABAC_CPP + +#include "abac_data.h" +#include "./model/scope_config.h" + +namespace casbin { + +/** + * @brief Get casbin::ABACData object + * + * @param attribs Should be of the format: { + * { "attrib_name1", value1 }, + * { "attrib_name2", value2 }, + * ... + * } + * + * Key's type is std::string and value's type can be one of std::string, int32_t, and float only + * @return Pointer to casbin::ABACData entity + */ +static const std::shared_ptr GetData(const ABACData::VariantMap& attribs) { + return std::make_shared(attribs); +} + +ABACData::ABACData(const VariantMap& attrib) + : m_attributes(attrib) +{} + +bool ABACData::AddAttribute(const std::string& key, const VariantType& value) { + m_attributes[key] = value; + return true; +} + +bool ABACData::AddAttributes(const VariantMap& attribs) { + for(auto attrib : attribs) { + m_attributes[attrib.first] = attrib.second; + } + return true; +} + +bool ABACData::DeleteAttribute(const std::string& key) { + auto it = m_attributes.find(key); + + // If key is not present in the map, indicate deletion failiure + if(it == m_attributes.end()) { + return false; + } + + m_attributes.erase(it); + return true; +} + +bool ABACData::UpdateAttribute(const std::string& key, const VariantType& value) { + m_attributes[key] = value; + return true; +} + +const ABACData::VariantMap& ABACData::GetAttributes() { + return m_attributes; +} + +} + +#endif // ABAC_CPP diff --git a/casbin/abac_data.h b/casbin/abac_data.h new file mode 100644 index 00000000..1285aa1c --- /dev/null +++ b/casbin/abac_data.h @@ -0,0 +1,109 @@ +/* +* Copyright 2021 The casbin Authors. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef ABAC_H +#define ABAC_H + +#include +#include +#include +#include +#include + +namespace casbin { + +/** + * @brief A wrapper to contain ABAC entity with a list of attributes stored in a hashmap + * + */ +class ABACData { + +public: + + // Intrinsic definitions + typedef std::variant VariantType; + typedef std::unordered_map VariantMap; + +private: + + // HashMap containing attributes as key-value pairs + VariantMap m_attributes; + +public: + /** + * @brief Construct a new casbin::ABACData object + * + * @param attribs Should be of the format: { + * { "attrib_name1", value1 }, + * { "attring_name2", value2 }, + * ... + * } + * + * Key's type is std::string and value's type can be one of std::string, int32_t, and float only + */ + ABACData(const VariantMap& attribs); + /** + * @brief Add attribute to the corresponding ABAC entity + * + * @param key Name of the attribute + * @param value Value of the attribute + * @return true when attribute is added successfully, false otherwise + */ + bool AddAttribute(const std::string& key, const VariantType& value); + /** + * @brief Add attributes to the corresponding ABAC entity + * + * @param attribs Should be of the format: { + * { "attrib_name1", value1 }, + * { "attring_name2", value2 }, + * ... + * } + * + * Key's type is std::string and value's type can be one of std::string, int32_t, and float only + * @return true if attributes are added successfully, false otherwise + */ + bool AddAttributes(const VariantMap& attribs); + /** + * @brief Delete attribute of the corresponding ABAC entity + * + * @param key Name of the attribute to be deleted + * @return true when attribute is deleted successfully, false otherwise + */ + bool DeleteAttribute(const std::string& key); + /** + * @brief Update attribute of the corresponding ABAC entity + * + * @param key Name of the attribute to be updated + * @param value Value which would replace the current value of the attribute corresponding + * to the given key + * @return true + * @return false + */ + bool UpdateAttribute(const std::string& key, const VariantType& value); + /** + * @brief Get the Attributes of the corresponding ABAC entity + * + * @return const reference to the hashmap containing attributes in key-value pairs + */ + const VariantMap& GetAttributes(); +}; + +// Casbin ABAC entity type +typedef ABACData ABACData; + +} + +#endif diff --git a/casbin/casbin.vcxproj b/casbin/casbin.vcxproj index d2cdb9ec..62532767 100644 --- a/casbin/casbin.vcxproj +++ b/casbin/casbin.vcxproj @@ -106,6 +106,7 @@ true pch.h 4996 + stdcpp17 Windows @@ -143,6 +144,7 @@ true pch.h 4996 + stdcpp17 Windows @@ -153,6 +155,7 @@ + @@ -219,6 +222,7 @@ + diff --git a/casbin/casbin.vcxproj.filters b/casbin/casbin.vcxproj.filters index 98977348..85d39704 100644 --- a/casbin/casbin.vcxproj.filters +++ b/casbin/casbin.vcxproj.filters @@ -264,6 +264,9 @@ Source Files + + Source Files + @@ -494,6 +497,9 @@ Header Files + + Header Files + Header Files diff --git a/casbin/enforcer.cpp b/casbin/enforcer.cpp index ec681b6b..e70a9a9e 100644 --- a/casbin/enforcer.cpp +++ b/casbin/enforcer.cpp @@ -37,13 +37,6 @@ namespace casbin { // with the operation "action", input parameters are usually: (matcher, sub, obj, act), // use model matcher by default when matcher is "". bool Enforcer :: m_enforce(const std::string& matcher, Scope scope) { - // TODO - // defer func() { - // if err := recover(); err != nil { - // fmt.Errorf("panic: %v", err) - // } - // }() - m_func_map.scope = scope; if(!m_enabled)