bool UserGroup::ResolveGroupMembership(const User::Ptr& user, bool add, int rstack) { if (add && rstack > 20) { Log(LogWarning, "UserGroup") << "Too many nested groups for group '" << GetName() << "': User '" << user->GetName() << "' membership assignment failed."; return false; } Array::Ptr groups = GetGroups(); if (groups && groups->GetLength() > 0) { ObjectLock olock(groups); for (const String& name : groups) { UserGroup::Ptr group = UserGroup::GetByName(name); if (group && !group->ResolveGroupMembership(user, add, rstack + 1)) return false; } } if (add) AddMember(user); else RemoveMember(user); return true; }
bool UserGroup::EvaluateObjectRuleOne(const User::Ptr user, const ObjectRule& rule) { DebugInfo di = rule.GetDebugInfo(); std::ostringstream msgbuf; msgbuf << "Evaluating 'object' rule (" << di << ")"; CONTEXT(msgbuf.str()); Dictionary::Ptr locals = make_shared<Dictionary>(); locals->Set("user", user); if (!rule.EvaluateFilter(locals)) return false; std::ostringstream msgbuf2; msgbuf2 << "Assigning membership for group '" << rule.GetName() << "' to user '" << user->GetName() << "' for rule " << di; Log(LogDebug, "UserGroup", msgbuf2.str()); String group_name = rule.GetName(); UserGroup::Ptr group = UserGroup::GetByName(group_name); if (!group) { Log(LogCritical, "UserGroup", "Invalid membership assignment. Group '" + group_name + "' does not exist."); return false; } /* assign user group membership */ group->ResolveGroupMembership(user, true); /* update groups attribute for apply */ user->AddGroup(group_name); return true; }
void User::Stop(bool runtimeRemoved) { ObjectImpl<User>::Stop(runtimeRemoved); Array::Ptr groups = GetGroups(); if (groups) { ObjectLock olock(groups); for (const String& name : groups) { UserGroup::Ptr ug = UserGroup::GetByName(name); if (ug) ug->ResolveGroupMembership(this, false); } } }
void User::OnAllConfigLoaded(void) { ObjectImpl<User>::OnAllConfigLoaded(); UserGroup::EvaluateObjectRules(this); Array::Ptr groups = GetGroups(); if (groups) { groups = groups->ShallowClone(); ObjectLock olock(groups); for (const String& name : groups) { UserGroup::Ptr ug = UserGroup::GetByName(name); if (ug) ug->ResolveGroupMembership(this, true); } } }