* 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 3255 2007-03-06 14:07:11Z 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 */
return (CLIENT_EXITED);
}
- /* valid user name check */
-
- if(!valid_username(source_p->username))
- {
- sendto_realops_snomask(SNO_REJ, L_ALL,
- "Invalid username: %s (%s@%s)",
- source_p->name, source_p->username, source_p->host);
- ServerStats->is_ref++;
- ircsprintf(tmpstr2, "Invalid username [%s]", source_p->username);
- exit_client(client_p, source_p, &me, tmpstr2);
- return (CLIENT_EXITED);
- }
-
- /* end of valid user name check */
-
/* kline exemption extends to xline too */
if(!IsExemptKline(source_p) &&
find_xline(source_p->info, 1) != NULL)
}
}
+ /* valid user name check */
+
+ if(!valid_username(source_p->username))
+ {
+ sendto_realops_snomask(SNO_REJ, L_ALL,
+ "Invalid username: %s (%s@%s)",
+ source_p->name, source_p->username, source_p->host);
+ ServerStats->is_ref++;
+ ircsprintf(tmpstr2, "Invalid username [%s]", source_p->username);
+ exit_client(client_p, source_p, &me, tmpstr2);
+ return (CLIENT_EXITED);
+ }
+
+ /* end of valid user name check */
+
/* Store original hostname -- jilles */
strlcpy(source_p->orighost, source_p->host, HOSTLEN + 1);
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;
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"%s (%s@%s) is now an operator", source_p->name,
source_p->username, source_p->host);
+ if(!(old & UMODE_INVISIBLE) && IsInvisible(source_p))
+ ++Count.invisi;
+ if((old & UMODE_INVISIBLE) && !IsInvisible(source_p))
+ --Count.invisi;
send_umode_out(source_p, source_p, old);
sendto_one(source_p, form_str(RPL_SNOMASK), me.name, source_p->name,
construct_snobuf(source_p->snomask));
{
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';
}
target_p->host, nick);
}
- strlcpy(target_p->username, user, USERLEN);
- strlcpy(target_p->host, host, HOSTLEN);
+ strlcpy(target_p->username, user, sizeof target_p->username);
+ strlcpy(target_p->host, host, sizeof target_p->host);
if (changed)
add_history(target_p, 1);