blob: 164f6f52d458ac313e19f04f4ba8107c49e6f922 [file] [log] [blame]
/*
* Copyright 2020 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 "casbin/pch.h"
#ifndef INTERNAL_API_CPP
#define INTERNAL_API_CPP
#include "casbin/enforcer.h"
#include "casbin/exception/unsupported_operation_exception.h"
#include "casbin/persist/batch_adapter.h"
#include "casbin/persist/watcher_ex.h"
#include "casbin/persist/watcher_update.h"
#include "casbin/util/util.h"
namespace casbin {
// addPolicy adds a rule to the current policy.
bool Enforcer::addPolicy(const std::string& sec, const std::string& p_type, const std::vector<std::string>& rule) {
bool rule_added = m_model->AddPolicy(sec, p_type, rule);
if (!rule_added)
return rule_added;
if (sec == "g") {
PoliciesValues rules({rule});
this->BuildIncrementalRoleLinks(policy_add, p_type, rules);
}
if (m_adapter && m_auto_save) {
try {
m_adapter->AddPolicy(sec, p_type, rule);
} catch (UnsupportedOperationException e) {
}
}
if (m_watcher && m_auto_notify_watcher) {
if (IsInstanceOf<WatcherEx>(m_watcher.get())) {
std::dynamic_pointer_cast<WatcherEx>(m_watcher)->UpdateForAddPolicy(rule);
} else
m_watcher->Update();
}
return rule_added;
}
// addPolicies adds rules to the current policy.
bool Enforcer::addPolicies(const std::string& sec, const std::string& p_type, const PoliciesValues& rules) {
bool rules_added = m_model->AddPolicies(sec, p_type, rules);
if (!rules_added)
return rules_added;
if (sec == "g")
this->BuildIncrementalRoleLinks(policy_add, p_type, rules);
if (m_adapter && m_auto_save) {
try {
std::dynamic_pointer_cast<BatchAdapter>(m_adapter)->AddPolicies(sec, p_type, rules);
} catch (UnsupportedOperationException e) {
}
}
if (m_watcher && m_auto_notify_watcher)
m_watcher->Update();
return rules_added;
}
// removePolicy removes a rule from the current policy.
bool Enforcer::removePolicy(const std::string& sec, const std::string& p_type, const std::vector<std::string>& rule) {
bool rule_removed = m_model->RemovePolicy(sec, p_type, rule);
if (!rule_removed)
return rule_removed;
if (sec == "g") {
PoliciesValues rules({rule});
this->BuildIncrementalRoleLinks(policy_add, p_type, rules);
}
if (m_adapter && m_auto_save) {
try {
m_adapter->RemovePolicy(sec, p_type, rule);
} catch (UnsupportedOperationException e) {
}
}
if (m_watcher && m_auto_notify_watcher) {
if (IsInstanceOf<WatcherEx>(m_watcher.get())) {
std::dynamic_pointer_cast<WatcherEx>(m_watcher)->UpdateForRemovePolicy(rule);
} else
m_watcher->Update();
}
return rule_removed;
}
// removePolicies removes rules from the current policy.
bool Enforcer::removePolicies(const std::string& sec, const std::string& p_type, const PoliciesValues& rules) {
bool rules_removed = m_model->AddPolicies(sec, p_type, rules);
if (!rules_removed)
return rules_removed;
if (sec == "g")
this->BuildIncrementalRoleLinks(policy_add, p_type, rules);
if (m_adapter && m_auto_save) {
try {
std::dynamic_pointer_cast<BatchAdapter>(m_adapter)->RemovePolicies(sec, p_type, rules);
} catch (UnsupportedOperationException e) {
}
}
if (m_watcher && m_auto_notify_watcher)
m_watcher->Update();
return rules_removed;
}
// removeFilteredPolicy removes rules based on field filters from the current policy.
bool Enforcer::removeFilteredPolicy(const std::string& sec, const std::string& p_type, int field_index, const std::vector<std::string>& field_values) {
std::pair<int, PoliciesValues> p = m_model->RemoveFilteredPolicy(sec, p_type, field_index, field_values);
bool rule_removed = p.first;
PoliciesValues effects = p.second;
if (!rule_removed)
return rule_removed;
if (sec == "g")
this->BuildIncrementalRoleLinks(policy_remove, p_type, effects);
if (m_adapter && m_auto_save) {
try {
m_adapter->RemoveFilteredPolicy(sec, p_type, field_index, field_values);
} catch (UnsupportedOperationException e) {
}
}
if (m_watcher && m_auto_notify_watcher) {
if (IsInstanceOf<WatcherEx>(m_watcher.get())) {
std::dynamic_pointer_cast<WatcherEx>(m_watcher)->UpdateForRemoveFilteredPolicy(field_index, field_values);
} else
m_watcher->Update();
}
return rule_removed;
}
bool Enforcer::updatePolicy(const std::string& sec, const std::string& p_type, const std::vector<std::string>& oldRule, const std::vector<std::string>& newRule) {
bool is_rule_updated = m_model->UpdatePolicy(sec, p_type, oldRule, newRule);
if (!is_rule_updated)
return false;
if (sec == "g") {
this->BuildIncrementalRoleLinks(policy_remove, p_type, PoliciesValues({oldRule}));
this->BuildIncrementalRoleLinks(policy_add, p_type, PoliciesValues({newRule}));
}
if (m_watcher && m_auto_notify_watcher) {
if (IsInstanceOf<WatcherUpdatable>(m_watcher.get())) {
std::dynamic_pointer_cast<WatcherUpdatable>(m_watcher)->UpdateForUpdatePolicy(oldRule, newRule);
} else {
m_watcher->Update();
}
}
return is_rule_updated;
}
bool Enforcer::updatePolicies(const std::string& sec, const std::string& p_type, const PoliciesValues& oldRules, const PoliciesValues& newRules) {
bool is_rules_updated = m_model->UpdatePolicies(sec, p_type, oldRules, newRules);
if (!is_rules_updated)
return false;
if (sec == "g") {
this->BuildIncrementalRoleLinks(policy_remove, p_type, oldRules);
this->BuildIncrementalRoleLinks(policy_add, p_type, newRules);
}
if (m_watcher && m_auto_notify_watcher) {
if (IsInstanceOf<WatcherUpdatable>(m_watcher.get())) {
std::dynamic_pointer_cast<WatcherUpdatable>(m_watcher)->UpdateForUpdatePolicies(oldRules, newRules);
} else {
m_watcher->Update();
}
}
return is_rules_updated;
}
} // namespace casbin
#endif // INTERNAL_API_CPP