X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=blobdiff_plain;f=ircd%2Fchannel.c;h=868a82f052c7d94496dff10b62c2815dafd3d239;hp=30b9f1de6d3864cf78b71756416c9190184b3d81;hb=c666f34b1e2d872189f36761e3b69eac635fd6ae;hpb=c6d3f87c62b35eda2b51563991dfa56e8519ba72 diff --git a/ircd/channel.c b/ircd/channel.c index 30b9f1d..868a82f 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -374,7 +374,7 @@ struct Membership* find_channel_member(struct Client* cptr, struct Channel* chpt * @param[in] banlist The list of bans to test. * @return Pointer to a matching ban, or NULL if none exit. */ -struct Ban *find_ban(struct Client *cptr, struct Ban *banlist) +static struct Ban *find_ban_with_nick(struct Client *cptr, const char *nick, struct Ban *banlist) { char nu[NICKLEN + USERLEN + 2]; char tmphost[HOSTLEN + 1]; @@ -386,7 +386,7 @@ struct Ban *find_ban(struct Client *cptr, struct Ban *banlist) /* Build nick!user and alternate host names. */ ircd_snprintf(0, nu, sizeof(nu), "%s!%s", - cli_name(cptr), cli_user(cptr)->username); + (nick ? nick : cli_name(cptr)), cli_user(cptr)->username); ircd_ntoa_r(iphost, &cli_ip(cptr)); /* Check for all three possible hosts: @@ -439,6 +439,10 @@ struct Ban *find_ban(struct Client *cptr, struct Ban *banlist) return found; } +struct Ban *find_ban(struct Client *cptr, struct Ban *banlist) { + return find_ban_with_nick(cptr, NULL, banlist); +} + /** * This function returns true if the user is banned on the said channel. * This function will check the ban cache if applicable, otherwise will @@ -462,6 +466,13 @@ static int is_banned(struct Membership* member) } } +static int is_banned_with_nick(struct Membership* member, const char *nick) { + if (find_ban_with_nick(member->user, nick, member->channel->banlist)) + return 1; + else + return 0; +} + /** add a user to a channel. * adds a user to a channel by adding another link to the channels member * chain. @@ -796,11 +807,12 @@ int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr, int r * the name of the first channel banned on. * * @param cptr The client + * @param new_nick The new nick of the client * * @returns the name of the first channel banned on, or NULL if the user * can change nicks. */ -const char* find_no_nickchange_channel(struct Client* cptr) +const char* find_no_nickchange_channel(struct Client* cptr, const char *new_nick) { if (MyUser(cptr)) { struct Membership* member; @@ -810,7 +822,7 @@ const char* find_no_nickchange_channel(struct Client* cptr) continue; if ((member->channel->mode.mode & MODE_MODERATED) || (member->channel->mode.mode & MODE_REGONLY && !IsAccount(cptr)) - || is_banned(member)) + || is_banned(member) || (new_nick && is_banned_with_nick(member, new_nick))) return member->channel->chname; } }