blob: 7a6e20b16d8129b4670138043cca41fedb0042b8 [file] [log] [blame]
/*
* 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 <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/functional.h>
#include "casbin/casbin.h"
namespace py = pybind11;
using namespace casbin;
// Helper function to convert Python args to DataVector for Enforce
DataVector make_data_vector(const std::vector<std::string>& args) {
DataVector data_vec;
for (const auto& arg : args) {
data_vec.push_back(arg);
}
return data_vec;
}
// Helper function to convert PoliciesValues to Python list
std::vector<std::vector<std::string>> policies_values_to_vector(const PoliciesValues& policies) {
std::vector<std::vector<std::string>> result;
for (const auto& policy : policies) {
result.push_back(policy);
}
return result;
}
PYBIND11_MODULE(_pycasbin_cpp, m) {
m.doc() = "pycasbin-on-cpp: High-performance Python bindings for casbin-cpp";
// Enforcer class
py::class_<Enforcer, std::shared_ptr<Enforcer>>(m, "Enforcer")
// Constructors
.def(py::init<>())
.def(py::init<const std::string&, const std::string&>(),
py::arg("model_path"), py::arg("policy_file"))
.def(py::init<const std::string&>(),
py::arg("model_path"))
// Enforcement
.def("enforce", [](Enforcer& e, const std::vector<std::string>& params) {
DataVector data = make_data_vector(params);
return e.Enforce(data);
}, py::arg("params"))
.def("enforce_ex", [](Enforcer& e, const std::vector<std::string>& params) {
DataVector data = make_data_vector(params);
std::vector<std::string> explain;
bool result = e.EnforceEx(data, explain);
return py::make_tuple(result, explain);
}, py::arg("params"))
// Policy management
.def("load_policy", &Enforcer::LoadPolicy)
.def("save_policy", &Enforcer::SavePolicy)
.def("clear_policy", &Enforcer::ClearPolicy)
// Policy API
.def("get_policy", [](Enforcer& e) {
return policies_values_to_vector(e.GetPolicy());
})
.def("get_filtered_policy", [](Enforcer& e, int field_index, const std::vector<std::string>& field_values) {
return policies_values_to_vector(e.GetFilteredPolicy(field_index, field_values));
}, py::arg("field_index"), py::arg("field_values"))
.def("has_policy", &Enforcer::HasPolicy,
py::arg("params"))
.def("add_policy", &Enforcer::AddPolicy,
py::arg("params"))
.def("add_policies", &Enforcer::AddPolicies,
py::arg("rules"))
.def("remove_policy", &Enforcer::RemovePolicy,
py::arg("params"))
.def("remove_policies", &Enforcer::RemovePolicies,
py::arg("rules"))
.def("remove_filtered_policy", &Enforcer::RemoveFilteredPolicy,
py::arg("field_index"), py::arg("field_values"))
.def("update_policy", &Enforcer::UpdatePolicy,
py::arg("old_policy"), py::arg("new_policy"))
// Grouping (role) policy API
.def("get_grouping_policy", [](Enforcer& e) {
return policies_values_to_vector(e.GetGroupingPolicy());
})
.def("get_filtered_grouping_policy", [](Enforcer& e, int field_index, const std::vector<std::string>& field_values) {
return policies_values_to_vector(e.GetFilteredGroupingPolicy(field_index, field_values));
}, py::arg("field_index"), py::arg("field_values"))
.def("has_grouping_policy", &Enforcer::HasGroupingPolicy,
py::arg("params"))
.def("add_grouping_policy", &Enforcer::AddGroupingPolicy,
py::arg("params"))
.def("add_grouping_policies", &Enforcer::AddGroupingPolicies,
py::arg("rules"))
.def("remove_grouping_policy", &Enforcer::RemoveGroupingPolicy,
py::arg("params"))
.def("remove_grouping_policies", &Enforcer::RemoveGroupingPolicies,
py::arg("rules"))
.def("remove_filtered_grouping_policy", &Enforcer::RemoveFilteredGroupingPolicy,
py::arg("field_index"), py::arg("field_values"))
.def("update_grouping_policy", &Enforcer::UpdateGroupingPolicy,
py::arg("old_rule"), py::arg("new_rule"))
// RBAC API
.def("get_roles_for_user", &Enforcer::GetRolesForUser,
py::arg("name"), py::arg("domain") = std::vector<std::string>{})
.def("get_users_for_role", &Enforcer::GetUsersForRole,
py::arg("name"), py::arg("domain") = std::vector<std::string>{})
.def("has_role_for_user", &Enforcer::HasRoleForUser,
py::arg("name"), py::arg("role"))
.def("add_role_for_user", &Enforcer::AddRoleForUser,
py::arg("user"), py::arg("role"))
.def("add_roles_for_user", &Enforcer::AddRolesForUser,
py::arg("user"), py::arg("roles"))
.def("delete_role_for_user", &Enforcer::DeleteRoleForUser,
py::arg("user"), py::arg("role"))
.def("delete_roles_for_user", &Enforcer::DeleteRolesForUser,
py::arg("user"))
.def("delete_user", &Enforcer::DeleteUser,
py::arg("user"))
.def("delete_role", &Enforcer::DeleteRole,
py::arg("role"))
// Permission management
.def("add_permission_for_user", &Enforcer::AddPermissionForUser,
py::arg("user"), py::arg("permission"))
.def("delete_permission_for_user", &Enforcer::DeletePermissionForUser,
py::arg("user"), py::arg("permission"))
.def("delete_permissions_for_user", &Enforcer::DeletePermissionsForUser,
py::arg("user"))
.def("get_permissions_for_user", [](Enforcer& e, const std::string& user) {
return policies_values_to_vector(e.GetPermissionsForUser(user));
}, py::arg("user"))
.def("has_permission_for_user", &Enforcer::HasPermissionForUser,
py::arg("user"), py::arg("permission"))
.def("get_implicit_roles_for_user", &Enforcer::GetImplicitRolesForUser,
py::arg("name"), py::arg("domain") = std::vector<std::string>{})
.def("get_implicit_permissions_for_user", [](Enforcer& e, const std::string& user, const std::vector<std::string>& domain) {
return policies_values_to_vector(e.GetImplicitPermissionsForUser(user, domain));
}, py::arg("user"), py::arg("domain") = std::vector<std::string>{})
.def("get_implicit_users_for_permission", &Enforcer::GetImplicitUsersForPermission,
py::arg("permission"))
// Management API
.def("get_all_subjects", &Enforcer::GetAllSubjects)
.def("get_all_objects", &Enforcer::GetAllObjects)
.def("get_all_actions", &Enforcer::GetAllActions)
.def("get_all_roles", &Enforcer::GetAllRoles)
// Configuration
.def("enable_enforce", &Enforcer::EnableEnforce,
py::arg("enable"))
.def("enable_auto_save", &Enforcer::EnableAutoSave,
py::arg("auto_save"))
.def("enable_auto_build_role_links", &Enforcer::EnableAutoBuildRoleLinks,
py::arg("auto_build_role_links"))
.def("build_role_links", &Enforcer::BuildRoleLinks);
// File adapter
py::class_<FileAdapter, std::shared_ptr<FileAdapter>>(m, "FileAdapter")
.def(py::init<const std::string&>(),
py::arg("file_path"));
// Version info
m.attr("__version__") = "0.1.0";
}