diff --git a/extensions/Makefile.am b/extensions/Makefile.am index 6a4963ad..f3a5ecbb 100644 --- a/extensions/Makefile.am +++ b/extensions/Makefile.am @@ -43,6 +43,7 @@ extension_LTLIBRARIES = \ sno_globalnickchange.la \ sno_globaloper.la \ sno_whois.la \ + umode_noctcp.la \ m_adminwall.la \ m_echotags.la \ m_extendchans.la \ diff --git a/extensions/umode_noctcp.c b/extensions/umode_noctcp.c new file mode 100644 index 00000000..12851366 --- /dev/null +++ b/extensions/umode_noctcp.c @@ -0,0 +1,72 @@ +/* + * umode_noctcp.c: user mode +C which blocks CTCPs to the user + * + * Copyright (c) 2016 M. Teufel + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "stdinc.h" +#include "modules.h" +#include "hook.h" +#include "client.h" +#include "ircd.h" +#include "send.h" +#include "s_user.h" +#include "numeric.h" +#include "inline/stringops.h" + +static const char umode_noctcp_desc[] = + "Adds user mode +C which blocks CTCPs to the user."; + +static void umode_noctcp_process(hook_data_privmsg_user *); + +mapi_hfn_list_av1 umode_noctcp_hfnlist[] = { + { "privmsg_user", (hookfn) umode_noctcp_process }, + { NULL, NULL } +}; + +static void +umode_noctcp_process(hook_data_privmsg_user *data) { + if (data->approved || data->msgtype == MESSAGE_TYPE_NOTICE) { + return; + } + + if (data->target_p->umodes & user_modes['C'] && *data->text == '\001' && strncasecmp(data->text + 1, "ACTION", 6)) { + sendto_one_numeric(data->source_p, ERR_CANNOTSENDTOUSER, form_str(ERR_CANNOTSENDTOUSER), data->target_p->name, "+C set"); + data->approved = ERR_CANNOTSENDTOUSER; + return; + } +} + +static int +_modinit(void) +{ + user_modes['C'] = find_umode_slot(); + construct_umodebuf(); + + return 0; +} + +static void +_moddeinit(void) +{ + user_modes['C'] = 0; + construct_umodebuf(); +} + +DECLARE_MODULE_AV2(umode_noctcp, _modinit, _moddeinit, NULL, NULL, umode_noctcp_hfnlist, NULL, NULL, umode_noctcp_desc); diff --git a/help/opers/umode b/help/opers/umode index c02da9d0..e961a738 100644 --- a/help/opers/umode +++ b/help/opers/umode @@ -16,6 +16,7 @@ User modes: (* designates that the umode is oper only) * +l - Can see oper locops (local wallops). * +s - Can see server notices (see /quote help snomask). * +z - Can see operwalls. + ? +C - Prevents you from receiving CTCPs other than ACTION. +D - Deaf - ignores all channel messages. +Q - Prevents you from being affected by channel forwarding. +R - Prevents unidentified users that you have not accepted from diff --git a/help/users/umode b/help/users/umode index 736735a8..71b01305 100644 --- a/help/users/umode +++ b/help/users/umode @@ -11,6 +11,7 @@ User modes: (? designates that the umode is provided by an extension ? +h - Has a cloaked host. May be +x depending on cloaking module +g - "caller id" mode only allow accept clients to message you +w - Can see oper wallops. + ? +C - Prevents you from receiving CTCPs other than ACTION. +D - Deaf - ignores all channel messages. +Q - Prevents you from being affected by channel forwarding. +R - Prevents unidentified users that you have not accepted from diff --git a/include/messages.h b/include/messages.h index d656f8dc..4d0c201d 100644 --- a/include/messages.h +++ b/include/messages.h @@ -192,6 +192,7 @@ #define NUMERIC_STR_486 "%s :You must log in with services to message this user" #define NUMERIC_STR_489 ":%s 489 %s %s :You're neither voiced nor channel operator" #define NUMERIC_STR_491 ":No appropriate operator blocks were found for your host" +#define NUMERIC_STR_492 ":Cannot send to user %s (%s)" #define NUMERIC_STR_494 "%s :cannot answer you while you are %s, your message was not sent" #define NUMERIC_STR_501 ":%s 501 %s :Unknown MODE flag" #define NUMERIC_STR_502 ":%s 502 %s :Can't change mode for other users" diff --git a/include/numeric.h b/include/numeric.h index 56d86b28..465cee15 100644 --- a/include/numeric.h +++ b/include/numeric.h @@ -293,6 +293,8 @@ #define ERR_NOOPERHOST 491 +#define ERR_CANNOTSENDTOUSER 492 + #define ERR_OWNMODE 494 /* from bahamut -- jilles */ #define ERR_UMODEUNKNOWNFLAG 501