diff --git a/modules/core/m_kick.c b/modules/core/m_kick.c index 7efabbb..8ed49f4 100644 --- a/modules/core/m_kick.c +++ b/modules/core/m_kick.c @@ -37,6 +37,7 @@ #include "hash.h" #include "packet.h" #include "s_serv.h" +#include "s_conf.h" #include "hook.h" static int m_kick(struct Client *, struct Client *, int, const char **); @@ -69,6 +70,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p char *p = NULL; const char *user; static char buf[BUFSIZE]; + int is_override = 0; if(MyClient(source_p) && !IsFloodDone(source_p)) flood_endgrace(source_p); @@ -104,17 +106,22 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p return 0; } - if(!can_kick_deop(msptr, find_channel_membership(chptr, who)) && !IsOverride(source_p)) + if(!can_kick_deop(msptr, find_channel_membership(chptr, who))) { if(MyConnect(source_p)) { - sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), - me.name, source_p->name, name); - return 0; + if(IsOverride(source_p)) + is_override = 1; + else + { + sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), + me.name, source_p->name, name); + return 0; + } } /* If its a TS 0 channel, do it the old way */ - if(chptr->channelts == 0) + else if(chptr->channelts == 0) { sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), get_id(&me, source_p), get_id(source_p, source_p), name); @@ -185,6 +192,11 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p if(strlen(comment) > (size_t) REASONLEN) comment[REASONLEN] = '\0'; + if(is_override) + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, + "%s is overriding KICK [%s] on [%s] [%s]", + get_oper_name(source_p), who->name, chptr->chname, comment); + /* jdc * - In the case of a server kicking a user (i.e. CLEARCHAN), * the kick should show up as coming from the server which did diff --git a/modules/m_invite.c b/modules/m_invite.c index 2a711e4..cd33aff 100644 --- a/modules/m_invite.c +++ b/modules/m_invite.c @@ -145,12 +145,19 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char /* unconditionally require ops, unless the channel is +g */ /* treat remote clients as chanops */ - if(MyClient(source_p) && !is_any_op(msptr) && !IsOverride(source_p) && + if(MyClient(source_p) && !is_any_op(msptr) && !(chptr->mode.mode & MODE_FREEINVITE)) { - sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), - me.name, source_p->name, parv[2]); - return 0; + if(IsOverride(source_p)) + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, + "%s is overriding INVITE [%s] on [%s]", + get_oper_name(source_p), target_p->name, chptr->chname); + else + { + sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), + me.name, source_p->name, parv[2]); + return 0; + } } if (IsSetNoInvite(target_p))