1+ #pragma once
2+
3+ #include " pch.h"
4+
5+ #include < direct.h>
6+ #include < algorithm>
7+ #include < fstream>
8+
9+ #include < enforcer.h>
10+ #include < rbac.h>
11+ #include < util.h>
12+
13+ using namespace std ;
14+
15+ namespace test_rbac_api
16+ {
17+ TEST_CLASS (TestRBACAPI)
18+ {
19+ public:
20+
21+ TEST_METHOD (TestRoleAPI) {
22+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_model.conf" , " ../../examples/rbac_policy.csv" );
23+
24+ Assert::IsTrue (ArrayEquals (vector<string>{ " data2_admin" }, e->GetRolesForUser (" alice" , vector<string>{})));
25+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" bob" , vector<string>{})));
26+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" data2_admin" , vector<string>{})));
27+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" non_exist" , vector<string>{})));
28+
29+ Assert::IsFalse (e->HasRoleForUser (" alice" , " data1_admin" ));
30+ Assert::IsTrue (e->HasRoleForUser (" alice" , " data2_admin" ));
31+
32+ e->AddRoleForUser (" alice" , " data1_admin" );
33+
34+ Assert::IsTrue (ArrayEquals (vector<string>{ " data1_admin" , " data2_admin" }, e->GetRolesForUser (" alice" , vector<string>{})));
35+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" bob" , vector<string>{})));
36+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" data2_admin" , vector<string>{})));
37+
38+ e->DeleteRoleForUser (" alice" , " data1_admin" );
39+
40+ Assert::IsTrue (ArrayEquals (vector<string>{ " data2_admin" }, e->GetRolesForUser (" alice" , vector<string>{})));
41+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" bob" , vector<string>{})));
42+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" data2_admin" , vector<string>{})));
43+
44+ e->DeleteRolesForUser (" alice" );
45+
46+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" alice" , vector<string>{})));
47+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" bob" , vector<string>{})));
48+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" data2_admin" , vector<string>{})));
49+
50+ e->AddRoleForUser (" alice" , " data1_admin" );
51+ e->DeleteUser (" alice" );
52+
53+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" alice" , vector<string>{})));
54+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" bob" , vector<string>{})));
55+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetRolesForUser (" data2_admin" , vector<string>{})));
56+
57+ e->AddRoleForUser (" alice" , " data2_admin" );
58+
59+ Assert::IsFalse (e->Enforce ({ " alice" , " data1" , " read" }));
60+ Assert::IsFalse (e->Enforce ({ " alice" , " data1" , " write" }));
61+ Assert::IsTrue (e->Enforce ({ " alice" , " data2" , " read" }));
62+ Assert::IsTrue (e->Enforce ({ " alice" , " data2" , " write" }));
63+ Assert::IsFalse (e->Enforce ({ " bob" , " data1" , " read" }));
64+ Assert::IsFalse (e->Enforce ({ " bob" , " data1" , " write" }));
65+ Assert::IsFalse (e->Enforce ({ " bob" , " data2" , " read" }));
66+ Assert::IsTrue (e->Enforce ({ " bob" , " data2" , " write" }));
67+
68+ e->DeleteRole (" data2_admin" );
69+
70+ Assert::IsFalse (e->Enforce ({ " alice" , " data1" , " read" }));
71+ Assert::IsFalse (e->Enforce ({ " alice" , " data1" , " write" }));
72+ Assert::IsFalse (e->Enforce ({ " alice" , " data2" , " read" }));
73+ Assert::IsFalse (e->Enforce ({ " alice" , " data2" , " write" }));
74+ Assert::IsFalse (e->Enforce ({ " bob" , " data1" , " read" }));
75+ Assert::IsFalse (e->Enforce ({ " bob" , " data1" , " write" }));
76+ Assert::IsFalse (e->Enforce ({ " bob" , " data2" , " read" }));
77+ Assert::IsTrue (e->Enforce ({ " bob" , " data2" , " write" }));
78+ }
79+
80+ TEST_METHOD (TestEnforcer_AddRolesForUser) {
81+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_model.conf" , " ../../examples/rbac_policy.csv" );
82+
83+ e->AddRolesForUser (" alice" , vector<string>{ " data1_admin" , " data2_admin" , " data3_admin" });
84+ Assert::IsTrue (ArrayEquals (vector<string>{ " data1_admin" , " data2_admin" , " data3_admin" }, e->GetRolesForUser (" alice" , vector<string>{})));
85+
86+ Assert::IsTrue (e->Enforce ({ " alice" , " data1" , " read" }));
87+ Assert::IsTrue (e->Enforce ({ " alice" , " data2" , " read" }));
88+ Assert::IsTrue (e->Enforce ({ " alice" , " data2" , " write" }));
89+ }
90+
91+ void TestGetPermissions (Enforcer* e, string name, vector<vector<string>> res) {
92+ vector<vector<string>> my_res = e->GetPermissionsForUser (name);
93+
94+ int count = 0 ;
95+ for (int i = 0 ; i < my_res.size (); i++) {
96+ for (int j = 0 ; j < res.size (); j++) {
97+ if (ArrayEquals (res[j], my_res[i])) {
98+ count += 1 ;
99+ break ;
100+ }
101+ }
102+ }
103+
104+ Assert::AreEqual (int (res.size ()), count);
105+ }
106+
107+ TEST_METHOD (TestPermissionAPI) {
108+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/basic_without_resources_model.conf" , " ../../examples/basic_without_resources_policy.csv" );
109+
110+ Assert::IsTrue (e->Enforce (vector<string>{ " alice" , " read" }));
111+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " write" }));
112+ Assert::IsFalse (e->Enforce (vector<string>{ " bob" , " read" }));
113+ Assert::IsTrue (e->Enforce (vector<string>{ " bob" , " write" }));
114+
115+ TestGetPermissions (e, " alice" , vector<vector<string>>{ {" alice" , " read" } });
116+ TestGetPermissions (e, " bob" , vector<vector<string>>{ {" bob" , " write" } });
117+
118+ Assert::IsTrue (e->HasPermissionForUser (" alice" , { " read" }));
119+ Assert::IsFalse (e->HasPermissionForUser (" alice" , { " write" }));
120+ Assert::IsFalse (e->HasPermissionForUser (" bob" , { " read" }));
121+ Assert::IsTrue (e->HasPermissionForUser (" bob" , { " write" }));
122+
123+ e->DeletePermission ({ " read" });
124+
125+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " read" }));
126+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " write" }));
127+ Assert::IsFalse (e->Enforce (vector<string>{ " bob" , " read" }));
128+ Assert::IsTrue (e->Enforce (vector<string>{ " bob" , " write" }));
129+
130+ e->AddPermissionForUser (" bob" , { " read" });
131+
132+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " read" }));
133+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " write" }));
134+ Assert::IsTrue (e->Enforce (vector<string>{ " bob" , " read" }));
135+ Assert::IsTrue (e->Enforce (vector<string>{ " bob" , " write" }));
136+
137+ e->DeletePermissionForUser (" bob" , { " read" });
138+
139+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " read" }));
140+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " write" }));
141+ Assert::IsFalse (e->Enforce (vector<string>{ " bob" , " read" }));
142+ Assert::IsTrue (e->Enforce (vector<string>{ " bob" , " write" }));
143+
144+ e->DeletePermissionsForUser (" bob" );
145+
146+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " read" }));
147+ Assert::IsFalse (e->Enforce (vector<string>{ " alice" , " write" }));
148+ Assert::IsFalse (e->Enforce (vector<string>{ " bob" , " read" }));
149+ Assert::IsFalse (e->Enforce (vector<string>{ " bob" , " write" }));
150+ }
151+
152+ TEST_METHOD (TestImplicitRoleAPI) {
153+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_model.conf" , " ../../examples/rbac_with_hierarchy_policy.csv" );
154+
155+ TestGetPermissions (e, " alice" , vector<vector<string>>{ {" alice" , " data1" , " read" } });
156+ TestGetPermissions (e, " bob" , vector<vector<string>>{ {" bob" , " data2" , " write" } });
157+
158+ Assert::IsTrue (ArrayEquals (vector<string>{ " admin" , " data1_admin" , " data2_admin" }, e->GetImplicitRolesForUser (" alice" , {})));
159+ Assert::IsTrue (ArrayEquals (vector<string>{ }, e->GetImplicitRolesForUser (" bob" , {})));
160+
161+ e = Enforcer::NewEnforcer (" ../../examples/rbac_with_pattern_model.conf" , " ../../examples/rbac_with_pattern_policy.csv" );
162+
163+ dynamic_cast <DefaultRoleManager*>(e->GetRoleManager ())->AddMatchingFunc (KeyMatch);
164+
165+ Assert::IsTrue (ArrayEquals (vector<string>{ " /book/1/2/3/4/5" , " pen_admin" , " /book/*" , " book_group" }, e->GetImplicitRolesForUser (" cathy" , {})));
166+ Assert::IsTrue (ArrayEquals (vector<string>{ " /book/1/2/3/4/5" , " pen_admin" }, e->GetRolesForUser (" cathy" , vector<string>{})));
167+ }
168+
169+ void TestGetImplicitPermissions (Enforcer* e, string name, vector<vector<string>> res) {
170+ vector<vector<string>> my_res = e->GetImplicitPermissionsForUser (name, {});
171+
172+ int count = 0 ;
173+ for (int i = 0 ; i < my_res.size (); i++) {
174+ for (int j = 0 ; j < res.size (); j++) {
175+ if (ArrayEquals (res[j], my_res[i])) {
176+ count += 1 ;
177+ break ;
178+ }
179+ }
180+ }
181+
182+ Assert::AreEqual (int (res.size ()), count);
183+ }
184+
185+ void TestGetImplicitPermissionsWithDomain (Enforcer* e, string name, string domain, vector<vector<string>> res) {
186+ vector<vector<string>> my_res = e->GetImplicitPermissionsForUser (name, { domain });
187+
188+ int count = 0 ;
189+ for (int i = 0 ; i < my_res.size (); i++) {
190+ for (int j = 0 ; j < res.size (); j++) {
191+ if (ArrayEquals (res[j], my_res[i])) {
192+ count += 1 ;
193+ break ;
194+ }
195+ }
196+ }
197+
198+ Assert::AreEqual (int (res.size ()), count);
199+ }
200+
201+ TEST_METHOD (TestImplicitPermissionAPI) {
202+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_model.conf" , " ../../examples/rbac_with_hierarchy_policy.csv" );
203+
204+ TestGetPermissions (e, " alice" , vector<vector<string>>{ {" alice" , " data1" , " read" } });
205+ TestGetPermissions (e, " bob" , vector<vector<string>>{ {" bob" , " data2" , " write" } });
206+
207+ TestGetImplicitPermissions (e, " alice" , vector<vector<string>>{ {" alice" , " data1" , " read" }, { " data1_admin" , " data1" , " read" }, { " data1_admin" , " data1" , " write" }, { " data2_admin" , " data2" , " read" }, { " data2_admin" , " data2" , " write" } });
208+ TestGetImplicitPermissions (e, " bob" , vector<vector<string>>{ {" bob" , " data2" , " write" } });
209+ }
210+
211+ TEST_METHOD (TestImplicitPermissionAPIWithDomain) {
212+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_with_domains_model.conf" , " ../../examples/rbac_with_hierarchy_with_domains_policy.csv" );
213+ TestGetImplicitPermissionsWithDomain (e, " alice" , " domain1" , vector<vector<string>>{ {" alice" , " domain1" , " data2" , " read" }, { " role:reader" , " domain1" , " data1" , " read" }, { " role:writer" , " domain1" , " data1" , " write" } });
214+ }
215+
216+ TEST_METHOD (TestImplicitUserAPI) {
217+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_model.conf" , " ../../examples/rbac_with_hierarchy_policy.csv" );
218+
219+ Assert::IsTrue (ArrayEquals (vector<string>{ " alice" }, e->GetImplicitUsersForPermission ({ " data1" , " read" })));
220+ Assert::IsTrue (ArrayEquals (vector<string>{ " alice" }, e->GetImplicitUsersForPermission ({ " data1" , " write" })));
221+ Assert::IsTrue (ArrayEquals (vector<string>{ " alice" }, e->GetImplicitUsersForPermission ({ " data2" , " read" })));
222+ Assert::IsTrue (ArrayEquals (vector<string>{ " alice" , " bob" }, e->GetImplicitUsersForPermission ({ " data2" , " write" })));
223+
224+ e->ClearPolicy ();
225+ e->AddPolicy ({ " admin" , " data1" , " read" });
226+ e->AddPolicy ({ " bob" , " data1" , " read" });
227+ e->AddGroupingPolicy ({ " alice" , " admin" });
228+ Assert::IsTrue (ArrayEquals (vector<string>{ " alice" , " bob" }, e->GetImplicitUsersForPermission ({ " data1" , " read" })));
229+ }
230+ };
231+ }
0 commit comments