Compare commits
3 commits
Author | SHA1 | Date | |
---|---|---|---|
172c43e60c | |||
9b120c570c | |||
2c2f982971 |
96 changed files with 398 additions and 828 deletions
4
CREDITS
4
CREDITS
|
@ -5,10 +5,6 @@ and OFTC:
|
|||
|
||||
dwfreed, Doug Freed <dwfreed@mtu.edu>
|
||||
edk, Ed Kellett <edk@libera.chat>
|
||||
glguy, Eric Mertens <glguy@libera.chat>
|
||||
ilbelkyr, Nicole Kleinhoff <ilbelkyr@libera.chat>
|
||||
mcintosh, Richie McIntosh <richiemcintosh@gmail.com>
|
||||
Myon, Christoph Berg <myon@oftc.net>
|
||||
tomaw, Tom Wesley <tom@tomaw.net>
|
||||
|
||||
The Charybdis team was:
|
||||
|
|
|
@ -46,7 +46,6 @@ These are known issues and workarounds for various platforms.
|
|||
# building
|
||||
|
||||
```bash
|
||||
sudo apt install build-essential pkg-config libsqlite3-dev # or equivalent for your distribution
|
||||
./autogen.sh
|
||||
./configure --prefix=/path/to/installation
|
||||
make
|
||||
|
@ -76,7 +75,7 @@ See `./configure --help` for build options.
|
|||
|
||||
* To report bugs in Solanum, visit us at `#solanum` on [Libera Chat](https://libera.chat)
|
||||
|
||||
* Please read [doc/readme.txt](doc/readme.txt) to get an overview of the current documentation.
|
||||
* Please read [doc/index.txt](doc/index.txt) to get an overview of the current documentation.
|
||||
|
||||
* Read the [NEWS.md](NEWS.md) file for what's new in this release.
|
||||
|
||||
|
|
|
@ -26,8 +26,6 @@
|
|||
#include "notice.h"
|
||||
#include "provider.h"
|
||||
|
||||
#include <netinet/tcp.h> // TCP_NODELAY
|
||||
|
||||
#define SELF_PID (opm_provider.id)
|
||||
|
||||
#define OPM_READSIZE 128
|
||||
|
|
|
@ -514,7 +514,7 @@ static void do_query_number(struct DNSQuery *query, const struct rb_sockaddr_sto
|
|||
request->name = (char *)rb_malloc(IRCD_RES_HOSTLEN + 1);
|
||||
}
|
||||
|
||||
build_rdns(request->queryname, sizeof request->queryname, addr, NULL);
|
||||
build_rdns(request->queryname, IRCD_RES_HOSTLEN + 1, addr, NULL);
|
||||
|
||||
request->type = T_PTR;
|
||||
query_name(request);
|
||||
|
|
|
@ -42,10 +42,6 @@ exists and is not +s or +p. (The ops of the channel the ban is on cannot
|
|||
necessarily see whether the user is in the target channel, so it should not
|
||||
influence whether they can join either.)
|
||||
|
||||
extb_canjoin.so
|
||||
$j:<channel>
|
||||
matches users who are or are not banned from a specified channel
|
||||
|
||||
extb_oper.so
|
||||
$o
|
||||
matches opers (most useful with +I)
|
||||
|
@ -60,14 +56,6 @@ extb_server.so
|
|||
matches users connected to a server matching the mask (* and ? wildcards);
|
||||
this can only be used with +b and +q
|
||||
|
||||
extb_extgecos.so
|
||||
$x:<mask>
|
||||
bans all users with matching nick!user@host#gecos
|
||||
|
||||
extb_ssl.so
|
||||
$z
|
||||
matches all SSL users
|
||||
|
||||
Comparisons:
|
||||
|
||||
+b $~a is similar to +r but also prevents not logged in users talking or
|
||||
|
|
|
@ -306,7 +306,7 @@ operator "god" {
|
|||
privset = "admin";
|
||||
};
|
||||
|
||||
/* See connecting-servers.rst for an introduction to using these files. */
|
||||
// See connecting-servers.rst for an introduction to using these files.
|
||||
|
||||
connect "irc.uplink.com" {
|
||||
host = "203.0.113.3";
|
||||
|
@ -579,7 +579,7 @@ general {
|
|||
kline_with_reason = yes;
|
||||
hide_tkdline_duration = no;
|
||||
kline_reason = "K-Lined";
|
||||
sasl_only_client_message = "You need to identify via SASL to use this server.";
|
||||
sasl_only_client_message = "You need to identify via SASL to use to use this server.";
|
||||
identd_only_client_message = "You need to install identd to use this server.";
|
||||
sctp_forbidden_client_message = "You are not allowed to use SCTP on this server.";
|
||||
ssltls_only_client_message = "You need to use SSL/TLS to use this server.";
|
||||
|
|
|
@ -76,6 +76,7 @@
|
|||
* Far connection notices (snomask +F) -- sno_farconnect
|
||||
* Remote oper up notices -- sno_globaloper
|
||||
* Global nick-change notices -- sno_globalnickchange
|
||||
* /whois notifications (snomask +W) -- sno_whois
|
||||
* Oper-override (modehacking only) -- override
|
||||
* Stop services kills -- no_kill_services
|
||||
*/
|
||||
|
@ -108,6 +109,7 @@
|
|||
#loadmodule "extensions/sno_farconnect";
|
||||
#loadmodule "extensions/sno_globalnickchange";
|
||||
#loadmodule "extensions/sno_globaloper";
|
||||
#loadmodule "extensions/sno_whois";
|
||||
#loadmodule "extensions/override";
|
||||
#loadmodule "extensions/no_kill_services";
|
||||
|
||||
|
@ -344,11 +346,6 @@ listen {
|
|||
|
||||
/* auth {}: allow users to connect to the ircd (OLD I:) */
|
||||
auth {
|
||||
/* description: descriptive text to help recognize this auth block in
|
||||
* stats i output.
|
||||
*/
|
||||
description = "example oper";
|
||||
|
||||
/* user: the user@host allowed to connect. Multiple IPv4/IPv6 user
|
||||
* lines are permitted per auth block. This is matched against the
|
||||
* hostname and IP address (using :: shortening for IPv6 and
|
||||
|
@ -1165,7 +1162,7 @@ general {
|
|||
/* SASL access only client message: give users a message that
|
||||
* informs them
|
||||
*/
|
||||
sasl_only_client_message = "You need to identify via SASL to use this server.";
|
||||
sasl_only_client_message = "You need to identify via SASL to use to use this server.";
|
||||
|
||||
/* Identd access only client message: give users a message that
|
||||
* informs them
|
||||
|
|
|
@ -13,10 +13,10 @@
|
|||
static const char chm_adminonly_desc[] =
|
||||
"Enables channel mode +A that blocks non-admins from joining a channel";
|
||||
|
||||
static void h_can_join(void *);
|
||||
static void h_can_join(hook_data_channel *);
|
||||
|
||||
mapi_hfn_list_av1 adminonly_hfnlist[] = {
|
||||
{ "can_join", h_can_join },
|
||||
{ "can_join", (hookfn) h_can_join },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -41,9 +41,8 @@ _moddeinit(void)
|
|||
DECLARE_MODULE_AV2(chm_adminonly, _modinit, _moddeinit, NULL, NULL, adminonly_hfnlist, NULL, NULL, chm_adminonly_desc);
|
||||
|
||||
static void
|
||||
h_can_join(void *data_)
|
||||
h_can_join(hook_data_channel *data)
|
||||
{
|
||||
hook_data_channel *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
struct Channel *chptr = data->chptr;
|
||||
|
||||
|
|
|
@ -14,10 +14,10 @@ static const char chm_insecure_desc[] =
|
|||
"Adds channel mode +U that allows non-SSL users to join a channel, "
|
||||
"disallowing them by default";
|
||||
|
||||
static void h_can_join(void *);
|
||||
static void h_can_join(hook_data_channel *);
|
||||
|
||||
mapi_hfn_list_av1 sslonly_hfnlist[] = {
|
||||
{ "can_join", h_can_join },
|
||||
{ "can_join", (hookfn) h_can_join },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -43,9 +43,8 @@ _moddeinit(void)
|
|||
DECLARE_MODULE_AV2(chm_insecure, _modinit, _moddeinit, NULL, NULL, sslonly_hfnlist, NULL, NULL, chm_insecure_desc);
|
||||
|
||||
static void
|
||||
h_can_join(void *data_)
|
||||
h_can_join(hook_data_channel *data)
|
||||
{
|
||||
hook_data_channel *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
struct Channel *chptr = data->chptr;
|
||||
|
||||
|
|
|
@ -40,23 +40,18 @@ static const char chm_nonotice_desc[] =
|
|||
|
||||
static unsigned int mode_nonotice;
|
||||
|
||||
static void chm_nonotice_process(void *);
|
||||
static void chm_nonotice_process(hook_data_privmsg_channel *);
|
||||
|
||||
mapi_hfn_list_av1 chm_nonotice_hfnlist[] = {
|
||||
{ "privmsg_channel", chm_nonotice_process },
|
||||
{ "privmsg_channel", (hookfn) chm_nonotice_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
static void
|
||||
chm_nonotice_process(void *data_)
|
||||
chm_nonotice_process(hook_data_privmsg_channel *data)
|
||||
{
|
||||
hook_data_privmsg_channel *data = data_;
|
||||
|
||||
/*
|
||||
* don't waste CPU if message is already blocked, only block notices,
|
||||
* only check messages sourced from local clients (so we don't block services notices)
|
||||
*/
|
||||
if (data->approved || data->msgtype != MESSAGE_TYPE_NOTICE || !MyClient(data->source_p))
|
||||
/* don't waste CPU if message is already blocked */
|
||||
if (data->approved || data->msgtype != MESSAGE_TYPE_NOTICE)
|
||||
return;
|
||||
|
||||
/* block all notices except CTCPs; use chm_noctcp to block CTCPs. */
|
||||
|
|
|
@ -13,10 +13,10 @@
|
|||
static const char chm_operonly_desc[] =
|
||||
"Adds channel mode +O which makes a channel operator-only";
|
||||
|
||||
static void h_can_join(void *);
|
||||
static void h_can_join(hook_data_channel *);
|
||||
|
||||
mapi_hfn_list_av1 operonly_hfnlist[] = {
|
||||
{ "can_join", h_can_join },
|
||||
{ "can_join", (hookfn) h_can_join },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -42,9 +42,8 @@ _moddeinit(void)
|
|||
DECLARE_MODULE_AV2(chm_operonly, _modinit, _moddeinit, NULL, NULL, operonly_hfnlist, NULL, NULL, chm_operonly_desc);
|
||||
|
||||
static void
|
||||
h_can_join(void *data_)
|
||||
h_can_join(hook_data_channel *data)
|
||||
{
|
||||
hook_data_channel *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
struct Channel *chptr = data->chptr;
|
||||
|
||||
|
|
|
@ -21,10 +21,10 @@
|
|||
static const char chm_operpeace_desc[] =
|
||||
"Adds channel mode +M which prohibits operators from being kicked";
|
||||
|
||||
static void hdl_can_kick(void *);
|
||||
static void hdl_can_kick(hook_data_channel_approval *);
|
||||
|
||||
mapi_hfn_list_av1 chm_operpeace_hfnlist[] = {
|
||||
{ "can_kick", hdl_can_kick },
|
||||
{ "can_kick", (hookfn) hdl_can_kick },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -49,9 +49,8 @@ _moddeinit(void)
|
|||
DECLARE_MODULE_AV2(chm_operpeace, _modinit, _moddeinit, NULL, NULL, chm_operpeace_hfnlist, NULL, NULL, chm_operpeace_desc);
|
||||
|
||||
static void
|
||||
hdl_can_kick(void *data_)
|
||||
hdl_can_kick(hook_data_channel_approval *data)
|
||||
{
|
||||
hook_data_channel_approval *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
struct Client *who = data->target;
|
||||
struct Channel *chptr = data->chptr;
|
||||
|
|
|
@ -43,7 +43,7 @@ static unsigned int mode_regmsg;
|
|||
static void chm_regmsg_process(void *);
|
||||
|
||||
mapi_hfn_list_av1 chm_regmsg_hfnlist[] = {
|
||||
{ "privmsg_channel", chm_regmsg_process },
|
||||
{ "privmsg_channel", (hookfn) chm_regmsg_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -57,10 +57,6 @@ chm_regmsg_process(void *data_)
|
|||
if (data->approved)
|
||||
return;
|
||||
|
||||
/* mode is unset, accept */
|
||||
if (!(data->chptr->mode.mode & mode_regmsg))
|
||||
return;
|
||||
|
||||
/* user is identified, accept */
|
||||
if (!EmptyString(data->source_p->user->suser))
|
||||
return;
|
||||
|
|
|
@ -13,10 +13,10 @@
|
|||
static const char chm_sslonly_desc[] =
|
||||
"Adds channel mode +S that bans non-SSL users from joing a channel";
|
||||
|
||||
static void h_can_join(void *);
|
||||
static void h_can_join(hook_data_channel *);
|
||||
|
||||
mapi_hfn_list_av1 sslonly_hfnlist[] = {
|
||||
{ "can_join", h_can_join },
|
||||
{ "can_join", (hookfn) h_can_join },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -41,9 +41,8 @@ _moddeinit(void)
|
|||
DECLARE_MODULE_AV2(chm_sslonly, _modinit, _moddeinit, NULL, NULL, sslonly_hfnlist, NULL, NULL, chm_sslonly_desc);
|
||||
|
||||
static void
|
||||
h_can_join(void *data_)
|
||||
h_can_join(hook_data_channel *data)
|
||||
{
|
||||
hook_data_channel *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
struct Channel *chptr = data->chptr;
|
||||
|
||||
|
|
|
@ -19,19 +19,18 @@
|
|||
|
||||
static const char restrict_desc[] = "Restricts channel creation to authenticated users and IRC operators only";
|
||||
|
||||
static void h_can_create_channel_authenticated(void *);
|
||||
static void h_can_create_channel_authenticated(hook_data_client_approval *);
|
||||
|
||||
mapi_hfn_list_av1 restrict_hfnlist[] = {
|
||||
{ "can_create_channel", h_can_create_channel_authenticated },
|
||||
{ "can_create_channel", (hookfn) h_can_create_channel_authenticated },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
DECLARE_MODULE_AV2(createauthonly, NULL, NULL, NULL, NULL, restrict_hfnlist, NULL, NULL, restrict_desc);
|
||||
|
||||
static void
|
||||
h_can_create_channel_authenticated(void *data_)
|
||||
h_can_create_channel_authenticated(hook_data_client_approval *data)
|
||||
{
|
||||
hook_data_client_approval *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
|
||||
if (*source_p->user->suser == '\0' && !IsOperGeneral(source_p))
|
||||
|
|
|
@ -19,19 +19,18 @@
|
|||
|
||||
static const char restrict_desc[] = "Restricts channel creation to IRC operators";
|
||||
|
||||
static void h_can_create_channel_authenticated(void *);
|
||||
static void h_can_create_channel_authenticated(hook_data_client_approval *);
|
||||
|
||||
mapi_hfn_list_av1 restrict_hfnlist[] = {
|
||||
{ "can_create_channel", h_can_create_channel_authenticated },
|
||||
{ "can_create_channel", (hookfn) h_can_create_channel_authenticated },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
DECLARE_MODULE_AV2(createoperonly, NULL, NULL, NULL, NULL, restrict_hfnlist, NULL, NULL, restrict_desc);
|
||||
|
||||
static void
|
||||
h_can_create_channel_authenticated(void *data_)
|
||||
h_can_create_channel_authenticated(hook_data_client_approval *data)
|
||||
{
|
||||
hook_data_client_approval *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
|
||||
if (!IsOperGeneral(source_p))
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
static void check_new_user(void *data);
|
||||
mapi_hfn_list_av1 drain_hfnlist[] = {
|
||||
{ "new_local_user", check_new_user },
|
||||
{ "new_local_user", (hookfn) check_new_user },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -22,13 +22,10 @@ check_new_user(void *vdata)
|
|||
struct Client *source_p = vdata;
|
||||
const char *drain_reason = ConfigFileEntry.drain_reason;
|
||||
|
||||
if (IsAnyDead(source_p))
|
||||
return;
|
||||
|
||||
if (drain_reason == NULL)
|
||||
drain_reason = "This server is not accepting connections.";
|
||||
|
||||
if (IsExemptKline(source_p))
|
||||
if(IsExemptKline(source_p))
|
||||
return;
|
||||
|
||||
exit_client(source_p, source_p, &me, drain_reason);
|
||||
|
|
|
@ -112,7 +112,7 @@ mapi_hlist_av1 test_hlist[] = {
|
|||
static void show_example_hook(void *unused);
|
||||
|
||||
mapi_hfn_list_av1 test_hfnlist[] = {
|
||||
{ "doing_example_hook", show_example_hook },
|
||||
{ "doing_example_hook", (hookfn) show_example_hook },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ static int eb_canjoin(const char *data, struct Client *client_p,
|
|||
return EXTBAN_INVALID;
|
||||
#endif
|
||||
recurse = 1;
|
||||
ret = is_banned(chptr2, client_p, NULL, NULL, NULL) != 0 ? EXTBAN_MATCH : EXTBAN_NOMATCH;
|
||||
ret = is_banned(chptr2, client_p, NULL, NULL, NULL) == CHFL_BAN ? EXTBAN_MATCH : EXTBAN_NOMATCH;
|
||||
recurse = 0;
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ static int eb_extended(const char *data, struct Client *client_p,
|
|||
if (data == NULL)
|
||||
return EXTBAN_INVALID;
|
||||
|
||||
snprintf(buf, sizeof buf, "%s!%s@%s#%s",
|
||||
snprintf(buf, BUFSIZE, "%s!%s@%s#%s",
|
||||
client_p->name, client_p->username, client_p->host, client_p->info);
|
||||
|
||||
return match(data, buf) ? EXTBAN_MATCH : EXTBAN_NOMATCH;
|
||||
|
|
|
@ -90,10 +90,10 @@ static char check_str[21] = "";
|
|||
static unsigned filter_chmode, filter_umode;
|
||||
|
||||
mapi_hfn_list_av1 filter_hfnlist[] = {
|
||||
{ "privmsg_user", filter_msg_user },
|
||||
{ "privmsg_channel", filter_msg_channel },
|
||||
{ "client_quit", filter_client_quit },
|
||||
{ "client_exit", on_client_exit },
|
||||
{ "privmsg_user", (hookfn) filter_msg_user },
|
||||
{ "privmsg_channel", (hookfn) filter_msg_channel },
|
||||
{ "client_quit", (hookfn) filter_client_quit },
|
||||
{ "client_exit", (hookfn) on_client_exit },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -18,19 +18,18 @@
|
|||
static const char noi_desc[] =
|
||||
"Do not allow users to remove user mode +i unless they are operators";
|
||||
|
||||
static void h_noi_umode_changed(void *);
|
||||
static void h_noi_umode_changed(hook_data_umode_changed *);
|
||||
|
||||
mapi_hfn_list_av1 noi_hfnlist[] = {
|
||||
{ "umode_changed", h_noi_umode_changed },
|
||||
{ "umode_changed", (hookfn) h_noi_umode_changed },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
DECLARE_MODULE_AV2(force_user_invis, NULL, NULL, NULL, NULL, noi_hfnlist, NULL, NULL, noi_desc);
|
||||
|
||||
static void
|
||||
h_noi_umode_changed(void *data)
|
||||
h_noi_umode_changed(hook_data_umode_changed *hdata)
|
||||
{
|
||||
hook_data_umode_changed *hdata = data;
|
||||
struct Client *source_p = hdata->client;
|
||||
|
||||
if (MyClient(source_p) && !IsOperGeneral(source_p) && !IsInvisible(source_p)) {
|
||||
|
|
|
@ -17,11 +17,11 @@
|
|||
static const char helpops_desc[] = "The helpops system as used by freenode";
|
||||
|
||||
static rb_dlink_list helper_list = { NULL, NULL, 0 };
|
||||
static void h_hdl_stats_request(void *hdata);
|
||||
static void h_hdl_new_remote_user(void *client_p);
|
||||
static void h_hdl_client_exit(void *hdata);
|
||||
static void h_hdl_umode_changed(void *hdata);
|
||||
static void h_hdl_whois(void *hdata);
|
||||
static void h_hdl_stats_request(hook_data_int *hdata);
|
||||
static void h_hdl_new_remote_user(struct Client *client_p);
|
||||
static void h_hdl_client_exit(hook_data_client_exit *hdata);
|
||||
static void h_hdl_umode_changed(hook_data_umode_changed *hdata);
|
||||
static void h_hdl_whois(hook_data_client *hdata);
|
||||
static void recurse_client_exit(struct Client *client_p);
|
||||
static void helper_add(struct Client *client_p);
|
||||
static void helper_delete(struct Client *client_p);
|
||||
|
@ -30,12 +30,12 @@ static void me_dehelper(struct MsgBuf *, struct Client *, struct Client *, int,
|
|||
static void do_dehelper(struct Client *source_p, struct Client *target_p);
|
||||
|
||||
mapi_hfn_list_av1 helpops_hfnlist[] = {
|
||||
{ "doing_stats", h_hdl_stats_request },
|
||||
{ "new_remote_user", h_hdl_new_remote_user },
|
||||
{ "client_exit", h_hdl_client_exit },
|
||||
{ "umode_changed", h_hdl_umode_changed },
|
||||
{ "doing_whois", h_hdl_whois },
|
||||
{ "doing_whois_global", h_hdl_whois },
|
||||
{ "doing_stats", (hookfn) h_hdl_stats_request },
|
||||
{ "new_remote_user", (hookfn) h_hdl_new_remote_user },
|
||||
{ "client_exit", (hookfn) h_hdl_client_exit },
|
||||
{ "umode_changed", (hookfn) h_hdl_umode_changed },
|
||||
{ "doing_whois", (hookfn) h_hdl_whois },
|
||||
{ "doing_whois_global", (hookfn) h_hdl_whois },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -137,9 +137,8 @@ _moddeinit(void)
|
|||
}
|
||||
|
||||
static void
|
||||
h_hdl_stats_request(void *data)
|
||||
h_hdl_stats_request(hook_data_int *hdata)
|
||||
{
|
||||
hook_data_int *hdata = data;
|
||||
struct Client *target_p;
|
||||
rb_dlink_node *helper_ptr;
|
||||
unsigned int count = 0;
|
||||
|
@ -156,16 +155,10 @@ h_hdl_stats_request(void *data)
|
|||
|
||||
count++;
|
||||
|
||||
if (IsOper(hdata->client) && SeesOper(target_p, hdata->client)
|
||||
&& !EmptyString(target_p->user->opername))
|
||||
sendto_one_numeric(hdata->client, RPL_STATSDEBUG,
|
||||
"p :%s (%s@%s) {%s}",
|
||||
target_p->name, target_p->username, target_p->host,
|
||||
target_p->user->opername);
|
||||
else
|
||||
sendto_one_numeric(hdata->client, RPL_STATSDEBUG,
|
||||
"p :%s (%s@%s)",
|
||||
target_p->name, target_p->username, target_p->host);
|
||||
sendto_one_numeric(hdata->client, RPL_STATSDEBUG,
|
||||
"p :%s (%s@%s)",
|
||||
target_p->name, target_p->username,
|
||||
target_p->host);
|
||||
}
|
||||
|
||||
sendto_one_numeric(hdata->client, RPL_STATSDEBUG,
|
||||
|
@ -190,9 +183,8 @@ helper_delete(struct Client *client_p)
|
|||
}
|
||||
|
||||
static void
|
||||
h_hdl_new_remote_user(void *data)
|
||||
h_hdl_new_remote_user(struct Client *client_p)
|
||||
{
|
||||
struct Client *client_p = data;
|
||||
if (client_p->umodes & user_modes[UMODECHAR_HELPOPS])
|
||||
helper_add(client_p);
|
||||
}
|
||||
|
@ -218,16 +210,14 @@ recurse_client_exit(struct Client *client_p)
|
|||
}
|
||||
|
||||
static void
|
||||
h_hdl_client_exit(void *data)
|
||||
h_hdl_client_exit(hook_data_client_exit *hdata)
|
||||
{
|
||||
hook_data_client_exit *hdata = data;
|
||||
recurse_client_exit(hdata->target);
|
||||
}
|
||||
|
||||
static void
|
||||
h_hdl_umode_changed(void *data)
|
||||
h_hdl_umode_changed(hook_data_umode_changed *hdata)
|
||||
{
|
||||
hook_data_umode_changed *hdata = data;
|
||||
struct Client *source_p = hdata->client;
|
||||
|
||||
/* didn't change +h umode, we don't need to do anything */
|
||||
|
@ -255,9 +245,8 @@ h_hdl_umode_changed(void *data)
|
|||
}
|
||||
|
||||
static void
|
||||
h_hdl_whois(void *data)
|
||||
h_hdl_whois(hook_data_client *hdata)
|
||||
{
|
||||
hook_data_client *hdata = data;
|
||||
struct Client *source_p = hdata->client;
|
||||
struct Client *target_p = hdata->target;
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ static const char hide_desc[] = "Hides channel memberships not shared";
|
|||
static void h_huc_doing_whois_channel_visibility(void *);
|
||||
|
||||
mapi_hfn_list_av1 huc_hfnlist[] = {
|
||||
{ "doing_whois_channel_visibility", h_huc_doing_whois_channel_visibility },
|
||||
{ "doing_whois_channel_visibility", (hookfn) h_huc_doing_whois_channel_visibility },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -55,9 +55,9 @@ static void me_heal(struct MsgBuf *msgbuf_p, struct Client *, struct Client *, i
|
|||
static int modinit(void);
|
||||
static void modfini(void);
|
||||
|
||||
static void client_exit_hook(void *);
|
||||
static void new_local_user_hook(void *);
|
||||
static void doing_stats_hook(void *);
|
||||
static void client_exit_hook(hook_data_client_exit *);
|
||||
static void new_local_user_hook(struct Client *);
|
||||
static void doing_stats_hook(hook_data_int *hdata);
|
||||
|
||||
static void hurt_check_event(void *);
|
||||
static void hurt_expire_event(void *);
|
||||
|
@ -98,9 +98,9 @@ struct Message heal_msgtab = {
|
|||
|
||||
/* {{{ Misc module stuff */
|
||||
mapi_hfn_list_av1 hurt_hfnlist[] = {
|
||||
{"client_exit", client_exit_hook},
|
||||
{"new_local_user", new_local_user_hook},
|
||||
{"doing_stats", doing_stats_hook},
|
||||
{"client_exit", (hookfn) client_exit_hook},
|
||||
{"new_local_user", (hookfn) new_local_user_hook},
|
||||
{"doing_stats", (hookfn) doing_stats_hook},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -429,9 +429,8 @@ hurt_expire_event(void *unused)
|
|||
|
||||
/* {{{ static void client_exit_hook() */
|
||||
static void
|
||||
client_exit_hook(void *data_)
|
||||
client_exit_hook(hook_data_client_exit *data)
|
||||
{
|
||||
hook_data_client_exit *data = data_;
|
||||
s_assert(data != NULL);
|
||||
s_assert(data->target != NULL);
|
||||
|
||||
|
@ -441,9 +440,8 @@ client_exit_hook(void *data_)
|
|||
|
||||
/* {{{ static void new_local_user_hook() */
|
||||
static void
|
||||
new_local_user_hook(void *data)
|
||||
new_local_user_hook(struct Client *source_p)
|
||||
{
|
||||
struct Client *source_p = data;
|
||||
if (IsAnyDead(source_p) || !EmptyString(source_p->user->suser) ||
|
||||
IsExemptKline(source_p))
|
||||
return;
|
||||
|
@ -460,9 +458,8 @@ new_local_user_hook(void *data)
|
|||
|
||||
/* {{{ static void doing_stats_hook() */
|
||||
static void
|
||||
doing_stats_hook(void *data)
|
||||
doing_stats_hook(hook_data_int *hdata)
|
||||
{
|
||||
hook_data_int *hdata = data;
|
||||
rb_dlink_node *ptr;
|
||||
hurt_t *hurt;
|
||||
struct Client *source_p;
|
||||
|
|
|
@ -8,19 +8,18 @@
|
|||
#include "s_conf.h"
|
||||
#include "numeric.h"
|
||||
|
||||
static void h_can_join(void *);
|
||||
static void h_can_join(hook_data_channel *);
|
||||
|
||||
mapi_hfn_list_av1 invex_regonly_hfnlist[] = {
|
||||
{ "can_join", h_can_join },
|
||||
{ "can_join", (hookfn) h_can_join },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
DECLARE_MODULE_AV1(invex_regonly, NULL, NULL, NULL, NULL, invex_regonly_hfnlist, "$Revision$");
|
||||
|
||||
static void
|
||||
h_can_join(void *data_)
|
||||
h_can_join(hook_data_channel *data)
|
||||
{
|
||||
hook_data_channel *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
struct Channel *chptr = data->chptr;
|
||||
struct Ban *invex = NULL;
|
||||
|
|
|
@ -40,8 +40,8 @@ _moddeinit(void)
|
|||
static void check_umode_change(void *data);
|
||||
static void check_new_user(void *data);
|
||||
mapi_hfn_list_av1 ip_cloaking_hfnlist[] = {
|
||||
{ "umode_changed", check_umode_change },
|
||||
{ "new_local_user", check_new_user },
|
||||
{ "umode_changed", (hookfn) check_umode_change },
|
||||
{ "new_local_user", (hookfn) check_new_user },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -36,8 +36,8 @@ _moddeinit(void)
|
|||
static void check_umode_change(void *data);
|
||||
static void check_new_user(void *data);
|
||||
mapi_hfn_list_av1 ip_cloaking_hfnlist[] = {
|
||||
{ "umode_changed", check_umode_change },
|
||||
{ "new_local_user", check_new_user },
|
||||
{ "umode_changed", (hookfn) check_umode_change },
|
||||
{ "new_local_user", (hookfn) check_new_user },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -40,8 +40,8 @@ _moddeinit(void)
|
|||
static void check_umode_change(void *data);
|
||||
static void check_new_user(void *data);
|
||||
mapi_hfn_list_av1 ip_cloaking_hfnlist[] = {
|
||||
{ "umode_changed", check_umode_change },
|
||||
{ "new_local_user", check_new_user },
|
||||
{ "umode_changed", (hookfn) check_umode_change },
|
||||
{ "new_local_user", (hookfn) check_new_user },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -36,8 +36,8 @@ _moddeinit(void)
|
|||
static void check_umode_change(void *data);
|
||||
static void check_new_user(void *data);
|
||||
mapi_hfn_list_av1 ip_cloaking_hfnlist[] = {
|
||||
{ "umode_changed", check_umode_change },
|
||||
{ "new_local_user", check_new_user },
|
||||
{ "umode_changed", (hookfn) check_umode_change },
|
||||
{ "new_local_user", (hookfn) check_new_user },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -134,7 +134,7 @@ mo_ojoin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
sendto_one(source_p, form_str(RPL_TOPIC), me.name,
|
||||
source_p->name, chptr->chname, chptr->topic);
|
||||
sendto_one(source_p, form_str(RPL_TOPICWHOTIME), me.name,
|
||||
source_p->name, chptr->chname, chptr->topic_info, (long long)chptr->topic_time);
|
||||
source_p->name, chptr->chname, chptr->topic_info, chptr->topic_time);
|
||||
}
|
||||
|
||||
source_p->localClient->last_join_time = rb_current_time();
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
static const char description[] = "Provides the REMOVE command, an alternative to KICK";
|
||||
|
||||
static void m_remove(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
|
||||
static void remove_quote_part(void *);
|
||||
static void remove_quote_part(hook_data_privmsg_channel *);
|
||||
|
||||
unsigned int CAP_REMOVE;
|
||||
static char part_buf[REASONLEN + 1];
|
||||
|
@ -54,7 +54,7 @@ struct Message remove_msgtab = {
|
|||
|
||||
mapi_clist_av1 remove_clist[] = { &remove_msgtab, NULL };
|
||||
mapi_hfn_list_av1 remove_hfnlist[] = {
|
||||
{ "privmsg_channel", remove_quote_part },
|
||||
{ "privmsg_channel", (hookfn) remove_quote_part },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
mapi_cap_list_av2 remove_cap_list[] = {
|
||||
|
@ -213,9 +213,8 @@ m_remove(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
}
|
||||
|
||||
static void
|
||||
remove_quote_part(void *data_)
|
||||
remove_quote_part(hook_data_privmsg_channel *data)
|
||||
{
|
||||
hook_data_privmsg_channel *data = data_;
|
||||
if (data->approved || EmptyString(data->text) || data->msgtype != MESSAGE_TYPE_PART)
|
||||
return;
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ mapi_clist_av1 webirc_clist[] = { &webirc_msgtab, NULL };
|
|||
static void new_local_user(void *data);
|
||||
mapi_hfn_list_av1 webirc_hfnlist[] = {
|
||||
/* unintuitive but correct--we want to be called first */
|
||||
{ "new_local_user", new_local_user, HOOK_LOWEST },
|
||||
{ "new_local_user", (hookfn) new_local_user, HOOK_LOWEST },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -106,17 +106,17 @@ mr_webirc(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sourc
|
|||
if (!IsConfDoSpoofIp(aconf) || irccmp(aconf->info.name, "webirc."))
|
||||
{
|
||||
/* XXX */
|
||||
exit_client(client_p, source_p, &me, "Not a CGI:IRC auth block");
|
||||
sendto_one(source_p, "NOTICE * :Not a CGI:IRC auth block");
|
||||
return;
|
||||
}
|
||||
if (EmptyString(aconf->passwd))
|
||||
{
|
||||
exit_client(client_p, source_p, &me, "CGI:IRC auth blocks must have a password");
|
||||
sendto_one(source_p, "NOTICE * :CGI:IRC auth blocks must have a password");
|
||||
return;
|
||||
}
|
||||
if (!IsSecure(source_p) && aconf->flags & CONF_FLAGS_NEED_SSL)
|
||||
{
|
||||
exit_client(client_p, source_p, &me, "Your CGI:IRC block requires TLS");
|
||||
sendto_one(source_p, "NOTICE * :Your CGI:IRC block requires TLS");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -129,13 +129,13 @@ mr_webirc(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sourc
|
|||
|
||||
if (encr == NULL || strcmp(encr, aconf->passwd))
|
||||
{
|
||||
exit_client(client_p, source_p, &me, "CGI:IRC password incorrect");
|
||||
sendto_one(source_p, "NOTICE * :CGI:IRC password incorrect");
|
||||
return;
|
||||
}
|
||||
|
||||
if (rb_inet_pton_sock(parv[4], &addr) <= 0)
|
||||
{
|
||||
exit_client(client_p, source_p, &me, "Invalid IP");
|
||||
sendto_one(source_p, "NOTICE * :Invalid IP");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -191,9 +191,6 @@ new_local_user(void *data)
|
|||
struct Client *source_p = data;
|
||||
struct ConfItem *aconf = source_p->localClient->att_conf;
|
||||
|
||||
if (aconf == NULL)
|
||||
return;
|
||||
|
||||
if (!irccmp(aconf->info.name, "webirc."))
|
||||
exit_client(source_p, source_p, &me, "Cannot log in using a WEBIRC block");
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ static const char nokill_desc[] = "Prevents operators from killing services";
|
|||
static void block_services_kill(void *data);
|
||||
|
||||
mapi_hfn_list_av1 no_kill_services_hfnlist[] = {
|
||||
{ "can_kill", block_services_kill },
|
||||
{ "can_kill", (hookfn) block_services_kill },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -14,19 +14,18 @@
|
|||
|
||||
static const char no_locops_desc[] = "Disables local operators";
|
||||
|
||||
static void h_nl_umode_changed(void *);
|
||||
static void h_nl_umode_changed(hook_data_umode_changed *);
|
||||
|
||||
mapi_hfn_list_av1 nl_hfnlist[] = {
|
||||
{ "umode_changed", h_nl_umode_changed },
|
||||
{ "umode_changed", (hookfn) h_nl_umode_changed },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
DECLARE_MODULE_AV2(no_locops, NULL, NULL, NULL, NULL, nl_hfnlist, NULL, NULL, no_locops_desc);
|
||||
|
||||
static void
|
||||
h_nl_umode_changed(void *data)
|
||||
h_nl_umode_changed(hook_data_umode_changed *hdata)
|
||||
{
|
||||
hook_data_umode_changed *hdata = data;
|
||||
struct Client *source_p = hdata->client;
|
||||
|
||||
if (MyClient(source_p) && source_p->umodes & UMODE_LOCOPS)
|
||||
|
|
|
@ -16,19 +16,18 @@
|
|||
static const char noi_desc[] =
|
||||
"Disallow operators from setting user mode +i on themselves";
|
||||
|
||||
static void h_noi_umode_changed(void *);
|
||||
static void h_noi_umode_changed(hook_data_umode_changed *);
|
||||
|
||||
mapi_hfn_list_av1 noi_hfnlist[] = {
|
||||
{ "umode_changed", h_noi_umode_changed },
|
||||
{ "umode_changed", (hookfn) h_noi_umode_changed },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
DECLARE_MODULE_AV2(no_oper_invis, NULL, NULL, NULL, NULL, noi_hfnlist, NULL, NULL, noi_desc);
|
||||
|
||||
static void
|
||||
h_noi_umode_changed(void *data)
|
||||
h_noi_umode_changed(hook_data_umode_changed *hdata)
|
||||
{
|
||||
hook_data_umode_changed *hdata = data;
|
||||
struct Client *source_p = hdata->client;
|
||||
|
||||
if (MyClient(source_p) && IsOper(source_p) && !IsOperInvis(source_p) &&
|
||||
|
|
|
@ -34,13 +34,13 @@ static void hack_can_invite(void *data);
|
|||
static void handle_client_exit(void *data);
|
||||
|
||||
mapi_hfn_list_av1 override_hfnlist[] = {
|
||||
{ "umode_changed", check_umode_change },
|
||||
{ "get_channel_access", hack_channel_access, HOOK_HIGHEST },
|
||||
{ "can_join", hack_can_join, HOOK_HIGHEST },
|
||||
{ "can_kick", hack_can_kick, HOOK_HIGHEST },
|
||||
{ "can_send", hack_can_send, HOOK_HIGHEST },
|
||||
{ "can_invite", hack_can_invite, HOOK_HIGHEST },
|
||||
{ "client_exit", handle_client_exit },
|
||||
{ "umode_changed", (hookfn) check_umode_change },
|
||||
{ "get_channel_access", (hookfn) hack_channel_access, HOOK_HIGHEST },
|
||||
{ "can_join", (hookfn) hack_can_join, HOOK_HIGHEST },
|
||||
{ "can_kick", (hookfn) hack_can_kick, HOOK_HIGHEST },
|
||||
{ "can_send", (hookfn) hack_can_send, HOOK_HIGHEST },
|
||||
{ "can_invite", (hookfn) hack_can_invite, HOOK_HIGHEST },
|
||||
{ "client_exit", (hookfn) handle_client_exit },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ static const char override_kick_immunity_desc[] =
|
|||
static void can_kick(void *data);
|
||||
|
||||
mapi_hfn_list_av1 override_kick_immunity_hfnlist[] = {
|
||||
{ "can_kick", can_kick, HOOK_HIGHEST },
|
||||
{ "can_kick", (hookfn) can_kick, HOOK_HIGHEST },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ static const char restrict_desc[] =
|
|||
static void hack_channel_access(void *data);
|
||||
|
||||
mapi_hfn_list_av1 restrict_unauthenticated_hfnlist[] = {
|
||||
{ "get_channel_access", hack_channel_access },
|
||||
{ "get_channel_access", (hookfn) hack_channel_access },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -40,9 +40,6 @@ check_new_user(void *vdata)
|
|||
{
|
||||
struct Client *source_p = vdata;
|
||||
|
||||
if (IsAnyDead(source_p))
|
||||
return;
|
||||
|
||||
if (!IsIPSpoof(source_p))
|
||||
return;
|
||||
|
||||
|
@ -128,9 +125,9 @@ check_new_user(void *vdata)
|
|||
return;
|
||||
}
|
||||
|
||||
sendto_realops_snomask(SNO_BANNED, L_NETWIDE,
|
||||
"Rejecting K-Lined user %s [%s] (%s@%s)", get_client_name(source_p, HIDE_IP),
|
||||
show_ip(NULL, source_p) ? source_p->sockhost : "255.255.255.255", aconf->user, aconf->host);
|
||||
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
|
||||
"KLINE active for %s",
|
||||
get_client_name(source_p, HIDE_IP));
|
||||
|
||||
notify_banned_client(source_p, aconf, K_LINED);
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ static void _moddeinit(void);
|
|||
static void h_scc_channel_join(void *);
|
||||
|
||||
mapi_hfn_list_av1 scc_hfnlist[] = {
|
||||
{ "channel_join", h_scc_channel_join },
|
||||
{ "channel_join", (hookfn) h_scc_channel_join },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -20,12 +20,12 @@ static const char sno_desc[] =
|
|||
|
||||
static int _modinit(void);
|
||||
static void _moddeinit(void);
|
||||
static void h_gcn_new_remote_user(void *);
|
||||
static void h_gcn_client_exit(void *);
|
||||
static void h_gcn_new_remote_user(struct Client *);
|
||||
static void h_gcn_client_exit(hook_data_client_exit *);
|
||||
|
||||
mapi_hfn_list_av1 gcn_hfnlist[] = {
|
||||
{ "new_remote_user", h_gcn_new_remote_user },
|
||||
{ "client_exit", h_gcn_client_exit },
|
||||
{ "new_remote_user", (hookfn) h_gcn_new_remote_user },
|
||||
{ "client_exit", (hookfn) h_gcn_client_exit },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -51,9 +51,8 @@ _moddeinit(void)
|
|||
}
|
||||
|
||||
static void
|
||||
h_gcn_new_remote_user(void *data)
|
||||
h_gcn_new_remote_user(struct Client *source_p)
|
||||
{
|
||||
struct Client *source_p = data;
|
||||
|
||||
if (!HasSentEob(source_p->servptr))
|
||||
return;
|
||||
|
@ -66,9 +65,8 @@ h_gcn_new_remote_user(void *data)
|
|||
}
|
||||
|
||||
static void
|
||||
h_gcn_client_exit(void *data)
|
||||
h_gcn_client_exit(hook_data_client_exit *hdata)
|
||||
{
|
||||
hook_data_client_exit *hdata = data;
|
||||
struct Client *source_p;
|
||||
|
||||
source_p = hdata->target;
|
||||
|
|
|
@ -15,10 +15,10 @@ static const char sno_desc[] =
|
|||
"Adds server notices for remote nick changes";
|
||||
|
||||
static int _modinit(void);
|
||||
static void h_gnc_nick_change(void *data);
|
||||
static void h_gnc_nick_change(hook_data *data);
|
||||
|
||||
mapi_hfn_list_av1 gcn_hfnlist[] = {
|
||||
{ "remote_nick_change", h_gnc_nick_change },
|
||||
{ "remote_nick_change", (hookfn) h_gnc_nick_change },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -34,9 +34,8 @@ _modinit(void)
|
|||
}
|
||||
|
||||
static void
|
||||
h_gnc_nick_change(void *data_)
|
||||
h_gnc_nick_change(hook_data *data)
|
||||
{
|
||||
hook_data *data = data_;
|
||||
struct Client *source_p = data->client;
|
||||
const char *oldnick = data->arg1;
|
||||
const char *newnick = data->arg2;
|
||||
|
|
|
@ -17,7 +17,7 @@ static const char sno_desc[] =
|
|||
static void h_sgo_umode_changed(void *);
|
||||
|
||||
mapi_hfn_list_av1 sgo_hfnlist[] = {
|
||||
{ "umode_changed", h_sgo_umode_changed },
|
||||
{ "umode_changed", (hookfn) h_sgo_umode_changed },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -33,17 +33,15 @@
|
|||
static const char umode_noctcp_desc[] =
|
||||
"Adds user mode +C which blocks CTCPs to the user.";
|
||||
|
||||
static void umode_noctcp_process(void *);
|
||||
static void umode_noctcp_process(hook_data_privmsg_user *);
|
||||
|
||||
mapi_hfn_list_av1 umode_noctcp_hfnlist[] = {
|
||||
{ "privmsg_user", umode_noctcp_process },
|
||||
{ "privmsg_user", (hookfn) umode_noctcp_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
static void
|
||||
umode_noctcp_process(void *data_)
|
||||
{
|
||||
hook_data_privmsg_user *data = data_;
|
||||
umode_noctcp_process(hook_data_privmsg_user *data) {
|
||||
if (!MyClient(data->target_p))
|
||||
return;
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@ NO PARAMETERS:
|
|||
messages is stripped.
|
||||
+g - Free invite. Everyone may invite users. Significantly
|
||||
weakens +i control.
|
||||
? +u - Unfiltered. Receive messages that would otherwise be filtered
|
||||
server side based on content.
|
||||
? +u - Unfiltered. Receive messages that are filtered server side based
|
||||
on content
|
||||
+z - Op moderated. Messages blocked by +m, +b and +q are instead
|
||||
sent to ops.
|
||||
+L - Large ban list. Increase maximum number of +beIq entries.
|
||||
|
|
|
@ -18,7 +18,5 @@ Modifiers are also supported, seperated by a comma:
|
|||
last n minutes
|
||||
T>n - List channels whose topics were last changed
|
||||
more than n minutes ago
|
||||
*mask* - List channels matching a wildcard mask
|
||||
!*mask* - List channels that do not match the mask
|
||||
|
||||
eg LIST <100,>20
|
||||
|
|
|
@ -16,8 +16,8 @@ User modes: (* designates that the umode is oper only)
|
|||
* +a - Is marked as a server admin in whois.
|
||||
* +l - Can see oper locops (local wallops).
|
||||
* +s - Can see server notices (see /quote help snomask).
|
||||
? +u - Receive messages that would otherwise be filtered server side
|
||||
based on content.
|
||||
? +u - Receive messages that are filtered server side based
|
||||
on content
|
||||
* +z - Can see operwalls.
|
||||
? +C - Prevents you from receiving CTCPs other than ACTION.
|
||||
+D - Deaf - ignores all channel messages.
|
||||
|
|
|
@ -11,8 +11,8 @@ User modes: (? designates that the umode is provided by an extension
|
|||
? +h - Has a cloaked host. May be +x depending on cloaking module
|
||||
+g - Deny users not on your /ACCEPT list from messaging you and
|
||||
inviting you to channels.
|
||||
? +u - Receive messages that would otherwise be filtered server side
|
||||
based on content.
|
||||
? +u - Receive messages that are filtered server side based
|
||||
on content.
|
||||
+w - Can see oper wallops.
|
||||
? +C - Prevents you from receiving CTCPs other than ACTION.
|
||||
+D - Deaf - ignores all channel messages.
|
||||
|
|
|
@ -308,7 +308,7 @@ struct PreClient
|
|||
|
||||
struct ListClient
|
||||
{
|
||||
char *chname, *mask, *nomask;
|
||||
char *chname;
|
||||
unsigned int users_min, users_max;
|
||||
time_t created_min, created_max, topic_min, topic_max;
|
||||
int operspy;
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
#define NUMERIC_STR_209 "Class %s %d"
|
||||
#define NUMERIC_STR_212 "%s %u %lu :%u"
|
||||
#define NUMERIC_STR_213 "C %s %s %s %d %s %s"
|
||||
#define NUMERIC_STR_215 "I %s %s %s@%s %d %s :%s"
|
||||
#define NUMERIC_STR_215 "I %s %s %s@%s %d %s"
|
||||
#define NUMERIC_STR_216 "%c %s * %s :%s%s%s"
|
||||
#define NUMERIC_STR_217 "%c %d %s :%s"
|
||||
#define NUMERIC_STR_218 "Y %s %d %d %d %u %d.%d %d.%d %u"
|
||||
|
@ -101,11 +101,11 @@
|
|||
#define NUMERIC_STR_323 ":%s 323 %s :End of /LIST"
|
||||
#define NUMERIC_STR_324 ":%s 324 %s %s %s"
|
||||
#define NUMERIC_STR_325 ":%s 325 %s %s %s :is the current channel mode-lock"
|
||||
#define NUMERIC_STR_329 ":%s 329 %s %s %lld"
|
||||
#define NUMERIC_STR_329 ":%s 329 %s %s %lu"
|
||||
#define NUMERIC_STR_330 "%s %s :is logged in as"
|
||||
#define NUMERIC_STR_331 ":%s 331 %s %s :No topic is set."
|
||||
#define NUMERIC_STR_332 ":%s 332 %s %s :%s"
|
||||
#define NUMERIC_STR_333 ":%s 333 %s %s %s %lld"
|
||||
#define NUMERIC_STR_333 ":%s 333 %s %s %s %lu"
|
||||
#define NUMERIC_STR_337 "%s :%s"
|
||||
#define NUMERIC_STR_338 "%s %s :actually using host"
|
||||
#define NUMERIC_STR_341 ":%s 341 %s %s %s"
|
||||
|
@ -144,7 +144,7 @@
|
|||
#define NUMERIC_STR_403 "%s :No such channel"
|
||||
#define NUMERIC_STR_404 "%s :Cannot send to nick/channel"
|
||||
#define NUMERIC_STR_405 ":%s 405 %s %s :You have joined too many channels"
|
||||
#define NUMERIC_STR_406 "%s :There was no such nickname"
|
||||
#define NUMERIC_STR_406 ":%s :There was no such nickname"
|
||||
#define NUMERIC_STR_407 ":%s 407 %s %s :Too many recipients."
|
||||
#define NUMERIC_STR_409 ":%s 409 %s :No origin specified"
|
||||
#define NUMERIC_STR_410 ":%s 410 %s %s :Invalid CAP subcommand"
|
||||
|
|
|
@ -43,8 +43,6 @@
|
|||
|
||||
#include "stdinc.h"
|
||||
|
||||
struct Client;
|
||||
|
||||
enum {
|
||||
PRIV_NEEDOPER = 1
|
||||
};
|
||||
|
|
|
@ -65,7 +65,6 @@ struct ConfItem
|
|||
char *passwd; /* doubles as kline reason *ugh* */
|
||||
char *spasswd; /* Password to send. */
|
||||
char *user; /* user part of user@host */
|
||||
char *desc; /* description */
|
||||
int port;
|
||||
time_t hold; /* Hold action until this time (calendar time) */
|
||||
time_t created; /* Creation time (for klines etc) */
|
||||
|
@ -385,7 +384,7 @@ extern int detach_conf(struct Client *);
|
|||
extern struct ConfItem *find_tkline(const char *, const char *, struct sockaddr *);
|
||||
extern char *show_iline_prefix(struct Client *, struct ConfItem *, char *);
|
||||
extern void get_printable_conf(struct ConfItem *,
|
||||
char **, char **, const char **, char **, int *, char **, char **);
|
||||
char **, char **, const char **, char **, int *, char **);
|
||||
extern char *get_user_ban_reason(struct ConfItem *aconf);
|
||||
extern void get_printable_kline(struct Client *, struct ConfItem *,
|
||||
char **, char **, char **, char **);
|
||||
|
|
|
@ -40,9 +40,6 @@
|
|||
#include <openssl/rsa.h>
|
||||
#endif
|
||||
|
||||
#define MAX_TEMP_TIME (52 * 7 * 24 * 60 * 60)
|
||||
|
||||
struct Client;
|
||||
struct ConfItem;
|
||||
|
||||
extern rb_dlink_list cluster_conf_list;
|
||||
|
|
|
@ -1141,7 +1141,7 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
|
|||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if(chmode_table[i].set_func == chm_hidden && !HasPrivilege(client_p, "auspex:cmodes") && IsClient(client_p))
|
||||
if(chmode_table[i].set_func == chm_hidden && (!HasPrivilege(client_p, "auspex:cmodes") || !IsClient(client_p)))
|
||||
continue;
|
||||
if(chptr->mode.mode & chmode_flags[i])
|
||||
*mbuf++ = i;
|
||||
|
|
|
@ -249,7 +249,9 @@ add_id(struct Client *source_p, struct Channel *chptr, const char *banid, const
|
|||
char *realban = LOCAL_COPY(banid);
|
||||
rb_dlink_node *ptr;
|
||||
|
||||
/* dont let local clients overflow the banlist */
|
||||
/* dont let local clients overflow the banlist, or set redundant
|
||||
* bans
|
||||
*/
|
||||
if(MyClient(source_p))
|
||||
{
|
||||
if((rb_dlink_list_length(&chptr->banlist) + rb_dlink_list_length(&chptr->exceptlist) + rb_dlink_list_length(&chptr->invexlist) + rb_dlink_list_length(&chptr->quietlist)) >= (unsigned long)((chptr->mode.mode & MODE_EXLIMIT) ? ConfigChannel.max_bans_large : ConfigChannel.max_bans))
|
||||
|
@ -258,15 +260,25 @@ add_id(struct Client *source_p, struct Channel *chptr, const char *banid, const
|
|||
me.name, source_p->name, chptr->chname, realban);
|
||||
return false;
|
||||
}
|
||||
|
||||
RB_DLINK_FOREACH(ptr, list->head)
|
||||
{
|
||||
actualBan = ptr->data;
|
||||
if(mask_match(actualBan->banstr, realban))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/* dont let remotes set duplicates */
|
||||
else
|
||||
{
|
||||
RB_DLINK_FOREACH(ptr, list->head)
|
||||
{
|
||||
actualBan = ptr->data;
|
||||
if(!irccmp(actualBan->banstr, realban))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* don't let anyone set duplicate bans */
|
||||
RB_DLINK_FOREACH(ptr, list->head)
|
||||
{
|
||||
actualBan = ptr->data;
|
||||
if(!irccmp(actualBan->banstr, realban))
|
||||
return false;
|
||||
}
|
||||
|
||||
if(IsPerson(source_p))
|
||||
sprintf(who, "%s!%s@%s", source_p->name, source_p->username, source_p->host);
|
||||
|
@ -925,9 +937,9 @@ chm_ban(struct Client *source_p, struct Channel *chptr,
|
|||
}
|
||||
|
||||
if (removed && removed->forward)
|
||||
removed_mask_pos += snprintf(buf + old_removed_mask_pos, sizeof(buf) - old_removed_mask_pos, "%s$%s", removed->banstr, removed->forward) + 1;
|
||||
removed_mask_pos += snprintf(buf + old_removed_mask_pos, sizeof(buf), "%s$%s", removed->banstr, removed->forward) + 1;
|
||||
else
|
||||
removed_mask_pos += rb_strlcpy(buf + old_removed_mask_pos, removed ? removed->banstr : mask, sizeof(buf)) + 1;
|
||||
removed_mask_pos += rb_strlcpy(buf + old_removed_mask_pos, mask, sizeof(buf)) + 1;
|
||||
if (removed)
|
||||
{
|
||||
free_ban(removed);
|
||||
|
|
|
@ -551,7 +551,7 @@ check_klines(void)
|
|||
}
|
||||
|
||||
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
|
||||
"Disconnecting K-Lined user %s (%s@%s)",
|
||||
"KLINE active for %s (%s@%s)",
|
||||
get_client_name(client_p, HIDE_IP), aconf->user, aconf->host);
|
||||
|
||||
notify_banned_client(client_p, aconf, K_LINED);
|
||||
|
@ -600,7 +600,7 @@ check_one_kline(struct ConfItem *kline)
|
|||
case HM_IPV6:
|
||||
if (IsConfDoSpoofIp(client_p->localClient->att_conf) &&
|
||||
IsConfKlineSpoof(client_p->localClient->att_conf))
|
||||
break;
|
||||
continue;
|
||||
if (client_p->localClient->ip.ss_family == AF_INET6 && sockaddr.ss_family == AF_INET &&
|
||||
rb_ipv4_from_ipv6((struct sockaddr_in6 *)&client_p->localClient->ip, &ip4)
|
||||
&& comp_with_mask_sock((struct sockaddr *)&ip4, (struct sockaddr *)&sockaddr, bits))
|
||||
|
@ -615,7 +615,7 @@ check_one_kline(struct ConfItem *kline)
|
|||
matched = 1;
|
||||
if (IsConfDoSpoofIp(client_p->localClient->att_conf) &&
|
||||
IsConfKlineSpoof(client_p->localClient->att_conf))
|
||||
break;
|
||||
continue;
|
||||
if (match(kline->host, client_p->sockhost))
|
||||
matched = 1;
|
||||
break;
|
||||
|
@ -634,7 +634,7 @@ check_one_kline(struct ConfItem *kline)
|
|||
}
|
||||
|
||||
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
|
||||
"Disconnecting K-Lined user %s (%s@%s)",
|
||||
"KLINE active for %s (%s@%s)",
|
||||
get_client_name(client_p, HIDE_IP), kline->user, kline->host);
|
||||
|
||||
notify_banned_client(client_p, kline, K_LINED);
|
||||
|
@ -669,7 +669,7 @@ check_dlines(void)
|
|||
continue;
|
||||
|
||||
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
|
||||
"Disconnecting D-Lined user %s (%s)",
|
||||
"DLINE active for %s (%s)",
|
||||
get_client_name(client_p, HIDE_IP), aconf->host);
|
||||
|
||||
notify_banned_client(client_p, aconf, D_LINED);
|
||||
|
@ -725,7 +725,7 @@ check_xlines(void)
|
|||
}
|
||||
|
||||
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
|
||||
"Disconnecting X-Lined user %s (%s)",
|
||||
"XLINE active for %s (%s)",
|
||||
get_client_name(client_p, HIDE_IP), aconf->host);
|
||||
|
||||
(void) exit_client(client_p, client_p, &me, "Bad user info");
|
||||
|
@ -1573,11 +1573,11 @@ exit_local_server(struct Client *client_p, struct Client *source_p, struct Clien
|
|||
remove_dependents(client_p, source_p, from, IsPerson(from) ? newcomment : comment, comment1);
|
||||
|
||||
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s was connected"
|
||||
" for %lld seconds. %d/%d sendK/recvK.",
|
||||
source_p->name, (long long)(rb_current_time() - source_p->localClient->firsttime), sendk, recvk);
|
||||
" for %ld seconds. %d/%d sendK/recvK.",
|
||||
source_p->name, (long) rb_current_time() - source_p->localClient->firsttime, sendk, recvk);
|
||||
|
||||
ilog(L_SERVER, "%s was connected for %lld seconds. %d/%d sendK/recvK.",
|
||||
source_p->name, (long long)(rb_current_time() - source_p->localClient->firsttime), sendk, recvk);
|
||||
ilog(L_SERVER, "%s was connected for %ld seconds. %d/%d sendK/recvK.",
|
||||
source_p->name, (long) rb_current_time() - source_p->localClient->firsttime, sendk, recvk);
|
||||
|
||||
if(has_id(source_p))
|
||||
del_from_id_hash(source_p->id, source_p);
|
||||
|
@ -1844,7 +1844,7 @@ show_ip_conf(struct ConfItem *aconf, struct Client *source_p)
|
|||
{
|
||||
if(IsConfDoSpoofIp(aconf))
|
||||
{
|
||||
if(!ConfigFileEntry.hide_spoof_ips && IsOper(source_p))
|
||||
if(!ConfigFileEntry.hide_spoof_ips && MyOper(source_p))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
@ -1857,7 +1857,7 @@ int
|
|||
show_ip_whowas(struct Whowas *whowas, struct Client *source_p)
|
||||
{
|
||||
if(whowas->flags & WHOWAS_IP_SPOOFING)
|
||||
if(ConfigFileEntry.hide_spoof_ips || !IsOper(source_p))
|
||||
if(ConfigFileEntry.hide_spoof_ips || !MyOper(source_p))
|
||||
return 0;
|
||||
if(whowas->flags & WHOWAS_DYNSPOOF)
|
||||
if(!IsOper(source_p))
|
||||
|
|
|
@ -710,7 +710,8 @@ show_iline_prefix(struct Client *sptr, struct ConfItem *aconf, char *name)
|
|||
*prefix_ptr++ = '^';
|
||||
if(IsOper(sptr) && IsConfExemptLimits(aconf))
|
||||
*prefix_ptr++ = '>';
|
||||
rb_strlcpy(prefix_ptr, name, USERLEN + 1);
|
||||
*prefix_ptr = '\0';
|
||||
strncpy(prefix_ptr, name, USERLEN);
|
||||
return (prefix_of_host);
|
||||
}
|
||||
|
||||
|
@ -723,7 +724,7 @@ show_iline_prefix(struct Client *sptr, struct ConfItem *aconf, char *name)
|
|||
void
|
||||
report_auth(struct Client *client_p)
|
||||
{
|
||||
char *name, *host, *user, *classname, *desc;
|
||||
char *name, *host, *user, *classname;
|
||||
const char *pass;
|
||||
struct AddressRec *arec;
|
||||
struct ConfItem *aconf;
|
||||
|
@ -739,7 +740,7 @@ report_auth(struct Client *client_p)
|
|||
continue;
|
||||
|
||||
get_printable_conf(aconf, &name, &host, &pass, &user, &port,
|
||||
&classname, &desc);
|
||||
&classname);
|
||||
|
||||
if(!EmptyString(aconf->spasswd))
|
||||
pass = aconf->spasswd;
|
||||
|
@ -748,7 +749,7 @@ report_auth(struct Client *client_p)
|
|||
form_str(RPL_STATSILINE),
|
||||
name, pass, show_iline_prefix(client_p, aconf, user),
|
||||
show_ip_conf(aconf, client_p) ? host : "255.255.255.255",
|
||||
port, classname, desc);
|
||||
port, classname);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -756,8 +756,8 @@ solanum_main(int argc, char * const argv[])
|
|||
check_splitmode_ev = rb_event_add("check_splitmode", check_splitmode, NULL, 5);
|
||||
|
||||
if(server_state_foreground)
|
||||
inotice("now running in foreground mode from %s as pid %ld ...",
|
||||
ConfigFileEntry.dpath, (long)getpid());
|
||||
inotice("now running in foreground mode from %s as pid %d ...",
|
||||
ConfigFileEntry.dpath, getpid());
|
||||
|
||||
rb_lib_loop(0);
|
||||
|
||||
|
|
|
@ -572,6 +572,8 @@ accept_sslcallback(struct Client *client_p, int status)
|
|||
return 0; /* use default handler if status != RB_OK */
|
||||
}
|
||||
|
||||
static const char *toofast = "ERROR :Reconnecting too fast, throttled.\r\n";
|
||||
|
||||
static int
|
||||
accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, void *data)
|
||||
{
|
||||
|
@ -581,13 +583,6 @@ accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, voi
|
|||
static time_t last_oper_notice = 0;
|
||||
int len;
|
||||
|
||||
static const char *toofast = "ERROR :Reconnecting too fast, throttled.\r\n";
|
||||
|
||||
static const unsigned char sslerrcode[] = {
|
||||
// SSLv3.0 Fatal Alert: Access Denied
|
||||
0x15, 0x03, 0x00, 0x00, 0x02, 0x02, 0x31
|
||||
};
|
||||
|
||||
if(listener->ssl && (!ircd_ssl_ok || !get_ssld_count()))
|
||||
{
|
||||
rb_close(F);
|
||||
|
@ -623,11 +618,7 @@ accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, voi
|
|||
{
|
||||
ServerStats.is_ref++;
|
||||
|
||||
if(listener->ssl)
|
||||
{
|
||||
rb_write(F, sslerrcode, sizeof(sslerrcode));
|
||||
}
|
||||
else if(ConfigFileEntry.dline_with_reason)
|
||||
if(ConfigFileEntry.dline_with_reason)
|
||||
{
|
||||
len = snprintf(buf, sizeof(buf), "ERROR :*** Banned: %s\r\n", get_user_ban_reason(aconf));
|
||||
if (len >= (int)(sizeof(buf)-1))
|
||||
|
@ -636,14 +627,11 @@ accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, voi
|
|||
buf[sizeof(buf) - 2] = '\n';
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
}
|
||||
rb_write(F, buf, strlen(buf));
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(buf, "ERROR :You have been D-lined.\r\n");
|
||||
rb_write(F, buf, strlen(buf));
|
||||
}
|
||||
|
||||
rb_write(F, buf, strlen(buf));
|
||||
rb_close(F);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1037,9 +1037,6 @@ conf_end_auth(struct TopConf *tc)
|
|||
if(yy_aconf->className)
|
||||
yy_tmp->className = rb_strdup(yy_aconf->className);
|
||||
|
||||
if(yy_aconf->desc)
|
||||
yy_tmp->desc = rb_strdup(yy_aconf->desc);
|
||||
|
||||
yy_tmp->flags = yy_aconf->flags;
|
||||
yy_tmp->port = yy_aconf->port;
|
||||
|
||||
|
@ -1175,13 +1172,6 @@ conf_set_auth_spoof(void *data)
|
|||
yy_aconf->flags |= CONF_FLAGS_SPOOF_IP;
|
||||
}
|
||||
|
||||
static void
|
||||
conf_set_auth_desc(void *data)
|
||||
{
|
||||
rb_free(yy_aconf->desc);
|
||||
yy_aconf->desc = rb_strdup(data);
|
||||
}
|
||||
|
||||
static void
|
||||
conf_set_auth_flags(void *data)
|
||||
{
|
||||
|
@ -2328,7 +2318,7 @@ conf_report_error(const char *fmt, ...)
|
|||
char msg[BUFSIZE + 1] = { 0 };
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(msg, sizeof msg, fmt, ap);
|
||||
vsnprintf(msg, BUFSIZE, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (testing_conf)
|
||||
|
@ -2348,7 +2338,7 @@ conf_report_warning(const char *fmt, ...)
|
|||
char msg[BUFSIZE + 1] = { 0 };
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(msg, sizeof msg, fmt, ap);
|
||||
vsnprintf(msg, BUFSIZE, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (testing_conf)
|
||||
|
@ -2650,7 +2640,6 @@ static struct ConfEntry conf_auth_table[] =
|
|||
{ "redirport", CF_INT, conf_set_auth_redir_port, 0, NULL },
|
||||
{ "flags", CF_STRING | CF_FLIST, conf_set_auth_flags, 0, NULL },
|
||||
{ "umodes", CF_QSTRING, conf_set_auth_umodes, 0, NULL},
|
||||
{ "description",CF_QSTRING, conf_set_auth_desc, 0, NULL},
|
||||
{ "\0", 0, NULL, 0, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -322,7 +322,7 @@ read_packet(rb_fde_t * F, void *data)
|
|||
* with client_p of "local" variation, which contains all the
|
||||
* necessary fields (buffer etc..)
|
||||
*/
|
||||
static void
|
||||
void
|
||||
client_dopacket(struct Client *client_p, char *buffer, size_t length)
|
||||
{
|
||||
s_assert(client_p != NULL);
|
||||
|
|
|
@ -100,7 +100,7 @@ reject_exit(void *unused)
|
|||
|
||||
if (ddata->aconf)
|
||||
{
|
||||
snprintf(dynamic_reason, sizeof dynamic_reason, form_str(ERR_YOUREBANNEDCREEP) "\r\n",
|
||||
snprintf(dynamic_reason, BUFSIZE, form_str(ERR_YOUREBANNEDCREEP) "\r\n",
|
||||
me.name, "*", get_user_ban_reason(ddata->aconf));
|
||||
rb_write(ddata->F, dynamic_reason, strlen(dynamic_reason));
|
||||
|
||||
|
@ -108,7 +108,7 @@ reject_exit(void *unused)
|
|||
}
|
||||
else if (ddata->reason)
|
||||
{
|
||||
snprintf(dynamic_reason, sizeof dynamic_reason, ":%s 465 %s :%s\r\n",
|
||||
snprintf(dynamic_reason, BUFSIZE, ":%s 465 %s :%s\r\n",
|
||||
me.name, "*", ddata->reason);
|
||||
rb_write(ddata->F, dynamic_reason, strlen(dynamic_reason));
|
||||
}
|
||||
|
|
|
@ -154,7 +154,6 @@ free_conf(struct ConfItem *aconf)
|
|||
rb_free(aconf->className);
|
||||
rb_free(aconf->user);
|
||||
rb_free(aconf->host);
|
||||
rb_free(aconf->desc);
|
||||
|
||||
if(IsConfBan(aconf))
|
||||
operhash_delete(aconf->info.oper);
|
||||
|
@ -201,10 +200,10 @@ check_client(struct Client *client_p, struct Client *source_p, const char *usern
|
|||
* see the IP, we still cannot send it.
|
||||
*/
|
||||
sendto_realops_snomask(SNO_FULL, L_NETWIDE,
|
||||
"Too many local connections for %s[%s%s@%s] [%s]",
|
||||
"Too many local connections for %s!%s%s@%s",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
source_p->username, source_p->host,
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : "0");
|
||||
source_p->username,
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : source_p->host);
|
||||
|
||||
ilog(L_FUSER, "Too many local connections from %s!%s%s@%s",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
|
@ -216,10 +215,10 @@ check_client(struct Client *client_p, struct Client *source_p, const char *usern
|
|||
|
||||
case TOO_MANY_GLOBAL:
|
||||
sendto_realops_snomask(SNO_FULL, L_NETWIDE,
|
||||
"Too many global connections for %s[%s%s@%s] [%s]",
|
||||
"Too many global connections for %s!%s%s@%s",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
source_p->username, source_p->host,
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : "0");
|
||||
source_p->username,
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : source_p->host);
|
||||
ilog(L_FUSER, "Too many global connections from %s!%s%s@%s",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
source_p->username, source_p->sockhost);
|
||||
|
@ -230,10 +229,10 @@ check_client(struct Client *client_p, struct Client *source_p, const char *usern
|
|||
|
||||
case TOO_MANY_IDENT:
|
||||
sendto_realops_snomask(SNO_FULL, L_NETWIDE,
|
||||
"Too many user connections for %s[%s%s@%s] [%s]",
|
||||
"Too many user connections for %s!%s%s@%s",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
source_p->username, source_p->host,
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : "0");
|
||||
source_p->username,
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : source_p->host);
|
||||
ilog(L_FUSER, "Too many user connections from %s!%s%s@%s",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
source_p->username, source_p->sockhost);
|
||||
|
@ -244,10 +243,10 @@ check_client(struct Client *client_p, struct Client *source_p, const char *usern
|
|||
|
||||
case I_LINE_FULL:
|
||||
sendto_realops_snomask(SNO_FULL, L_NETWIDE,
|
||||
"I-line is full for %s[%s%s@%s] [%s]",
|
||||
"I-line is full for %s!%s%s@%s (%s).",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
source_p->username, source_p->host,
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : "0");
|
||||
show_ip(NULL, source_p) && !IsIPSpoof(source_p) ? source_p->sockhost : "255.255.255.255");
|
||||
|
||||
ilog(L_FUSER, "Too many connections from %s!%s%s@%s.",
|
||||
source_p->name, IsGotId(source_p) ? "" : "~",
|
||||
|
@ -369,8 +368,8 @@ verify_access(struct Client *client_p, const char *username)
|
|||
get_user_ban_reason(aconf));
|
||||
|
||||
sendto_realops_snomask(SNO_BANNED, L_NETWIDE,
|
||||
"Rejecting K-Lined user %s [%s] (%s@%s)", get_client_name(client_p, HIDE_IP),
|
||||
show_ip(NULL, client_p) ? client_p->sockhost : "255.255.255.255", aconf->user, aconf->host);
|
||||
"Rejecting K-Lined user %s [%s@%s]",
|
||||
get_client_name(client_p, HIDE_IP), aconf->user, aconf->host);
|
||||
add_reject(client_p, aconf->user, aconf->host, aconf, NULL);
|
||||
return (BANNED_CLIENT);
|
||||
}
|
||||
|
@ -1347,8 +1346,7 @@ get_oper_name(struct Client *client_p)
|
|||
*/
|
||||
void
|
||||
get_printable_conf(struct ConfItem *aconf, char **name, char **host,
|
||||
const char **pass, char **user, int *port,
|
||||
char **classname, char **desc)
|
||||
const char **pass, char **user, int *port, char **classname)
|
||||
{
|
||||
static char null[] = "<NULL>";
|
||||
static char zero[] = "default";
|
||||
|
@ -1358,7 +1356,6 @@ get_printable_conf(struct ConfItem *aconf, char **name, char **host,
|
|||
*pass = EmptyString(aconf->passwd) ? null : aconf->passwd;
|
||||
*user = EmptyString(aconf->user) ? null : aconf->user;
|
||||
*classname = EmptyString(aconf->className) ? zero : aconf->className;
|
||||
*desc = CheckEmpty(aconf->desc);
|
||||
*port = (int) aconf->port;
|
||||
}
|
||||
|
||||
|
|
|
@ -685,55 +685,23 @@ time_t
|
|||
valid_temp_time(const char *p)
|
||||
{
|
||||
time_t result = 0;
|
||||
long current = 0;
|
||||
|
||||
while (*p) {
|
||||
char *endp;
|
||||
int mul;
|
||||
|
||||
errno = 0;
|
||||
current = strtol(p, &endp, 10);
|
||||
|
||||
if (endp == p)
|
||||
return -1;
|
||||
if (current < 0)
|
||||
return -1;
|
||||
|
||||
switch (*endp) {
|
||||
case '\0': /* No unit was given so send it back as minutes */
|
||||
case 'm':
|
||||
mul = 60;
|
||||
break;
|
||||
case 'h':
|
||||
mul = 3600;
|
||||
break;
|
||||
case 'd':
|
||||
mul = 86400;
|
||||
break;
|
||||
case 'w':
|
||||
mul = 604800;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
while(*p)
|
||||
{
|
||||
if(IsDigit(*p))
|
||||
{
|
||||
result *= 10;
|
||||
result += ((*p) & 0xF);
|
||||
p++;
|
||||
}
|
||||
|
||||
if (current > LONG_MAX / mul)
|
||||
return MAX_TEMP_TIME;
|
||||
|
||||
current *= mul;
|
||||
|
||||
if (current > MAX_TEMP_TIME - result)
|
||||
return MAX_TEMP_TIME;
|
||||
|
||||
result += current;
|
||||
|
||||
if (*endp == '\0')
|
||||
break;
|
||||
|
||||
p = endp + 1;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
return MIN(result, MAX_TEMP_TIME);
|
||||
if(result > (60 * 24 * 7 * 52))
|
||||
result = (60 * 24 * 7 * 52);
|
||||
|
||||
return(result * 60);
|
||||
}
|
||||
|
||||
/* Propagated bans are expired elsewhere. */
|
||||
|
|
|
@ -1017,16 +1017,12 @@ serv_connect(struct server_conf *server_p, struct Client *by)
|
|||
else if(server_p->aftype == AF_INET || GET_SS_FAMILY(&server_p->connect4) == AF_INET)
|
||||
{
|
||||
sa_connect[0] = server_p->connect4;
|
||||
sa_connect[1] = server_p->connect6;
|
||||
sa_bind[0] = server_p->bind4;
|
||||
sa_bind[1] = server_p->bind6;
|
||||
}
|
||||
else if(server_p->aftype == AF_INET6 || GET_SS_FAMILY(&server_p->connect6) == AF_INET6)
|
||||
{
|
||||
sa_connect[0] = server_p->connect6;
|
||||
sa_connect[1] = server_p->connect4;
|
||||
sa_bind[0] = server_p->bind6;
|
||||
sa_bind[1] = server_p->bind4;
|
||||
}
|
||||
|
||||
/* log */
|
||||
|
|
|
@ -524,7 +524,7 @@ register_local_user(struct Client *client_p, struct Client *source_p)
|
|||
const char *sasl_only_client_message = ConfigFileEntry.sasl_only_client_message;
|
||||
|
||||
if (sasl_only_client_message == NULL)
|
||||
sasl_only_client_message = "You need to identify via SASL to use this server.";
|
||||
sasl_only_client_message = "You need to identify via SASL to use to use this server.";
|
||||
|
||||
ServerStats.is_ref++;
|
||||
sendto_one_notice(source_p, ":*** Notice -- %s", sasl_only_client_message);
|
||||
|
@ -597,8 +597,8 @@ register_local_user(struct Client *client_p, struct Client *source_p)
|
|||
{
|
||||
ServerStats.is_ref++;
|
||||
sendto_realops_snomask(SNO_BANNED, L_NETWIDE,
|
||||
"Rejecting X-Lined user %s [%s] (%s)", get_client_name(source_p, HIDE_IP),
|
||||
show_ip(NULL, source_p) ? source_p->sockhost : "255.255.255.255", xconf->host);
|
||||
"Rejecting X-Lined user %s [%s]",
|
||||
get_client_name(client_p, HIDE_IP), xconf->host);
|
||||
|
||||
add_reject(source_p, xconf->host, NULL, NULL, NULL);
|
||||
exit_client(client_p, source_p, &me, "Bad user info");
|
||||
|
@ -1640,7 +1640,7 @@ change_nick_user_host(struct Client *target_p, const char *nick, const char *use
|
|||
if(do_qjm)
|
||||
{
|
||||
va_start(ap, format);
|
||||
vsnprintf(reason, sizeof reason, format, ap);
|
||||
vsnprintf(reason, 255, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
sendto_common_channels_local_butone(target_p, NOCAPS, CLICAP_CHGHOST, ":%s!%s@%s QUIT :%s",
|
||||
|
|
|
@ -26,7 +26,6 @@ else \
|
|||
{ print $1 " " $2 " " $3 " " $7 " at " $4 " " $5 " " $6 }}'`
|
||||
else
|
||||
creation="$EXTERNAL_BUILD_TIMESTAMP"
|
||||
generation=1
|
||||
fi
|
||||
|
||||
$spitshell >version.c <<!SUB!THIS!
|
||||
|
|
|
@ -112,7 +112,6 @@ whowas_add_history(struct Client *client_p, int online)
|
|||
rb_strlcpy(who->hostname, client_p->host, sizeof(who->hostname));
|
||||
rb_strlcpy(who->realname, client_p->info, sizeof(who->realname));
|
||||
rb_strlcpy(who->sockhost, client_p->sockhost, sizeof(who->sockhost));
|
||||
rb_strlcpy(who->suser, client_p->user->suser, sizeof(who->suser));
|
||||
|
||||
who->flags = (IsIPSpoof(client_p) ? WHOWAS_IP_SPOOFING : 0) |
|
||||
(IsDynSpoof(client_p) ? WHOWAS_DYNSPOOF : 0);
|
||||
|
|
|
@ -52,7 +52,7 @@ rb_crypt(const char *key, const char *salt)
|
|||
return rb_sha512_crypt(key, salt);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
}
|
||||
else
|
||||
return rb_des_crypt(key, salt);
|
||||
|
|
|
@ -294,21 +294,23 @@ rb_event_init(void)
|
|||
void
|
||||
rb_dump_events(void (*func) (char *, void *), void *ptr)
|
||||
{
|
||||
int len;
|
||||
char buf[512];
|
||||
rb_dlink_node *dptr;
|
||||
struct ev_entry *ev;
|
||||
len = sizeof(buf);
|
||||
|
||||
snprintf(buf, sizeof buf, "Last event to run: %s", last_event_ran);
|
||||
snprintf(buf, len, "Last event to run: %s", last_event_ran);
|
||||
func(buf, ptr);
|
||||
|
||||
rb_strlcpy(buf, "Operation Next Execution", sizeof buf);
|
||||
rb_strlcpy(buf, "Operation Next Execution", len);
|
||||
func(buf, ptr);
|
||||
|
||||
RB_DLINK_FOREACH(dptr, event_list.head)
|
||||
{
|
||||
ev = dptr->data;
|
||||
snprintf(buf, sizeof buf, "%-28s %-4lld seconds (frequency=%d)", ev->name,
|
||||
(long long)(ev->when - rb_current_time()), (int)ev->frequency);
|
||||
snprintf(buf, len, "%-28s %-4ld seconds (frequency=%d)", ev->name,
|
||||
ev->when - (long)rb_current_time(), (int)ev->frequency);
|
||||
func(buf, ptr);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -172,7 +172,7 @@ int
|
|||
rb_ports_supports_event(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
rb_ports_init_event(void)
|
||||
|
|
|
@ -162,7 +162,7 @@ rb_path_to_self(void)
|
|||
{
|
||||
static char path_buf[4096];
|
||||
#if defined(HAVE_GETEXECNAME)
|
||||
const char *s = getexecname();
|
||||
char *s = getexecname();
|
||||
if (s == NULL)
|
||||
return NULL;
|
||||
realpath(s, path_buf);
|
||||
|
|
|
@ -37,11 +37,11 @@
|
|||
static const char cap_account_tag_desc[] =
|
||||
"Provides the account-tag client capability";
|
||||
|
||||
static void cap_account_tag_process(void *);
|
||||
static void cap_account_tag_process(hook_data *);
|
||||
unsigned int CLICAP_ACCOUNT_TAG = 0;
|
||||
|
||||
mapi_hfn_list_av1 cap_account_tag_hfnlist[] = {
|
||||
{ "outbound_msgbuf", cap_account_tag_process },
|
||||
{ "outbound_msgbuf", (hookfn) cap_account_tag_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
mapi_cap_list_av2 cap_account_tag_cap_list[] = {
|
||||
|
@ -49,9 +49,8 @@ mapi_cap_list_av2 cap_account_tag_cap_list[] = {
|
|||
{ 0, NULL, NULL, NULL },
|
||||
};
|
||||
static void
|
||||
cap_account_tag_process(void *data_)
|
||||
cap_account_tag_process(hook_data *data)
|
||||
{
|
||||
hook_data *data = data_;
|
||||
struct MsgBuf *msgbuf = data->arg1;
|
||||
|
||||
if (data->client != NULL && IsPerson(data->client) && *data->client->user->suser)
|
||||
|
|
|
@ -37,11 +37,11 @@
|
|||
static const char cap_server_time_desc[] =
|
||||
"Provides the server-time client capability";
|
||||
|
||||
static void cap_server_time_process(void *);
|
||||
static void cap_server_time_process(hook_data *);
|
||||
unsigned int CLICAP_SERVER_TIME = 0;
|
||||
|
||||
mapi_hfn_list_av1 cap_server_time_hfnlist[] = {
|
||||
{ "outbound_msgbuf", cap_server_time_process },
|
||||
{ "outbound_msgbuf", (hookfn) cap_server_time_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
mapi_cap_list_av2 cap_server_time_cap_list[] = {
|
||||
|
@ -50,9 +50,8 @@ mapi_cap_list_av2 cap_server_time_cap_list[] = {
|
|||
};
|
||||
|
||||
static void
|
||||
cap_server_time_process(void *data_)
|
||||
cap_server_time_process(hook_data *data)
|
||||
{
|
||||
hook_data *data = data_;
|
||||
static char buf[BUFSIZE];
|
||||
struct MsgBuf *msgbuf = data->arg1;
|
||||
struct timeval tv;
|
||||
|
|
|
@ -40,17 +40,16 @@ static const char chm_nocolour_desc[] =
|
|||
static char buf[BUFSIZE];
|
||||
static unsigned int mode_nocolour;
|
||||
|
||||
static void chm_nocolour_process(void *);
|
||||
static void chm_nocolour_process(hook_data_privmsg_channel *);
|
||||
|
||||
mapi_hfn_list_av1 chm_nocolour_hfnlist[] = {
|
||||
{ "privmsg_channel", chm_nocolour_process },
|
||||
{ "privmsg_channel", (hookfn) chm_nocolour_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
static void
|
||||
chm_nocolour_process(void *data_)
|
||||
chm_nocolour_process(hook_data_privmsg_channel *data)
|
||||
{
|
||||
hook_data_privmsg_channel *data = data_;
|
||||
/* don't waste CPU if message is already blocked */
|
||||
if (data->approved)
|
||||
return;
|
||||
|
|
|
@ -39,24 +39,21 @@ static const char chm_noctcp_desc[] =
|
|||
|
||||
static unsigned int mode_noctcp;
|
||||
|
||||
static void chm_noctcp_process(void *);
|
||||
static void chm_noctcp_process(hook_data_privmsg_channel *);
|
||||
|
||||
mapi_hfn_list_av1 chm_noctcp_hfnlist[] = {
|
||||
{ "privmsg_channel", chm_noctcp_process },
|
||||
{ "privmsg_channel", (hookfn) chm_noctcp_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
static void
|
||||
chm_noctcp_process(void *data_)
|
||||
chm_noctcp_process(hook_data_privmsg_channel *data)
|
||||
{
|
||||
hook_data_privmsg_channel *data = data_;
|
||||
/* don't waste CPU if message is already blocked */
|
||||
if (data->approved)
|
||||
if (data->approved || data->msgtype == MESSAGE_TYPE_NOTICE)
|
||||
return;
|
||||
|
||||
if (*data->text == '\001' &&
|
||||
data->chptr->mode.mode & mode_noctcp &&
|
||||
!(data->msgtype == MESSAGE_TYPE_PRIVMSG && !rb_strncasecmp(data->text + 1, "ACTION ", 7)))
|
||||
if (*data->text == '\001' && rb_strncasecmp(data->text + 1, "ACTION ", 7) && data->chptr->mode.mode & mode_noctcp)
|
||||
{
|
||||
sendto_one_numeric(data->source_p, ERR_CANNOTSENDTOCHAN, form_str(ERR_CANNOTSENDTOCHAN), data->chptr->chname);
|
||||
data->approved = ERR_CANNOTSENDTOCHAN;
|
||||
|
|
|
@ -374,7 +374,7 @@ m_join(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
|
|||
sendto_one(source_p, form_str(RPL_TOPICWHOTIME),
|
||||
me.name, source_p->name, chptr->chname,
|
||||
chptr->topic_info,
|
||||
(long long)chptr->topic_time);
|
||||
(unsigned long)chptr->topic_time);
|
||||
}
|
||||
|
||||
channel_member_names(chptr, source_p, 1);
|
||||
|
|
|
@ -132,7 +132,7 @@ m_mode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
|
|||
operspy ? channel_modes(chptr, &me) : channel_modes(chptr, source_p));
|
||||
|
||||
sendto_one(source_p, form_str(RPL_CREATIONTIME),
|
||||
me.name, source_p->name, parv[1], (long long)chptr->channelts);
|
||||
me.name, source_p->name, parv[1], chptr->channelts);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -37,11 +37,11 @@ static const char alias_desc[] = "Provides the system for services aliases";
|
|||
|
||||
static int _modinit(void);
|
||||
static void _moddeinit(void);
|
||||
static void reload_aliases(void *);
|
||||
static int reload_aliases(hook_data *);
|
||||
static void m_alias(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
|
||||
|
||||
mapi_hfn_list_av1 alias_hfnlist[] = {
|
||||
{ "rehash", reload_aliases },
|
||||
{ "rehash", (hookfn)reload_aliases },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
|
@ -100,11 +100,12 @@ _moddeinit(void)
|
|||
destroy_aliases();
|
||||
}
|
||||
|
||||
static void
|
||||
reload_aliases(void *data)
|
||||
static int
|
||||
reload_aliases(hook_data *data)
|
||||
{
|
||||
destroy_aliases(); /* Clear old aliases */
|
||||
create_aliases();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The below was mostly taken from the old do_alias */
|
||||
|
|
|
@ -123,10 +123,7 @@ mo_etrace(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sourc
|
|||
target_p->servptr->name,
|
||||
get_id(target_p, target_p));
|
||||
else
|
||||
{
|
||||
do_single_etrace(source_p, target_p);
|
||||
sendto_one_numeric(source_p, RPL_ENDOFTRACE, form_str(RPL_ENDOFTRACE), target_p->name);
|
||||
}
|
||||
}
|
||||
else
|
||||
sendto_one_numeric(source_p, ERR_NOSUCHNICK,
|
||||
|
@ -340,10 +337,20 @@ mo_masktrace(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *so
|
|||
const char *parv[])
|
||||
{
|
||||
char *name, *username, *hostname, *gecos;
|
||||
const char *mask;
|
||||
int operspy = 0;
|
||||
|
||||
mask = parv[1];
|
||||
name = LOCAL_COPY(parv[1]);
|
||||
collapse(name);
|
||||
|
||||
if(IsOperSpy(source_p) && parv[1][0] == '!')
|
||||
{
|
||||
name++;
|
||||
mask++;
|
||||
operspy = 1;
|
||||
}
|
||||
|
||||
if(parc > 2 && !EmptyString(parv[2]))
|
||||
{
|
||||
gecos = LOCAL_COPY(parv[2]);
|
||||
|
@ -373,6 +380,21 @@ mo_masktrace(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *so
|
|||
return;
|
||||
}
|
||||
|
||||
match_masktrace(source_p, &global_client_list, username, hostname, name, gecos);
|
||||
if(operspy) {
|
||||
if (!ConfigFileEntry.operspy_dont_care_user_info)
|
||||
{
|
||||
char buf[512];
|
||||
rb_strlcpy(buf, mask, sizeof(buf));
|
||||
if(!EmptyString(gecos)) {
|
||||
rb_strlcat(buf, " ", sizeof(buf));
|
||||
rb_strlcat(buf, gecos, sizeof(buf));
|
||||
}
|
||||
|
||||
report_operspy(source_p, "MASKTRACE", buf);
|
||||
}
|
||||
match_masktrace(source_p, &global_client_list, username, hostname, name, gecos);
|
||||
} else
|
||||
match_masktrace(source_p, &lclient_list, username, hostname, name, gecos);
|
||||
|
||||
sendto_one_numeric(source_p, RPL_ENDOFTRACE, form_str(RPL_ENDOFTRACE), me.name);
|
||||
}
|
||||
|
|
|
@ -165,11 +165,6 @@ mo_kline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
}
|
||||
|
||||
reason = LOCAL_COPY(parv[loc]);
|
||||
if(strlen(reason) > BANREASONLEN)
|
||||
{
|
||||
sendto_one_notice(source_p, ":K-Line reason exceeds %d characters", BANREASONLEN);
|
||||
return;
|
||||
}
|
||||
|
||||
if(parse_netmask_strict(host, NULL, NULL) == HM_ERROR)
|
||||
{
|
||||
|
@ -239,6 +234,9 @@ mo_kline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
aconf->port = 0;
|
||||
aconf->info.oper = operhash_add(get_oper_name(source_p));
|
||||
|
||||
if(strlen(reason) > BANREASONLEN)
|
||||
reason[BANREASONLEN] = '\0';
|
||||
|
||||
/* Look for an oper reason */
|
||||
if((oper_reason = strchr(reason, '|')) != NULL)
|
||||
{
|
||||
|
|
102
modules/m_list.c
102
modules/m_list.c
|
@ -66,7 +66,7 @@ static void mo_list(struct MsgBuf *, struct Client *, struct Client *, int, cons
|
|||
static void list_one_channel(struct Client *source_p, struct Channel *chptr, int visible);
|
||||
|
||||
static void safelist_one_channel(struct Client *source_p, struct Channel *chptr, struct ListClient *params);
|
||||
static void safelist_check_cliexit(void *);
|
||||
static void safelist_check_cliexit(hook_data_client_exit * hdata);
|
||||
static void safelist_client_instantiate(struct Client *, struct ListClient *);
|
||||
static void safelist_client_release(struct Client *);
|
||||
static void safelist_iterate_client(struct Client *source_p);
|
||||
|
@ -81,7 +81,7 @@ struct Message list_msgtab = {
|
|||
mapi_clist_av1 list_clist[] = { &list_msgtab, NULL };
|
||||
|
||||
mapi_hfn_list_av1 list_hfnlist[] = {
|
||||
{"client_exit", safelist_check_cliexit},
|
||||
{"client_exit", (hookfn) safelist_check_cliexit},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -100,7 +100,7 @@ static int _modinit(void)
|
|||
* T = topic search (T> T<)
|
||||
*/
|
||||
add_isupport("SAFELIST", isupport_string, "");
|
||||
add_isupport("ELIST", isupport_string, "CMNTU");
|
||||
add_isupport("ELIST", isupport_string, "CTU");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -113,9 +113,8 @@ static void _moddeinit(void)
|
|||
delete_isupport("ELIST");
|
||||
}
|
||||
|
||||
static void safelist_check_cliexit(void *data)
|
||||
static void safelist_check_cliexit(hook_data_client_exit * hdata)
|
||||
{
|
||||
hook_data_client_exit * hdata = data;
|
||||
/* Cancel the safelist request if we are disconnecting
|
||||
* from the server. That way it doesn't core. :P --nenolod
|
||||
*/
|
||||
|
@ -191,7 +190,7 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
}
|
||||
|
||||
/* Single channel. */
|
||||
if (args && IsChannelName(args) && !strpbrk(args, "*?, "))
|
||||
if (args && IsChannelName(args))
|
||||
{
|
||||
safelist_channel_named(source_p, args, operspy);
|
||||
return;
|
||||
|
@ -205,8 +204,6 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
params->operspy = operspy;
|
||||
params->created_min = params->topic_min =
|
||||
params->created_max = params->topic_max = 0;
|
||||
params->mask = NULL;
|
||||
params->nomask = NULL;
|
||||
|
||||
if (args && !EmptyString(args))
|
||||
{
|
||||
|
@ -221,23 +218,22 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
if (*args == '<')
|
||||
{
|
||||
args++;
|
||||
if (!IsDigit(*args)) goto fail;
|
||||
|
||||
params->users_max = atoi(args);
|
||||
if (params->users_max == 0)
|
||||
params->users_max = INT_MAX;
|
||||
else
|
||||
params->users_max--;
|
||||
if (IsDigit(*args))
|
||||
{
|
||||
params->users_max = atoi(args);
|
||||
if (params->users_max == 0)
|
||||
params->users_max = INT_MAX;
|
||||
else
|
||||
params->users_max--;
|
||||
}
|
||||
}
|
||||
else if (*args == '>')
|
||||
{
|
||||
args++;
|
||||
if (IsDigit(*args))
|
||||
params->users_min = atoi(args) + 1;
|
||||
else if (args[0] == '-' && IsDigit(args[1]))
|
||||
params->users_min = 0;
|
||||
else
|
||||
goto fail;
|
||||
params->users_min = 0;
|
||||
}
|
||||
else if (*args == 'C' || *args == 'c')
|
||||
{
|
||||
|
@ -246,19 +242,19 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
{
|
||||
/* Creation time earlier than last x minutes. */
|
||||
args++;
|
||||
if (!IsDigit(*args)) goto fail;
|
||||
params->created_max = rb_current_time() - (60 * atoi(args));
|
||||
if (IsDigit(*args))
|
||||
{
|
||||
params->created_max = rb_current_time() - (60 * atoi(args));
|
||||
}
|
||||
}
|
||||
else if (*args == '<')
|
||||
{
|
||||
/* Creation time within last x minutes. */
|
||||
args++;
|
||||
if (!IsDigit(*args)) goto fail;
|
||||
params->created_min = rb_current_time() - (60 * atoi(args));
|
||||
}
|
||||
else
|
||||
{
|
||||
goto fail;
|
||||
if (IsDigit(*args))
|
||||
{
|
||||
params->created_min = rb_current_time() - (60 * atoi(args));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (*args == 'T' || *args == 't')
|
||||
|
@ -268,35 +264,20 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
{
|
||||
/* Topic change time earlier than last x minutes. */
|
||||
args++;
|
||||
if (!IsDigit(*args)) goto fail;
|
||||
params->topic_max = rb_current_time() - (60 * atoi(args));
|
||||
if (IsDigit(*args))
|
||||
{
|
||||
params->topic_max = rb_current_time() - (60 * atoi(args));
|
||||
}
|
||||
}
|
||||
else if (*args == '<')
|
||||
{
|
||||
/* Topic change time within last x minutes. */
|
||||
args++;
|
||||
if (!IsDigit(*args)) goto fail;
|
||||
params->topic_min = rb_current_time() - (60 * atoi(args));
|
||||
if (IsDigit(*args))
|
||||
{
|
||||
params->topic_min = rb_current_time() - (60 * atoi(args));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
else if (*args == '!')
|
||||
{
|
||||
args++;
|
||||
rb_free(params->nomask);
|
||||
params->nomask = rb_strdup(args);
|
||||
}
|
||||
else if (*args == '?' || *args == '*' || IsChanPrefix(*args))
|
||||
{
|
||||
rb_free(params->mask);
|
||||
params->mask = rb_strdup(args);
|
||||
}
|
||||
else
|
||||
{
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (EmptyString(p))
|
||||
|
@ -307,13 +288,6 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
}
|
||||
|
||||
safelist_client_instantiate(source_p, params);
|
||||
return;
|
||||
|
||||
fail:
|
||||
rb_free(params);
|
||||
sendto_one(source_p, form_str(RPL_LISTSTART), me.name, source_p->name);
|
||||
sendto_one_notice(source_p, ":Invalid parameters for /LIST");
|
||||
sendto_one(source_p, form_str(RPL_LISTEND), me.name, source_p->name);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -369,8 +343,6 @@ static bool safelist_sendq_exceeded(struct Client *client_p)
|
|||
*/
|
||||
static void safelist_client_instantiate(struct Client *client_p, struct ListClient *params)
|
||||
{
|
||||
struct Channel *chptr;
|
||||
|
||||
s_assert(MyClient(client_p));
|
||||
s_assert(params != NULL);
|
||||
|
||||
|
@ -382,12 +354,6 @@ static void safelist_client_instantiate(struct Client *client_p, struct ListClie
|
|||
rb_dlinkAddAlloc(client_p, &safelisting_clients);
|
||||
|
||||
/* give the user some initial data to work with */
|
||||
if (params->mask && (chptr = find_channel(params->mask)))
|
||||
{
|
||||
bool visible = !SecretChannel(chptr) || IsMember(client_p, chptr);
|
||||
if (visible || params->operspy)
|
||||
list_one_channel(client_p, chptr, visible);
|
||||
}
|
||||
safelist_iterate_client(client_p);
|
||||
}
|
||||
|
||||
|
@ -409,8 +375,6 @@ static void safelist_client_release(struct Client *client_p)
|
|||
rb_dlinkFindDestroy(client_p, &safelisting_clients);
|
||||
|
||||
rb_free(client_p->localClient->safelist_data->chname);
|
||||
rb_free(client_p->localClient->safelist_data->mask);
|
||||
rb_free(client_p->localClient->safelist_data->nomask);
|
||||
rb_free(client_p->localClient->safelist_data);
|
||||
|
||||
client_p->localClient->safelist_data = NULL;
|
||||
|
@ -494,12 +458,6 @@ static void safelist_one_channel(struct Client *source_p, struct Channel *chptr,
|
|||
if (params->created_max && chptr->channelts > params->created_max)
|
||||
return;
|
||||
|
||||
if (params->mask && (!irccmp(params->mask, chptr->chname) || !match(params->mask, chptr->chname)))
|
||||
return;
|
||||
|
||||
if (params->nomask && match(params->nomask, chptr->chname))
|
||||
return;
|
||||
|
||||
list_one_channel(source_p, chptr, visible);
|
||||
}
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ dump_map(struct Client *client_p, struct Client *root_p, char *pbuf)
|
|||
}
|
||||
|
||||
frac = (1000 * rb_dlink_list_length(&root_p->serv->users) + Count.total / 2) / Count.total;
|
||||
snprintf(buf + USER_COL, sizeof buf - USER_COL,
|
||||
snprintf(buf + USER_COL, BUFSIZE - USER_COL,
|
||||
" | Users: %5lu (%2d.%1d%%)", rb_dlink_list_length(&root_p->serv->users),
|
||||
frac / 10, frac % 10);
|
||||
|
||||
|
@ -172,7 +172,7 @@ flattened_map(struct Client *client_p)
|
|||
}
|
||||
}
|
||||
|
||||
snprintf(buf + USER_COL, sizeof buf - USER_COL,
|
||||
snprintf(buf + USER_COL, BUFSIZE - USER_COL,
|
||||
" | Users: %5lu (%4.1f%%)", rb_dlink_list_length(&me.serv->users),
|
||||
100 * (float) rb_dlink_list_length(&me.serv->users) / (float) Count.total);
|
||||
|
||||
|
@ -210,7 +210,7 @@ flattened_map(struct Client *client_p)
|
|||
}
|
||||
}
|
||||
|
||||
snprintf(buf + USER_COL, sizeof buf - USER_COL,
|
||||
snprintf(buf + USER_COL, BUFSIZE - USER_COL,
|
||||
" | Users: %5lu (%4.1f%%)", rb_dlink_list_length(&target_p->serv->users),
|
||||
100 * (float) rb_dlink_list_length(&target_p->serv->users) / (float) Count.total);
|
||||
|
||||
|
|
|
@ -120,9 +120,10 @@ static void
|
|||
names_global(struct Client *source_p)
|
||||
{
|
||||
bool dont_show = false;
|
||||
rb_dlink_node *ptr;
|
||||
rb_dlink_node *lp, *ptr;
|
||||
struct Client *target_p;
|
||||
struct Channel *chptr = NULL;
|
||||
struct membership *msptr;
|
||||
|
||||
/* first do all visible channels */
|
||||
RB_DLINK_FOREACH(ptr, global_channel_list.head)
|
||||
|
@ -140,9 +141,6 @@ names_global(struct Client *source_p)
|
|||
/* Second, do all clients in one big sweep */
|
||||
RB_DLINK_FOREACH(ptr, global_client_list.head)
|
||||
{
|
||||
rb_dlink_node *ps, *pt;
|
||||
struct membership *ms, *mt;
|
||||
|
||||
target_p = ptr->data;
|
||||
dont_show = false;
|
||||
|
||||
|
@ -156,11 +154,13 @@ names_global(struct Client *source_p)
|
|||
* both were missed out above. if the target is on a
|
||||
* common channel with source, its already been shown.
|
||||
*/
|
||||
ITER_COMM_CHANNELS(ps, pt, source_p->user->channel.head, target_p->user->channel.head, ms, mt, chptr)
|
||||
RB_DLINK_FOREACH(lp, target_p->user->channel.head)
|
||||
{
|
||||
if (!mt) continue;
|
||||
msptr = lp->data;
|
||||
chptr = msptr->chptr;
|
||||
|
||||
if (PubChannel(chptr) || SecretChannel(chptr) || ms)
|
||||
if(PubChannel(chptr) || IsMember(source_p, chptr) ||
|
||||
SecretChannel(chptr))
|
||||
{
|
||||
dont_show = true;
|
||||
break;
|
||||
|
|
|
@ -49,8 +49,8 @@ static void m_authenticate(struct MsgBuf *, struct Client *, struct Client *, in
|
|||
static void me_sasl(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
|
||||
static void me_mechlist(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
|
||||
|
||||
static void abort_sasl(void *);
|
||||
static void abort_sasl_exit(void *);
|
||||
static void abort_sasl(struct Client *);
|
||||
static void abort_sasl_exit(hook_data_client_exit *);
|
||||
|
||||
static unsigned int CLICAP_SASL = 0;
|
||||
static char mechlist_buf[BUFSIZE];
|
||||
|
@ -72,8 +72,8 @@ mapi_clist_av1 sasl_clist[] = {
|
|||
&authenticate_msgtab, &sasl_msgtab, &mechlist_msgtab, NULL
|
||||
};
|
||||
mapi_hfn_list_av1 sasl_hfnlist[] = {
|
||||
{ "new_local_user", abort_sasl },
|
||||
{ "client_exit", abort_sasl_exit },
|
||||
{ "new_local_user", (hookfn) abort_sasl },
|
||||
{ "client_exit", (hookfn) abort_sasl_exit },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -304,9 +304,8 @@ me_mechlist(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou
|
|||
* registering anyway, abort the exchange.
|
||||
*/
|
||||
static void
|
||||
abort_sasl(void *data_)
|
||||
abort_sasl(struct Client *data)
|
||||
{
|
||||
struct Client *data = data_;
|
||||
if(data->localClient->sasl_out == 0 || data->localClient->sasl_complete)
|
||||
return;
|
||||
|
||||
|
@ -332,9 +331,8 @@ abort_sasl(void *data_)
|
|||
}
|
||||
|
||||
static void
|
||||
abort_sasl_exit(void *data_)
|
||||
abort_sasl_exit(hook_data_client_exit *data)
|
||||
{
|
||||
hook_data_client_exit *data = data_;
|
||||
if (data->target->localClient)
|
||||
abort_sasl(data->target);
|
||||
}
|
||||
|
|
|
@ -237,7 +237,7 @@ scan_umodes(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou
|
|||
|
||||
if (mask != NULL)
|
||||
{
|
||||
snprintf(maskbuf, sizeof maskbuf, "%s!%s@%s",
|
||||
snprintf(maskbuf, BUFSIZE, "%s!%s@%s",
|
||||
target_p->name, target_p->username, target_p->host);
|
||||
|
||||
if (!match(mask, maskbuf))
|
||||
|
|
|
@ -59,9 +59,9 @@ static void me_login(struct MsgBuf *, struct Client *, struct Client *, int, con
|
|||
static void me_rsfnc(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
|
||||
static void me_nickdelay(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
|
||||
|
||||
static void h_svc_server_introduced(void *);
|
||||
static void h_svc_whois(void *);
|
||||
static void h_svc_stats(void *);
|
||||
static void h_svc_server_introduced(hook_data_client *);
|
||||
static void h_svc_whois(hook_data_client *);
|
||||
static void h_svc_stats(hook_data_int *);
|
||||
static void h_svc_conf_read_start(void *);
|
||||
static void h_svc_conf_read_end(void *);
|
||||
|
||||
|
@ -86,12 +86,12 @@ mapi_clist_av1 services_clist[] = {
|
|||
&su_msgtab, &login_msgtab, &rsfnc_msgtab, &nickdelay_msgtab, NULL
|
||||
};
|
||||
mapi_hfn_list_av1 services_hfnlist[] = {
|
||||
{ "doing_stats", h_svc_stats },
|
||||
{ "doing_whois", h_svc_whois },
|
||||
{ "doing_whois_global", h_svc_whois },
|
||||
{ "server_introduced", h_svc_server_introduced },
|
||||
{ "conf_read_start", h_svc_conf_read_start },
|
||||
{ "conf_read_end", h_svc_conf_read_end },
|
||||
{ "doing_stats", (hookfn) h_svc_stats },
|
||||
{ "doing_whois", (hookfn) h_svc_whois },
|
||||
{ "doing_whois_global", (hookfn) h_svc_whois },
|
||||
{ "server_introduced", (hookfn) h_svc_server_introduced },
|
||||
{ "conf_read_start", (hookfn) h_svc_conf_read_start },
|
||||
{ "conf_read_end", (hookfn) h_svc_conf_read_end },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -300,9 +300,8 @@ me_nickdelay(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *so
|
|||
}
|
||||
|
||||
static void
|
||||
h_svc_server_introduced(void *data)
|
||||
h_svc_server_introduced(hook_data_client *hdata)
|
||||
{
|
||||
hook_data_client *hdata = data;
|
||||
rb_dlink_node *ptr;
|
||||
|
||||
RB_DLINK_FOREACH(ptr, service_list.head)
|
||||
|
@ -316,9 +315,8 @@ h_svc_server_introduced(void *data)
|
|||
}
|
||||
|
||||
static void
|
||||
h_svc_whois(void *data_)
|
||||
h_svc_whois(hook_data_client *data)
|
||||
{
|
||||
hook_data_client *data = data_;
|
||||
char *p = data->target->user->suser;
|
||||
if(!EmptyString(p))
|
||||
{
|
||||
|
@ -338,9 +336,8 @@ h_svc_whois(void *data_)
|
|||
}
|
||||
|
||||
static void
|
||||
h_svc_stats(void *data_)
|
||||
h_svc_stats(hook_data_int *data)
|
||||
{
|
||||
hook_data_int *data = data_;
|
||||
char statchar = (char) data->arg2;
|
||||
rb_dlink_node *ptr;
|
||||
|
||||
|
|
|
@ -453,7 +453,7 @@ stats_deny (struct Client *source_p)
|
|||
static void
|
||||
stats_exempt(struct Client *source_p)
|
||||
{
|
||||
char *name, *host, *user, *classname, *desc;
|
||||
char *name, *host, *user, *classname;
|
||||
const char *pass;
|
||||
struct AddressRec *arec;
|
||||
struct ConfItem *aconf;
|
||||
|
@ -474,7 +474,7 @@ stats_exempt(struct Client *source_p)
|
|||
{
|
||||
aconf = arec->aconf;
|
||||
get_printable_conf (aconf, &name, &host, &pass,
|
||||
&user, &port, &classname, &desc);
|
||||
&user, &port, &classname);
|
||||
|
||||
sendto_one_numeric(source_p, RPL_STATSDLINE,
|
||||
form_str(RPL_STATSDLINE),
|
||||
|
@ -533,7 +533,7 @@ stats_auth (struct Client *source_p)
|
|||
else if((ConfigFileEntry.stats_i_oper_only == 1) && !IsOperGeneral (source_p))
|
||||
{
|
||||
struct ConfItem *aconf;
|
||||
char *name, *host, *user, *classname, *desc;
|
||||
char *name, *host, *user, *classname;
|
||||
const char *pass = "*";
|
||||
int port;
|
||||
|
||||
|
@ -550,13 +550,13 @@ stats_auth (struct Client *source_p)
|
|||
if(aconf == NULL)
|
||||
return;
|
||||
|
||||
get_printable_conf (aconf, &name, &host, &pass, &user, &port, &classname, &desc);
|
||||
get_printable_conf (aconf, &name, &host, &pass, &user, &port, &classname);
|
||||
if(!EmptyString(aconf->spasswd))
|
||||
pass = aconf->spasswd;
|
||||
|
||||
sendto_one_numeric(source_p, RPL_STATSILINE, form_str(RPL_STATSILINE),
|
||||
name, pass, show_iline_prefix(source_p, aconf, user),
|
||||
host, port, classname, desc);
|
||||
host, port, classname);
|
||||
}
|
||||
|
||||
/* Theyre opered, or allowed to see all auth blocks */
|
||||
|
@ -908,8 +908,8 @@ stats_ssld_foreach(void *data, pid_t pid, int cli_count, enum ssld_status status
|
|||
struct Client *source_p = data;
|
||||
|
||||
sendto_one_numeric(source_p, RPL_STATSDEBUG,
|
||||
"S :%ld %c %u :%s",
|
||||
(long)pid,
|
||||
"S :%u %c %u :%s",
|
||||
pid,
|
||||
status == SSLD_DEAD ? 'D' : (status == SSLD_SHUTDOWN ? 'S' : 'A'),
|
||||
cli_count,
|
||||
version);
|
||||
|
@ -960,8 +960,8 @@ stats_usage (struct Client *source_p)
|
|||
(int) (rus.ru_stime.tv_sec % 60));
|
||||
sendto_one_numeric(source_p, RPL_STATSDEBUG,
|
||||
"R :RSS %ld ShMem %ld Data %ld Stack %ld",
|
||||
rus.ru_maxrss, (long)(rus.ru_ixrss / rup),
|
||||
(long)(rus.ru_idrss / rup), (long)(rus.ru_isrss / rup));
|
||||
rus.ru_maxrss, (rus.ru_ixrss / rup),
|
||||
(rus.ru_idrss / rup), (rus.ru_isrss / rup));
|
||||
sendto_one_numeric(source_p, RPL_STATSDEBUG,
|
||||
"R :Swaps %d Reclaims %d Faults %d",
|
||||
(int) rus.ru_nswap, (int) rus.ru_minflt, (int) rus.ru_majflt);
|
||||
|
|
|
@ -235,8 +235,7 @@ mo_testline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou
|
|||
sendto_one_numeric(source_p, RPL_STATSILINE, form_str(RPL_STATSILINE),
|
||||
aconf->info.name, EmptyString(aconf->spasswd) ? "<NULL>" : aconf->spasswd,
|
||||
show_iline_prefix(source_p, aconf, aconf->user),
|
||||
aconf->host, aconf->port, aconf->className,
|
||||
CheckEmpty(aconf->desc));
|
||||
aconf->host, aconf->port, aconf->className);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -173,7 +173,7 @@ m_topic(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
sendto_one(source_p, form_str(RPL_TOPICWHOTIME),
|
||||
me.name, source_p->name, chptr->chname,
|
||||
chptr->topic_info,
|
||||
(long long)chptr->topic_time);
|
||||
(unsigned long)chptr->topic_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -367,12 +367,8 @@ who_global(struct Client *source_p, const char *mask, int server_oper, int opers
|
|||
who_common_channel(source_p, msptr->chptr, mask, server_oper, &maxmatches, fmt);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
maxmatches = INT_MAX;
|
||||
if (!ConfigFileEntry.operspy_dont_care_user_info)
|
||||
report_operspy(source_p, "WHO", mask);
|
||||
}
|
||||
else if (!ConfigFileEntry.operspy_dont_care_user_info)
|
||||
report_operspy(source_p, "WHO", mask);
|
||||
|
||||
/* second, list all matching visible clients and clear all marks
|
||||
* on invisible clients
|
||||
|
|
|
@ -36,12 +36,12 @@
|
|||
#include "ircd.h"
|
||||
#include "send.h"
|
||||
|
||||
static void h_nn_server_eob(void *);
|
||||
static void h_nn_client_exit(void *);
|
||||
static void h_nn_server_eob(struct Client *);
|
||||
static void h_nn_client_exit(hook_data_client_exit *);
|
||||
|
||||
mapi_hfn_list_av1 nn_hfnlist[] = {
|
||||
{ "server_eob", h_nn_server_eob },
|
||||
{ "client_exit", h_nn_client_exit },
|
||||
{ "server_eob", (hookfn) h_nn_server_eob },
|
||||
{ "client_exit", (hookfn) h_nn_client_exit },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -73,9 +73,8 @@ count_mark_downlinks(struct Client *server_p, int *pservcount, int *pusercount)
|
|||
}
|
||||
|
||||
static void
|
||||
h_nn_server_eob(void *data)
|
||||
h_nn_server_eob(struct Client *source_p)
|
||||
{
|
||||
struct Client *source_p = data;
|
||||
int s = 0, u = 0;
|
||||
|
||||
if (IsFloodDone(source_p))
|
||||
|
@ -87,9 +86,8 @@ h_nn_server_eob(void *data)
|
|||
}
|
||||
|
||||
static void
|
||||
h_nn_client_exit(void *data)
|
||||
h_nn_client_exit(hook_data_client_exit *hdata)
|
||||
{
|
||||
hook_data_client_exit *hdata = data;
|
||||
struct Client *source_p;
|
||||
int s = 0, u = 0;
|
||||
char *fromnick;
|
||||
|
|
|
@ -44,78 +44,49 @@
|
|||
#include "supported.h"
|
||||
#include "logger.h"
|
||||
|
||||
static int
|
||||
um_callerid_modinit(void)
|
||||
{
|
||||
user_modes['g'] = find_umode_slot();
|
||||
if (!user_modes['g'])
|
||||
{
|
||||
ierror("um_callerid: unable to allocate usermode slot for +g; unloading module.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
user_modes['G'] = find_umode_slot();
|
||||
if (!user_modes['G'])
|
||||
{
|
||||
user_modes['g'] = 0;
|
||||
|
||||
ierror("um_callerid: unable to allocate usermode slot for +G; unloading module.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
construct_umodebuf();
|
||||
|
||||
add_isupport("CALLERID", isupport_umode, "g");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
um_callerid_moddeinit(void)
|
||||
{
|
||||
user_modes['g'] = 0;
|
||||
user_modes['G'] = 0;
|
||||
construct_umodebuf();
|
||||
|
||||
delete_isupport("CALLERID");
|
||||
}
|
||||
|
||||
#define IsSetStrictCallerID(c) ((c->umodes & user_modes['g']) == user_modes['g'])
|
||||
#define IsSetRelaxedCallerID(c) ((c->umodes & user_modes['G']) == user_modes['G'])
|
||||
#define IsSetAnyCallerID(c) (IsSetStrictCallerID(c) || IsSetRelaxedCallerID(c))
|
||||
#define IsSetTalkThroughCallerID(c) ((c->umodes & user_modes['M']) == user_modes['M'])
|
||||
|
||||
static const char um_callerid_desc[] =
|
||||
"Provides usermodes +g and +G which restrict messages from unauthorized users.";
|
||||
|
||||
|
||||
struct CallerIDOverrideSession {
|
||||
rb_dlink_node node;
|
||||
|
||||
struct Client *client;
|
||||
time_t deadline;
|
||||
};
|
||||
|
||||
static rb_dlink_list callerid_overriding_opers = { NULL, NULL, 0 };
|
||||
struct ev_entry *expire_callerid_override_deadlines_ev = NULL;
|
||||
|
||||
static void
|
||||
update_session_deadline(struct Client *source_p)
|
||||
{
|
||||
struct CallerIDOverrideSession *session_p = NULL;
|
||||
rb_dlink_node *n;
|
||||
|
||||
RB_DLINK_FOREACH(n, callerid_overriding_opers.head)
|
||||
{
|
||||
struct CallerIDOverrideSession *s = n->data;
|
||||
|
||||
if (s->client == source_p)
|
||||
{
|
||||
session_p = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (session_p != NULL)
|
||||
{
|
||||
rb_dlinkDelete(&session_p->node, &callerid_overriding_opers);
|
||||
}
|
||||
else
|
||||
{
|
||||
session_p = rb_malloc(sizeof(struct CallerIDOverrideSession));
|
||||
session_p->client = source_p;
|
||||
}
|
||||
|
||||
session_p->deadline = rb_current_time() + 1800;
|
||||
|
||||
rb_dlinkAddTail(session_p, &session_p->node, &callerid_overriding_opers);
|
||||
}
|
||||
|
||||
static void
|
||||
expire_callerid_override_deadlines(void *unused)
|
||||
{
|
||||
rb_dlink_node *n, *tn;
|
||||
|
||||
RB_DLINK_FOREACH_SAFE(n, tn, callerid_overriding_opers.head)
|
||||
{
|
||||
struct CallerIDOverrideSession *session_p = n->data;
|
||||
|
||||
if (session_p->deadline >= rb_current_time())
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *parv[4] = {session_p->client->name, session_p->client->name, "-M", NULL};
|
||||
user_mode(session_p->client, session_p->client, 3, parv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
allow_message(struct Client *source_p, struct Client *target_p)
|
||||
{
|
||||
|
@ -134,7 +105,7 @@ allow_message(struct Client *source_p, struct Client *target_p)
|
|||
return true;
|
||||
|
||||
/* XXX: controversial? allow opers to send through +g */
|
||||
if (IsSetTalkThroughCallerID(source_p) || MayHavePrivilege(source_p, "oper:always_message"))
|
||||
if (MayHavePrivilege(source_p, "oper:message"))
|
||||
return true;
|
||||
|
||||
if (accept_message(source_p, target_p))
|
||||
|
@ -256,156 +227,11 @@ h_hdl_privmsg_user(void *vdata)
|
|||
data->approved = ERR_TARGUMODEG;
|
||||
}
|
||||
|
||||
static void
|
||||
check_umode_change(void *vdata)
|
||||
{
|
||||
hook_data_umode_changed *data = (hook_data_umode_changed *)vdata;
|
||||
bool changed = false;
|
||||
struct Client *source_p = data->client;
|
||||
|
||||
if (!MyClient(source_p))
|
||||
return;
|
||||
|
||||
if (data->oldumodes & UMODE_OPER && !IsOper(source_p))
|
||||
source_p->umodes &= ~user_modes['M'];
|
||||
|
||||
changed = ((data->oldumodes ^ source_p->umodes) & user_modes['M']);
|
||||
|
||||
if (changed && source_p->umodes & user_modes['M'])
|
||||
{
|
||||
if (!HasPrivilege(source_p, "oper:message"))
|
||||
{
|
||||
sendto_one_notice(source_p, ":*** You need oper:message privilege for +M");
|
||||
source_p->umodes &= ~user_modes['M'];
|
||||
return;
|
||||
}
|
||||
|
||||
update_session_deadline(source_p);
|
||||
}
|
||||
else if (changed)
|
||||
{
|
||||
// Unsetting +M; remove the timeout session
|
||||
rb_dlink_node *n, *tn;
|
||||
|
||||
RB_DLINK_FOREACH_SAFE(n, tn, callerid_overriding_opers.head)
|
||||
{
|
||||
struct CallerIDOverrideSession *session_p = n->data;
|
||||
|
||||
if (session_p->client != source_p)
|
||||
continue;
|
||||
|
||||
rb_dlinkDelete(n, &callerid_overriding_opers);
|
||||
rb_free(session_p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void check_priv_change(void *vdata)
|
||||
{
|
||||
hook_data_priv_change *data = (hook_data_priv_change*)vdata;
|
||||
struct Client *source_p = data->client;
|
||||
const char *fakeparv[4];
|
||||
|
||||
if (!MyClient(source_p))
|
||||
return;
|
||||
|
||||
if (source_p->umodes & user_modes['M'] && !HasPrivilege(source_p, "oper:message"))
|
||||
{
|
||||
sendto_one_notice(source_p, ":*** You need oper:message privilege for +M");
|
||||
fakeparv[0] = fakeparv[1] = source_p->name;
|
||||
fakeparv[2] = "-M";
|
||||
fakeparv[3] = NULL;
|
||||
user_mode(source_p, source_p, 3, fakeparv);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
handle_client_exit(void *vdata)
|
||||
{
|
||||
hook_data_client_exit *data = (hook_data_client_exit *) vdata;
|
||||
rb_dlink_node *n, *tn;
|
||||
struct Client *source_p = data->target;
|
||||
|
||||
RB_DLINK_FOREACH_SAFE(n, tn, callerid_overriding_opers.head)
|
||||
{
|
||||
struct CallerIDOverrideSession *session_p = n->data;
|
||||
|
||||
if (session_p->client != source_p)
|
||||
continue;
|
||||
|
||||
rb_dlinkDelete(n, &callerid_overriding_opers);
|
||||
rb_free(session_p);
|
||||
}
|
||||
}
|
||||
|
||||
static mapi_hfn_list_av1 um_callerid_hfnlist[] = {
|
||||
{ "umode_changed", check_umode_change },
|
||||
{ "priv_change", check_priv_change },
|
||||
{ "invite", h_hdl_invite },
|
||||
{ "privmsg_user", h_hdl_privmsg_user },
|
||||
{ "client_exit", handle_client_exit },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
static int
|
||||
um_callerid_modinit(void)
|
||||
{
|
||||
rb_dlink_node *ptr;
|
||||
|
||||
user_modes['g'] = find_umode_slot();
|
||||
if (!user_modes['g'])
|
||||
{
|
||||
ierror("um_callerid: unable to allocate usermode slot for +g; unloading module.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
user_modes['G'] = find_umode_slot();
|
||||
if (!user_modes['G'])
|
||||
{
|
||||
user_modes['g'] = 0;
|
||||
|
||||
ierror("um_callerid: unable to allocate usermode slot for +G; unloading module.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
user_modes['M'] = find_umode_slot();
|
||||
if (!user_modes['M'])
|
||||
{
|
||||
user_modes['g'] = 0;
|
||||
user_modes['G'] = 0;
|
||||
|
||||
ierror("um_callerid: unable to allocate usermode slot for +M; unloading module.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
construct_umodebuf();
|
||||
|
||||
add_isupport("CALLERID", isupport_umode, "g");
|
||||
|
||||
RB_DLINK_FOREACH(ptr, lclient_list.head)
|
||||
{
|
||||
struct Client *client_p = ptr->data;
|
||||
if (IsPerson(client_p) && (client_p->umodes & user_modes['M']))
|
||||
update_session_deadline(client_p);
|
||||
}
|
||||
|
||||
expire_callerid_override_deadlines_ev = rb_event_add("expire_callerid_override_deadlines", expire_callerid_override_deadlines, NULL, 60);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
um_callerid_moddeinit(void)
|
||||
{
|
||||
user_modes['g'] = 0;
|
||||
user_modes['G'] = 0;
|
||||
user_modes['M'] = 0;
|
||||
construct_umodebuf();
|
||||
|
||||
delete_isupport("CALLERID");
|
||||
|
||||
rb_event_delete(expire_callerid_override_deadlines_ev);
|
||||
}
|
||||
|
||||
DECLARE_MODULE_AV2(um_callerid, um_callerid_modinit, um_callerid_moddeinit,
|
||||
NULL, NULL, um_callerid_hfnlist, NULL, NULL, um_callerid_desc);
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
check_PROGRAMS = runtests \
|
||||
chmode1 \
|
||||
match1 \
|
||||
misc \
|
||||
msgbuf_parse1 \
|
||||
msgbuf_unparse1 \
|
||||
hostmask1 \
|
||||
|
|
88
tests/misc.c
88
tests/misc.c
|
@ -1,88 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include "tap/basic.h"
|
||||
|
||||
#include "s_newconf.h"
|
||||
|
||||
#define MSG "%s:%d (%s)", __FILE__, __LINE__, __FUNCTION__
|
||||
|
||||
#define MINUTE (60)
|
||||
#define HOUR (MINUTE * 60)
|
||||
#define DAY (HOUR * 24)
|
||||
#define WEEK (DAY * 7)
|
||||
|
||||
static void valid_temp_time1(void)
|
||||
{
|
||||
time_t t;
|
||||
t = valid_temp_time("1");
|
||||
is_int(MINUTE, t, MSG);
|
||||
t = valid_temp_time("1m");
|
||||
is_int(MINUTE, t, MSG);
|
||||
t = valid_temp_time("1h");
|
||||
is_int(HOUR, t, MSG);
|
||||
t = valid_temp_time("1d");
|
||||
is_int(DAY, t, MSG);
|
||||
t = valid_temp_time("1w");
|
||||
is_int(WEEK, t, MSG);
|
||||
|
||||
t = valid_temp_time("2d");
|
||||
is_int(2 * DAY, t, MSG);
|
||||
|
||||
t = valid_temp_time("1w2d3h4m");
|
||||
is_int(1 * WEEK + 2 * DAY + 3 * HOUR + 4 * MINUTE, t, MSG);
|
||||
t = valid_temp_time("1w2d3h4");
|
||||
is_int(1 * WEEK + 2 * DAY + 3 * HOUR + 4 * MINUTE, t, MSG);
|
||||
|
||||
t = valid_temp_time("4m3h2d1w");
|
||||
is_int(1 * WEEK + 2 * DAY + 3 * HOUR + 4 * MINUTE, t, MSG);
|
||||
|
||||
t = valid_temp_time("7000w");
|
||||
is_int(52 * WEEK, t, MSG);
|
||||
}
|
||||
|
||||
static void valid_temp_time_invalid(void)
|
||||
{
|
||||
time_t t;
|
||||
t = valid_temp_time("-2w");
|
||||
is_int(-1, t, MSG);
|
||||
|
||||
t = valid_temp_time("hello");
|
||||
is_int(-1, t, MSG);
|
||||
|
||||
t = valid_temp_time("m");
|
||||
is_int(-1, t, MSG);
|
||||
|
||||
t = valid_temp_time("1w-1w");
|
||||
is_int(-1, t, MSG);
|
||||
}
|
||||
|
||||
static void valid_temp_time_overflow(void)
|
||||
{
|
||||
char s[100];
|
||||
time_t t;
|
||||
|
||||
snprintf(s, sizeof s, "%" PRIuMAX "m", UINTMAX_MAX / 60 + 2);
|
||||
t = valid_temp_time(s);
|
||||
is_int(52 * WEEK, t, MSG);
|
||||
|
||||
snprintf(s, sizeof s, "%ldm", LONG_MAX / 60 + 2);
|
||||
t = valid_temp_time(s);
|
||||
is_int(52 * WEEK, t, MSG);
|
||||
|
||||
snprintf(s, sizeof s, "%ldm%ldm", LONG_MAX / 60 - 1, LONG_MAX / 60 - 1);
|
||||
t = valid_temp_time(s);
|
||||
is_int(52 * WEEK, t, MSG);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
plan_lazy();
|
||||
|
||||
valid_temp_time1();
|
||||
valid_temp_time_invalid();
|
||||
valid_temp_time_overflow();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue