Commits

Anonymous committed 8186aa6

[svn] - allow JOIN 0 from remotes
- allow JOIN 0 from locals, but only if it is exactly one
zero and is the first channel

  • Participants
  • Parent commits a381e90

Comments (0)

Files changed (3)

+nenolod     2007/05/27 06:33:26 UTC	(20070527-3488)
+  Log:
+  - add some IDEAS, including SASL based opering, internally reworking channel access (custom access 
+    levels?), hideops, namespace cleanups, etc
+  
+
+  Changes:	Modified:
+  + -		trunk/IDEAS (File Added) 
+
+
 nenolod     2007/05/27 05:44:35 UTC	(20070527-3486)
   Log:
   - disallow JOIN 0

File include/serno.h

-#define SERNO "20070527-3486"
+#define SERNO "20070527-3488"

File modules/core/m_join.c

  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
  *
- *  $Id: m_join.c 3486 2007-05-27 05:44:35Z nenolod $
+ *  $Id: m_join.c 3494 2007-05-27 13:07:27Z jilles $
  */
 
 #include "stdinc.h"
 	{ NULL, NULL },
 };
 
-DECLARE_MODULE_AV1(join, NULL, NULL, join_clist, join_hlist, NULL, "$Revision: 3486 $");
+DECLARE_MODULE_AV1(join, NULL, NULL, join_clist, join_hlist, NULL, "$Revision: 3494 $");
 
+static void do_join_0(struct Client *client_p, struct Client *source_p);
 static int check_channel_name_loc(struct Client *source_p, const char *name);
 
 static void set_final_mode(struct Mode *mode, struct Mode *oldmode);
 			continue;
 		}
 
+		/* join 0 parts all channels */
+		if(*name == '0' && (name[1] == ',' || name[1] == '\0') && name == chanlist)
+		{
+			(void) strcpy(jbuf, "0");
+			continue;
+		}
+
 		/* check it begins with # or &, and local chans are disabled */
 		else if(!IsChannelName(name))
 		{
 	{
 		hook_data_channel_activity hook_info;
 
+		/* JOIN 0 simply parts all channels the user is in */
+		if(*name == '0' && !atoi(name))
+		{
+			if(source_p->user->channel.head == NULL)
+				continue;
+
+			do_join_0(&me, source_p);
+			continue;
+		}
+
 		/* look for the channel */
 		if((chptr = find_channel(name)) != NULL)
 		{
 	int keep_new_modes = YES;
 	dlink_node *ptr, *next_ptr;
 
+	/* special case for join 0 */
+	if((parv[1][0] == '0') && (parv[1][1] == '\0') && parc == 2)
+	{
+		do_join_0(client_p, source_p);
+		return 0;
+	}
+
 	if(parc < 4)
 		return 0;
 
 	return 0;
 }
 
+/*
+ * do_join_0
+ *
+ * inputs	- pointer to client doing join 0
+ * output	- NONE
+ * side effects	- Use has decided to join 0. This is legacy
+ *		  from the days when channels were numbers not names. *sigh*
+ *		  There is a bunch of evilness necessary here due to
+ * 		  anti spambot code.
+ */
+static void
+do_join_0(struct Client *client_p, struct Client *source_p)
+{
+	struct membership *msptr;
+	struct Channel *chptr = NULL;
+	dlink_node *ptr;
+
+	/* Finish the flood grace period... */
+	if(MyClient(source_p) && !IsFloodDone(source_p))
+		flood_endgrace(source_p);
+
+
+	sendto_server(client_p, NULL, CAP_TS6, NOCAPS, ":%s JOIN 0", use_id(source_p));
+	sendto_server(client_p, NULL, NOCAPS, CAP_TS6, ":%s JOIN 0", source_p->name);
+
+	if(source_p->user->channel.head && MyConnect(source_p) &&
+	   !IsOper(source_p) && !IsExemptSpambot(source_p))
+		check_spambot_warning(source_p, NULL);
+
+	while((ptr = source_p->user->channel.head))
+	{
+		msptr = ptr->data;
+		chptr = msptr->chptr;
+		sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%s@%s PART %s",
+				     source_p->name,
+				     source_p->username, source_p->host, chptr->chname);
+		remove_user_from_channel(msptr);
+	}
+}
+
 static int
 check_channel_name_loc(struct Client *source_p, const char *name)
 {