Skip to content

Commit f6d1786

Browse files
authored
Merge pull request #58 from divy9881/api_tests
feat: Add Management, RBAC API, RBAC API with Domains tests and fix filePath function removal.
2 parents 30941e0 + 2bfebf8 commit f6d1786

20 files changed

+787
-188
lines changed

casbin/enforcer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,8 @@ bool Enforcer::EnforceWithMatcher(string matcher, string sub, string dom, string
483483
bool Enforcer::EnforceWithMatcher(string matcher, vector<string> params) {
484484
vector <string> r_tokens = this->model->m["r"].assertion_map["r"]->tokens;
485485

486-
int r_cnt = r_tokens.size();
487-
int cnt = params.size();
486+
int r_cnt = int(r_tokens.size());
487+
int cnt = int(params.size());
488488

489489
if (cnt != r_cnt)
490490
return false;

casbin/enforcer.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -210,17 +210,18 @@ class Enforcer : public IEnforcer{
210210
void AddFunction(string name, Function function, Index nargs);
211211

212212
/*RBAC API member functions.*/
213-
vector<string> GetRolesForUser(string name);
214-
vector<string> GetUsersForRole(string name);
213+
vector<string> GetRolesForUser(string name, vector<string> domain = {});
214+
vector<string> GetUsersForRole(string name, vector<string> domain = {});
215215
bool HasRoleForUser(string name, string role);
216216
bool AddRoleForUser(string user, string role);
217+
bool AddRolesForUser(string user, vector<string> roles);
217218
bool AddPermissionForUser(string user, vector<string> permission);
218219
bool DeletePermissionForUser(string user, vector<string> permission);
219220
bool DeletePermissionsForUser(string user);
220221
vector<vector<string>> GetPermissionsForUser(string user);
221222
bool HasPermissionForUser(string user, vector<string> permission);
222-
vector<string> GetImplicitRolesForUser(string name, vector<string> domain);
223-
vector<vector<string>> GetImplicitPermissionsForUser(string user, vector<string> domain);
223+
vector<string> GetImplicitRolesForUser(string name, vector<string> domain = {});
224+
vector<vector<string>> GetImplicitPermissionsForUser(string user, vector<string> domain = {});
224225
vector<string> GetImplicitUsersForPermission(vector<string> permission);
225226
bool DeleteRoleForUser(string user, string role);
226227
bool DeleteRolesForUser(string user);
@@ -236,11 +237,11 @@ class Enforcer : public IEnforcer{
236237
bool removeFilteredPolicy(string sec , string ptype , int fieldIndex , vector<string> fieldValues);
237238

238239
/* RBAC API with domains.*/
239-
vector<string> GetUsersForRoleInDomain(string name, string domain);
240-
vector<string> GetRolesForUserInDomain(string name, string domain);
241-
vector<vector<string>> GetPermissionsForUserInDomain(string user, string domain);
242-
bool AddRoleForUserInDomain(string user, string role, string domain);
243-
bool DeleteRoleForUserInDomain(string user, string role, string domain);
240+
vector<string> GetUsersForRoleInDomain(string name, string domain = {});
241+
vector<string> GetRolesForUserInDomain(string name, string domain = {});
242+
vector<vector<string>> GetPermissionsForUserInDomain(string user, string domain = {});
243+
bool AddRoleForUserInDomain(string user, string role, string domain = {});
244+
bool DeleteRoleForUserInDomain(string user, string role, string domain = {});
244245

245246
};
246247

casbin/enforcer_interface.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,18 @@ class IEnforcer {
6060
virtual bool EnforceWithMatcher(string matcher, Scope scope) = 0;
6161

6262
/* RBAC API */
63-
virtual vector<string> GetRolesForUser(string name) = 0;
64-
virtual vector<string> GetUsersForRole(string name) = 0;
63+
virtual vector<string> GetRolesForUser(string name, vector<string> domain = {}) = 0;
64+
virtual vector<string> GetUsersForRole(string name, vector<string> domain = {}) = 0;
6565
virtual bool HasRoleForUser(string name, string role) = 0;
6666
virtual bool AddRoleForUser(string user, string role) = 0;
67+
virtual bool AddRolesForUser(string user, vector<string> roles) = 0;
6768
virtual bool AddPermissionForUser(string user, vector<string> permission) = 0;
6869
virtual bool DeletePermissionForUser(string user, vector<string> permission) = 0;
6970
virtual bool DeletePermissionsForUser(string user) = 0;
7071
virtual vector<vector<string>> GetPermissionsForUser(string user) = 0;
7172
virtual bool HasPermissionForUser(string user, vector<string> permission) = 0;
72-
virtual vector<string> GetImplicitRolesForUser(string name, vector<string> domain) = 0;
73-
virtual vector<vector<string>> GetImplicitPermissionsForUser(string user, vector<string> domain) = 0;
73+
virtual vector<string> GetImplicitRolesForUser(string name, vector<string> domain = {}) = 0;
74+
virtual vector<vector<string>> GetImplicitPermissionsForUser(string user, vector<string> domain = {}) = 0;
7475
virtual vector<string> GetImplicitUsersForPermission(vector<string> permission) = 0;
7576
virtual bool DeleteRoleForUser(string user, string role) = 0;
7677
virtual bool DeleteRolesForUser(string user) = 0;

casbin/internal_api.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,11 @@ bool Enforcer :: addPolicies(string sec, string p_type, vector<vector<string>> r
6565
this->BuildIncrementalRoleLinks(policy_add, p_type, rules);
6666

6767
if (this->adapter != NULL && this->auto_save) {
68-
void* adapter = this->adapter;
69-
((BatchAdapter *)adapter)->AddPolicies(sec, p_type, rules);
68+
try {
69+
dynamic_cast<BatchAdapter*>(this->adapter)->AddPolicies(sec, p_type, rules);
70+
}
71+
catch(UnsupportedOperationException e) {
72+
}
7073
}
7174

7275
if (this->watcher != NULL && this->auto_notify_watcher)
@@ -116,8 +119,11 @@ bool Enforcer :: removePolicies(string sec, string p_type, vector<vector<string>
116119
this->BuildIncrementalRoleLinks(policy_add, p_type, rules);
117120

118121
if (this->adapter != NULL && this->auto_save) {
119-
void* adapter = this->adapter;
120-
((BatchAdapter *)adapter)->RemovePolicies(sec, p_type, rules);
122+
try{
123+
dynamic_cast<BatchAdapter*>(this->adapter)->RemovePolicies(sec, p_type, rules);
124+
}
125+
catch(UnsupportedOperationException e){
126+
}
121127
}
122128

123129
if (this->watcher != NULL && this->auto_notify_watcher)

casbin/model/assertion.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ void Assertion :: BuildIncrementalRoleLinks(RoleManager* rm, policy_op op, vecto
3030
if (char_count < 2)
3131
throw IllegalArgumentException("the number of \"_\" in role definition should be at least 2");
3232

33-
for(int i = 0 ; i < this->policy.size() ; i++){
34-
vector<string> rule = this->policy[i];
33+
for(int i = 0 ; i < rules.size() ; i++){
34+
vector<string> rule = rules[i];
3535

3636
if (rule.size() < char_count)
3737
throw IllegalArgumentException("grouping policy elements do not meet role definition");
@@ -43,6 +43,7 @@ void Assertion :: BuildIncrementalRoleLinks(RoleManager* rm, policy_op op, vecto
4343
switch(op) {
4444
case policy_op :: policy_add:
4545
this->rm->AddLink(rule[0], rule[1], domain);
46+
break;
4647
case policy_op :: policy_remove:
4748
this->rm->DeleteLink(rule[0], rule[1], domain);
4849
}
@@ -76,5 +77,5 @@ void Assertion :: BuildRoleLinks(RoleManager* rm) {
7677

7778
// LogUtil :: LogPrint("Role links for: " + Key);
7879

79-
this->rm->PrintRoles();
80+
// this->rm->PrintRoles();
8081
}

casbin/model/model.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ vector<vector<string>> Model :: GetFilteredPolicy(string sec, string p_type, int
209209
vector<vector<string>> policy(m[sec].assertion_map[p_type]->policy);
210210
for(int i = 0 ; i < policy.size() ; i++){
211211
bool matched = true;
212-
for(int i = 0 ; i < field_values.size() ; i++){
213-
if(field_values[i] != "" && (policy[i])[field_index + i] != field_values[i] ){
212+
for(int j = 0 ; j < field_values.size() ; j++){
213+
if(field_values[j] != "" && (policy[i])[field_index + j] != field_values[j] ){
214214
matched = false;
215215
break;
216216
}

casbin/rbac/default_role_manager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ vector<string> DefaultRoleManager :: GetUsers(string name, vector<string> domain
254254
else if (domain.size() > 1)
255255
throw CasbinRBACException("error: domain should be 1 parameter");
256256

257-
if (this->HasRole(name))
257+
if (!this->HasRole(name))
258258
throw CasbinRBACException("error: name does not exist");
259259

260260
vector<string> names;

casbin/rbac/default_role_manager.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,28 +85,28 @@ class DefaultRoleManager : public RoleManager {
8585
// AddLink adds the inheritance link between role: name1 and role: name2.
8686
// aka role: name1 inherits role: name2.
8787
// domain is a prefix to the roles.
88-
void AddLink(string name1, string name2, vector<string> domain = vector<string>{});
88+
void AddLink(string name1, string name2, vector<string> domain = {});
8989

9090
/**
9191
* deleteLink deletes the inheritance link between role: name1 and role: name2.
9292
* aka role: name1 does not inherit role: name2 any more.
9393
* domain is a prefix to the roles.
9494
*/
95-
void DeleteLink(string name1, string name2, vector<string> domain = vector<string>{});
95+
void DeleteLink(string name1, string name2, vector<string> domain = {});
9696

9797
/**
9898
* hasLink determines whether role: name1 inherits role: name2.
9999
* domain is a prefix to the roles.
100100
*/
101-
bool HasLink(string name1, string name2, vector<string> domain = vector<string>{});
101+
bool HasLink(string name1, string name2, vector<string> domain = {});
102102

103103
/**
104104
* getRoles gets the roles that a subject inherits.
105105
* domain is a prefix to the roles.
106106
*/
107-
vector <string> GetRoles(string name, vector<string> domain = vector<string>{});
107+
vector <string> GetRoles(string name, vector<string> domain = {});
108108

109-
vector<string> GetUsers(string name, vector<string> domain = vector<string>{});
109+
vector<string> GetUsers(string name, vector<string> domain = {});
110110

111111
/**
112112
* printRoles prints all the roles to log.

casbin/rbac_api.cpp

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,21 @@
2323
#include "./util/util.h"
2424

2525
// GetRolesForUser gets the roles that a user has.
26-
vector<string> Enforcer :: GetRolesForUser(string name) {
27-
vector<string> domain;
26+
vector<string> Enforcer :: GetRolesForUser(string name, vector<string> domain) {
2827
vector<string> res = this->model->m["g"].assertion_map["g"]->rm->GetRoles(name, domain);
2928
return res;
3029
}
3130

3231
// GetUsersForRole gets the users that has a role.
33-
vector<string> Enforcer :: GetUsersForRole(string name) {
34-
vector<string> domain;
32+
vector<string> Enforcer :: GetUsersForRole(string name, vector<string> domain) {
3533
vector<string> res = this->model->m["g"].assertion_map["g"]->rm->GetUsers(name, domain);
3634
return res;
3735
}
3836

3937
// HasRoleForUser determines whether a user has a role.
4038
bool Enforcer :: HasRoleForUser(string name, string role) {
41-
vector<string> roles = this->GetRolesForUser(name);
39+
vector<string> domain;
40+
vector<string> roles = this->GetRolesForUser(name, domain);
4241

4342
bool has_role = false;
4443
for (int i = 0 ; i < roles.size() ; i++) {
@@ -58,6 +57,18 @@ bool Enforcer :: AddRoleForUser(string user, string role) {
5857
return this->AddGroupingPolicy(params);
5958
}
6059

60+
// AddRolesForUser adds roles for a user.
61+
// Returns false if the user already has the roles (aka not affected).
62+
bool Enforcer :: AddRolesForUser(string user, vector<string> roles) {
63+
bool f = false;
64+
for(int i=0;i<roles.size();i++) {
65+
bool b = this->AddGroupingPolicy({user, roles[i]});
66+
if(b)
67+
f = true;
68+
}
69+
return f;
70+
}
71+
6172
// DeleteRoleForUser deletes a role for a user.
6273
// Returns false if the user does not have the role (aka not affected).
6374
bool Enforcer :: DeleteRoleForUser(string user, string role) {
@@ -211,24 +222,23 @@ vector<vector<string>> Enforcer :: GetImplicitPermissionsForUser(string user, ve
211222
// GetImplicitUsersForPermission("data1", "read") will get: ["alice", "bob"].
212223
// Note: only users will be returned, roles (2nd arg in "g") will be excluded.
213224
vector<string> Enforcer :: GetImplicitUsersForPermission(vector<string> permission) {
214-
vector<string> subjects = this->GetAllSubjects();
215-
vector<string> roles = this->GetAllRoles();
225+
vector<string> p_subjects = this->GetAllSubjects();
226+
vector<string> g_inherit = this->model->GetValuesForFieldInPolicyAllTypes("g", 1);
227+
vector<string> g_subjects = this->model->GetValuesForFieldInPolicyAllTypes("g", 0);
216228

217-
vector<string> users = SetSubtract(subjects, roles);
229+
vector<string> subjects(p_subjects);
230+
subjects.insert(subjects.end(), g_subjects.begin(), g_subjects.end());
231+
ArrayRemoveDuplicates(subjects);
218232

219233
vector<string> res;
220-
for (int i = 0 ; i < users.size() ; i++) {
221-
Scope scope = InitializeScope();
222-
PushObject(scope);
223-
PushStringPropToObject(scope, "r", users[i], "sub");
224-
PushStringPropToObject(scope, "r", permission[0], "obj");
225-
PushStringPropToObject(scope, "r", permission[1], "act");
226-
227-
bool allowed = this->Enforce(scope);
228-
229-
if (allowed)
230-
res.push_back(users[i]);
234+
for(int i=0;i<subjects.size();i++) {
235+
bool allowed = this->Enforce({subjects[i], permission[0], permission[1]});
236+
237+
if(allowed) {
238+
res.push_back(subjects[i]);
239+
}
231240
}
232241

242+
res = SetSubtract(res, g_inherit);
233243
return res;
234244
}

casbin/util/array_equals.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include "pch.h"
2020

21+
#include <algorithm>
22+
2123
#include "./util.h"
2224

2325
using namespace std;
@@ -28,6 +30,8 @@ bool ArrayEquals(vector<string> a, vector<string> b) {
2830
return false;
2931
}
3032

33+
sort(a.begin(), a.end());
34+
sort(b.begin(), b.end());
3135
for (int i = 0 ; i < a.size() ; i++) {
3236
if (a[i] != b[i]) {
3337
return false;

0 commit comments

Comments
 (0)