{ FLAG_WEBIRC, 'W' },
{ FLAG_SEE_IDLETIME,'t' },
{ FLAG_SECURITY_SERV,'D' },
- { FLAG_HIDDENHOST, 'x' }
+ { FLAG_KEEPCONN_ENABLED, 'K' },
+ { FLAG_HIDDENHOST, 'x' },
+ { FLAG_NOTCONN, 'Z' }
};
/** Length of #userModeList. */
}
else {
/* Local client setting NICK the first time */
- strcpy(cli_name(sptr), nick);
+ if(!force)
+ strcpy(cli_name(sptr), nick);
+ else {
+ /* use a "temponary" nick here (we'll switch later) */
+ char tmpnick[NICKLEN + 2];
+ int tmpnickend;
+ strcpy(tmpnick, nick);
+ /* we need at least 10 characters */
+ if (strlen(tmpnick) > IRCD_MIN(NICKLEN, feature_int(FEAT_NICKLEN)) - 10)
+ tmpnick[IRCD_MIN(NICKLEN, feature_int(FEAT_NICKLEN))-10] = '\0';
+ tmpnickend = strlen(tmpnick);
+
+ do { /* get a non-used nick... */
+ sprintf(tmpnick + tmpnickend, "[rz%d]", ircrandom() % 10000);
+ } while(FindClient(tmpnick));
+ strcpy(cli_name(sptr), tmpnick);
+ }
hAddClient(sptr);
return auth_set_nick(cli_auth(sptr), nick);
}
}
if (cptr && MyUser(cptr))
send_umode(cptr, sptr, old, ALL_UMODES, 0);
+ if (sptr && sptr != cptr && MyUser(sptr))
+ send_umode(sptr, sptr, old, ALL_UMODES, 0);
}
char buf[BUFSIZE];
int prop = 0;
int do_host_hiding = 0;
- char* account = NULL, *fakehost = NULL;
+ char* account = NULL, *fakehost = NULL, *keepconn = NULL;
struct Membership *chan;
what = MODE_ADD;
else
ClearWebIRC(sptr);
break;
+ case 'K':
+ if (what == MODE_ADD) {
+ if(*(p + 1) == 0)
+ break;
+ keepconn = *(++p);
+ SetKeepConnEnabled(sptr);
+ } else {
+ ClearKeepConnEnabled(sptr);
+ }
+ break;
case 'r':
if (*(p + 1) && (what == MODE_ADD)) {
account = *(++p);
case 'z': /* Formerly SSL mode; we ignore it. */
break;
#endif
+ case 'Z':
+ if (what == MODE_ADD)
+ SetNotConn(sptr);
+ else
+ ClearNotConn(sptr);
+ break;
default:
send_reply(sptr, ERR_UMODEUNKNOWNFLAG, *m);
break;
ClrFlag(sptr, FLAG_FAKEHOST);
if (!FlagHas(&setflags, FLAG_SEE_IDLETIME) && IsSeeIdletime(sptr))
ClrFlag(sptr, FLAG_SEE_IDLETIME);
+ if (!FlagHas(&setflags, FLAG_NOTCONN) && IsNotConn(sptr))
+ ClrFlag(sptr, FLAG_NOTCONN);
/*
* new umode; servers and privileged opers can set it, local users cannot;
* prevents users from /kick'ing or /mode -o'ing
ClearHiddenOper(sptr);
if (!FlagHas(&setflags, FLAG_OVERRIDECC) && IsOverrideCC(sptr) && !HasPriv(sptr, PRIV_UMODE_OVERRIDECC))
ClearOverrideCC(sptr);
+ if (!FlagHas(&setflags, FLAG_KEEPCONN_ENABLED) && IsKeepConnEnabled(sptr) && !HasPriv(sptr, PRIV_SET_KEEPCONN))
+ ClearKeepConnEnabled(sptr);
+ if(keepconn && !HasPriv(sptr, PRIV_SET_KEEPCONN))
+ keepconn = NULL;
/* Opers are able to fake the webirc usermode only if FEAT_FAKE_WEBIRC is true. */
if (!FlagHas(&setflags, FLAG_WEBIRC) && IsWebIRC(sptr) && !(feature_bool(FEAT_FAKE_WEBIRC) && IsOper(sptr)))
ClearWebIRC(sptr);
if (!FlagHas(&setflags, FLAG_FAKEHOST) && IsFakeHost(sptr)) {
ircd_strncpy(cli_user(sptr)->fakehost, fakehost, HOSTLEN);
}
+ if (!FlagHas(&setflags, FLAG_KEEPCONN_ENABLED) && IsKeepConnEnabled(sptr)) {
+ sptr->keepconn = atoi(keepconn);
+ } else if(keepconn && sptr->keepconn != atoi(keepconn)) {
+ FlagClr(&setflags, FLAG_KEEPCONN_ENABLED);
+ sptr->keepconn = atoi(keepconn);
+ }
if (IsRegistered(sptr)) {
if(do_host_hiding)
int flag;
char *m;
int what = MODE_NULL;
- int add_fakehost = 0, add_account = 0;
+ int add_fakehost = 0, add_account = 0, add_keepconn = 0;
/*
* Build a string in umodeBuf to represent the change in the user's
if(!serv_modes || FlagHas(old, flag)) continue;
add_fakehost = 1;
}
+
+ if(flag == FLAG_KEEPCONN_ENABLED) {
+ add_keepconn = 1;
+ }
switch (sendset)
{
while((*m++ = *t++)) ; /* Empty loop */
--m; /* back up over previous nul-termination */
}
+
+ if(add_keepconn) {
+ *m++ = ' ';
+ m += sprintf(m, "%u", sptr->keepconn);
+ }
*m = '\0';
if (*umodeBuf && cptr)