* account assignment causes a numeric reply during registration.
*/
if (HasHiddenHost(sptr))
- hide_hostmask(sptr, FLAG_HIDDENHOST);
+ hide_hostmask(sptr, HIDE_HOSTMASK_FLAG_HIDDENHOST);
if (IsInvisible(sptr))
++UserStats.inv_clients;
if (IsOper(sptr))
if (MyUser(sptr)) {
const char* channel_name;
struct Membership *member;
- if (!force && !IsXtraOp(sptr) && (channel_name = find_no_nickchange_channel(sptr))) {
+ if (!force && !IsXtraOp(sptr) && (channel_name = find_no_nickchange_channel(sptr, nick))) {
return send_reply(cptr, ERR_BANNICKCHANGE, channel_name);
}
/*
struct Membership *chan;
char buf[HOSTLEN];
- switch (flag) {
- case FLAG_HIDDENHOST:
+ if (flag & HIDE_HOSTMASK_FLAG_HIDDENHOST) {
/* Local users cannot set +x unless FEAT_HOST_HIDING is true. */
if (MyConnect(cptr) && !feature_bool(FEAT_HOST_HIDING))
return 0;
- break;
- case FLAG_ACCOUNT:
- case FLAG_FAKEHOST:
- case FLAG_FAKEIDENT:
+ }
+ if (flag & (HIDE_HOSTMASK_FLAG_ACCOUNT | HIDE_HOSTMASK_FLAG_FAKEHOST | HIDE_HOSTMASK_FLAG_FAKEIDENT)) {
/* Invalidate all bans against the user so we check them again */
for (chan = (cli_user(cptr))->channel; chan;
chan = chan->next_channel)
ClearBanValid(chan);
- break;
- default:
- /* default: no special handling */
- break;
}
/* Set flags and stop if no fakehost has to be applied. */
- SetFlag(cptr, flag);
+ if(flag & HIDE_HOSTMASK_FLAG_HIDDENHOST)
+ SetFlag(cptr, FLAG_HIDDENHOST);
+ if(flag & HIDE_HOSTMASK_FLAG_ACCOUNT)
+ SetFlag(cptr, FLAG_ACCOUNT);
+ if(flag & HIDE_HOSTMASK_FLAG_FAKEHOST)
+ SetFlag(cptr, FLAG_FAKEHOST);
+ if(flag & HIDE_HOSTMASK_FLAG_FAKEIDENT)
+ SetFlag(cptr, FLAG_FAKEIDENT);
+
if(!HasHiddenHost(cptr))
return 0;
/* Generate new fakehost. */
- if(IsFakeHost(cptr)) ircd_strncpy(buf, cli_user(cptr)->fakehost, HOSTLEN);
- else if (IsAccount(cptr)) ircd_snprintf(0, buf, HOSTLEN, "%s.%s", cli_user(cptr)->account, feature_str(FEAT_HIDDEN_HOST));
- else return 0;
- if(strncmp(buf, cli_user(cptr)->host, HOSTLEN) == 0 && (!IsFakeIdent(cptr) || strncmp(cli_user(cptr)->fakeuser, cli_user(cptr)->username, USERLEN) == 0)) return 0;
+ unsigned int reregister = 0;
+ if(IsFakeHost(cptr) || IsAccount(cptr)) {
+ if(IsFakeHost(cptr))
+ ircd_strncpy(buf, cli_user(cptr)->fakehost, HOSTLEN);
+ else
+ ircd_snprintf(0, buf, HOSTLEN, "%s.%s", cli_user(cptr)->account, feature_str(FEAT_HIDDEN_HOST));
+ if(strncmp(buf, cli_user(cptr)->host, HOSTLEN))
+ reregister |= HIDE_HOSTMASK_FLAG_FAKEHOST;
+ }
+ if(IsFakeIdent(cptr)) {
+ if(strncmp(cli_user(cptr)->fakeuser, cli_user(cptr)->username, USERLEN))
+ reregister |= HIDE_HOSTMASK_FLAG_FAKEIDENT;
+ }
+
+ if (!reregister) return 0;
/* Remove all "valid" marks on the bans. This forces them to be
* rechecked if the ban is accessed again.
/* Quit user and set the previously generated fakehost. */
sendcmdto_common_channels_butone(cptr, CMD_QUIT, cptr, ":Registered");
- ircd_strncpy(cli_user(cptr)->host, buf, HOSTLEN);
-
- /* spoof also the username if username is passed */
- if(IsFakeIdent(cptr)) {
- if(strncmp(cli_user(cptr)->username, cli_user(cptr)->fakeuser, USERLEN) != 0) {
- ircd_strncpy(cli_username(cptr), cli_user(cptr)->fakeuser, USERLEN);
- ircd_strncpy(cli_user(cptr)->username, cli_user(cptr)->fakeuser, USERLEN);
- }
- /* ok, the client is now fully hidden, so let them know -- hikari */
- if (MyConnect(cptr))
+ if(reregister & HIDE_HOSTMASK_FLAG_FAKEHOST)
+ ircd_strncpy(cli_user(cptr)->host, buf, HOSTLEN);
+ if(reregister & HIDE_HOSTMASK_FLAG_FAKEIDENT)
+ ircd_strncpy(cli_user(cptr)->username, cli_user(cptr)->fakeuser, USERLEN);
+
+
+ /* ok, the client is now fully hidden, so let them know -- hikari */
+ if(MyConnect(cptr)) {
+ if (IsFakeIdent(cptr))
send_reply(cptr, RPL_HOSTUSERHIDDEN, cli_user(cptr)->username, cli_user(cptr)->host);
- } else {
- /* ok, the client is now fully hidden, so let them know -- hikari */
- if (MyConnect(cptr))
+ else
send_reply(cptr, RPL_HOSTHIDDEN, cli_user(cptr)->host);
}