From eee77963d6c4aa27e506b9ea22d309179898c32b Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Tue, 5 Feb 2019 11:37:12 +0100 Subject: [PATCH] refactoring: simplify NaivePolicyDb::getPolicy() Change-Id: I3be0a3682dd7be9510a0145d16cd3b750ee129c9 --- src/internal/naive_policy_checker.cpp | 8 ++-- src/internal/naive_policy_db.cpp | 85 +++++++++++++++++------------------ src/internal/naive_policy_db.hpp | 53 ++++------------------ 3 files changed, 52 insertions(+), 94 deletions(-) diff --git a/src/internal/naive_policy_checker.cpp b/src/internal/naive_policy_checker.cpp index 05fc74b..12244cd 100755 --- a/src/internal/naive_policy_checker.cpp +++ b/src/internal/naive_policy_checker.cpp @@ -88,19 +88,19 @@ template DecisionItem NaivePolicyChecker::checkItem(bool bus_type, uid_t uid, gid_t gid, const T& item, const ItemType type) { const NaivePolicyDb& policy_db = getPolicyDb(bus_type); - DecisionItem ret = policy_db.getDecisionItem(type, PolicyType::CONTEXT, PolicyTypeValue(ContextType::MANDATORY), item); + DecisionItem ret = policy_db.getDecisionItem(PolicyType::CONTEXT, PolicyTypeValue(ContextType::MANDATORY), item); // access rules can be defined only in default/mandatory context // defining them elsewhere is considered as policy syntax error by dbus-daemon if (type != ItemType::ACCESS) { if (ret.getDecision() == Decision::ANY) - ret = policy_db.getDecisionItem(type, PolicyType::USER, PolicyTypeValue(uid), item); + ret = policy_db.getDecisionItem(PolicyType::USER, PolicyTypeValue(uid), item); if (ret.getDecision() == Decision::ANY) ret = checkGroupPolicies(policy_db, uid, gid, item, type); } if (ret.getDecision() == Decision::ANY) - ret = policy_db.getDecisionItem(type, PolicyType::CONTEXT, PolicyTypeValue(ContextType::DEFAULT), item); + ret = policy_db.getDecisionItem(PolicyType::CONTEXT, PolicyTypeValue(ContextType::DEFAULT), item); return ret; } @@ -112,7 +112,7 @@ DecisionItem NaivePolicyChecker::checkGroupPolicies(const NaivePolicyDb& policy_ return Decision::ANY; for (auto sgid : *sgroups) { - DecisionItem ret = policy_db.getDecisionItem(type, PolicyType::GROUP, PolicyTypeValue(sgid), item); + DecisionItem ret = policy_db.getDecisionItem(PolicyType::GROUP, PolicyTypeValue(sgid), item); if (ret.getDecision() != Decision::ANY) return ret; diff --git a/src/internal/naive_policy_db.cpp b/src/internal/naive_policy_db.cpp index fc30042..34a07fa 100755 --- a/src/internal/naive_policy_db.cpp +++ b/src/internal/naive_policy_db.cpp @@ -82,53 +82,52 @@ void NaivePolicyDb::printContent() const } template -DecisionItem NaivePolicyDb::getDecisionItem(ItemType type, - PolicyType policy_type, +DecisionItem NaivePolicyDb::getDecisionItem(PolicyType policy_type, PolicyTypeValue policy_type_value, const T &item) const { - const P *curr_policy = nullptr; - if (!getPolicy(type, policy_type, policy_type_value, curr_policy)) + auto policy = getPolicy

(policy_type, policy_type_value); + if (nullptr == policy) return Decision::ANY; tslog::log_verbose("Checking ", P::name, " policy for: ", item, "\n"); - return curr_policy->getDecisionItem(item); + return policy->getDecisionItem(item); } -template DecisionItem NaivePolicyDb::getDecisionItem(ItemType type, PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemOwn &item) const; -template DecisionItem NaivePolicyDb::getDecisionItem(ItemType type, PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemSend &item) const; -template DecisionItem NaivePolicyDb::getDecisionItem(ItemType type, PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemReceive &item) const; -template DecisionItem NaivePolicyDb::getDecisionItem(ItemType type, PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemAccess &item) const; +template DecisionItem NaivePolicyDb::getDecisionItem(PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemOwn &item) const; +template DecisionItem NaivePolicyDb::getDecisionItem(PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemSend &item) const; +template DecisionItem NaivePolicyDb::getDecisionItem(PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemReceive &item) const; +template DecisionItem NaivePolicyDb::getDecisionItem(PolicyType policy_type, PolicyTypeValue policy_type_value, const MatchItemAccess &item) const; -bool NaivePolicyDb::getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const NaivePolicyDb::PolicyOwn*& policy) const { - assert(item_type == ItemType::OWN); - return m_own_set.getPolicy(policy_type, policy_type_value, policy); +template +const P *NaivePolicyDb::getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const { + return nullptr; +} + +namespace ldp_xml_parser { +template <> +const NaivePolicyDb::PolicyOwn *NaivePolicyDb::getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const { + return m_own_set.getPolicy(policy_type, policy_type_value); } -bool NaivePolicyDb::getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const NaivePolicyDb::PolicySend*& policy) const { - assert(item_type == ItemType::SEND); - return m_send_set.getPolicy(policy_type, policy_type_value, policy); +template <> +const NaivePolicyDb::PolicySend *NaivePolicyDb::getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const { + return m_send_set.getPolicy(policy_type, policy_type_value); } -bool NaivePolicyDb::getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const NaivePolicyDb::PolicyReceive*& policy) const { - assert(item_type == ItemType::RECEIVE); - return m_receive_set.getPolicy(policy_type, policy_type_value, policy); +template <> +const NaivePolicyDb::PolicyReceive *NaivePolicyDb::getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const { + return m_receive_set.getPolicy(policy_type, policy_type_value); } -bool NaivePolicyDb::getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const NaivePolicyDb::PolicyAccess*& policy) const { - assert(item_type == ItemType::ACCESS); - return m_access_set.getPolicy(policy_type, policy_type_value, policy); +template <> +const NaivePolicyDb::PolicyAccess *NaivePolicyDb::getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const { + return m_access_set.getPolicy(policy_type, policy_type_value); +} } void NaivePolicyDb::updateSupplementaryGroups(const VGid &groups, uid_t uid, gid_t gid) const @@ -265,17 +264,15 @@ void NaivePolicyDb::PolicySet

::printSet() const } template -bool NaivePolicyDb::PolicySet

