Commits

jilles  committed 1dc6eef

[svn] Change handling of modularized umodes:
- keep the bitmask reserved forever to the letter, fixing
the problems when loading multiple umode modules,
unloading them and then loading them in a different order
- don't allow local users to change umodes which have
been unloaded and don't set them on new users via
default_umodes

  • Participants
  • Parent commits d21a499

Comments (0)

Files changed (3)

+jilles      2007/02/04 01:59:38 UTC	(20070204-3201)
+  Log:
+  Move find_umode_slot() from libcharybdis/tools.c to src/s_user.c.
+  
+
+  Changes:	Modified:
+  +1 -0		trunk/include/s_user.h (File Modified) 
+  +0 -22	trunk/libcharybdis/tools.c (File Modified) 
+  +0 -1		trunk/libcharybdis/tools.h (File Modified) 
+  +22 -0	trunk/src/s_user.c (File Modified) 
+
+
 jilles      2007/02/01 01:44:31 UTC	(20070201-3195)
   Log:
   DNSBL keyword substitution is available as of 2.1.3.

File include/serno.h

-#define SERNO "20070201-3195"
+#define SERNO "20070204-3201"

File src/s_user.c

  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
  *
- *  $Id: s_user.c 3201 2007-02-04 01:59:38Z jilles $
+ *  $Id: s_user.c 3203 2007-02-04 15:08:04Z jilles $
  */
 
 #include "stdinc.h"
 
 char umodebuf[128];
 
+static int orphaned_umodes = 0;
 int user_modes[256] = {
 	/* 0x00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0F */
 	/* 0x10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1F */
 		add_to_id_hash(source_p->id, source_p);
 	}
 
-	source_p->umodes |= ConfigFileEntry.default_umodes & ~ConfigFileEntry.oper_only_umodes;
+	source_p->umodes |= ConfigFileEntry.default_umodes & ~ConfigFileEntry.oper_only_umodes & ~orphaned_umodes;
 
 	if (source_p->umodes & UMODE_INVISIBLE)
 		Count.invisi++;
 			if((flag = user_modes[(unsigned char) *pm]))
 			{
 				if(MyConnect(source_p)
-				   && !IsOper(source_p)
-				   && (ConfigFileEntry.oper_only_umodes & flag))
+						&& ((!IsOper(source_p)
+							&& (ConfigFileEntry.oper_only_umodes & flag))
+						|| (orphaned_umodes & flag)))
 				{
 					if (what == MODE_ADD || source_p->umodes & flag)
 						badflag = YES;
 {
 	int i;
 	char *ptr = umodebuf;
+	static int prev_user_modes[128];
 
 	*ptr = '\0';
 
 	for (i = 0; i < 128; i++)
+	{
+		if (prev_user_modes[i] != 0 && prev_user_modes[i] != user_modes[i])
+		{
+			if (user_modes[i] == 0)
+			{
+				orphaned_umodes |= prev_user_modes[i];
+				sendto_realops_snomask(SNO_DEBUG, L_ALL, "Umode +%c is now orphaned", i);
+			}
+			else
+			{
+				orphaned_umodes &= ~prev_user_modes[i];
+				sendto_realops_snomask(SNO_DEBUG, L_ALL, "Orphaned umode +%c is picked up by module", i);
+			}
+			user_modes[i] = prev_user_modes[i];
+		}
+		else
+			prev_user_modes[i] = user_modes[i];
 		if (user_modes[i])
 			*ptr++ = (char) i;
+	}
 
 	*ptr++ = '\0';
 }