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.
4038bool 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).
6374bool 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.
213224vector<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}
0 commit comments