Added new define in include/client.h IsRealChannelService() - client has usermode +k and is on a services server (+s flag) Function ms_invite did not return an error when the source was a channel service, that should only be for a real channel service. diff -r 48ace0dc0261 include/client.h --- a/include/client.h Wed Mar 17 14:34:56 2010 +0100 +++ b/include/client.h Wed Mar 17 14:50:51 2010 +0100 @@ -568,6 +568,8 @@ #define IsBurstOrBurstAck(x) (HasFlag(x, FLAG_BURST) || HasFlag(x, FLAG_BURST_ACK)) /** Return non-zero if the client has set mode +k (channel service). */ #define IsChannelService(x) HasFlag(x, FLAG_CHSERV) +/** Return non-zero if the client has set mode +k (channel service) and is on a service server */ +#define IsRealChannelService(x) (IsChannelService(x) && IsService(cli_user(x)->server)) /** Return non-zero if the client's socket is disconnected. */ #define IsDead(x) HasFlag(x, FLAG_DEADSOCKET) /** Return non-zero if the client has set mode +d (deaf). */ diff -r 48ace0dc0261 ircd/channel.c --- a/ircd/channel.c Wed Mar 17 14:34:56 2010 +0100 +++ b/ircd/channel.c Wed Mar 17 14:50:51 2010 +0100 @@ -180,7 +180,7 @@ * however there are typically no more than 1000 people in a channel * at a time. */ - if (IsChannelService(cptr)) { + if (IsRealChannelService(cptr)) { m = chptr->members; while (m) { assert(m->channel == chptr); @@ -3176,7 +3176,7 @@ * Allow +X'ed users to mess with +k'ed. * --Bigfoot */ - if ((IsChannelService(state->cli_change[i].client) && IsService(cli_user(state->cli_change[i].client)->server)) || (IsChannelService(state->cli_change[i].client) && !IsXtraOp(state->sptr))) { + if ((IsRealChannelService(state->cli_change[i].client)) || (IsChannelService(state->cli_change[i].client) && !IsXtraOp(state->sptr))) { if (state->flags & MODE_PARSE_FORCE) /* it was forced */ sendto_opmask_butone(0, SNO_HACK4, "Deop of +k user on %H by %s", state->chptr, @@ -3184,7 +3184,7 @@ cli_name((cli_user(state->sptr))->server))); else if (MyUser(state->sptr) && state->flags & MODE_PARSE_SET && (state->sptr != state->cli_change[i].client)) { - if(IsService(cli_user(state->cli_change[i].client)->server) && IsChannelService(state->cli_change[i].client)){ + if(IsRealChannelService(state->cli_change[i].client)){ send_reply(state->sptr, ERR_ISREALSERVICE, cli_name(state->cli_change[i].client), state->chptr->chname); @@ -3641,7 +3641,7 @@ if (!(flags & (CHFL_ZOMBIE | CHFL_DELAYED))) sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL, 0, ((flags & CHFL_BANNED) || ((chan->mode.mode & MODE_NOQUITPARTS) - && !IsChannelService(member->user)) || !jbuf->jb_comment) ? + && !IsRealChannelService(member->user)) || !jbuf->jb_comment) ? "%H" : "%H :%s", chan, jbuf->jb_comment); else if (MyUser(jbuf->jb_source)) sendcmdto_one(jbuf->jb_source, CMD_PART, jbuf->jb_source, diff -r 48ace0dc0261 ircd/ircd_relay.c --- a/ircd/ircd_relay.c Wed Mar 17 14:34:56 2010 +0100 +++ b/ircd/ircd_relay.c Wed Mar 17 14:50:51 2010 +0100 @@ -205,7 +205,7 @@ * This first: Almost never a server/service * Servers may have channel services, need to check for it here */ - if (client_can_send_to_channel(sptr, chptr, 1) || IsChannelService(sptr)) { + if (client_can_send_to_channel(sptr, chptr, 1) || IsRealChannelService(sptr)) { sendcmdto_channel_butone(sptr, CMD_PRIVATE, chptr, cli_from(sptr), SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text); } @@ -233,7 +233,7 @@ * This first: Almost never a server/service * Servers may have channel services, need to check for it here */ - if (client_can_send_to_channel(sptr, chptr, 1) || IsChannelService(sptr)) { + if (client_can_send_to_channel(sptr, chptr, 1) || IsRealChannelService(sptr)) { sendcmdto_channel_butone(sptr, CMD_NOTICE, chptr, cli_from(sptr), SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text); } @@ -290,7 +290,7 @@ */ if (!(acptr = FindUser(name)) || !MyUser(acptr) || (!EmptyString(host) && 0 != match(host, cli_user(acptr)->host)) || - !IsChannelService(acptr)) + !IsRealChannelService(acptr)) { /* * By this stage we might as well not bother because they will @@ -385,7 +385,7 @@ send_reply(sptr, ERR_NOSUCHNICK, name); return; } - if ((!IsChannelService(acptr) && + if ((!IsRealChannelService(acptr) && check_target_limit(sptr, acptr, cli_name(acptr), 0)) || is_silenced(sptr, acptr)) return; @@ -431,7 +431,7 @@ if (0 == (acptr = FindUser(name))) return; - if ((!IsChannelService(acptr) && + if ((!IsRealChannelService(acptr) && check_target_limit(sptr, acptr, cli_name(acptr), 0)) || is_silenced(sptr, acptr)) return; diff -r 48ace0dc0261 ircd/m_invite.c --- a/ircd/m_invite.c Wed Mar 17 14:34:56 2010 +0100 +++ b/ircd/m_invite.c Wed Mar 17 14:50:51 2010 +0100 @@ -271,7 +271,7 @@ } else if (IsBurstOrBurstAck(cptr)) return 0; - if (!IsChannelService(sptr) && !find_channel_member(sptr, chptr)) { + if (!IsRealChannelService(sptr) && !find_channel_member(sptr, chptr)) { send_reply(sptr, ERR_NOTONCHANNEL, chptr->chname); return 0; } diff -r 48ace0dc0261 ircd/m_kick.c --- a/ircd/m_kick.c Wed Mar 17 14:34:56 2010 +0100 +++ b/ircd/m_kick.c Wed Mar 17 14:50:51 2010 +0100 @@ -136,17 +136,14 @@ * Allow +X'ed users to kick +k'ed, but not U-lined services. * --Bigfoot */ - if (IsChannelService(who)) { - if (IsService(cli_user(who)->server)) - return send_reply(sptr, ERR_ISREALSERVICE, cli_name(who), chptr->chname); + if (IsRealChannelService(who)) + return send_reply(sptr, ERR_ISREALSERVICE, cli_name(who), chptr->chname); - if (!IsXtraOp(sptr) && (who!=sptr)) { - /* the victim is paranoid AND on the channel but not a zombie - wiebe */ - if (IsParanoid(who) && (member = find_member_link(chptr, who)) && !IsZombie(member)) { - sendcmdto_one(&me, CMD_NOTICE, who, "%C :kick: %s tried to /KICK you from %s.", who, cli_name(sptr), chptr->chname); - } - return send_reply(sptr, ERR_ISCHANSERVICE, cli_name(who), chptr->chname); - } + if (IsChannelService(who) && !IsXtraOp(sptr) && (who!=sptr)) { + /* the victim is paranoid AND on the channel but not a zombie */ + if (IsParanoid(who) && (member = find_member_link(chptr, who)) && !IsZombie(member)) + sendcmdto_one(&me, CMD_NOTICE, who, "%C :kick: %s tried to /KICK you from %s.", who, cli_name(sptr), chptr->chname); + return send_reply(sptr, ERR_ISCHANSERVICE, cli_name(who), chptr->chname); } /* Prevent kicking opers from local channels -DM- */ diff -r 48ace0dc0261 ircd/m_kill.c --- a/ircd/m_kill.c Wed Mar 17 14:34:56 2010 +0100 +++ b/ircd/m_kill.c Wed Mar 17 14:50:51 2010 +0100 @@ -293,7 +293,7 @@ * Allow +X'ed users to kill +k'ed, but not U-lined services. * --Bigfoot */ - if (IsChannelService(victim) && IsService(cli_user(victim)->server)) + if (IsRealChannelService(victim)) return send_reply(sptr, ERR_ISREALSERVICE, "KILL", cli_name(victim)); if (IsChannelService(victim) && !IsXtraOp(sptr) && !(victim==sptr)) diff -r 48ace0dc0261 ircd/m_silence.c --- a/ircd/m_silence.c Wed Mar 17 14:34:56 2010 +0100 +++ b/ircd/m_silence.c Wed Mar 17 14:50:51 2010 +0100 @@ -289,7 +289,7 @@ /* See if the user is requesting a silence list. */ acptr = sptr; if (parc < 2 || EmptyString(parv[1]) || (acptr = FindUser(parv[1]))) { - if (cli_user(acptr) && ((acptr == sptr) || IsChannelService(acptr))) { + if (cli_user(acptr) && ((acptr == sptr) || IsRealChannelService(acptr))) { for (sile = cli_user(acptr)->silence; sile; sile = sile->next) { send_reply(sptr, RPL_SILELIST, cli_name(acptr), (sile->flags & BAN_EXCEPTION ? "~" : ""), sile->banstr);