]> jfr.im git - irc/atheme/atheme.git/commitdiff
groupserv: allow selective recursion of child groups
authorWilliam Pitcock <redacted>
Fri, 8 Aug 2014 22:34:19 +0000 (17:34 -0500)
committerWilliam Pitcock <redacted>
Fri, 8 Aug 2014 22:34:19 +0000 (17:34 -0500)
modules/groupserv/fflags.c
modules/groupserv/flags.c
modules/groupserv/groupserv.h
modules/groupserv/invite.c
modules/groupserv/main/groupserv.c
modules/groupserv/main/groupserv_main.h
modules/groupserv/main/validation.c

index 1f4e51afc6a8b41f9469034cf3b884e8bf6ab6a3..df1e7ad967211a255729270dba6d4e7494c3fe72 100644 (file)
@@ -53,13 +53,13 @@ static void gs_cmd_fflags(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       ga = groupacs_find(mg, mt, 0);
+       ga = groupacs_find(mg, mt, 0, false);
        if (ga != NULL)
                flags = ga->flags;
 
        flags = gs_flags_parser(parv[2], 1, flags);
 
-       if (!(flags & GA_FOUNDER) && groupacs_find(mg, mt, GA_FOUNDER))
+       if (!(flags & GA_FOUNDER) && groupacs_find(mg, mt, GA_FOUNDER, false))
        {
                if (mygroup_count_flag(mg, GA_FOUNDER) == 1)
                {
index 02b01a1365e5ec4f9896bd30e9626e6a4b1c2657..40aa29475a59d7096c0d105dfe719f47e53df5e0 100644 (file)
@@ -103,13 +103,13 @@ static void gs_cmd_flags(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (isuser(mt) && (MU_NEVERGROUP & user(mt)->flags) && (groupacs_find(mg, mt, 0) == NULL))
+       if (isuser(mt) && (MU_NEVERGROUP & user(mt)->flags) && (groupacs_find(mg, mt, 0, true) == NULL))
        {
                command_fail(si, fault_noprivs, _("\2%s\2 does not wish to have flags in any groups."), parv[1]);
                return;
        }
 
-       ga = groupacs_find(mg, mt, 0);
+       ga = groupacs_find(mg, mt, 0, false);
        if (ga != NULL)
                flags = ga->flags;
 
@@ -142,7 +142,7 @@ static void gs_cmd_flags(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (!(flags & GA_FOUNDER) && groupacs_find(mg, mt, GA_FOUNDER))
+       if (!(flags & GA_FOUNDER) && groupacs_find(mg, mt, GA_FOUNDER, false))
        {
                if (mygroup_count_flag(mg, GA_FOUNDER) == 1)
                {
index 3de72aca5b867046717d3c6c31a00f50a5a7c4fa..857396cc3aa0213bee373eeb712ef7aaa7bc90f0 100644 (file)
@@ -19,7 +19,7 @@ unsigned int (*mygroup_count_flag)(mygroup_t *mg, unsigned int flag);
 unsigned int (*myentity_count_group_flag)(myentity_t *mu, unsigned int flagset);
 
 groupacs_t * (*groupacs_add)(mygroup_t *mg, myentity_t *mt, unsigned int flags);
-groupacs_t * (*groupacs_find)(mygroup_t *mg, myentity_t *mt, unsigned int flags);
+groupacs_t * (*groupacs_find)(mygroup_t *mg, myentity_t *mt, unsigned int flags, bool allow_recurse);
 void (*groupacs_delete)(mygroup_t *mg, myentity_t *mt);
 
 bool (*groupacs_sourceinfo_has_flag)(mygroup_t *mg, sourceinfo_t *si, unsigned int flag);
index d78ba6122f7b2d4cb1aa4bd735f1e86620d72a0b..90189a2ab05c88da13d1ae4ce5ca56388d1b935d 100644 (file)
@@ -59,7 +59,7 @@ static void gs_cmd_invite(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if ((ga = groupacs_find(mg, entity(mu), 0)) != NULL)
+       if ((ga = groupacs_find(mg, entity(mu), 0, false)) != NULL)
        {
                command_fail(si, fault_badparams, _("\2%s\2 is already a member of \2%s\2."), user, group);
                return;
index 17bdd619cd815bcd2317f9ac93dd345632056879..3cbc49fa714c76b4bf5c694530cbfd6cfd7c80d2 100644 (file)
@@ -134,9 +134,8 @@ groupacs_t *groupacs_add(mygroup_t *mg, myentity_t *mt, unsigned int flags)
        return ga;
 }
 
-groupacs_t *groupacs_find(mygroup_t *mg, myentity_t *mt, unsigned int flags)
+groupacs_t *groupacs_find(mygroup_t *mg, myentity_t *mt, unsigned int flags, bool allow_recurse)
 {
-       static bool recursing = false;
        mowgli_node_t *n;
 
        return_val_if_fail(mg != NULL, NULL);
@@ -146,13 +145,11 @@ groupacs_t *groupacs_find(mygroup_t *mg, myentity_t *mt, unsigned int flags)
        {
                groupacs_t *ga = n->data;
 
-               if (!recursing && isgroup(ga->mt))
+               if (isgroup(ga->mt) && allow_recurse)
                {
                        groupacs_t *ga2;
 
-                       recursing = true;
-                       ga2 = groupacs_find(group(ga->mt), mt, flags);
-                       recursing = false;
+                       ga2 = groupacs_find(group(ga->mt), mt, flags, false);
 
                        if (ga2 != NULL)
                                return ga;
@@ -176,7 +173,7 @@ void groupacs_delete(mygroup_t *mg, myentity_t *mt)
 {
        groupacs_t *ga;
 
-       ga = groupacs_find(mg, mt, 0);
+       ga = groupacs_find(mg, mt, 0, false);
        if (ga != NULL)
        {
                mowgli_node_delete(&ga->gnode, &mg->acs);
@@ -187,14 +184,14 @@ void groupacs_delete(mygroup_t *mg, myentity_t *mt)
 
 bool groupacs_sourceinfo_has_flag(mygroup_t *mg, sourceinfo_t *si, unsigned int flag)
 {
-       return groupacs_find(mg, entity(si->smu), flag) != NULL;
+       return groupacs_find(mg, entity(si->smu), flag, true) != NULL;
 }
 
 unsigned int groupacs_sourceinfo_flags(mygroup_t *mg, sourceinfo_t *si)
 {
        groupacs_t *ga;
 
-       ga = groupacs_find(mg, entity(si->smu), 0);
+       ga = groupacs_find(mg, entity(si->smu), 0, true);
        if (ga == NULL)
                return 0;
 
index 2b385554824cb8b265ea9a85719046e13402b5f8..2a3ae2007a0667f85940a688257cd7436804959f 100644 (file)
@@ -17,7 +17,7 @@ E mygroup_t *mygroup_add_id(const char *id, const char *name);
 E mygroup_t *mygroup_find(const char *name);
 
 E groupacs_t *groupacs_add(mygroup_t *mg, myentity_t *mt, unsigned int flags);
-E groupacs_t *groupacs_find(mygroup_t *mg, myentity_t *mt, unsigned int flags);
+E groupacs_t *groupacs_find(mygroup_t *mg, myentity_t *mt, unsigned int flags, bool allow_recurse);
 E void groupacs_delete(mygroup_t *mg, myentity_t *mt);
 
 E bool groupacs_sourceinfo_has_flag(mygroup_t *mg, sourceinfo_t *si, unsigned int flag);
index 7a7924e1de6a59d7d5673f667c0cdbb151d1a755..75dc3d0516410786122740aa5272a4eeb0345f31 100644 (file)
@@ -15,7 +15,7 @@ static chanacs_t *mygroup_chanacs_match_entity(chanacs_t *ca, myentity_t *mt)
        if (!isuser(mt))
                return NULL;
 
-       return groupacs_find(mg, mt, GA_CHANACS) != NULL ? ca : NULL;
+       return groupacs_find(mg, mt, GA_CHANACS, true) != NULL ? ca : NULL;
 }
 
 static bool mygroup_can_register_channel(myentity_t *mt)