]> jfr.im git - irc/atheme/atheme.git/commitdiff
GroupServ/HostServ: Remove group-specific offered vhosts when group dropped
authorRenegade334 <redacted>
Mon, 12 Jan 2015 01:48:10 +0000 (01:48 +0000)
committerRenegade334 <redacted>
Mon, 12 Jan 2015 01:53:18 +0000 (01:53 +0000)
Added group_register and group_drop hooks
Addresses atheme#428

include/hooktypes.in
modules/groupserv/drop.c
modules/groupserv/register.c
modules/hostserv/offer.c

index c6ff0fe8c4b7ebcef85c949019fd9d21917fce87..84ba28fcf7c7f3685ca023e421b354611de2dd1d 100644 (file)
@@ -57,6 +57,8 @@ channel_info       hook_channel_req_t *
 channel_register   hook_channel_req_t *
 channel_check_expire  hook_expiry_req_t *
 channel_acl_change hook_channel_acl_req_t *
+group_drop         mygroup_t *
+group_register     mygroup_t *
 nick_can_register  hook_user_register_check_t *
 nick_group         hook_user_req_t *
 nick_check         user_t *
index ba05359e9fbf4cf35e3388540a09551115c4459c..efbefc4602f7db4cb0e82d85190ab3bc229309aa 100644 (file)
@@ -78,6 +78,7 @@ static void gs_cmd_drop(sourceinfo_t *si, int parc, char *parv[])
 
        logcommand(si, CMDLOG_REGISTER, "DROP: \2%s\2", entity(mg)->name);
        remove_group_chanacs(mg);
+       hook_call_group_drop(mg);
        object_unref(mg);
        command_success_nodata(si, _("The group \2%s\2 has been dropped."), name);
        return;
index e03fabfc01d6f1cf67bb54e4f095b60e91cb1c76..03bc7f9d197175b1b5f812026314530e0053d495 100644 (file)
@@ -65,6 +65,7 @@ static void gs_cmd_register(sourceinfo_t *si, int parc, char *parv[])
 
        mg = mygroup_add(parv[0]);
        groupacs_add(mg, entity(si->smu), GA_ALL | GA_FOUNDER);
+       hook_call_group_register(mg);
 
        logcommand(si, CMDLOG_REGISTER, "REGISTER: \2%s\2", entity(mg)->name);
        command_success_nodata(si, _("The group \2%s\2 has been registered to \2%s\2."), entity(mg)->name, entity(si->smu)->name);
index 73078fd825b0f453264ddd4eb3be217c62c24142..bca3fe37f7ba3375ed86a3380ad0b06dd21af07a 100644 (file)
@@ -25,6 +25,8 @@ static void hs_cmd_take(sourceinfo_t *si, int parc, char *parv[]);
 static void write_hsofferdb(database_handle_t *db);
 static void db_h_ho(database_handle_t *db, const char *type);
 
+static void remove_group_offered_hosts(mygroup_t *mg);
+
 command_t hs_offer = { "OFFER", N_("Sets vhosts available for users to take."), PRIV_USER_VHOST, 2, hs_cmd_offer, { .path = "hostserv/offer" } };
 command_t hs_unoffer = { "UNOFFER", N_("Removes a vhost from the list that users can take."), PRIV_USER_VHOST, 2, hs_cmd_unoffer, { .path = "hostserv/unoffer" } };
 command_t hs_offerlist = { "OFFERLIST", N_("Lists all available vhosts."), AC_NONE, 1, hs_cmd_offerlist, { .path = "hostserv/offerlist" } };
@@ -54,6 +56,9 @@ void _modinit(module_t *m)
        hook_add_db_write(write_hsofferdb);
        db_register_type_handler("HO", db_h_ho);
 
+       hook_add_event("group_drop");
+       hook_add_group_drop(remove_group_offered_hosts);
+
        service_named_bind_command("hostserv", &hs_offer);
        service_named_bind_command("hostserv", &hs_unoffer);
        service_named_bind_command("hostserv", &hs_offerlist);
@@ -65,6 +70,8 @@ void _moddeinit(module_unload_intent_t intent)
        hook_del_db_write(write_hsofferdb);
        db_unregister_type_handler("HO");
 
+       hook_del_group_drop(remove_group_offered_hosts);
+
        service_named_unbind_command("hostserv", &hs_offer);
        service_named_unbind_command("hostserv", &hs_unoffer);
        service_named_unbind_command("hostserv", &hs_offerlist);
@@ -135,6 +142,31 @@ static inline hsoffered_t *hs_offer_find(const char *host, myentity_t *mt)
        return NULL;
 }
 
+static void remove_group_offered_hosts(mygroup_t *mg)
+{
+       return_if_fail(mg != NULL);
+
+       myentity_t *mt = entity(mg);
+       mowgli_node_t *n, *tn;
+       hsoffered_t *l;
+
+       MOWGLI_ITER_FOREACH_SAFE(n, tn, hs_offeredlist.head)
+       {
+               l = n->data;
+
+               if (l->group != NULL && l->group == mt)
+               {
+                       slog(LG_VERBOSE, "remove_group_offered_hosts(): removing %s (group %s)", l->vhost, l->group->name);
+
+                       mowgli_node_delete(n, &hs_offeredlist);
+
+                       strshare_unref(l->creator);
+                       free(l->vhost);
+                       free(l);
+               }
+       }
+}
+
 /* OFFER <host> */
 static void hs_cmd_offer(sourceinfo_t *si, int parc, char *parv[])
 {
@@ -197,8 +229,16 @@ static void hs_cmd_offer(sourceinfo_t *si, int parc, char *parv[])
 
        mowgli_node_add(l, &l->node, &hs_offeredlist);
 
-       command_success_nodata(si, _("You have offered vhost \2%s\2."), host);
-       logcommand(si, CMDLOG_ADMIN, "OFFER: \2%s\2", host);
+       if (mt != NULL)
+       {
+               command_success_nodata(si, _("You have offered vhost \2%s\2 to group \2%s\2."), host, group);
+               logcommand(si, CMDLOG_ADMIN, "OFFER: \2%s\2 to \2%s\2", host, group);
+       }
+       else
+       {
+               command_success_nodata(si, _("You have offered vhost \2%s\2."), host);
+               logcommand(si, CMDLOG_ADMIN, "OFFER: \2%s\2", host);
+       }
 
        return;
 }