X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/3499aa48d5d1f3fe08d0160e9212dbde3c8bb32b..ea84bfdefffd4f120799ab6854ef78ea3766d986:/modules/m_invite.c diff --git a/modules/m_invite.c b/modules/m_invite.c index be00603..7fd5ff4 100644 --- a/modules/m_invite.c +++ b/modules/m_invite.c @@ -21,16 +21,14 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: m_invite.c 3438 2007-05-06 14:46:45Z jilles $ */ #include "stdinc.h" -#include "tools.h" #include "common.h" #include "channel.h" #include "client.h" #include "hash.h" -#include "irc_string.h" +#include "match.h" #include "ircd.h" #include "numeric.h" #include "send.h" @@ -40,6 +38,10 @@ #include "parse.h" #include "modules.h" #include "packet.h" +#include "tgchange.h" +#include "channel.h" + +struct module_modes ModuleModes; static int m_invite(struct Client *, struct Client *, int, const char **); @@ -53,7 +55,6 @@ DECLARE_MODULE_AV1(invite, NULL, NULL, invite_clist, NULL, NULL, "$Revision: 343 static void add_invite(struct Channel *, struct Client *); /* m_invite() - * parv[0] - sender prefix * parv[1] - user to invite * parv[2] - channel name */ @@ -111,6 +112,16 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char return 0; } + if(((MyConnect(source_p) && !IsExemptResv(source_p)) || + (MyConnect(target_p) && !IsExemptResv(target_p))) && + hash_find_resv(parv[2])) + { + sendto_one_numeric(source_p, ERR_BADCHANNAME, + form_str(ERR_BADCHANNAME), + parv[2]); + return 0; + } + if((chptr = find_channel(parv[2])) == NULL) { sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL, @@ -136,11 +147,31 @@ 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_chanop(msptr) && - !(chptr->mode.mode & MODE_FREEINVITE)) + if(MyClient(source_p) && !is_any_op(msptr) && + !(chptr->mode.mode & ModuleModes.MODE_FREEINVITE)) { - sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), - me.name, source_p->name, parv[2]); + if(IsOverride(source_p)) + { + sendto_wallops_flags(UMODE_WALLOP, &me, + "%s is overriding INVITE [%s] on [%s]", + get_oper_name(source_p), target_p->name, chptr->chname); + sendto_server(NULL, chptr, NOCAPS, NOCAPS, + ":%s WALLOPS :%s is overriding INVITE [%s] on [%s]", + me.name, 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)) + { + sendto_one_numeric(source_p, ERR_NOINVITE, + form_str(ERR_NOINVITE), + target_p->name); return 0; } @@ -148,12 +179,20 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char * for +l/+j just check if the mode is set, this varies over time */ if(chptr->mode.mode & MODE_INVITEONLY || - (chptr->mode.mode & MODE_REGONLY && EmptyString(target_p->user->suser)) || + (chptr->mode.mode & ModuleModes.MODE_REGONLY && EmptyString(target_p->user->suser)) || chptr->mode.limit || chptr->mode.join_num) store_invite = 1; if(MyConnect(source_p)) { + if (ConfigFileEntry.target_change && !IsOper(source_p) && + !find_allowing_channel(source_p, target_p) && + !add_target(source_p, target_p)) + { + sendto_one(source_p, form_str(ERR_TARGCHANGE), + me.name, source_p->name, target_p->name); + return 0; + } sendto_one(source_p, form_str(RPL_INVITING), me.name, source_p->name, target_p->name, parv[2]); @@ -171,6 +210,34 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char if(MyConnect(target_p)) { + if(!IsOper(source_p) && (IsSetCallerId(target_p) || + (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0])) && + !accept_message(source_p, target_p)) + { + if (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0]) + { + sendto_one_numeric(source_p, ERR_NONONREG, + form_str(ERR_NONONREG), + target_p->name); + return 0; + } + else + { + /* instead of sending RPL_UMODEGMSG, + * just let the invite through + */ + if((target_p->localClient->last_caller_id_time + + ConfigFileEntry.caller_id_wait) >= rb_current_time()) + { + sendto_one_numeric(source_p, ERR_TARGUMODEG, + form_str(ERR_TARGUMODEG), + target_p->name); + return 0; + } + target_p->localClient->last_caller_id_time = rb_current_time(); + } + } + add_reply_target(target_p, source_p); sendto_one(target_p, ":%s!%s@%s INVITE %s :%s", source_p->name, source_p->username, source_p->host, target_p->name, chptr->chname); @@ -196,17 +263,17 @@ m_invite(struct Client *client_p, struct Client *source_p, int parc, const char static void add_invite(struct Channel *chptr, struct Client *who) { - dlink_node *ptr; + rb_dlink_node *ptr; /* already invited? */ - DLINK_FOREACH(ptr, who->user->invited.head) + RB_DLINK_FOREACH(ptr, who->user->invited.head) { if(ptr->data == chptr) return; } /* ok, if their invite list is too long, remove the tail */ - if((int)dlink_list_length(&who->user->invited) >= + if((int)rb_dlink_list_length(&who->user->invited) >= ConfigChannel.max_chans_per_user) { ptr = who->user->invited.tail; @@ -214,10 +281,10 @@ add_invite(struct Channel *chptr, struct Client *who) } /* add user to channel invite list */ - dlinkAddAlloc(who, &chptr->invites); + rb_dlinkAddAlloc(who, &chptr->invites); /* add channel to user invite list */ - dlinkAddAlloc(chptr, &who->user->invited); + rb_dlinkAddAlloc(chptr, &who->user->invited); }