::getPolicy(const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const P*& policy) const +const P *NaivePolicyDb::PolicySet

::getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const { tslog::log("---policy_type ="); switch (policy_type) { case PolicyType::CONTEXT: tslog::log("CONTEXT =", (int)policy_type_value.context, "\n"); - policy = &context[static_cast(policy_type_value.context)]; - return true; + return &context[static_cast(policy_type_value.context)]; case PolicyType::USER: { tslog::log("USER =", (int)policy_type_value.user, "\n"); @@ -283,11 +280,10 @@ bool NaivePolicyDb::PolicySet

::getPolicy(const PolicyType policy_type, auto it = user.find(policy_type_value.user); if (it == user.end()) { tslog::log_verbose("GetPolicy: Out of Range exception\n"); - return false; + return nullptr; } - policy = &(it->second); + return &(it->second); } - return true; case PolicyType::GROUP: { tslog::log("GROUP = ", (int)policy_type_value.group, "\n"); @@ -295,16 +291,15 @@ bool NaivePolicyDb::PolicySet

::getPolicy(const PolicyType policy_type, auto it = group.find(policy_type_value.group); if (it == group.end()) { tslog::log_verbose("GetPolicy: Out of Range exception\n"); - return false; + return nullptr; } - policy = &(it->second); + return &(it->second); } - return true; default: tslog::log("NO POLICY\n"); } - return false; + return nullptr; } template template diff --git a/src/internal/naive_policy_db.hpp b/src/internal/naive_policy_db.hpp index f117876..93c0378 100755 --- a/src/internal/naive_policy_db.hpp +++ b/src/internal/naive_policy_db.hpp @@ -93,40 +93,11 @@ namespace ldp_xml_parser static constexpr const char *name = "access"; }; - /** Gets policy with ownership rules from DB - * \param[in] policy_type Policy type - * \param[in] policy_type_value Policy type value - * \param[out] policy Received policy - * \return True if there is such policy, false elsewhere - */ - bool getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const PolicyOwn*& policy) const; - - /** Gets policy with send/receive rules from DB - * \param[in] item_type Item Type - * \param[in] policy_type Policy type - * \param[in] policy_type_value Policy type value - * \param[out] policy Received policy - * \return True if there is such policy, false elsewhere - */ - bool getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const PolicySend*& policy) const; - - bool getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const PolicyReceive*& policy) const; - - bool getPolicy(const ItemType item_type, - const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const PolicyAccess*& policy) const; - private: + template + const P *getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const; + typedef std::vector VGid; template @@ -151,17 +122,6 @@ namespace ldp_xml_parser const PolicyTypeValue policy_type_value, T &item); - /** Gets requested policy - * \param[in] set Set to add item to - * \param[in] policy_type Policy type - * \param[in] policy_type_value Policy type value - * \param[out] policy Received policy - * \return False if there is no such policy, true elsewhere - */ - bool getPolicy(const PolicyType policy_type, - const PolicyTypeValue policy_type_value, - const P*& policy) const; - void printSet() const; void printMap() const; @@ -169,6 +129,9 @@ namespace ldp_xml_parser VGid &getMapGroup(uid_t uid) const { return mapGroup[uid]; } void clearMapGroup() { mapGroup.clear(); } + + const P *getPolicy(const PolicyType policy_type, + const PolicyTypeValue policy_type_value) const; }; /** Set of ownership policies */ @@ -229,7 +192,7 @@ namespace ldp_xml_parser ItemAccess &item); template - DecisionItem getDecisionItem(ItemType type, PolicyType policy_type, PolicyTypeValue policy_type_value, + DecisionItem getDecisionItem(PolicyType policy_type, PolicyTypeValue policy_type_value, const T &item) const; }; } -- 2.7.4