X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/b705a46f439ae6e6f8d068a7a1ff8b178d490de6..585e477be8d7cfa2c0308568e5cab8df095a639e:/modules/core/m_message.c diff --git a/modules/core/m_message.c b/modules/core/m_message.c index acbae11..670a609 100644 --- a/modules/core/m_message.c +++ b/modules/core/m_message.c @@ -21,7 +21,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: m_message.c 3173 2007-01-31 23:57:18Z jilles $ */ #include "stdinc.h" @@ -501,7 +500,7 @@ msg_channel(int p_or_n, const char *command, if(chptr->mode.mode & MODE_NOREPEAT) { rb_strlcpy(text2, text, BUFSIZE); - strip_colour(text2); + strip_unprintable(text2); md = channel_metadata_find(chptr, "NOREPEAT"); if(md && (!ConfigChannel.exempt_cmode_K || !is_any_op(msptr))) { @@ -534,18 +533,29 @@ msg_channel(int p_or_n, const char *command, /* chanops and voiced can flood their own channel with impunity */ if((result = can_send(chptr, source_p, NULL))) { + if(result != CAN_SEND_OPV && MyClient(source_p) && + !IsOper(source_p) && + !add_channel_target(source_p, chptr)) + { + sendto_one(source_p, form_str(ERR_TARGCHANGE), + me.name, source_p->name, chptr->chname); + return; + } if(result == CAN_SEND_OPV || !flood_attack_channel(p_or_n, source_p, chptr, chptr->chname)) { if (strlen(text) > 10 && chptr->mode.mode & MODE_NOCAPS && (!ConfigChannel.exempt_cmode_G || !is_any_op(msptr))) { - for(contor=0; contor < strlen(text); contor++) + rb_strlcpy(text2, text, BUFSIZE); + strip_unprintable(text2); + for(contor=0; contor < strlen(text2); contor++) { - if(IsUpper(text[contor]) && !isdigit(text[contor])) + if(IsUpper(text2[contor]) && !isdigit(text2[contor])) caps++; len++; } - if(((caps*100)/(len)) >= 50) + /* Added divide by 0 check --alxbl */ + if(len != 0 && ((caps*100)/(len)) >= 50) { sendto_one_numeric(source_p, 404, "%s :Cannot send to channel - Your message contains mostly capital letters (+G set)", chptr->chname); return; @@ -564,7 +574,7 @@ msg_channel(int p_or_n, const char *command, return; } if (p_or_n != NOTICE && *text == '\001' && - strncasecmp(text + 1, "ACTION", 6)) + strncasecmp(text + 1, "ACTION ", 7)) { if (chptr->mode.mode & MODE_NOCTCP && (!ConfigChannel.exempt_cmode_C || !is_any_op(msptr))) { @@ -582,6 +592,13 @@ msg_channel(int p_or_n, const char *command, (!(chptr->mode.mode & MODE_NOPRIVMSGS) || IsMember(source_p, chptr))) { + if(MyClient(source_p) && !IsOper(source_p) && + !add_channel_target(source_p, chptr)) + { + sendto_one(source_p, form_str(ERR_TARGCHANGE), + me.name, source_p->name, chptr->chname); + return; + } if(!flood_attack_channel(p_or_n, source_p, chptr, chptr->chname)) { sendto_channel_opmod(client_p, source_p, chptr, @@ -731,10 +748,36 @@ msg_client(int p_or_n, const char *command, struct Metadata *md; struct DictionaryIter iter; int oaccept = 0; - char *text3 = rb_strdup(""); + char text3[10]; if(MyClient(source_p)) { + /* + * XXX: Controversial? Allow target users to send replies + * through a +g. Rationale is that people can presently use +g + * as a way to taunt users, e.g. harass them and hide behind +g + * as a way of griefing. --nenolod + */ + if(p_or_n != NOTICE && MyClient(source_p) && + IsSetCallerId(source_p) && + IsSetSCallerId(source_p) && + !accept_message(target_p, source_p)) + { + if(rb_dlink_list_length(&source_p->localClient->allow_list) < + ConfigFileEntry.max_accept) + { + rb_dlinkAddAlloc(target_p, &source_p->localClient->allow_list); + rb_dlinkAddAlloc(source_p, &target_p->on_allow_list); + } + else + { + sendto_one_numeric(source_p, ERR_OWNMODE, + form_str(ERR_OWNMODE), + target_p->name, "+g"); + return; + } + } + /* reset idle time for message only if its not to self * and its not a notice */ if(p_or_n != NOTICE) @@ -794,7 +837,7 @@ msg_client(int p_or_n, const char *command, { if (IsOper(source_p)) { - rb_sprintf(text3, "O%s", source_p->id); + rb_snprintf(text3, sizeof(text3), "O%s", source_p->id); DICTIONARY_FOREACH(md, &iter, target_p->user->metadata) { if(!strcmp(md->value, "OACCEPT") && !strcmp(md->name, text3)) @@ -885,7 +928,7 @@ flood_attack_client(int p_or_n, struct Client *source_p, struct Client *target_p * and msg user@server. * -- jilles */ - if(GlobalSetOptions.floodcount && IsClient(source_p) && source_p != target_p && !IsService(target_p)) + if(GlobalSetOptions.floodcount && IsClient(source_p) && source_p != target_p && !IsService(target_p) && (!IsOper(source_p) || !ConfigFileEntry.true_no_oper_flood)) { if((target_p->first_received_message_time + 1) < rb_current_time()) { @@ -940,7 +983,7 @@ flood_attack_channel(int p_or_n, struct Client *source_p, struct Channel *chptr, { int delta; - if(GlobalSetOptions.floodcount && MyClient(source_p)) + if(GlobalSetOptions.floodcount && MyClient(source_p) && (!IsOper(source_p) || !ConfigFileEntry.true_no_oper_flood)) { if((chptr->first_received_message_time + 1) < rb_current_time()) {