diff --git a/doc/conf/help/help.conf b/doc/conf/help/help.conf index dd6b9c217..f121c86e4 100644 --- a/doc/conf/help/help.conf +++ b/doc/conf/help/help.conf @@ -998,8 +998,6 @@ help Rehash { " The flags are used to rehash other config files, valid flags are:"; " -dns - Reinitializes and reloads the resolver"; " -garbage - Force garbage collection"; - " -motd - Only re-read all MOTD, BOTMOTD, OPERMOTD and RULES files"; - " (including those in tld{} blocks)"; " -tls - Reloads SSL/TLS certificates"; } diff --git a/doc/conf/help/help.de.conf b/doc/conf/help/help.de.conf index ec7ce1468..bd78d5248 100644 --- a/doc/conf/help/help.de.conf +++ b/doc/conf/help/help.de.conf @@ -912,9 +912,7 @@ help Rehash { " -"; " Die Flags werden benutzt, um andere Configdateien zu rehashen."; " Gültige Flags sind:"; - " -motd - Rehasht alle MOTD Dateien und RULES Dateien (incl. tld{})"; - " -opermotd - Rehasht die OPERMOTD"; - " -botmotd - Rehasht die BOTMOTD"; + " -dns - Rehasht der DNS resolver"; " -garbage - bewirkt garbage collection"; " Anmerkung des Übersetzers: Garbage collection (GC) (englisch,"; " wörtlich deutsch: Mülleinsammeln, auch Freispeichersammlung) ist"; diff --git a/doc/conf/help/help.es.conf b/doc/conf/help/help.es.conf index 9256b83b1..0508afc94 100644 --- a/doc/conf/help/help.es.conf +++ b/doc/conf/help/help.es.conf @@ -984,8 +984,6 @@ help Rehash { " -"; " -dns - Reinicializa y recarga el resolver"; " -garbage - Fuerza la eliminacion de basura"; - " -motd - Solo re-lee todos los archivos MOTD, BOTMOTD, OPERMOTD y RULES"; - " (incluidos los bloques de tld{} )"; " -tls - Recarga los certificados SSL/TLS"; }; diff --git a/doc/conf/help/help.fr.conf b/doc/conf/help/help.fr.conf index 1903c48d1..e73569747 100644 --- a/doc/conf/help/help.fr.conf +++ b/doc/conf/help/help.fr.conf @@ -940,8 +940,6 @@ help Rehash { " Les flags valides sont :"; " -dns - Réinitialise et recharge le résolveur"; " -garbage - Force le nettoyage de la mémoire"; - " -motd - Ne recharge que les fichiers MOTD, BOTMOTD, OPERMOTD et RULES"; - " (dont ceux définis dans les tld{} blocks)"; " -tls - Recharge les certificats SSL/TLS"; } diff --git a/doc/conf/help/help.it.conf b/doc/conf/help/help.it.conf index f66b53600..378eaf8ac 100644 --- a/doc/conf/help/help.it.conf +++ b/doc/conf/help/help.it.conf @@ -845,7 +845,6 @@ help Rehash { " Le flag disponibili sono:"; " -dns - Inizializza e ricarica il risolutore DNS"; " -garbage - Forza la pulizia dei file inutili"; - " -motd - Ricarica i file MOTD, BOTMOTD, OPERMOTD e RULES, inclusi quelli nei blocchi tld"; " -tls - Ricarica i certificati SSL/TLS"; } diff --git a/doc/conf/help/help.nl.conf b/doc/conf/help/help.nl.conf index e5ad2b5a8..07c7c9ea9 100644 --- a/doc/conf/help/help.nl.conf +++ b/doc/conf/help/help.nl.conf @@ -998,8 +998,6 @@ help Rehash { " De vlaggen worden gebruikt om andere configuratiebestanden te herhashen, geldige vlaggen zijn:"; " -dns - Reinitialiseert en herlaadt de resolver"; " -garbage - Forceer afvalverzameling"; - " -motd - Alleen alle MOTD-, BOTMOTD, OPERMOTD en RULES-bestanden opnieuw lezen"; - " (inclusief die in tld-blokken)"; " -tls - Reloads SSL/TLS-certificaten"; } diff --git a/doc/conf/help/help.pl.conf b/doc/conf/help/help.pl.conf index 4f9ee49ac..24f4b8415 100644 --- a/doc/conf/help/help.pl.conf +++ b/doc/conf/help/help.pl.conf @@ -1028,8 +1028,6 @@ help Rehash { " flagi to:"; " -dns - Ponownie inicjalizuje i przeładowuje narzędzie rozpoznawania nazw DNS?"; " -garbage - Wymusza zadziałanie mechanizmu oczyszczania (garbage collection)"; - " -motd - Odświeża tylko wszystkie pliki MOTD, BOTMOTD, OPERMOTD i RULES"; - " (włącznie z tymi podanymi w blokach tld {})"; " -tls - Ponownie ładuje certyfikaty SSL/TLS"; } diff --git a/doc/conf/help/help.ru.conf b/doc/conf/help/help.ru.conf index 801be753c..952a84a78 100644 --- a/doc/conf/help/help.ru.conf +++ b/doc/conf/help/help.ru.conf @@ -1013,9 +1013,7 @@ help Rehash { " Список флагов:"; " -dns - Переинециализация и перезагрузка преобразования адресов"; " -garbage - Активирует \"сборщик мусора\""; - " -motd - Перечитает все файлы MOTD, BOTMOTD, OPERMOTD и RULES (включая tld{})"; " -tls - Перезагрузка сертификатов SSL/TLS"; - } help Restart { diff --git a/doc/conf/help/help.tr.conf b/doc/conf/help/help.tr.conf index 1f2767091..7b6c6a9d4 100644 --- a/doc/conf/help/help.tr.conf +++ b/doc/conf/help/help.tr.conf @@ -871,8 +871,6 @@ help Rehash { " Flaglar, diğer config dosyalarını tekrar kullanmak için kullanılır, aşağıdakiler geçerli flaglardır:"; " -dns - Yeniden başlatır ve yeniden yükler, çözümler"; " -garbage - Değersiz dataların toplanmasını sağlar"; - " -motd - Tüm MOTD, BOTMOTD, OPERMOTD ve RULES dosyalarını tekrar okumasını sağlar"; - " (tld{}'de onlar dahil bloklar)"; " -tls - SSL/TLS Sertifikaları yeniden okur"; } diff --git a/doc/conf/modules.optional.conf b/doc/conf/modules.optional.conf index 1a8043091..a42eb5350 100644 --- a/doc/conf/modules.optional.conf +++ b/doc/conf/modules.optional.conf @@ -99,19 +99,6 @@ set { */ convert-to-lowercase yes; - /* FULLSTATUS-ON-LOAD: - * If enabled, then upon loading it will check all users that are currently - * connected and give a status report about who it would have killed. - * Note that it doesn't actually kill any currently connected users, it is for - * informative purposes only. - * This can be (very) useful if you use the module for the first time. - * But you probably want to disable it after a while, since once the module - * is actively dealing with randomly looking persons, it shouldn't report any - * users anymore on load and then this check only eats useless CPU on /REHASH. - * Enabled by default. - */ - fullstatus-on-load yes; - /* SHOW-FAILEDCONNECTS: * This will send out a notice whenever a randomly looking user has been catched * during connecting. Obviously this can be pretty noisy. diff --git a/include/channel.h b/include/channel.h index 44fe84a90..f229290aa 100644 --- a/include/channel.h +++ b/include/channel.h @@ -26,7 +26,7 @@ #define MODEBUFLEN 200 -#define ChannelExists(n) (find_channel(n, NULL)) +#define ChannelExists(n) (find_channel(n)) /* NOTE: Timestamps will be added to MODE-commands, so never make * RESYNCMODES and MODEPARAMS higher than MAXPARA-3. DALnet servers diff --git a/include/dynconf.h b/include/dynconf.h index dbf4c4d74..848cac4e5 100644 --- a/include/dynconf.h +++ b/include/dynconf.h @@ -176,6 +176,7 @@ struct Configuration { BroadcastChannelMessagesOption broadcast_channel_messages; AllowedChannelChars allowed_channelchars; HideIdleTimePolicy hide_idle_time; + LogSnomask *log_snomasks; }; extern MODVAR Configuration iConf; diff --git a/include/h.h b/include/h.h index 6eabb2829..7103df6bb 100644 --- a/include/h.h +++ b/include/h.h @@ -317,11 +317,13 @@ extern Ban *make_ban(); extern User *make_user(Client *); extern Server *make_server(); extern Client *make_client(Client *, Client *); +extern Channel *make_channel(char *name); extern Member *find_channel_link(Member *, Channel *); extern char *pretty_mask(char *); extern void add_client_to_list(Client *); extern void remove_client_from_list(Client *); -extern void initlists(); +extern void initlists(void); +extern void initlist_channels(void); extern struct hostent *get_res(char *); extern struct hostent *gethost_byaddr(char *, Link *); extern struct hostent *gethost_byname(char *, Link *); @@ -336,7 +338,6 @@ extern void del_queries(char *); #define CHAN_HASH_TABLE_SIZE 32768 #define WHOWAS_HASH_TABLE_SIZE 32768 #define THROTTLING_HASH_TABLE_SIZE 8192 -#define hash_find_channel find_channel extern uint64_t siphash(const char *in, const char *k); extern uint64_t siphash_raw(const char *in, size_t len, const char *k); extern uint64_t siphash_nocase(const char *in, const char *k); @@ -353,7 +354,7 @@ extern Channel *hash_get_chan_bucket(uint64_t); extern Client *hash_find_client(const char *, Client *); extern Client *hash_find_id(const char *, Client *); extern Client *hash_find_nickatserver(const char *, Client *); -extern Channel *find_channel(char *name, Channel *channel); +extern Channel *find_channel(char *name); extern Client *hash_find_server(const char *, Client *); extern struct MODVAR ThrottlingBucket *ThrottlingHash[THROTTLING_HASH_TABLE_SIZE]; @@ -638,7 +639,6 @@ extern int spamfilter_getconftargets(char *s); extern void remove_oper_snomasks(Client *client); extern void remove_oper_modes(Client *client); extern char *spamfilter_inttostring_long(int v); -extern Channel *get_channel(Client *cptr, char *chname, int flag); extern MODVAR char backupbuf[]; extern int is_invited(Client *client, Channel *channel); extern void channel_modes(Client *client, char *mbuf, char *pbuf, size_t mbuf_size, size_t pbuf_size, Channel *channel, int hide_local_modes); @@ -694,6 +694,7 @@ extern MODVAR int (*tkl_hash)(unsigned int c); extern MODVAR char (*tkl_typetochar)(int type); extern MODVAR int (*tkl_chartotype)(char c); extern MODVAR char *(*tkl_type_string)(TKL *tk); +extern MODVAR char *(*tkl_type_config_string)(TKL *tk); extern MODVAR TKL *(*tkl_add_serverban)(int type, char *usermask, char *hostmask, char *reason, char *setby, time_t expire_at, time_t set_at, int soft, int flags); extern MODVAR TKL *(*tkl_add_banexception)(int type, char *usermask, char *hostmask, char *reason, char *set_by, @@ -774,6 +775,7 @@ extern MODVAR int (*watch_del)(char *nick, Client *client, int flags); extern MODVAR int (*watch_del_list)(Client *client, int flags); extern MODVAR Watch *(*watch_get)(char *nick); extern MODVAR int (*watch_check)(Client *client, int reply); +extern MODVAR char *(*tkl_uhost)(TKL *tkl, char *buf, size_t buflen, int options); /* /Efuncs */ /* SSL/TLS functions */ @@ -1088,14 +1090,20 @@ extern LogType log_type_stringtoval(char *str); extern char *log_type_valtostring(LogType v); #ifdef DEBUGMODE #define unreal_log(...) do_unreal_log(__VA_ARGS__, log_data_source(__FILE__, __LINE__, __FUNCTION__), NULL) +#define unreal_log_raw(...) do_unreal_log_raw(__VA_ARGS__, log_data_source(__FILE__, __LINE__, __FUNCTION__), NULL) #else #define unreal_log(...) do_unreal_log(__VA_ARGS__, NULL) +#define unreal_log_raw(...) do_unreal_log_raw(__VA_ARGS__, NULL) #endif extern void do_unreal_log(LogLevel loglevel, char *subsystem, char *event_id, Client *client, char *msg, ...) __attribute__((format(printf,5,0))); +extern void do_unreal_log_raw(LogLevel loglevel, char *subsystem, char *event_id, Client *client, char *msg, ...); extern LogData *log_data_string(const char *key, const char *str); +extern LogData *log_data_char(const char *key, const char c); extern LogData *log_data_integer(const char *key, int64_t integer); +extern LogData *log_data_timestamp(const char *key, time_t ts); extern LogData *log_data_client(const char *key, Client *client); extern LogData *log_data_source(const char *file, int line, const char *function); extern LogData *log_data_socket_error(int fd); extern LogData *log_data_link_block(ConfigItem_link *link); +extern LogData *log_data_tkl(const char *key, TKL *tkl); /* end of logging */ diff --git a/include/modules.h b/include/modules.h index 9459c20a1..8aa03fc93 100644 --- a/include/modules.h +++ b/include/modules.h @@ -1695,12 +1695,11 @@ int hooktype_local_oper(Client *client, int add); int hooktype_local_pass(Client *client, char *password); /** Called when a channel is created (function prototype for HOOKTYPE_CHANNEL_CREATE). - * @param client The client * @param channel The channel that just got created * @note This function is not used much, use hooktype_local_join() and hooktype_remote_join() instead. * @return The return value is ignored (use return 0) */ -int hooktype_channel_create(Client *client, Channel *channel); +int hooktype_channel_create(Channel *channel); /** Called when a channel is completely destroyed (function prototype for HOOKTYPE_CHANNEL_DESTROY). * @param channel The channel that is about to be destroyed @@ -2344,6 +2343,7 @@ enum EfunctionType { EFUNC_MTAGS_TO_STRING, EFUNC_TKL_CHARTOTYPE, EFUNC_TKL_TYPE_STRING, + EFUNC_TKL_TYPE_CONFIG_STRING, EFUNC_CAN_SEND_TO_CHANNEL, EFUNC_CAN_SEND_TO_USER, EFUNC_BROADCAST_MD_GLOBALVAR, @@ -2373,6 +2373,7 @@ enum EfunctionType { EFUNC_WATCH_DEL_LIST, EFUNC_WATCH_GET, EFUNC_WATCH_CHECK, + EFUNC_TKL_UHOST, }; /* Module flags */ diff --git a/include/struct.h b/include/struct.h index ecfcd2218..c00d3ce10 100644 --- a/include/struct.h +++ b/include/struct.h @@ -234,11 +234,16 @@ typedef struct LogData { } LogData; /** New log levels for unreal_log() */ +/* Note: the reason for these high numbers is so we can easily catch + * if someone makes a mistake to use LOG_INFO (from syslog.h) instead + * of the ULOG_xxx levels. + */ typedef enum LogLevel { - ULOG_INFO = 0, - ULOG_WARN = 1, - ULOG_ERROR = 2, - ULOG_FATAL = 3 + ULOG_DEBUG = 1000, + ULOG_INFO = 2000, + ULOG_WARNING = 3000, + ULOG_ERROR = 4000, + ULOG_FATAL = 5000 } LogLevel; /** Logging types (text, json, etc) */ @@ -248,6 +253,13 @@ typedef enum LogType { LOG_TYPE_JSON = 2, } LogType; +typedef struct LogSnomask LogSnomask; +struct LogSnomask { + LogSnomask *prev, *next; + char *subsystem; + long snomask; +}; + /* ** 'offsetof' is defined in ANSI-C. The following definition ** is not absolutely portable (I have been told), but so far @@ -1888,7 +1900,7 @@ struct ConfigItem_help { struct ConfigItem_offchans { ConfigItem_offchans *prev, *next; - char chname[CHANNELLEN+1]; + char name[CHANNELLEN+1]; char *topic; }; @@ -2027,7 +2039,7 @@ struct Channel { Ban *invexlist; /**< List of invite exceptions (+I) */ char *mode_lock; /**< Mode lock (MLOCK) applied to channel - usually by Services */ ModData moddata[MODDATA_MAX_CHANNEL]; /**< Channel attached module data, used by the ModData system */ - char chname[1]; /**< Channel name */ + char name[CHANNELLEN+1]; /**< Channel name */ }; /** user/channel member struct (channel->members). diff --git a/src/aliases.c b/src/aliases.c index 22f299b7d..9482c4d05 100644 --- a/src/aliases.c +++ b/src/aliases.c @@ -106,19 +106,19 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * else if (alias->type == ALIAS_CHANNEL) { Channel *channel; - if ((channel = find_channel(alias->nick, NULL))) + if ((channel = find_channel(alias->nick))) { char *msg = parv[1]; char *errmsg = NULL; if (can_send_to_channel(client, channel, &msg, &errmsg, 0)) { - if (alias->spamfilter && match_spamfilter(client, parv[1], SPAMF_CHANMSG, cmd, channel->chname, 0, NULL)) + if (alias->spamfilter && match_spamfilter(client, parv[1], SPAMF_CHANMSG, cmd, channel->name, 0, NULL)) return; new_message(client, NULL, &mtags); sendto_channel(channel, client, client->direction, PREFIX_ALL, 0, SEND_ALL|SKIP_DEAF, mtags, ":%s PRIVMSG %s :%s", - client->name, channel->chname, parv[1]); + client->name, channel->name, parv[1]); free_message_tags(mtags); return; } @@ -241,19 +241,19 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * else if (format->type == ALIAS_CHANNEL) { Channel *channel; - if ((channel = find_channel(format->nick, NULL))) + if ((channel = find_channel(format->nick))) { char *msg = output; char *errmsg = NULL; if (!can_send_to_channel(client, channel, &msg, &errmsg, 0)) { - if (alias->spamfilter && match_spamfilter(client, output, SPAMF_CHANMSG, cmd, channel->chname, 0, NULL)) + if (alias->spamfilter && match_spamfilter(client, output, SPAMF_CHANMSG, cmd, channel->name, 0, NULL)) return; new_message(client, NULL, &mtags); sendto_channel(channel, client, client->direction, PREFIX_ALL, 0, SEND_ALL|SKIP_DEAF, mtags, ":%s PRIVMSG %s :%s", - client->name, channel->chname, parv[1]); + client->name, channel->name, parv[1]); free_message_tags(mtags); return; } diff --git a/src/api-channelmode.c b/src/api-channelmode.c index 2c670429c..a88baeb6e 100644 --- a/src/api-channelmode.c +++ b/src/api-channelmode.c @@ -336,10 +336,10 @@ static void unload_extcmode_commit(Cmode *cmode) new_message(&me, NULL, &mtags); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -%c", - me.name, channel->chname, cmode->flag); + me.name, channel->name, cmode->flag); sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c 0", - me.id, channel->chname, cmode->flag); + me.id, channel->name, cmode->flag); free_message_tags(mtags); channel->mode.extmode &= ~cmode->mode; @@ -360,17 +360,17 @@ static void unload_extcmode_commit(Cmode *cmode) char *param = cmode->get_param(GETPARASTRUCT(channel, cmode->flag)); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -%c %s", - me.name, channel->chname, cmode->flag, param); + me.name, channel->name, cmode->flag, param); sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c %s 0", - me.id, channel->chname, cmode->flag, param); + me.id, channel->name, cmode->flag, param); } else { sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -%c", - me.name, channel->chname, cmode->flag); + me.name, channel->name, cmode->flag); sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c 0", - me.id, channel->chname, cmode->flag); + me.id, channel->name, cmode->flag); } free_message_tags(mtags); diff --git a/src/api-efunctions.c b/src/api-efunctions.c index b8be57474..a5a6e3e1e 100644 --- a/src/api-efunctions.c +++ b/src/api-efunctions.c @@ -46,6 +46,8 @@ int (*tkl_hash)(unsigned int c); char (*tkl_typetochar)(int type); int (*tkl_chartotype)(char c); char *(*tkl_type_string)(TKL *tk); +char *(*tkl_type_config_string)(TKL *tk); +char *(*tkl_uhost)(TKL *tkl, char *buf, size_t buflen, int options); TKL *(*tkl_add_serverban)(int type, char *usermask, char *hostmask, char *reason, char *setby, time_t expire_at, time_t set_at, int soft, int flags); TKL *(*tkl_add_nameban)(int type, char *name, int hold, char *reason, char *setby, @@ -354,6 +356,7 @@ void efunctions_init(void) efunc_init_function(EFUNC_MTAGS_TO_STRING, mtags_to_string, &mtags_to_string_default_handler); efunc_init_function(EFUNC_TKL_CHARTOTYPE, tkl_chartotype, NULL); efunc_init_function(EFUNC_TKL_TYPE_STRING, tkl_type_string, NULL); + efunc_init_function(EFUNC_TKL_TYPE_CONFIG_STRING, tkl_type_config_string, NULL); efunc_init_function(EFUNC_CAN_SEND_TO_CHANNEL, can_send_to_channel, NULL); efunc_init_function(EFUNC_BROADCAST_MD_GLOBALVAR, broadcast_md_globalvar, NULL); efunc_init_function(EFUNC_BROADCAST_MD_GLOBALVAR_CMD, broadcast_md_globalvar_cmd, NULL); @@ -381,5 +384,6 @@ void efunctions_init(void) efunc_init_function(EFUNC_WATCH_DEL_LIST, watch_del_list, NULL); efunc_init_function(EFUNC_WATCH_GET, watch_get, NULL); efunc_init_function(EFUNC_WATCH_CHECK, watch_check, NULL); + efunc_init_function(EFUNC_TKL_UHOST, tkl_uhost, NULL); } diff --git a/src/channel.c b/src/channel.c index a48e9e467..cb45ca57f 100644 --- a/src/channel.c +++ b/src/channel.c @@ -47,6 +47,8 @@ MODVAR char modebuf[BUFSIZE]; /** Parameter buffer (eg: "key 123") */ MODVAR char parabuf[BUFSIZE]; +static mp_pool_t *channel_pool = NULL; + /** This describes the letters, modes and options for core channel modes. * These are +ntmispklr and also the list modes +vhoaq and +beI. */ @@ -272,7 +274,7 @@ int add_listmode_ex(Ban **list, Client *client, Channel *channel, char *banid, c if (MyUser(client)) { /* Only send the error to local clients */ - sendnumeric(client, ERR_BANLISTFULL, channel->chname, banid); + sendnumeric(client, ERR_BANLISTFULL, channel->name, banid); } do_not_add = 1; } @@ -301,7 +303,7 @@ int add_listmode_ex(Ban **list, Client *client, Channel *channel, char *banid, c if (MyUser(client)) { /* Only send the error to local clients */ - sendnumeric(client, ERR_BANLISTFULL, channel->chname, banid); + sendnumeric(client, ERR_BANLISTFULL, channel->name, banid); } return -1; } @@ -928,47 +930,65 @@ int valid_channelname(const char *cname) return 1; /* Valid */ } -/** Get existing channel 'chname' or create a new one. - * @param client User creating or searching this channel - * @param chname Channel name +void initlist_channels(void) +{ + channel_pool = mp_pool_new(sizeof(Channel), 512 * 1024); +} + +/** Create channel 'name' (or if it exists, return the existing one) + * @param name Channel name * @param flag If set to 'CREATE' then the channel is * created if it does not exist. * @returns Pointer to channel (new or existing). * @note Be sure to call valid_channelname() first before * you blindly call this function! */ -Channel *get_channel(Client *client, char *chname, int flag) +Channel *make_channel(char *name) { Channel *channel; - int len; + int len; + char *p; + char namebuf[CHANNELLEN+1]; - if (BadPtr(chname)) + if (BadPtr(name)) return NULL; - len = strlen(chname); - if (MyUser(client) && len > CHANNELLEN) + /* Copy and silently truncate */ + strlcpy(namebuf, name, sizeof(namebuf)); + + /* Copied from valid_channelname(), the minimal requirements */ + for (p = namebuf; *p; p++) { - len = CHANNELLEN; - *(chname + CHANNELLEN) = '\0'; - } - if ((channel = find_channel(chname, NULL))) - return (channel); - if (flag == CREATE) - { - channel = safe_alloc(sizeof(Channel) + len); - strlcpy(channel->chname, chname, len + 1); - if (channels) - channels->prevch = channel; - channel->topic = NULL; - channel->topic_nick = NULL; - channel->prevch = NULL; - channel->nextch = channels; - channel->creationtime = MyUser(client) ? TStime() : 0; - channels = channel; - add_to_channel_hash_table(chname, channel); - irccounts.channels++; - RunHook2(HOOKTYPE_CHANNEL_CREATE, client, channel); + if (*p < 33 || *p == ',' || *p == ':') + { + *p = '\0'; + break; + } } + + /* Exists? Return it. */ + if ((channel = find_channel(name))) + return channel; + + channel = mp_pool_get(channel_pool); + memset(channel, 0, sizeof(Channel)); + + strlcpy(channel->name, name, sizeof(channel->name)); + + if (channels) + channels->prevch = channel; + + channel->topic = NULL; + channel->topic_nick = NULL; + channel->prevch = NULL; + channel->nextch = channels; + channel->creationtime = TStime(); + channels = channel; + add_to_channel_hash_table(channel->name, channel); + irccounts.channels++; + + RunHook(HOOKTYPE_CHANNEL_CREATE, channel); + return channel; } @@ -1050,10 +1070,10 @@ int sub1_from_channel(Channel *channel) if (channel->nextch) channel->nextch->prevch = channel->prevch; - del_from_channel_hash_table(channel->chname, channel); + del_from_channel_hash_table(channel->name, channel); irccounts.channels--; - safe_free(channel); + mp_pool_release(channel); return 1; } @@ -1069,7 +1089,7 @@ void set_channel_mlock(Client *client, Channel *channel, const char *newmlock, i if (propagate) { sendto_server(client, 0, 0, NULL, ":%s MLOCK %lld %s :%s", - client->id, (long long)channel->creationtime, channel->chname, + client->id, (long long)channel->creationtime, channel->name, BadPtr(channel->mode_lock) ? "" : channel->mode_lock); } } diff --git a/src/conf.c b/src/conf.c index b988b23ab..951ec2bef 100644 --- a/src/conf.c +++ b/src/conf.c @@ -195,9 +195,9 @@ extern void unload_all_unused_umodes(void); extern void unload_all_unused_extcmodes(void); extern void unload_all_unused_caps(void); extern void unload_all_unused_history_backends(void); - +extern void log_snomask_setdefaultsettings(Configuration *i); +extern void log_snomask_free_settings(Configuration *i); int reloadable_perm_module_unloaded(void); - int tls_tests(void); /* Conf sub-sub-functions */ @@ -1489,8 +1489,7 @@ void config_error(FORMAT_STRING(const char *format), ...) va_end(ap); if ((ptr = strchr(buffer, '\n')) != NULL) *ptr = '\0'; - ircd_log(LOG_ERROR, "config error: %s", buffer); - sendto_realops("error: %s", buffer); + unreal_log_raw(ULOG_ERROR, "config", "CONFIG_ERROR_GENERIC", NULL, buffer); if (remote_rehash_client) sendnotice(remote_rehash_client, "error: %s", buffer); /* We cannot live with this */ @@ -1548,8 +1547,7 @@ void config_status(FORMAT_STRING(const char *format), ...) va_end(ap); if ((ptr = strchr(buffer, '\n')) != NULL) *ptr = '\0'; - ircd_log(LOG_ERROR, "%s", buffer); - sendto_realops("%s", buffer); + unreal_log_raw(ULOG_INFO, "config", "CONFIG_INFO_GENERIC", NULL, buffer); if (remote_rehash_client) sendnotice(remote_rehash_client, "%s", buffer); } @@ -1565,8 +1563,7 @@ void config_warn(FORMAT_STRING(const char *format), ...) va_end(ap); if ((ptr = strchr(buffer, '\n')) != NULL) *ptr = '\0'; - ircd_log(LOG_ERROR, "[warning] %s", buffer); - sendto_realops("[warning] %s", buffer); + unreal_log_raw(ULOG_WARNING, "config", "CONFIG_WARNING_GENERIC", NULL, buffer); if (remote_rehash_client) sendnotice(remote_rehash_client, "[warning] %s", buffer); } @@ -1741,6 +1738,7 @@ void free_iConf(Configuration *i) free_floodsettings(f); } i->floodsettings = NULL; + log_snomask_free_settings(i); } int config_test(); @@ -1749,6 +1747,7 @@ void config_setdefaultsettings(Configuration *i) { char tmp[512]; + log_snomask_setdefaultsettings(i); safe_strdup(i->oper_snomask, SNO_DEFOPER); i->ident_read_timeout = 7; i->ident_connect_timeout = 3; @@ -1872,6 +1871,7 @@ static void make_default_logblock(void) safe_strdup(ca->file, "ircd.log"); convert_to_absolute_path(&ca->file, LOGDIR); ca->flags |= LOG_CHGCMDS|LOG_CLIENT|LOG_ERROR|LOG_KILL|LOG_KLINE|LOG_OPER|LOG_OVERRIDE|LOG_SACMDS|LOG_SERVER|LOG_SPAMFILTER|LOG_TKL; + ca->type = LOG_TYPE_TEXT; ca->logfd = -1; AddListItem(ca, conf_log); } @@ -2233,7 +2233,7 @@ int init_conf(char *rootconf, int rehash) } else { - config_error("IRCd configuration failed to load"); + unreal_log(ULOG_ERROR, "config", "CONFIG_NOT_LOADED", NULL, "IRCd configuration failed to load"); Unload_all_testing_modules(); unload_notloaded_includes(); config_free(conf); @@ -2253,7 +2253,7 @@ int init_conf(char *rootconf, int rehash) RunHook0(HOOKTYPE_REHASH_COMPLETE); } postconf(); - config_status("Configuration loaded."); + unreal_log(ULOG_INFO, "config", "CONFIG_LOADED", NULL, "Configuration loaded"); clicap_post_rehash(); unload_all_unused_mtag_handlers(); return 0; @@ -9504,7 +9504,7 @@ int _conf_offchans(ConfigFile *conf, ConfigEntry *ce) for (cep = ce->ce_entries; cep; cep = cep->ce_next) { ConfigItem_offchans *of = safe_alloc(sizeof(ConfigItem_offchans)); - strlcpy(of->chname, cep->ce_varname, CHANNELLEN+1); + strlcpy(of->name, cep->ce_varname, CHANNELLEN+1); for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { if (!strcmp(cepp->ce_varname, "topic")) @@ -10796,8 +10796,7 @@ int rehash_internal(Client *client, int sig) loop.ircd_rehashing = 1; /* double checking.. */ if (init_conf(configfile, 1) == 0) run_configuration(); - if (sig == 1) - reread_motdsandrules(); + reread_motdsandrules(); unload_all_unused_snomasks(); unload_all_unused_umodes(); unload_all_unused_extcmodes(); diff --git a/src/hash.c b/src/hash.c index 94e86e61f..90edc278a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -563,22 +563,20 @@ Client *find_person(char *name, Client *requester) /* TODO: this should have bee /** Find a channel by name. * @param name The channel name to search for - * @param default_result If the channel is not found, this value is returned. - * @returns If the channel exists then the Channel is returned, otherwise default_result is returned. + * @returns If the channel exists then the Channel is returned, otherwise NULL. */ -Channel *find_channel(char *name, Channel *default_result) +Channel *find_channel(char *name) { unsigned int hashv; - Channel *tmp; + Channel *channel; hashv = hash_channel_name(name); - for (tmp = channelTable[hashv]; tmp; tmp = tmp->hnextch) - { - if (smycmp(name, tmp->chname) == 0) - return tmp; - } - return default_result; + for (channel = channelTable[hashv]; channel; channel = channel->hnextch) + if (smycmp(name, channel->name) == 0) + return channel; + + return NULL; } /** @} */ diff --git a/src/ircd.c b/src/ircd.c index dbf18dd18..0b998b9db 100644 --- a/src/ircd.c +++ b/src/ircd.c @@ -178,7 +178,9 @@ void server_reboot(char *mesg) { int i; Client *client; - sendto_realops("Aieeeee!!! Restarting server... %s", mesg); + unreal_log(ULOG_INFO, "main", "UNREALIRCD_RESTARTING", NULL, + "Restarting server: $reason", + log_data_string("reason", mesg)); list_for_each_entry(client, &lclient_list, lclient_node) (void) send_queued(client); @@ -371,10 +373,9 @@ void check_ping(Client *client) if (IsServer(client) || IsConnecting(client) || IsHandshake(client) || IsTLSConnectHandshake(client)) { - sendto_umode_global(UMODE_OPER, "No response from %s, closing link", - get_client_name(client, FALSE)); - ircd_log(LOG_ERROR, "No response from %s, closing link", - get_client_name(client, FALSE)); + unreal_log(ULOG_ERROR, "link", "LINK_DISCONNECTED", client, + "Lost server link to $client ($link_block.ip:$link_block.port): No response (Ping timeout)", + client->serv->conf ? log_data_link_block(client->serv->conf) : NULL); } ircsnprintf(scratch, sizeof(scratch), "Ping timeout: %lld seconds", (long long) (TStime() - client->local->lasttime)); @@ -396,8 +397,10 @@ void check_ping(Client *client) (TStime() - client->local->lasttime) >= (ping + PINGWARNING)) { SetPingWarning(client); - sendto_realops("Warning, no response from %s for %d seconds", - get_client_name(client, FALSE), PINGWARNING); + unreal_log(ULOG_WARNING, "link", "LINK_UNRELIABLE", client, + "Warning, no response from $client for $time_delta seconds", + log_data_integer("time_delta", PINGWARNING), + client->serv->conf ? log_data_link_block(client->serv->conf) : NULL); } return; @@ -436,9 +439,6 @@ EVENT(check_deadsockets) /* No need to notify opers here. It's already done when dead socket is set */ if (IsDeadSocket(client)) { -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "Closing deadsock: %d/%s", client->local->fd, client->name); -#endif ClearDeadSocket(client); /* CPR. So we send the error. */ exit_client(client, NULL, client->local->error_str ? client->local->error_str : "Dead socket"); continue; @@ -450,9 +450,6 @@ EVENT(check_deadsockets) /* No need to notify opers here. It's already done when dead socket is set */ if (IsDeadSocket(client)) { -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "Closing deadsock: %d/%s", client->local->fd, client->name); -#endif ClearDeadSocket(client); /* CPR. So we send the error. */ exit_client(client, NULL, client->local->error_str ? client->local->error_str : "Dead socket"); continue; @@ -645,38 +642,35 @@ void detect_timeshift_and_warn(void) if (oldtimeofday == 0) oldtimeofday = timeofday; /* pretend everything is ok the first time.. */ - if (mytdiff(timeofday, oldtimeofday) < NEGATIVE_SHIFT_WARN) { + if (mytdiff(timeofday, oldtimeofday) < NEGATIVE_SHIFT_WARN) + { /* tdiff = # of seconds of time set backwards (positive number! eg: 60) */ time_t tdiff = oldtimeofday - timeofday; - ircd_log(LOG_ERROR, "WARNING: Time running backwards! Clock set back ~%lld seconds (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); - ircd_log(LOG_ERROR, "[TimeShift] Resetting a few timers to prevent IRCd freeze!"); - sendto_realops("WARNING: Time running backwards! Clock set back ~%lld seconds (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); + unreal_log(ULOG_WARNING, "system", "SYSTEM_CLOCK_JUMP_BACKWARDS", NULL, + "System clock jumped back in time ~$time_delta seconds ($time_from -> $time_to)", + log_data_integer("time_delta", tdiff), + log_data_timestamp("time_from", oldtimeofday), + log_data_timestamp("time_to", timeofday)); sendto_realops("Incorrect time for IRC servers is a serious problem. " "Time being set backwards (system clock changed) is " "even more serious and can cause clients to freeze, channels to be " "taken over, and other issues."); - sendto_realops("Please be sure your clock is always synchronized before " - "the IRCd is started!"); - sendto_realops("[TimeShift] Resetting a few timers to prevent IRCd freeze!"); + sendto_realops("Please be sure your clock is always synchronized before the IRCd is started!"); fix_timers(); } else if (mytdiff(timeofday, oldtimeofday) > POSITIVE_SHIFT_WARN) /* do not set too low or you get false positives */ { /* tdiff = # of seconds of time set forward (eg: 60) */ time_t tdiff = timeofday - oldtimeofday; - ircd_log(LOG_ERROR, "WARNING: Time jumped ~%lld seconds ahead! (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); - ircd_log(LOG_ERROR, "[TimeShift] Resetting some timers!"); - sendto_realops("WARNING: Time jumped ~%lld seconds ahead! (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); + unreal_log(ULOG_WARNING, "system", "SYSTEM_CLOCK_JUMP_FORWARDS", NULL, + "System clock jumped ~$time_delta seconds forward ($time_from -> $time_to)", + log_data_integer("time_delta", tdiff), + log_data_timestamp("time_from", oldtimeofday), + log_data_timestamp("time_to", timeofday)); sendto_realops("Incorrect time for IRC servers is a serious problem. " "Time being adjusted (by changing the system clock) " "more than a few seconds forward/backward can lead to serious issues."); - sendto_realops("Please be sure your clock is always synchronized before " - "the IRCd is started!"); - sendto_realops("[TimeShift] Resetting some timers!"); + sendto_realops("Please be sure your clock is always synchronized before the IRCd is started!"); fix_timers(); } @@ -686,13 +680,11 @@ void detect_timeshift_and_warn(void) lasthighwarn = timeofday; if (timeofday - lasthighwarn > 300) { - ircd_log(LOG_ERROR, "[TimeShift] The (IRCd) clock was set backwards. " - "Waiting for time to be OK again. This will be in %lld seconds", - (long long)(highesttimeofday - timeofday)); - sendto_realops("[TimeShift] The (IRCd) clock was set backwards. Timers, nick- " - "and channel-timestamps are possibly incorrect. This message will " - "repeat itself until we catch up with the original time, which will be " - "in %lld seconds", (long long)(highesttimeofday - timeofday)); + unreal_log(ULOG_WARNING, "system", "SYSTEM_CLOCK_JUMP_BACKWARDS_PREVIOUSLY", NULL, + "The system clock previously went backwards. Waiting for time to be OK again. This will be in $time_delta seconds.", + log_data_integer("time_delta", highesttimeofday - timeofday), + log_data_timestamp("time_from", highesttimeofday), + log_data_timestamp("time_to", timeofday)); lasthighwarn = timeofday; } } else { @@ -820,6 +812,7 @@ int InitUnrealIRCd(int argc, char *argv[]) mp_pool_init(); dbuf_init(); initlists(); + initlist_channels(); early_init_ssl(); #ifdef USE_LIBCURL @@ -1121,7 +1114,7 @@ int InitUnrealIRCd(int argc, char *argv[]) } if (loop.config_test) { - ircd_log(LOG_ERROR, "Configuration test passed OK"); + unreal_log(ULOG_INFO, "config", "CONFIG_PASSED", NULL, "Configuration test passed OK"); fflush(stderr); exit(0); } @@ -1138,7 +1131,7 @@ int InitUnrealIRCd(int argc, char *argv[]) openlog("ircd", LOG_PID | LOG_NDELAY, LOG_DAEMON); #endif run_configuration(); - ircd_log(LOG_ERROR, "UnrealIRCd started."); + unreal_log(ULOG_INFO, "main", "UNREALIRCD_START", NULL, "UnrealIRCd started."); read_motd(conf_files->botmotd_file, &botmotd); read_motd(conf_files->rules_file, &rules); @@ -1260,8 +1253,8 @@ void SocketLoop(void *dummy) } if (doreloadcert) { + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD_TLS", NULL, "Reloading all SSL related data (./unrealircd reloadtls)"); reinit_tls(); - sendto_realops_and_log("Reloading all SSL related data (./unrealircd reloadtls)"); doreloadcert = 0; } } diff --git a/src/log.c b/src/log.c index 1e6a723b9..220ed5819 100644 --- a/src/log.c +++ b/src/log.c @@ -26,6 +26,21 @@ #include "unrealircd.h" +#define SNO_ALL INT_MAX + +/* Forward declarations */ +static int valid_event_id(const char *s); +static int valid_subsystem(const char *s); +long log_to_snomask(LogLevel loglevel, char *subsystem, char *event_id); +void do_unreal_log_internal(LogLevel loglevel, char *subsystem, char *event_id, Client *client, int expand_msg, char *msg, va_list vl); + +json_t *json_string_possibly_null(char *s) +{ + if (s) + return json_string(s); + return json_null(); +} + LogType log_type_stringtoval(char *str) { if (!strcmp(str, "json")) @@ -168,6 +183,7 @@ int config_run_log(ConfigFile *conf, ConfigEntry *ce) ca = safe_alloc(sizeof(ConfigItem_log)); ca->logfd = -1; + ca->type = LOG_TYPE_TEXT; /* default */ if (strchr(ce->ce_vardata, '%')) safe_strdup(ca->filefmt, ce->ce_vardata); else @@ -202,8 +218,30 @@ int config_run_log(ConfigFile *conf, ConfigEntry *ce) // TODO: validate that all 'key' values are lowercase+underscore+digits in all functions below. +void json_expand_client_security_groups(json_t *parent, Client *client) +{ + SecurityGroup *s; + json_t *child = json_array(); + json_object_set_new(parent, "security-groups", child); + + /* We put known-users or unknown-users at the beginning. + * The latter is special and doesn't actually exist + * in the linked list, hence the special code here, + * and again later in the for loop to skip it. + */ + if (user_allowed_by_security_group_name(client, "known-users")) + json_array_append_new(child, json_string("known-users")); + else + json_array_append_new(child, json_string("unknown-users")); + + for (s = securitygroups; s; s = s->next) + if (strcmp(s->name, "known-users") && user_allowed_by_security_group(client, s)) + json_array_append_new(child, json_string(s->name)); +} + void json_expand_client(json_t *j, char *key, Client *client, int detail) { + char buf[BUFSIZE+1]; json_t *child = json_object(); json_object_set_new(j, key, child); @@ -213,26 +251,49 @@ void json_expand_client(json_t *j, char *key, Client *client, int detail) json_object_set_new(child, "username", json_string(client->user->username)); if (client->user && *client->user->realhost) - json_object_set_new(child, "host", json_string(client->user->realhost)); + json_object_set_new(child, "hostname", json_string(client->user->realhost)); else if (client->local && *client->local->sockhost) - json_object_set_new(child, "host", json_string(client->local->sockhost)); + json_object_set_new(child, "hostname", json_string(client->local->sockhost)); else - json_object_set_new(child, "host", json_string(GetIP(client))); + json_object_set_new(child, "hostname", json_string(GetIP(client))); - json_object_set_new(child, "ip", json_string(GetIP(client))); + json_object_set_new(child, "ip", json_string_possibly_null(client->ip)); + + if (client->user) + { + snprintf(buf, sizeof(buf), "%s!%s@%s", client->name, client->user->username, client->user->realhost); + json_object_set_new(child, "nuh", json_string(buf)); + } else if (client->ip) { + snprintf(buf, sizeof(buf), "%s@%s", client->name, client->ip); + json_object_set_new(child, "nuh", json_string(buf)); + } else { + json_object_set_new(child, "nuh", json_string(client->name)); + } + + if (*client->info) + json_object_set_new(child, "info", json_string(client->info)); + + if (client->srvptr && client->srvptr->name) + json_object_set_new(child, "servername", json_string(client->srvptr->name)); if (IsLoggedIn(client)) json_object_set_new(child, "account", json_string(client->user->svid)); + + if (IsUser(client)) + { + json_object_set_new(child, "reputation", json_integer(GetReputation(client))); + json_expand_client_security_groups(child, client); + } } void json_expand_channel(json_t *j, char *key, Channel *channel, int detail) { json_t *child = json_object(); json_object_set_new(j, key, child); - json_object_set_new(child, "name", json_string(channel->chname)); + json_object_set_new(child, "name", json_string(channel->name)); } -char *timestamp_iso8601(void) +char *timestamp_iso8601_now(void) { struct timeval t; struct tm *tm; @@ -242,6 +303,7 @@ char *timestamp_iso8601(void) gettimeofday(&t, NULL); sec = t.tv_sec; tm = gmtime(&sec); + snprintf(buf, sizeof(buf), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", tm->tm_year + 1900, tm->tm_mon + 1, @@ -250,6 +312,32 @@ char *timestamp_iso8601(void) tm->tm_min, tm->tm_sec, (int)(t.tv_usec / 1000)); + + return buf; +} + +char *timestamp_iso8601(time_t v) +{ + struct tm *tm; + static char buf[64]; + + if (v == 0) + return NULL; + + tm = gmtime(&v); + + if (tm == NULL) + return NULL; + + snprintf(buf, sizeof(buf), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + 0); + return buf; } @@ -262,6 +350,17 @@ LogData *log_data_string(const char *key, const char *str) return d; } +LogData *log_data_char(const char *key, const char c) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_STRING; + safe_strdup(d->key, key); + d->value.string = safe_alloc(2); + d->value.string[0] = c; + d->value.string[1] = '\0'; + return d; +} + LogData *log_data_integer(const char *key, int64_t integer) { LogData *d = safe_alloc(sizeof(LogData)); @@ -271,6 +370,15 @@ LogData *log_data_integer(const char *key, int64_t integer) return d; } +LogData *log_data_timestamp(const char *key, time_t ts) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_STRING; + safe_strdup(d->key, key); + safe_strdup(d->value.string, timestamp_iso8601(ts)); + return d; +} + LogData *log_data_client(const char *key, Client *client) { LogData *d = safe_alloc(sizeof(LogData)); @@ -349,6 +457,70 @@ LogData *log_data_link_block(ConfigItem_link *link) return d; } +json_t *json_timestamp(time_t v) +{ + char *ts = timestamp_iso8601(v); + if (ts) + return json_string(ts); + return json_null(); +} + +LogData *log_data_tkl(const char *key, TKL *tkl) +{ + char buf[BUFSIZE]; + LogData *d = safe_alloc(sizeof(LogData)); + json_t *j; + + d->type = LOG_FIELD_OBJECT; + safe_strdup(d->key, key); + d->value.object = j = json_object(); + + json_object_set_new(j, "type", json_string(tkl_type_config_string(tkl))); // Eg 'kline' + json_object_set_new(j, "type_string", json_string(tkl_type_string(tkl))); // Eg 'Soft K-Line' + json_object_set_new(j, "set_by", json_string(tkl->set_by)); + json_object_set_new(j, "set_at", json_timestamp(tkl->set_at)); + json_object_set_new(j, "expire_at", json_timestamp(tkl->expire_at)); + *buf = '\0'; + short_date(tkl->set_at, buf); + strlcat(buf, " GMT", sizeof(buf)); + json_object_set_new(j, "set_at_string", json_string(buf)); + if (tkl->expire_at <= 0) + { + json_object_set_new(j, "expire_at_string", json_string("Never")); + } else { + *buf = '\0'; + short_date(tkl->expire_at, buf); + strlcat(buf, " GMT", sizeof(buf)); + json_object_set_new(j, "expire_at_string", json_string(buf)); + } + json_object_set_new(j, "set_at_delta", json_integer(TStime() - tkl->set_at)); + if (TKLIsServerBan(tkl)) + { + json_object_set_new(j, "name", json_string(tkl_uhost(tkl, buf, sizeof(buf), 0))); + json_object_set_new(j, "reason", json_string(tkl->ptr.serverban->reason)); + } else + if (TKLIsNameBan(tkl)) + { + json_object_set_new(j, "name", json_string(tkl->ptr.nameban->name)); + json_object_set_new(j, "reason", json_string(tkl->ptr.nameban->reason)); + } else + if (TKLIsBanException(tkl)) + { + json_object_set_new(j, "name", json_string(tkl_uhost(tkl, buf, sizeof(buf), 0))); + json_object_set_new(j, "reason", json_string(tkl->ptr.banexception->reason)); + json_object_set_new(j, "exception_types", json_string(tkl->ptr.banexception->bantypes)); + } else + if (TKLIsSpamfilter(tkl)) + { + json_object_set_new(j, "name", json_string(tkl->ptr.spamfilter->match->str)); + json_object_set_new(j, "match_type", json_string(unreal_match_method_valtostr(tkl->ptr.spamfilter->match->type))); + json_object_set_new(j, "ban_action", json_string(banact_valtostring(tkl->ptr.spamfilter->action))); + json_object_set_new(j, "spamfilter_targets", json_string(spamfilter_target_inttostring(tkl->ptr.spamfilter->target))); + json_object_set_new(j, "reason", json_string(unreal_decodespace(tkl->ptr.spamfilter->tkl_reason))); + } + + return d; +} void log_data_free(LogData *d) { @@ -362,9 +534,11 @@ char *loglevel_to_string(LogLevel loglevel) { switch(loglevel) { + case ULOG_DEBUG: + return "debug"; case ULOG_INFO: return "info"; - case ULOG_WARN: + case ULOG_WARNING: return "warn"; case ULOG_ERROR: return "error"; @@ -376,6 +550,28 @@ char *loglevel_to_string(LogLevel loglevel) } #define validvarcharacter(x) (isalnum((x)) || ((x) == '_')) +#define valideventidcharacter(x) (isupper((x)) || isdigit((x)) || ((x) == '_')) +#define validsubsystemcharacter(x) (islower((x)) || isdigit((x)) || ((x) == '_')) + +static int valid_event_id(const char *s) +{ + if (!*s) + return 0; + for (; *s; s++) + if (!valideventidcharacter(*s)) + return 0; + return 1; +} + +static int valid_subsystem(const char *s) +{ + if (!*s) + return 0; + for (; *s; s++) + if (!validsubsystemcharacter(*s)) + return 0; + return 1; +} const char *json_get_value(json_t *t) { @@ -515,6 +711,7 @@ void do_unreal_log_loggers(LogLevel loglevel, char *subsystem, char *event_id, c struct stat fstats; int n; int write_error; + long snomask; /* Trap infinite recursions to avoid crash if log file is unavailable, * this will also avoid calling ircd_log from anything else called @@ -553,8 +750,11 @@ void do_unreal_log_loggers(LogLevel loglevel, char *subsystem, char *event_id, c /* Log to all ircops for now */ // FIXME: obviously there should be snomask filtering here ;) // TODO: don't show loglevel for simple INFO messages? - if (strncmp(msg, "->", 2) && strncmp(msg, "<-", 2)) - sendto_realops("[%s] %s", loglevel_to_string(loglevel), msg); + snomask = log_to_snomask(loglevel, subsystem, event_id); + if (snomask == SNO_ALL) + sendto_realops("[%s] %s.%s %s", loglevel_to_string(loglevel), subsystem, event_id, msg); + else if (snomask > 0) + sendto_snomask(snomask, "[%s] %s.%s %s", loglevel_to_string(loglevel), subsystem, event_id, msg); for (l = conf_log; l; l = l->next) { @@ -633,7 +833,7 @@ void do_unreal_log_loggers(LogLevel loglevel, char *subsystem, char *event_id, c /* Now actually WRITE to the log... */ write_error = 0; - if (l->type == LOG_TYPE_JSON) + if ((l->type == LOG_TYPE_JSON) && strcmp(subsystem, "traffic")) { n = write(l->logfd, json_serialized, strlen(json_serialized)); if (n < strlen(text_buf)) @@ -641,6 +841,7 @@ void do_unreal_log_loggers(LogLevel loglevel, char *subsystem, char *event_id, c else write(l->logfd, "\n", 1); // FIXME: no.. we should do it this way..... and why do we use direct I/O at all? } else + if (l->type == LOG_TYPE_TEXT) { // FIXME: don't write in 2 stages, waste of slow system calls if (write(l->logfd, timebuf, strlen(timebuf)) < 0) @@ -673,15 +874,33 @@ void do_unreal_log_loggers(LogLevel loglevel, char *subsystem, char *event_id, c /* Logging function, called by the unreal_log() macro. */ void do_unreal_log(LogLevel loglevel, char *subsystem, char *event_id, - Client *client, - char *msg, ...) + Client *client, char *msg, ...) { va_list vl; + va_start(vl, msg); + do_unreal_log_internal(loglevel, subsystem, event_id, client, 1, msg, vl); + va_end(vl); +} + +/* Logging function, called by the unreal_log_raw() macro. */ +void do_unreal_log_raw(LogLevel loglevel, char *subsystem, char *event_id, + Client *client, char *msg, ...) +{ + va_list vl; + va_start(vl, msg); + do_unreal_log_internal(loglevel, subsystem, event_id, client, 0, msg, vl); + va_end(vl); +} + +void do_unreal_log_internal(LogLevel loglevel, char *subsystem, char *event_id, + Client *client, int expand_msg, char *msg, va_list vl) +{ LogData *d; char *json_serialized; json_t *j = NULL; json_t *j_details = NULL; char msgbuf[1024]; + char *loglevel_string = loglevel_to_string(loglevel); /* TODO: Enforcement: * - loglevel must be valid @@ -690,12 +909,20 @@ void do_unreal_log(LogLevel loglevel, char *subsystem, char *event_id, * - msg may not contain percent signs (%) as that is an obvious indication something is wrong? * or maybe a temporary restriction while upgrading that can be removed later ;) */ + if (!strcmp(loglevel_string, "???")) + abort(); + if (!valid_subsystem(subsystem)) + abort(); + if (!valid_event_id(event_id)) + abort(); + if (expand_msg && strchr(msg, '%')) + abort(); j = json_object(); j_details = json_object(); - json_object_set_new(j, "timestamp", json_string(timestamp_iso8601())); - json_object_set_new(j, "level", json_string(loglevel_to_string(loglevel))); + json_object_set_new(j, "timestamp", json_string(timestamp_iso8601_now())); + json_object_set_new(j, "level", json_string(loglevel_string)); json_object_set_new(j, "subsystem", json_string(subsystem)); json_object_set_new(j, "event_id", json_string(event_id)); @@ -706,7 +933,6 @@ void do_unreal_log(LogLevel loglevel, char *subsystem, char *event_id, if (client) json_expand_client(j_details, "client", client, 0); /* Additional details (if any) */ - va_start(vl, msg); while ((d = va_arg(vl, LogData *))) { switch(d->type) @@ -715,7 +941,10 @@ void do_unreal_log(LogLevel loglevel, char *subsystem, char *event_id, json_object_set_new(j_details, d->key, json_integer(d->value.integer)); break; case LOG_FIELD_STRING: - json_object_set_new(j_details, d->key, json_string(d->value.string)); + if (d->value.string) + json_object_set_new(j_details, d->key, json_string(d->value.string)); + else + json_object_set_new(j_details, d->key, json_null()); break; case LOG_FIELD_CLIENT: json_expand_client(j_details, d->key, d->value.client, 0); @@ -731,7 +960,12 @@ void do_unreal_log(LogLevel loglevel, char *subsystem, char *event_id, } log_data_free(d); } - buildlogstring(msg, msgbuf, sizeof(msgbuf), j_details); + + if (expand_msg) + buildlogstring(msg, msgbuf, sizeof(msgbuf), j_details); + else + strlcpy(msgbuf, msg, sizeof(msgbuf)); + json_object_set_new(j, "msg", json_string(msgbuf)); /* Now merge the details into root object 'j': */ @@ -777,3 +1011,54 @@ void logtest(void) unreal_log(ULOG_INFO, "test", "TEST", &me, "More data, fun: $fun!", log_data_string("fun", "yes lots of fun"), log_data_integer("some_integer", 1337)); unreal_log(ULOG_INFO, "sacmds", "SAJOIN_COMMAND", &me, "Client $client used SAJOIN to join $target to y!", log_data_client("target", &me)); } + +void add_log_snomask(Configuration *i, char *subsystem, long snomask) +{ + LogSnomask *l = safe_alloc(sizeof(LogSnomask)); + safe_strdup(l->subsystem, subsystem); + l->snomask = snomask; + AppendListItem(l, i->log_snomasks); +} + +void log_snomask_free(LogSnomask *l) +{ + safe_free(l->subsystem); + safe_free(l); +} + +void log_snomask_free_settings(Configuration *i) +{ + LogSnomask *l, *l_next; + for (l = i->log_snomasks; l; l = l_next) + { + l_next = l->next; + log_snomask_free(l); + } + i->log_snomasks = NULL; +} + +void log_snomask_setdefaultsettings(Configuration *i) +{ + add_log_snomask(i, "linking", SNO_ALL); + add_log_snomask(i, "traffic", 0); + add_log_snomask(i, "*", SNO_ALL); +} + +long log_to_snomask(LogLevel loglevel, char *subsystem, char *event_id) +{ + LogSnomask *l; + long snomask = 0; + + for (l = iConf.log_snomasks; l; l = l->next) + { + if (match_simple(l->subsystem, subsystem)) + { + if (l->snomask == SNO_ALL) + return SNO_ALL; /* return early */ + if (l->snomask == 0) + return 0; /* return early */ + snomask |= l->snomask; + } + } + return snomask; +} diff --git a/src/misc.c b/src/misc.c index ba9fcc7c6..042f3edb7 100644 --- a/src/misc.c +++ b/src/misc.c @@ -114,8 +114,7 @@ void ircd_log(int flags, FORMAT_STRING(const char *format), ...) ircvsnprintf(buf, sizeof(buf), format, vl); va_end(vl); - // This is a stupid escape trick, we better use a different method / other function - unreal_log(ULOG_ERROR, "unknown", "UNKNOWN", NULL, "$_data", log_data_string("_data", buf)); + unreal_log_raw(ULOG_ERROR, "unknown", "UNKNOWN", NULL, buf); } /** Returns the date in rather long string */ @@ -626,18 +625,14 @@ void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, char SetClosing(client); if (IsUser(client)) { + long connected_time = TStime() - client->local->firsttime; RunHook3(HOOKTYPE_LOCAL_QUIT, client, recv_mtags, comment); - sendto_connectnotice(client, 1, comment); - on_for = TStime() - client->local->firsttime; - if (IsHidden(client)) - ircd_log(LOG_CLIENT, "Disconnect - (%lld:%lld:%lld) %s!%s@%s [%s] [vhost: %s] (%s)", - on_for / 3600, (on_for % 3600) / 60, on_for % 60, - client->name, client->user->username, - client->user->realhost, GetIP(client), client->user->virthost, comment); - else - ircd_log(LOG_CLIENT, "Disconnect - (%lld:%lld:%lld) %s!%s@%s [%s] (%s)", - on_for / 3600, (on_for % 3600) / 60, on_for % 60, - client->name, client->user->username, client->user->realhost, GetIP(client), comment); + unreal_log(ULOG_INFO, "connect", "LOCAL_CLIENT_DISCONNECT", client, + "Client exiting: $client ($client.username@$client.hostname) [$client.ip] ($reason)", + log_data_string("extended_client_info", get_connect_extinfo(client)), + log_data_string("reason", comment), + log_data_integer("connected_time", connected_time)); + } else if (IsUnknown(client)) { diff --git a/src/modules/antirandom.c b/src/modules/antirandom.c index 8522f3681..1c5cde53f 100644 --- a/src/modules/antirandom.c +++ b/src/modules/antirandom.c @@ -22,17 +22,6 @@ #include "unrealircd.h" -/* You can change this '//#undef' into '#define' if you want to see quite - * a flood for every user that connects (and on-load if cfg.fullstatus_on_load). - * Obviously only recommended for testing, use with care! - */ -#undef DEBUGMODE - -/** Change this 'undef' to 'define' to get performance information. - * This really only meant for debugging purposes. - */ -#undef TIMING - ModuleHeader MOD_HEADER = { "antirandom", @@ -515,7 +504,6 @@ struct { long ban_time; int convert_to_lowercase; int show_failedconnects; - int fullstatus_on_load; ConfigItem_mask *except_hosts; int except_webirc; } cfg; @@ -553,19 +541,14 @@ MOD_INIT() HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, antirandom_config_run); /* Some default values: */ - cfg.fullstatus_on_load = 1; cfg.convert_to_lowercase = 1; cfg.except_webirc = 1; return MOD_SUCCESS; } -void check_all_users(void); - MOD_LOAD() { - if (cfg.fullstatus_on_load) - check_all_users(); return MOD_SUCCESS; } @@ -644,9 +627,6 @@ int antirandom_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (!strcmp(cep->ce_varname, "convert-to-lowercase")) { } else - if (!strcmp(cep->ce_varname, "fullstatus-on-load")) - { - } else if (!strcmp(cep->ce_varname, "show-failedconnects")) { } else @@ -705,10 +685,6 @@ int antirandom_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (!strcmp(cep->ce_varname, "show-failedconnects")) { cfg.show_failedconnects = config_checkval(cep->ce_vardata, CFG_YESNO); - } else - if (!strcmp(cep->ce_varname, "fullstatus-on-load")) - { - cfg.fullstatus_on_load = config_checkval(cep->ce_vardata, CFG_YESNO); } } return 1; @@ -821,23 +797,14 @@ static int internal_getscore(char *str) if (digits >= 5) { score += 5 + (digits - 5); -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for digits check", str); -#endif } if (vowels >= 4) { score += 4 + (vowels - 4); -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for vowels check", str); -#endif } if (consonants >= 4) { score += 4 + (consonants - 4); -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for consonants check", str); -#endif } for (t=triples; t; t=t->next) @@ -846,10 +813,6 @@ static int internal_getscore(char *str) if ((t->two[0] == s[0]) && (t->two[1] == s[1]) && s[2] && strchr(t->rest, s[2])) { score++; /* OK */ -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for '%s[%s]' %c/%c/%c", str, t->two, t->rest, - s[0], s[1], s[2]); -#endif } } @@ -868,11 +831,6 @@ static int get_spam_score(Client *client) char *gecos = client->info; char nbuf[NICKLEN+1], ubuf[USERLEN+1], rbuf[REALLEN+1]; int nscore, uscore, gscore, score; -#ifdef TIMING - struct timeval tv_alpha, tv_beta; - - gettimeofday(&tv_alpha, NULL); -#endif if (cfg.convert_to_lowercase) { @@ -889,46 +847,9 @@ static int get_spam_score(Client *client) gscore = internal_getscore(gecos); score = nscore + uscore + gscore; -#ifdef TIMING - gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "AntiRandom Timing: %ld microseconds", - ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec)); -#endif -#ifdef DEBUGMODE - sendto_ops_and_log("got score: %d/%d/%d = %d", - nscore, uscore, gscore, score); -#endif - return score; } -void check_all_users(void) -{ - Client *client; - int matches=0, score; - - list_for_each_entry(client, &lclient_list, lclient_node) - { - if (IsUser(client)) - { - if (is_exempt(client)) - continue; - - score = get_spam_score(client); - if (score > cfg.threshold) - { - if (!matches) - sendto_realops("[antirandom] Full status report follows:"); - sendto_realops("%d points: %s!%s@%s:%s", - score, client->name, client->user->username, client->user->realhost, client->info); - matches++; - } - } - } - if (matches) - sendto_realops("[antirandom] %d match%s", matches, matches == 1 ? "" : "es"); -} - int antirandom_preconnect(Client *client) { int score; @@ -941,13 +862,17 @@ int antirandom_preconnect(Client *client) { if (cfg.ban_action == BAN_ACT_WARN) { - sendto_ops_and_log("[antirandom] would have denied access to user with score %d: %s!%s@%s:%s", - score, client->name, client->user->username, client->user->realhost, client->info); + unreal_log(LOG_INFO, "antirandom", "ANTIRANDOM_REJECTED_USER", client, + "[antirandom] would have denied access to user with score $score: $client:$client.info", + log_data_integer("score", score)); return HOOK_CONTINUE; } if (cfg.show_failedconnects) - sendto_ops_and_log("[antirandom] denied access to user with score %d: %s!%s@%s:%s", - score, client->name, client->user->username, client->user->realhost, client->info); + { + unreal_log(LOG_INFO, "antirandom", "ANTIRANDOM_REJECTED_USER", client, + "[antirandom] denied access to user with score $score: $client:$client.info", + log_data_integer("score", score)); + } place_host_ban(client, cfg.ban_action, cfg.ban_reason, cfg.ban_time); return HOOK_DENY; } diff --git a/src/modules/chanmodes/delayjoin.c b/src/modules/chanmodes/delayjoin.c index d6f948d36..fe4a6da4a 100644 --- a/src/modules/chanmodes/delayjoin.c +++ b/src/modules/chanmodes/delayjoin.c @@ -104,7 +104,7 @@ void set_post_delayed(Channel *channel) channel->mode.extmode |= EXTMODE_POST_DELAYED; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +d", me.name, channel->chname); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +d", me.name, channel->name); free_message_tags(mtags); } @@ -115,7 +115,7 @@ void clear_post_delayed(Channel *channel) channel->mode.extmode &= ~EXTMODE_POST_DELAYED; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -d", me.name, channel->chname); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -d", me.name, channel->name); free_message_tags(mtags); } @@ -217,14 +217,14 @@ void clear_user_invisible_announce(Channel *channel, Client *client, MessageTag clear_user_invisible(channel, client); ircsnprintf(joinbuf, sizeof(joinbuf), ":%s!%s@%s JOIN %s", - client->name, client->user->username, GetHost(client), channel->chname); + client->name, client->user->username, GetHost(client), channel->name); ircsnprintf(exjoinbuf, sizeof(exjoinbuf), ":%s!%s@%s JOIN %s %s :%s", - client->name, client->user->username, GetHost(client), channel->chname, + client->name, client->user->username, GetHost(client), channel->name, IsLoggedIn(client) ? client->user->svid : "*", client->info); - new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->chname); + new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->name); for (i = channel->members; i; i = i->next) { Client *acptr = i->client; @@ -337,16 +337,16 @@ int moded_chanmode(Client *client, Channel *channel, MessageTag *recv_mtags, cha if (moded_user_invisible(i->client, channel)) { MessageTag *mtags = NULL; - new_message_special(i->client, recv_mtags, &mtags, ":%s JOIN %s", i->client->name, channel->chname); + new_message_special(i->client, recv_mtags, &mtags, ":%s JOIN %s", i->client->name, channel->name); if (HasCapabilityFast(user, CAP_EXTENDED_JOIN)) { sendto_one(user, mtags, ":%s!%s@%s JOIN %s %s :%s", i->client->name, i->client->user->username, GetHost(i->client), - channel->chname, + channel->name, IsLoggedIn(i->client) ? i->client->user->svid : "*", i->client->info); } else { - sendto_one(user, mtags, ":%s!%s@%s JOIN :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->chname); + sendto_one(user, mtags, ":%s!%s@%s JOIN :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->name); } free_message_tags(mtags); } @@ -374,8 +374,8 @@ int moded_chanmode(Client *client, Channel *channel, MessageTag *recv_mtags, cha if (moded_user_invisible(i->client, channel)) { MessageTag *mtags = NULL; - new_message_special(i->client, recv_mtags, &mtags, ":%s PART %s", i->client->name, channel->chname); - sendto_one(user, mtags, ":%s!%s@%s PART :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->chname); + new_message_special(i->client, recv_mtags, &mtags, ":%s PART %s", i->client->name, channel->name); + sendto_one(user, mtags, ":%s!%s@%s PART :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->name); free_message_tags(mtags); } } diff --git a/src/modules/chanmodes/floodprot.c b/src/modules/chanmodes/floodprot.c index a3aa3efe7..9c2a2b4a4 100644 --- a/src/modules/chanmodes/floodprot.c +++ b/src/modules/chanmodes/floodprot.c @@ -928,9 +928,9 @@ int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership * { mtags = NULL; new_message(&me, NULL, &mtags); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +b %s 0", me.id, channel->chname, mask); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +b %s 0", me.id, channel->name, mask); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s MODE %s +b %s", me.name, channel->chname, mask); + ":%s MODE %s +b %s", me.name, channel->name, mask); free_message_tags(mtags); } /* else.. ban list is full */ } @@ -1081,7 +1081,7 @@ void floodprottimer_add(Channel *channel, char mflag, time_t when) if (strlen(chp->timers_running)+1 >= sizeof(chp->timers_running)) { sendto_realops_and_log("floodprottimer_add: too many timers running for %s (%s)!!!", - channel->chname, chp->timers_running); + channel->name, chp->timers_running); return; } strccat(chp->timers_running, mflag); /* bounds already checked ^^ */ @@ -1140,7 +1140,7 @@ EVENT(modef_event) long mode = 0; Cmode_t extmode = 0; #ifdef NEWFLDDBG - sendto_realops("modef_event: chan %s mode -%c EXPIRED", e->channel->chname, e->m); + sendto_realops("modef_event: chan %s mode -%c EXPIRED", e->channel->name, e->m); #endif mode = get_mode_bitbychar(e->m); if (mode == 0) @@ -1152,10 +1152,10 @@ EVENT(modef_event) MessageTag *mtags = NULL; new_message(&me, NULL, &mtags); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c 0", me.id, e->channel->chname, e->m); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c 0", me.id, e->channel->name, e->m); sendto_channel(e->channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -%c", - me.name, e->channel->chname, e->m); + me.name, e->channel->name, e->m); free_message_tags(mtags); e->channel->mode.mode &= ~mode; @@ -1168,7 +1168,7 @@ EVENT(modef_event) } else { #ifdef NEWFLDDBG sendto_realops("modef_event: chan %s mode -%c about %d seconds", - e->channel->chname, e->m, e->when - now); + e->channel->name, e->m, e->when - now); #endif } } @@ -1258,7 +1258,7 @@ void do_floodprot_action(Channel *channel, int what) new_message(&me, NULL, &mtags); ircsnprintf(comment, sizeof(comment), "*** Channel %s detected (limit is %d per %d seconds), setting mode +%c", text, chp->limit[what], chp->per, m); - ircsnprintf(target, sizeof(target), "%%%s", channel->chname); + ircsnprintf(target, sizeof(target), "%%%s", channel->name); sendto_channel(channel, &me, NULL, PREFIX_HALFOP|PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, 0, SEND_ALL, mtags, ":%s NOTICE %s :%s", me.name, target, comment); @@ -1267,8 +1267,8 @@ void do_floodprot_action(Channel *channel, int what) /* Then the MODE broadcast */ mtags = NULL; new_message(&me, NULL, &mtags); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +%c 0", me.id, channel->chname, m); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +%c", me.name, channel->chname, m); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +%c 0", me.id, channel->name, m); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +%c", me.name, channel->name, m); free_message_tags(mtags); /* Actually set the mode internally */ diff --git a/src/modules/chanmodes/history.c b/src/modules/chanmodes/history.c index 124a25ebc..792292f37 100644 --- a/src/modules/chanmodes/history.c +++ b/src/modules/chanmodes/history.c @@ -623,9 +623,9 @@ int history_chanmode_change(Client *client, Channel *channel, MessageTag *mtags, /* If so, grab the settings, and communicate them */ settings = (HistoryChanMode *)GETPARASTRUCT(channel, 'H'); if (settings) - history_set_limit(channel->chname, settings->max_lines, settings->max_time); + history_set_limit(channel->name, settings->max_lines, settings->max_time); else - history_destroy(channel->chname); + history_destroy(channel->name); return 0; } @@ -636,7 +636,7 @@ int history_channel_destroy(Channel *channel, int *should_destroy) if (*should_destroy == 0) return 0; /* channel will not be destroyed */ - history_destroy(channel->chname); + history_destroy(channel->name); return 0; } @@ -672,10 +672,10 @@ int history_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, snprintf(buf, sizeof(buf), ":%s %s %s :%s", source, sendtype_to_cmd(sendtype), - channel->chname, + channel->name, text); - history_add(channel->chname, mtags, buf); + history_add(channel->name, mtags, buf); return 0; } @@ -700,7 +700,7 @@ int history_join(Client *client, Channel *channel, MessageTag *mtags, char *parv filter.cmd = HFC_SIMPLE; filter.last_lines = cfg.playback_on_join.lines; filter.last_seconds = cfg.playback_on_join.time; - r = history_request(channel->chname, &filter); + r = history_request(channel->name, &filter); if (r) { history_send_result(client, r); @@ -727,7 +727,7 @@ CMD_OVERRIDE_FUNC(override_mode) (IsUser(client) && client->srvptr && client->srvptr->local)) { /* Now check if the channel is currently +r */ - if ((parc >= 2) && !BadPtr(parv[1]) && ((channel = find_channel(parv[1], NULL))) && + if ((parc >= 2) && !BadPtr(parv[1]) && ((channel = find_channel(parv[1]))) && has_channel_mode(channel, 'r')) { had_r = 1; @@ -744,7 +744,7 @@ CMD_OVERRIDE_FUNC(override_mode) * then... */ if (had_r && - ((channel = find_channel(parv[1], NULL))) && + ((channel = find_channel(parv[1]))) && !has_channel_mode(channel, 'r') && HistoryEnabled(channel)) { @@ -782,9 +782,9 @@ CMD_OVERRIDE_FUNC(override_mode) sendto_channel(channel, &me, &me, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", - me.name, channel->chname, modebuf, parabuf); + me.name, channel->name, modebuf, parabuf); sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s %lld", - me.id, channel->chname, modebuf, parabuf, + me.id, channel->name, modebuf, parabuf, (long long)channel->creationtime); /* Activate this hook just like cmd_mode.c */ diff --git a/src/modules/chanmodes/issecure.c b/src/modules/chanmodes/issecure.c index 56320abd6..272fcd2fb 100644 --- a/src/modules/chanmodes/issecure.c +++ b/src/modules/chanmodes/issecure.c @@ -143,17 +143,17 @@ void issecure_unset(Channel *channel, Client *client, MessageTag *recv_mtags, in if (notice) { mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting -Z", channel->chname); + new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting -Z", channel->name); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s NOTICE %s :User '%s' joined and is not connected through SSL/TLS, setting channel -Z (insecure)", - me.id, channel->chname, client->name); + me.id, channel->name, client->name); free_message_tags(mtags); } channel->mode.extmode &= ~EXTCMODE_ISSECURE; mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "MODE %s -Z", channel->chname); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -Z", me.name, channel->chname); + new_message_special(&me, recv_mtags, &mtags, "MODE %s -Z", channel->name); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -Z", me.name, channel->name); free_message_tags(mtags); } @@ -168,7 +168,7 @@ void issecure_set(Channel *channel, Client *client, MessageTag *recv_mtags, int MessageTag *mtags; mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting +Z", channel->chname); + new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting +Z", channel->name); if (notice && client) { /* note that we have to skip 'client', since when this call is being made @@ -176,23 +176,23 @@ void issecure_set(Channel *channel, Client *client, MessageTag *recv_mtags, int */ sendto_channel(channel, &me, client, 0, 0, SEND_LOCAL, NULL, ":%s NOTICE %s :Now all users in the channel are connected through SSL/TLS, setting channel +Z (secure)", - me.name, channel->chname); + me.name, channel->name); } else if (notice) { /* note the missing word 'now' in next line */ sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, NULL, ":%s NOTICE %s :All users in the channel are connected through SSL/TLS, setting channel +Z (secure)", - me.name, channel->chname); + me.name, channel->name); } free_message_tags(mtags); channel->mode.extmode |= EXTCMODE_ISSECURE; mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "MODE %s +Z", channel->chname); + new_message_special(&me, recv_mtags, &mtags, "MODE %s +Z", channel->name); sendto_channel(channel, &me, client, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +Z", - me.name, channel->chname); + me.name, channel->name); free_message_tags(mtags); } diff --git a/src/modules/chanmodes/link.c b/src/modules/chanmodes/link.c index 3be4a4351..847c24d87 100644 --- a/src/modules/chanmodes/link.c +++ b/src/modules/chanmodes/link.c @@ -129,7 +129,7 @@ int cmodeL_is_ok(Client *client, Channel *channel, char mode, char *para, int ty return EX_DENY; } - if (find_channel(para, NULL) == channel) + if (find_channel(para) == channel) { if (MyUser(client)) sendnumeric(client, ERR_CANNOTCHANGECHANMODE, 'L', @@ -335,8 +335,8 @@ int link_doforward(Client *client, Channel *channel, char *linked, linkType type sendto_one(client, NULL, ":%s %d %s %s %s :[Link] Cannot join channel %s (%s) -- transferring you to %s", - me.name, ERR_LINKCHANNEL, client->name, channel->chname, linked, - channel->chname, desc, linked); + me.name, ERR_LINKCHANNEL, client->name, channel->name, linked, + channel->name, desc, linked); parv[0] = client->name; parv[1] = linked; parv[2] = NULL; diff --git a/src/modules/chanmodes/noinvite.c b/src/modules/chanmodes/noinvite.c index d6874aa1d..e50357336 100644 --- a/src/modules/chanmodes/noinvite.c +++ b/src/modules/chanmodes/noinvite.c @@ -75,7 +75,7 @@ int noinvite_pre_knock(Client *client, Channel *channel) if (MyUser(client) && IsNoInvite(channel)) { sendnumeric(client, ERR_CANNOTKNOCK, - channel->chname, "The channel does not allow invites (+V)"); + channel->name, "The channel does not allow invites (+V)"); return HOOK_DENY; } @@ -90,7 +90,7 @@ int noinvite_pre_invite(Client *client, Client *target, Channel *channel, int *o { *override = 1; } else { - sendnumeric(client, ERR_NOINVITE, channel->chname); + sendnumeric(client, ERR_NOINVITE, channel->name); return HOOK_DENY; } } diff --git a/src/modules/chanmodes/noknock.c b/src/modules/chanmodes/noknock.c index d5b36a49f..5cb5552e7 100644 --- a/src/modules/chanmodes/noknock.c +++ b/src/modules/chanmodes/noknock.c @@ -74,7 +74,7 @@ int noknock_check (Client *client, Channel *channel) { if (MyUser(client) && IsNoKnock(channel)) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "No knocks are allowed! (+K)"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "No knocks are allowed! (+K)"); return HOOK_DENY; } diff --git a/src/modules/chanmodes/secureonly.c b/src/modules/chanmodes/secureonly.c index 4bd3dcb38..05fab003c 100644 --- a/src/modules/chanmodes/secureonly.c +++ b/src/modules/chanmodes/secureonly.c @@ -112,11 +112,11 @@ static int secureonly_kick_insecure_users(Channel *channel) prefix, 0, SEND_LOCAL, mtags, ":%s KICK %s %s :%s", - me.name, channel->chname, client->name, comment); + me.name, channel->name, client->name, comment); - sendto_prefix_one(client, &me, mtags, ":%s KICK %s %s :%s", me.name, channel->chname, client->name, comment); + sendto_prefix_one(client, &me, mtags, ":%s KICK %s %s :%s", me.name, channel->name, client->name, comment); - sendto_server(NULL, 0, 0, mtags, ":%s KICK %s %s :%s", me.id, channel->chname, client->id, comment); + sendto_server(NULL, 0, 0, mtags, ":%s KICK %s %s :%s", me.id, channel->name, client->id, comment); free_message_tags(mtags); @@ -168,7 +168,7 @@ int secureonly_check_sajoin(Client *target, Channel *channel, Client *requester) if (IsSecureOnly(channel) && !IsSecure(target)) { sendnotice(requester, "You cannot SAJOIN %s to %s because the channel is +z and the user is not connected via SSL/TLS", - target->name, channel->chname); + target->name, channel->name); return HOOK_DENY; } @@ -182,7 +182,7 @@ int secureonly_specialcheck(Client *client, Channel *channel, char *parv[]) { if ((channel->users == 0) && (iConf.modes_on_join.extmodes & EXTCMODE_SECUREONLY) && !IsSecure(client) && !IsOper(client)) { - sendnumeric(client, ERR_SECUREONLYCHAN, channel->chname); + sendnumeric(client, ERR_SECUREONLYCHAN, channel->name); return HOOK_DENY; } return HOOK_CONTINUE; diff --git a/src/modules/channeldb.c b/src/modules/channeldb.c index 3fc91e055..00b62f055 100644 --- a/src/modules/channeldb.c +++ b/src/modules/channeldb.c @@ -27,9 +27,7 @@ ModuleHeader MOD_HEADER = { #define MAGIC_CHANNEL_START 0x11111111 #define MAGIC_CHANNEL_END 0x22222222 -#ifdef DEBUGMODE - #define BENCHMARK -#endif +// #undef BENCHMARK #define WARN_WRITE_ERROR(fname) \ do { \ @@ -335,7 +333,7 @@ int write_channel_entry(UnrealDB *db, const char *tmpfname, Channel *channel) { W_SAFE(unrealdb_write_int32(db, MAGIC_CHANNEL_START)); /* Channel name */ - W_SAFE(unrealdb_write_str(db, channel->chname)); + W_SAFE(unrealdb_write_str(db, channel->name)); /* Channel creation time */ W_SAFE(unrealdb_write_int64(db, channel->creationtime)); /* Topic (topic, setby, seton) */ @@ -506,7 +504,7 @@ int read_channeldb(void) R_SAFE(unrealdb_read_str(db, &modes2)); R_SAFE(unrealdb_read_str(db, &mode_lock)); /* If we got this far, we can create/initialize the channel with the above */ - channel = get_channel(&me, chname, CREATE); + channel = make_channel(chname); channel->creationtime = creationtime; safe_strdup(channel->topic, topic); safe_strdup(channel->topic_nick, topic_nick); diff --git a/src/modules/chathistory.c b/src/modules/chathistory.c index 226e865e4..2a3114375 100644 --- a/src/modules/chathistory.c +++ b/src/modules/chathistory.c @@ -173,7 +173,7 @@ void chathistory_targets(Client *client, HistoryFilter *filter, int limit) for (mp = client->user->channel; mp; mp = mp->next) { Channel *channel = mp->channel; - r = history_request(channel->chname, filter); + r = history_request(channel->name, filter); if (r) { add_chathistory_target(&targets, r); @@ -257,7 +257,7 @@ CMD_FUNC(cmd_chathistory) goto end; } - channel = find_channel(parv[2], NULL); + channel = find_channel(parv[2]); if (!channel) { sendto_one(client, NULL, ":%s FAIL CHATHISTORY INVALID_TARGET %s %s :Messages could not be retrieved, not an existing channel", @@ -369,7 +369,7 @@ CMD_FUNC(cmd_chathistory) if (filter->limit > CHATHISTORY_LIMIT) filter->limit = CHATHISTORY_LIMIT; - if ((r = history_request(channel->chname, filter))) + if ((r = history_request(channel->name, filter))) history_send_result(client, r); end: diff --git a/src/modules/connthrottle.c b/src/modules/connthrottle.c index 608e07c69..8c9bbb6cf 100644 --- a/src/modules/connthrottle.c +++ b/src/modules/connthrottle.c @@ -360,16 +360,18 @@ EVENT(connthrottle_evt) if (ucounter->rejected_clients) { - snprintf(buf, sizeof(buf), - "[ConnThrottle] Stats for this server past 60 secs: Connections rejected: %d. Accepted: %d known user(s), %d SASL, %d WEBIRC and %d new user(s).", - ucounter->rejected_clients, - ucounter->allowed_score, - ucounter->allowed_sasl, - ucounter->allowed_webirc, - ucounter->allowed_other); - - sendto_realops("%s", buf); - ircd_log(LOG_ERROR, "%s", buf); + unreal_log(ULOG_INFO, "connthrottle", "CONNTHROTLE_REPORT", NULL, + "ConnThrottle] Stats for this server past 60 secs: " + "Connections rejected: $num_rejected. " + "Accepted: $num_accepted_known_users known user(s), " + "$num_accepted_sasl SASL, " + "$num_accepted_webirc WEBIRC and " + "$num_accepted_unknown_users new user(s).", + log_data_integer("num_rejected", ucounter->rejected_clients), + log_data_integer("num_accepted_known_users", ucounter->allowed_score), + log_data_integer("num_accepted_sasl", ucounter->allowed_sasl), + log_data_integer("num_accepted_webirc", ucounter->allowed_webirc), + log_data_integer("num_accepted_unknown_users", ucounter->allowed_other)); } /* Reset stats for next message */ @@ -436,8 +438,8 @@ int ct_pre_lconnect(Client *client) /* We send the LARGE banner if throttling was activated */ if (!ucounter->throttling_previous_minute && !ucounter->throttling_banner_displayed) { - ircd_log(LOG_ERROR, "[ConnThrottle] Connection throttling has been ACTIVATED due to a HIGH CONNECTION RATE."); - sendto_realops("[ConnThrottle] Connection throttling has been ACTIVATED due to a HIGH CONNECTION RATE."); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_ACTIVATED", NULL, + "[ConnThrottle] Connection throttling has been ACTIVATED due to a HIGH CONNECTION RATE."); sendto_realops("[ConnThrottle] Users with IP addresses that have not been seen before will be rejected above the set connection rate. Known users can still get in."); sendto_realops("[ConnThrottle] For more information see https://www.unrealircd.org/docs/ConnThrottle"); ucounter->throttling_banner_displayed = 1; @@ -602,8 +604,8 @@ CMD_FUNC(ct_throttle) return; } ucounter->disabled = 1; - sendto_realops("[connthrottle] %s (%s@%s) DISABLED the connthrottle module.", - client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_MODULE_DISABLED", client, + "[ConnThrottle] $client.nuh DISABLED the connthrottle module."); } else if (!strcasecmp(parv[1], "ON")) { @@ -612,15 +614,15 @@ CMD_FUNC(ct_throttle) sendnotice(client, "Already ON"); return; } - sendto_realops("[connthrottle] %s (%s@%s) ENABLED the connthrottle module.", - client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_MODULE_ENABLED", client, + "[ConnThrottle] $client.nuh ENABLED the connthrottle module."); ucounter->disabled = 0; } else if (!strcasecmp(parv[1], "RESET")) { memset(ucounter, 0, sizeof(UCounter)); - sendto_realops("[connthrottle] %s (%s@%s) did a RESET on the stats/counters!!", - client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_RESET", client, + "[ConnThrottle] $client.nuh did a RESET on the statistics/counters."); } else { sendnotice(client, "Unknown option '%s'", parv[1]); diff --git a/src/modules/dccdeny.c b/src/modules/dccdeny.c index d27a9f7cd..c516c2322 100644 --- a/src/modules/dccdeny.c +++ b/src/modules/dccdeny.c @@ -515,7 +515,7 @@ int dccdeny_can_send_to_channel(Client *client, Channel *channel, Membership *lp { char *err = NULL; char *filename = get_dcc_filename(*msg); - if (filename && !can_dcc(client, channel->chname, NULL, filename, &err)) + if (filename && !can_dcc(client, channel->name, NULL, filename, &err)) { if (!IsDead(client) && (sendtype != SEND_TYPE_NOTICE)) { diff --git a/src/modules/eos.c b/src/modules/eos.c index 157c9f01b..8d9f2d7e1 100644 --- a/src/modules/eos.c +++ b/src/modules/eos.c @@ -65,10 +65,6 @@ CMD_FUNC(cmd_eos) return; client->serv->flags.synced = 1; /* pass it on ^_- */ -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[EOSDBG] cmd_eos: got sync from %s (path:%s)", client->name, client->direction->name); - ircd_log(LOG_ERROR, "[EOSDBG] cmd_eos: broadcasting it back to everyone except route from %s", client->direction->name); -#endif sendto_server(client, 0, 0, NULL, ":%s EOS", client->id); RunHook(HOOKTYPE_SERVER_SYNCED, client); diff --git a/src/modules/extbans/inchannel.c b/src/modules/extbans/inchannel.c index e8755f49a..f6b438851 100644 --- a/src/modules/extbans/inchannel.c +++ b/src/modules/extbans/inchannel.c @@ -146,7 +146,7 @@ int extban_inchannel_is_banned(Client *client, Channel *channel, char *ban, int for (lp = client->user->channel; lp; lp = lp->next) { - if (match_esc(p, lp->channel->chname)) + if (match_esc(p, lp->channel->name)) { /* Channel matched, check symbol if needed (+/%/@/etc) */ if (symbol) diff --git a/src/modules/extbans/textban.c b/src/modules/extbans/textban.c index 297f0ca24..5f70b3187 100644 --- a/src/modules/extbans/textban.c +++ b/src/modules/extbans/textban.c @@ -275,7 +275,7 @@ int extban_modeT_is_ok(Client *client, Channel *channel, char *para, int checkt, ((n = counttextbans(channel)) >= MAX_EXTBANT_PER_CHAN)) { /* We check the # of bans in the channel, may not exceed MAX_EXTBANT_PER_CHAN */ - sendnumeric(client, ERR_BANLISTFULL, channel->chname, para); + sendnumeric(client, ERR_BANLISTFULL, channel->name, para); sendnotice(client, "Too many textbans for this channel"); return 0; } @@ -500,7 +500,7 @@ int textban_check_ban(Client *client, Channel *channel, char *ban, char **msg, c gettimeofday(&tv_beta, NULL); ircd_log(LOG_ERROR, "TextBan Timing: %ld microseconds (%s / %s / %d)", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec), - client->name, channel->chname, strlen(*msg)); + client->name, channel->name, strlen(*msg)); #endif if (cleaned) diff --git a/src/modules/extbans/timedban.c b/src/modules/extbans/timedban.c index 1b5f13080..cb1bcd3d7 100644 --- a/src/modules/extbans/timedban.c +++ b/src/modules/extbans/timedban.c @@ -398,7 +398,7 @@ EVENT(timedban_timeout) * is too costly. So we stick with this. It should be * good enough. Alternative would be some channel->id value. */ - if (((unsigned int)channel->chname[1] % TIMEDBAN_TIMER_ITERATION_SPLIT) != current_iteration) + if (((unsigned int)channel->name[1] % TIMEDBAN_TIMER_ITERATION_SPLIT) != current_iteration) continue; /* not this time, maybe next */ *mbuf = *pbuf = '\0'; @@ -433,8 +433,8 @@ EVENT(timedban_timeout) { MessageTag *mtags = NULL; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->chname, mbuf, pbuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->chname, mbuf, pbuf); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->name, mbuf, pbuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->name, mbuf, pbuf); free_message_tags(mtags); *pbuf = 0; } @@ -484,8 +484,8 @@ void add_send_mode_param(Channel *channel, Client *from, char what, char mode, c MessageTag *mtags = NULL; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->chname, mbuf, pbuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->chname, mbuf, pbuf); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->name, mbuf, pbuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->name, mbuf, pbuf); free_message_tags(mtags); send = 0; *pbuf = 0; diff --git a/src/modules/history.c b/src/modules/history.c index e8311e041..ba62c53fe 100644 --- a/src/modules/history.c +++ b/src/modules/history.c @@ -82,7 +82,7 @@ CMD_FUNC(cmd_history) return; } - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); @@ -91,13 +91,13 @@ CMD_FUNC(cmd_history) if (!IsMember(client, channel)) { - sendnumeric(client, ERR_NOTONCHANNEL, channel->chname); + sendnumeric(client, ERR_NOTONCHANNEL, channel->name); return; } if (!has_channel_mode(channel, 'H')) { - sendnotice(client, "Channel %s does not have channel mode +H set", channel->chname); + sendnotice(client, "Channel %s does not have channel mode +H set", channel->name); return; } @@ -125,7 +125,7 @@ CMD_FUNC(cmd_history) filter.cmd = HFC_SIMPLE; filter.last_lines = lines; - if ((r = history_request(channel->chname, &filter))) + if ((r = history_request(channel->name, &filter))) { history_send_result(client, r); free_history_result(r); diff --git a/src/modules/history_backend_mem.c b/src/modules/history_backend_mem.c index d357fdac5..a572d6dae 100644 --- a/src/modules/history_backend_mem.c +++ b/src/modules/history_backend_mem.c @@ -481,7 +481,7 @@ int hbm_modechar_del(Channel *channel, int modechar) if (!cfg.persist) return 0; - if ((modechar == 'P') && ((h = hbm_find_object(channel->chname)))) + if ((modechar == 'P') && ((h = hbm_find_object(channel->name)))) { /* Channel went from +P to -P and also has channel history: delete the history file */ hbm_delete_db(h); @@ -1533,7 +1533,7 @@ static int hbm_write_db(HistoryLogObject *h) if (!cfg.db_secret) abort(); - channel = find_channel(h->name, NULL); + channel = find_channel(h->name); if (!channel || !has_channel_mode(channel, 'P')) return 1; /* Don't save this channel, pretend success */ diff --git a/src/modules/invite.c b/src/modules/invite.c index 49c9ef2e8..37a652d3b 100644 --- a/src/modules/invite.c +++ b/src/modules/invite.c @@ -198,7 +198,7 @@ void send_invite_list(Client *client) for (inv = CLIENT_INVITES(client); inv; inv = inv->next) { sendnumeric(client, RPL_INVITELIST, - inv->value.channel->chname); + inv->value.channel->name); } sendnumeric(client, RPL_ENDOFINVITELIST); } @@ -226,7 +226,7 @@ void invite_process(Client *client, Client *target, Channel *channel, MessageTag new_message(client, recv_mtags, &mtags); /* broadcast to other servers */ - sendto_server(client, 0, 0, mtags, ":%s INVITE %s %s %d", client->id, target->id, channel->chname, override); + sendto_server(client, 0, 0, mtags, ":%s INVITE %s %s %d", client->id, target->id, channel->name, override); /* send chanops notifications */ if (IsUser(client) && (is_chan_op(client, channel) @@ -240,20 +240,20 @@ void invite_process(Client *client, Client *target, Channel *channel, MessageTag sendto_channel(channel, &me, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, 0, SEND_LOCAL, mtags, ":%s NOTICE @%s :OperOverride -- %s invited him/herself into the channel.", - me.name, channel->chname, client->name); + me.name, channel->name, client->name); } if (override == 0) { sendto_channel(channel, &me, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, CAP_INVITE_NOTIFY | CAP_INVERT, SEND_LOCAL, mtags, ":%s NOTICE @%s :%s invited %s into the channel.", - me.name, channel->chname, client->name, target->name); + me.name, channel->name, client->name, target->name); } /* always send IRCv3 invite-notify if possible */ sendto_channel(channel, client, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, CAP_INVITE_NOTIFY, SEND_LOCAL, mtags, ":%s INVITE %s %s", - client->name, target->name, channel->chname); + client->name, target->name, channel->name); } /* add to list and notify the person who got invited */ @@ -270,7 +270,7 @@ void invite_process(Client *client, Client *target, Channel *channel, MessageTag if (!is_silenced(client, target)) { sendto_prefix_one(target, client, mtags, ":%s INVITE %s :%s", client->name, - target->name, channel->chname); + target->name, channel->name); } } free_message_tags(mtags); @@ -295,7 +295,7 @@ CMD_FUNC(cmd_invite) { params_ok = 1; target = find_person(parv[1], NULL); - channel = find_channel(parv[2], NULL); + channel = find_channel(parv[2]); } if (!MyConnect(client)) @@ -386,7 +386,7 @@ CMD_FUNC(cmd_invite) { override = 1; } else { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } } @@ -396,17 +396,17 @@ CMD_FUNC(cmd_invite) { override = 1; } else { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } } } if (SPAMFILTER_VIRUSCHANDENY && SPAMFILTER_VIRUSCHAN && - !strcasecmp(channel->chname, SPAMFILTER_VIRUSCHAN) && + !strcasecmp(channel->name, SPAMFILTER_VIRUSCHAN) && !is_chan_op(client, channel) && !ValidatePermissionsForPath("immune:server-ban:viruschan",client,NULL,NULL,NULL)) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } @@ -422,7 +422,7 @@ CMD_FUNC(cmd_invite) if (!override) { - sendnumeric(client, RPL_INVITING, target->name, channel->chname); + sendnumeric(client, RPL_INVITING, target->name, channel->name); if (target->user->away) { sendnumeric(client, RPL_AWAY, target->name, target->user->away); @@ -435,33 +435,33 @@ CMD_FUNC(cmd_invite) { sendto_snomask_global(SNO_EYES, "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +b).", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); /* Logging implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Ban).", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); } else if (channel->mode.mode & MODE_INVITEONLY) { sendto_snomask_global(SNO_EYES, "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +i).", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); /* Logging implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Invite Only)", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); } else if (channel->mode.limit) { sendto_snomask_global(SNO_EYES, "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +l).", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); /* Logging implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Limit)", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); } @@ -469,22 +469,22 @@ CMD_FUNC(cmd_invite) { sendto_snomask_global(SNO_EYES, "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +k).", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); /* Logging implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Key)", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); } else if (has_channel_mode(channel, 'z')) { sendto_snomask_global(SNO_EYES, "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +z).", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); /* Logging implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding SSL/TLS-Only)", - client->name, client->user->username, client->user->realhost, channel->chname); + client->name, client->user->username, client->user->realhost, channel->name); } #ifdef OPEROVERRIDE_VERIFY else if (channel->mode.mode & MODE_SECRET || channel->mode.mode & MODE_PRIVATE) diff --git a/src/modules/join.c b/src/modules/join.c index b8cb9ee81..f9887b81c 100644 --- a/src/modules/join.c +++ b/src/modules/join.c @@ -146,7 +146,7 @@ int _can_join(Client *client, Channel *channel, char *key, char *parv[]) #ifndef NO_OPEROVERRIDE #ifdef OPEROVERRIDE_VERIFY if (ValidatePermissionsForPath("channel:override:privsecret",client,NULL,channel,NULL) && (channel->mode.mode & MODE_SECRET || - channel->mode.mode & MODE_PRIVATE) && !is_autojoin_chan(channel->chname)) + channel->mode.mode & MODE_PRIVATE) && !is_autojoin_chan(channel->name)) return (ERR_OPERSPVERIFY); #endif #endif @@ -194,10 +194,10 @@ void _send_join_to_local_users(Client *client, Channel *channel, MessageTag *mta long CAP_AWAY_NOTIFY = ClientCapabilityBit("away-notify"); ircsnprintf(joinbuf, sizeof(joinbuf), ":%s!%s@%s JOIN :%s", - client->name, client->user->username, GetHost(client), channel->chname); + client->name, client->user->username, GetHost(client), channel->name); ircsnprintf(exjoinbuf, sizeof(exjoinbuf), ":%s!%s@%s JOIN %s %s :%s", - client->name, client->user->username, GetHost(client), channel->chname, + client->name, client->user->username, GetHost(client), channel->name, IsLoggedIn(client) ? client->user->svid : "*", client->info); @@ -237,7 +237,7 @@ void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, int char *parv[] = { 0, 0 }; /* Same way as in SJOIN */ - new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->chname); + new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->name); new_message(&me, recv_mtags, &mtags_sjoin); @@ -247,7 +247,7 @@ void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, int sendto_server(client, 0, 0, mtags_sjoin, ":%s SJOIN %lld %s :%s%s ", me.id, (long long)channel->creationtime, - channel->chname, chfl_to_sjoin_symbol(flags), client->id); + channel->name, chfl_to_sjoin_symbol(flags), client->id); if (MyUser(client)) { @@ -260,13 +260,13 @@ void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, int { channel->creationtime = TStime(); sendto_server(client, 0, 0, NULL, ":%s MODE %s + %lld", - me.id, channel->chname, (long long)channel->creationtime); + me.id, channel->name, (long long)channel->creationtime); } if (channel->topic) { - sendnumeric(client, RPL_TOPIC, channel->chname, channel->topic); - sendnumeric(client, RPL_TOPICWHOTIME, channel->chname, channel->topic_nick, + sendnumeric(client, RPL_TOPIC, channel->name, channel->topic); + sendnumeric(client, RPL_TOPICWHOTIME, channel->name, channel->topic_nick, channel->topic_time); } @@ -295,15 +295,15 @@ void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, int *modebuf = *parabuf = 0; channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel, 0); /* This should probably be in the SJOIN stuff */ - new_message_special(&me, recv_mtags, &mtags_mode, ":%s MODE %s %s %s", me.name, channel->chname, modebuf, parabuf); + new_message_special(&me, recv_mtags, &mtags_mode, ":%s MODE %s %s %s", me.name, channel->name, modebuf, parabuf); sendto_server(NULL, 0, 0, mtags_mode, ":%s MODE %s %s %s %lld", - me.id, channel->chname, modebuf, parabuf, (long long)channel->creationtime); - sendto_one(client, mtags_mode, ":%s MODE %s %s %s", me.name, channel->chname, modebuf, parabuf); + me.id, channel->name, modebuf, parabuf, (long long)channel->creationtime); + sendto_one(client, mtags_mode, ":%s MODE %s %s %s", me.name, channel->name, modebuf, parabuf); free_message_tags(mtags_mode); } parv[0] = client->name; - parv[1] = channel->chname; + parv[1] = channel->name; do_cmd(client, NULL, "NAMES", 2, parv); RunHook4(HOOKTYPE_LOCAL_JOIN, client, channel, mtags, parv); @@ -383,7 +383,7 @@ void _do_join(Client *client, int parc, char *parv[]) if (MyConnect(client) && !valid_channelname(name)) { send_invalid_channelname(client, name); - if (IsOper(client) && find_channel(name, NULL)) + if (IsOper(client) && find_channel(name)) { /* Give IRCOps a bit more information */ sendnotice(client, "Channel '%s' is unjoinable because it contains illegal characters. " @@ -441,8 +441,8 @@ void _do_join(Client *client, int parc, char *parv[]) sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s :%s", - client->name, channel->chname, "Left all channels"); - sendto_server(client, 0, 0, mtags, ":%s PART %s :Left all channels", client->name, channel->chname); + client->name, channel->name, "Left all channels"); + sendto_server(client, 0, 0, mtags, ":%s PART %s :Left all channels", client->name, channel->name); if (MyConnect(client)) RunHook4(HOOKTYPE_LOCAL_PART, client, channel, mtags, "Left all channels"); @@ -513,7 +513,7 @@ void _do_join(Client *client, int parc, char *parv[]) !strcasecmp(name, SPAMFILTER_VIRUSCHAN) && !ValidatePermissionsForPath("immune:server-ban:viruschan",client,NULL,NULL,NULL) && !spamf_ugly_vchanoverride) { - Channel *channel = find_channel(name, NULL); + Channel *channel = find_channel(name); if (!channel || !is_invited(client, channel)) { @@ -524,7 +524,7 @@ void _do_join(Client *client, int parc, char *parv[]) } } - channel = get_channel(client, name, CREATE); + channel = make_channel(name); if (channel && (lp = find_membership_link(client->user->channel, channel))) continue; @@ -713,20 +713,20 @@ void _userhost_changed(Client *client) /* Prepare buffers for PART, JOIN, MODE */ ircsnprintf(partbuf, sizeof(partbuf), ":%s!%s@%s PART %s :%s", remember_nick, remember_user, remember_host, - channel->chname, + channel->name, "Changing host"); ircsnprintf(joinbuf, sizeof(joinbuf), ":%s!%s@%s JOIN %s", - client->name, client->user->username, GetHost(client), channel->chname); + client->name, client->user->username, GetHost(client), channel->name); ircsnprintf(exjoinbuf, sizeof(exjoinbuf), ":%s!%s@%s JOIN %s %s :%s", - client->name, client->user->username, GetHost(client), channel->chname, + client->name, client->user->username, GetHost(client), channel->name, IsLoggedIn(client) ? client->user->svid : "*", client->info); modes = get_chmodes_for_user(client, flags); if (!BadPtr(modes)) - ircsnprintf(modebuf, sizeof(modebuf), ":%s MODE %s %s", me.name, channel->chname, modes); + ircsnprintf(modebuf, sizeof(modebuf), ":%s MODE %s %s", me.name, channel->name, modes); for (lp = channel->members; lp; lp = lp->next) { diff --git a/src/modules/jointhrottle.c b/src/modules/jointhrottle.c index 324740678..d444d261d 100644 --- a/src/modules/jointhrottle.c +++ b/src/modules/jointhrottle.c @@ -40,7 +40,7 @@ typedef struct JoinFlood JoinFlood; struct JoinFlood { JoinFlood *prev, *next; - char chname[CHANNELLEN+1]; + char name[CHANNELLEN+1]; time_t firstjoin; unsigned short numjoins; }; @@ -104,7 +104,7 @@ static int isjthrottled(Client *client, Channel *channel) /* Grab user<->chan entry.. */ for (e = moddata_local_client(client, jointhrottle_md).ptr; e; e=e->next) - if (!strcasecmp(e->chname, channel->chname)) + if (!strcasecmp(e->name, channel->name)) break; if (!e) @@ -129,7 +129,7 @@ static void jointhrottle_increase_usercounter(Client *client, Channel *channel) /* Grab user<->chan entry.. */ for (e = moddata_local_client(client, jointhrottle_md).ptr; e; e=e->next) - if (!strcasecmp(e->chname, channel->chname)) + if (!strcasecmp(e->name, channel->name)) break; if (!e) @@ -175,12 +175,12 @@ JoinFlood *jointhrottle_addentry(Client *client, Channel *channel) abort(); for (e=moddata_local_client(client, jointhrottle_md).ptr; e; e=e->next) - if (!strcasecmp(e->chname, channel->chname)) + if (!strcasecmp(e->name, channel->name)) abort(); /* already exists -- should never happen */ #endif e = safe_alloc(sizeof(JoinFlood)); - strlcpy(e->chname, channel->chname, sizeof(e->chname)); + strlcpy(e->name, channel->name, sizeof(e->name)); /* Insert our new entry as (new) head */ if (moddata_local_client(client, jointhrottle_md).ptr) @@ -213,7 +213,7 @@ EVENT(jointhrottle_cleanup_structs) continue; /* still valid entry */ #ifdef DEBUGMODE ircd_log(LOG_ERROR, "jointhrottle_cleanup_structs(): freeing %s/%s (%ld[%ld], %ld)", - client->name, jf->chname, jf->firstjoin, (long)(TStime() - jf->firstjoin), + client->name, jf->name, jf->firstjoin, (long)(TStime() - jf->firstjoin), iConf.floodsettings->period[FLD_JOIN]); #endif if (moddata_local_client(client, jointhrottle_md).ptr == jf) diff --git a/src/modules/kick.c b/src/modules/kick.c index 8545f9b01..459c0af28 100644 --- a/src/modules/kick.c +++ b/src/modules/kick.c @@ -84,7 +84,7 @@ void _kick_user(MessageTag *initial_mtags, Channel *channel, Client *client, Cli new_message(client, NULL, &initial_mtags); } - new_message_special(client, initial_mtags, &mtags, ":%s KICK %s %s", client->name, channel->chname, victim->name); + new_message_special(client, initial_mtags, &mtags, ":%s KICK %s %s", client->name, channel->name, victim->name); /* The same message is actually sent at 5 places below (though max 4 at most) */ if (MyUser(client)) @@ -99,22 +99,22 @@ void _kick_user(MessageTag *initial_mtags, Channel *channel, Client *client, Cli PREFIX_HALFOP|PREFIX_OP|PREFIX_OWNER|PREFIX_ADMIN, 0, SEND_LOCAL, mtags, ":%s KICK %s %s :%s", - client->name, channel->chname, victim->name, comment); + client->name, channel->name, victim->name, comment); if (MyUser(victim)) { sendto_prefix_one(victim, client, mtags, ":%s KICK %s %s :%s", - client->name, channel->chname, victim->name, comment); + client->name, channel->name, victim->name, comment); } } else { /* NORMAL */ sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s KICK %s %s :%s", - client->name, channel->chname, victim->name, comment); + client->name, channel->name, victim->name, comment); } sendto_server(client, 0, 0, mtags, ":%s KICK %s %s :%s", - client->id, channel->chname, victim->id, comment); + client->id, channel->name, victim->id, comment); free_message_tags(mtags); if (initial_mtags_generated) @@ -166,7 +166,7 @@ CMD_FUNC(cmd_kick) for (; (name = strtoken(&p, parv[1], ",")); parv[1] = NULL) { long client_flags = 0; - channel = get_channel(client, name, !CREATE); + channel = find_channel(name); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, name); @@ -178,7 +178,7 @@ CMD_FUNC(cmd_kick) if (MyUser(client) && !IsULine(client) && !op_can_override("channel:override:kick:no-ops",client,channel,NULL) && !(client_flags & CHFL_ISOP) && !(client_flags & CHFL_HALFOP)) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); continue; } @@ -250,10 +250,10 @@ CMD_FUNC(cmd_kick) sendto_snomask(SNO_EYES, "*** OperOverride -- %s (%s@%s) KICK %s %s (%s)", client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); + channel->name, who->name, comment); ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) KICK %s %s (%s)", client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); + channel->name, who->name, comment); goto attack; /* all other checks don't matter anymore (and could cause double msgs) */ } else { /* Not an oper overriding */ @@ -277,12 +277,12 @@ CMD_FUNC(cmd_kick) sendto_snomask(SNO_EYES, "*** OperOverride -- %s (%s@%s) KICK %s %s (%s)", client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); + channel->name, who->name, comment); /* Logging Implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) KICK %s %s (%s)", client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); + channel->name, who->name, comment); goto attack; } /* is_chan_op */ @@ -299,12 +299,12 @@ CMD_FUNC(cmd_kick) sendto_snomask(SNO_EYES, "*** OperOverride -- %s (%s@%s) KICK %s %s (%s)", client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); + channel->name, who->name, comment); /* Logging Implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) KICK %s %s (%s)", client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); + channel->name, who->name, comment); goto attack; } diff --git a/src/modules/knock.c b/src/modules/knock.c index d2197af8f..9f2c064f4 100644 --- a/src/modules/knock.c +++ b/src/modules/knock.c @@ -97,7 +97,7 @@ CMD_FUNC(cmd_knock) return; } - if (!(channel = find_channel(parv[1], NULL))) + if (!(channel = find_channel(parv[1]))) { sendnumeric(client, ERR_CANNOTKNOCK, parv[1], "Channel does not exist!"); return; @@ -106,19 +106,19 @@ CMD_FUNC(cmd_knock) /* IsMember bugfix by codemastr */ if (IsMember(client, channel) == 1) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "You're already there!"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "You're already there!"); return; } if (!(channel->mode.mode & MODE_INVITEONLY)) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "Channel is not invite only!"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "Channel is not invite only!"); return; } if (is_banned(client, channel, BANCHK_JOIN, NULL, NULL)) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "You're banned!"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "You're banned!"); return; } @@ -145,14 +145,14 @@ CMD_FUNC(cmd_knock) sendto_channel(channel, &me, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, 0, SEND_LOCAL, mtags, ":%s NOTICE @%s :[Knock] by %s!%s@%s (%s)", - me.name, channel->chname, + me.name, channel->name, client->name, client->user->username, GetHost(client), reason); - sendto_server(client, 0, 0, mtags, ":%s KNOCK %s :%s", client->id, channel->chname, reason); + sendto_server(client, 0, 0, mtags, ":%s KNOCK %s :%s", client->id, channel->name, reason); if (MyUser(client)) - sendnotice(client, "Knocked on %s", channel->chname); + sendnotice(client, "Knocked on %s", channel->name); RunHook4(HOOKTYPE_KNOCK, client, channel, mtags, parv[2]); diff --git a/src/modules/list.c b/src/modules/list.c index bcf04e266..23dd53cc5 100644 --- a/src/modules/list.c +++ b/src/modules/list.c @@ -269,7 +269,7 @@ CMD_FUNC(cmd_list) } else /* Just a normal channel */ { - channel = find_channel(name, NULL); + channel = find_channel(name); if (channel && (ShowChannel(client, channel) || ValidatePermissionsForPath("channel:see:list:secret",client,NULL,channel,NULL))) { #ifdef LIST_SHOW_MODES modebuf[0] = '['; @@ -343,9 +343,9 @@ int send_list(Client *client) ConfigItem_offchans *x; for (x = conf_offchans; x; x = x->next) { - if (find_channel(x->chname, NULL)) + if (find_channel(x->name)) continue; /* exists, >0 users.. will be sent later */ - sendnumeric(client, RPL_LIST, x->chname, + sendnumeric(client, RPL_LIST, x->name, 0, #ifdef LIST_SHOW_MODES "", @@ -366,11 +366,11 @@ int send_list(Client *client) continue; /* set::hide-list { deny-channel } */ - if (!IsOper(client) && iConf.hide_list && find_channel_allowed(client, channel->chname)) + if (!IsOper(client) && iConf.hide_list && find_channel_allowed(client, channel->name)) continue; /* Similarly, hide unjoinable channels for non-ircops since it would be confusing */ - if (!IsOper(client) && !valid_channelname(channel->chname)) + if (!IsOper(client) && !valid_channelname(channel->name)) continue; /* Much more readable like this -- codemastr */ @@ -394,11 +394,11 @@ int send_list(Client *client) continue; /* Must not be on nolist (if it exists) */ - if (lopt->nolist && find_name_list_match(lopt->nolist, channel->chname)) + if (lopt->nolist && find_name_list_match(lopt->nolist, channel->name)) continue; /* Must be on yeslist (if it exists) */ - if (lopt->yeslist && !find_name_list_match(lopt->yeslist, channel->chname)) + if (lopt->yeslist && !find_name_list_match(lopt->yeslist, channel->name)) continue; } #ifdef LIST_SHOW_MODES @@ -412,7 +412,7 @@ int send_list(Client *client) if (!ValidatePermissionsForPath("channel:see:list:secret",client,NULL,channel,NULL)) sendnumeric(client, RPL_LIST, ShowChannel(client, - channel) ? channel->chname : + channel) ? channel->name : "*", channel->users, #ifdef LIST_SHOW_MODES ShowChannel(client, channel) ? @@ -422,7 +422,7 @@ int send_list(Client *client) channel) ? (channel->topic ? channel->topic : "") : ""); else - sendnumeric(client, RPL_LIST, channel->chname, + sendnumeric(client, RPL_LIST, channel->name, channel->users, #ifdef LIST_SHOW_MODES modebuf, diff --git a/src/modules/md.c b/src/modules/md.c index 29f16f76c..f41056256 100644 --- a/src/modules/md.c +++ b/src/modules/md.c @@ -138,7 +138,7 @@ CMD_FUNC(cmd_md) } else if (!strcmp(type, "channel")) { - Channel *channel = find_channel(objname, NULL); + Channel *channel = find_channel(objname); md = findmoddata_byname(varname, MODDATATYPE_CHANNEL); if (!md || !md->unserialize || !channel) return; @@ -166,7 +166,7 @@ CMD_FUNC(cmd_md) return; *p++ = '\0'; - channel = find_channel(objname, NULL); + channel = find_channel(objname); if (!channel) return; @@ -213,7 +213,7 @@ CMD_FUNC(cmd_md) if (!target) return; - channel = find_channel(p, NULL); + channel = find_channel(p); if (!channel) return; @@ -276,10 +276,10 @@ void _broadcast_md_channel_cmd(Client *except, Client *sender, Channel *channel, { if (value) sendto_server(except, 0, 0, NULL, ":%s MD %s %s %s :%s", - sender->id, "channel", channel->chname, varname, value); + sender->id, "channel", channel->name, varname, value); else sendto_server(except, 0, 0, NULL, ":%s MD %s %s %s", - sender->id, "channel", channel->chname, varname); + sender->id, "channel", channel->name, varname); } void _broadcast_md_member_cmd(Client *except, Client *sender, Channel *channel, Client *client, char *varname, char *value) @@ -287,12 +287,12 @@ void _broadcast_md_member_cmd(Client *except, Client *sender, Channel *channel, if (value) { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s :%s", - sender->id, "member", channel->chname, client->id, varname, value); + sender->id, "member", channel->name, client->id, varname, value); } else { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s", - sender->id, "member", channel->chname, client->id, varname); + sender->id, "member", channel->name, client->id, varname); } } @@ -301,12 +301,12 @@ void _broadcast_md_membership_cmd(Client *except, Client *sender, Client *client if (value) { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s :%s", - sender->id, "membership", client->id, channel->chname, varname, value); + sender->id, "membership", client->id, channel->name, varname, value); } else { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s", - sender->id, "membership", client->id, channel->chname, varname); + sender->id, "membership", client->id, channel->name, varname); } } @@ -394,7 +394,7 @@ void _send_moddata_channel(Client *srv, Channel *channel) char *value = mdi->serialize(&moddata_channel(channel, mdi)); if (value) sendto_one(srv, NULL, ":%s MD %s %s %s :%s", - me.id, "channel", channel->chname, mdi->name, value); + me.id, "channel", channel->name, mdi->name, value); } } } @@ -421,7 +421,7 @@ void _send_moddata_members(Client *srv) char *value = mdi->serialize(&moddata_member(m, mdi)); if (value) sendto_one(srv, NULL, ":%s MD %s %s:%s %s :%s", - me.id, "member", channel->chname, client->id, mdi->name, value); + me.id, "member", channel->name, client->id, mdi->name, value); } } } @@ -445,7 +445,7 @@ void _send_moddata_members(Client *srv) char *value = mdi->serialize(&moddata_membership(m, mdi)); if (value) sendto_one(srv, NULL, ":%s MD %s %s:%s %s :%s", - me.id, "membership", client->id, m->channel->chname, mdi->name, value); + me.id, "membership", client->id, m->channel->name, mdi->name, value); } } } diff --git a/src/modules/mdex.c b/src/modules/mdex.c index 26388fbbb..c63761a77 100644 --- a/src/modules/mdex.c +++ b/src/modules/mdex.c @@ -104,7 +104,7 @@ CMD_FUNC(cmd_mdex) } else if (!strcmp(type, "channel")) { - Channel *channel = find_channel(objname, NULL); + Channel *channel = find_channel(objname); md = findmoddata_byname(varname, MODDATATYPE_CHANNEL); if (!md || !md->unserialize || !md->free || !channel) return 0; @@ -130,7 +130,7 @@ CMD_FUNC(cmd_mdex) return 0; *p++ = '\0'; - channel = find_channel(objname, NULL); + channel = find_channel(objname); if (!channel) return 0; @@ -172,7 +172,7 @@ CMD_FUNC(cmd_mdex) if (!target) return 0; - channel = find_channel(p, NULL); + channel = find_channel(p); if (!channel) return 0; @@ -212,7 +212,7 @@ CMD_FUNC(cmd_mdex) } else if (!strcmp(type, "channel")) { - Channel *channel = find_channel(objname, NULL); + Channel *channel = find_channel(objname); char *str; md = findmoddata_byname(varname, MODDATATYPE_CHANNEL); @@ -237,7 +237,7 @@ CMD_FUNC(cmd_mdex) return 0; *p++ = '\0'; - channel = find_channel(objname, NULL); + channel = find_channel(objname); if (!channel) return 0; @@ -276,7 +276,7 @@ CMD_FUNC(cmd_mdex) if (!target) return 0; - channel = find_channel(p, NULL); + channel = find_channel(p); if (!channel) return 0; diff --git a/src/modules/message.c b/src/modules/message.c index db8684b66..4d75bbb17 100644 --- a/src/modules/message.c +++ b/src/modules/message.c @@ -244,14 +244,14 @@ int can_send_to_prefix(Client *client, Channel *channel, int prefix) */ if (!lp || !(lp->flags & (CHFL_VOICE|CHFL_HALFOP|CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANADMIN))) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return 0; } if (!(prefix & PREFIX_OP) && ((prefix & PREFIX_OWNER) || (prefix & PREFIX_ADMIN)) && !(lp->flags & (CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANADMIN))) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return 0; } @@ -334,7 +334,7 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], prefix = 0; /* Message to channel */ - if (p2 && (channel = find_channel(p2, NULL))) + if (p2 && (channel = find_channel(p2))) { prefix = prefix_string_to_values(targetstr, p2); if (prefix) @@ -345,15 +345,15 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], * Eg: @&~#chan becomes @#chan */ pfixchan[0] = prefix_values_to_char(prefix); - strlcpy(pfixchan+1, channel->chname, sizeof(pfixchan)-1); + strlcpy(pfixchan+1, channel->name, sizeof(pfixchan)-1); targetstr = pfixchan; } else { /* Replace target so the privmsg always goes to the "official" channel name */ - strlcpy(pfixchan, channel->chname, sizeof(pfixchan)); + strlcpy(pfixchan, channel->name, sizeof(pfixchan)); targetstr = pfixchan; } - if (IsVirus(client) && strcasecmp(channel->chname, SPAMFILTER_VIRUSCHAN)) + if (IsVirus(client) && strcasecmp(channel->name, SPAMFILTER_VIRUSCHAN)) { sendnotice(client, "You are only allowed to talk in '%s'", SPAMFILTER_VIRUSCHAN); continue; @@ -372,7 +372,7 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], if (IsDead(client)) return; if (!IsDead(client) && (sendtype != SEND_TYPE_NOTICE) && errmsg) - sendnumeric(client, ERR_CANNOTSENDTOCHAN, channel->chname, errmsg, p2); + sendnumeric(client, ERR_CANNOTSENDTOCHAN, channel->name, errmsg, p2); continue; /* skip delivery to this target */ } } @@ -389,7 +389,7 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], { int spamtype = (sendtype == SEND_TYPE_NOTICE ? SPAMF_CHANNOTICE : SPAMF_CHANMSG); - if (match_spamfilter(client, text, spamtype, cmd, channel->chname, 0, NULL)) + if (match_spamfilter(client, text, spamtype, cmd, channel->name, 0, NULL)) return; } diff --git a/src/modules/mode.c b/src/modules/mode.c index 5ac7f764c..afafec900 100644 --- a/src/modules/mode.c +++ b/src/modules/mode.c @@ -105,7 +105,7 @@ CMD_FUNC(cmd_mode) { if (*parv[1] == '#') { - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { cmd_umode(client, recv_mtags, parc, parv); @@ -134,8 +134,8 @@ CMD_FUNC(cmd_mode) modebuf[1] = '\0'; channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel, 0); - sendnumeric(client, RPL_CHANNELMODEIS, channel->chname, modebuf, parabuf); - sendnumeric(client, RPL_CREATIONTIME, channel->chname, channel->creationtime); + sendnumeric(client, RPL_CHANNELMODEIS, channel->name, modebuf, parabuf); + sendnumeric(client, RPL_CREATIONTIME, channel->name, channel->creationtime); return; } @@ -154,8 +154,8 @@ CMD_FUNC(cmd_mode) return; /* send ban list */ for (ban = channel->banlist; ban; ban = ban->next) - sendnumeric(client, RPL_BANLIST, channel->chname, ban->banstr, ban->who, ban->when); - sendnumeric(client, RPL_ENDOFBANLIST, channel->chname); + sendnumeric(client, RPL_BANLIST, channel->name, ban->banstr, ban->who, ban->when); + sendnumeric(client, RPL_ENDOFBANLIST, channel->name); return; } @@ -165,8 +165,8 @@ CMD_FUNC(cmd_mode) return; /* send exban list */ for (ban = channel->exlist; ban; ban = ban->next) - sendnumeric(client, RPL_EXLIST, channel->chname, ban->banstr, ban->who, ban->when); - sendnumeric(client, RPL_ENDOFEXLIST, channel->chname); + sendnumeric(client, RPL_EXLIST, channel->name, ban->banstr, ban->who, ban->when); + sendnumeric(client, RPL_ENDOFEXLIST, channel->name); return; } @@ -175,8 +175,8 @@ CMD_FUNC(cmd_mode) if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remoteinvexlist",client,NULL,channel,NULL)) return; for (ban = channel->invexlist; ban; ban = ban->next) - sendnumeric(client, RPL_INVEXLIST, channel->chname, ban->banstr, ban->who, ban->when); - sendnumeric(client, RPL_ENDOFINVEXLIST, channel->chname); + sendnumeric(client, RPL_INVEXLIST, channel->name, ban->banstr, ban->who, ban->when); + sendnumeric(client, RPL_ENDOFINVEXLIST, channel->name); return; } @@ -190,9 +190,9 @@ CMD_FUNC(cmd_mode) for (member = channel->members; member; member = member->next) { if (is_chanowner(member->client, channel)) - sendnumeric(client, RPL_QLIST, channel->chname, member->client->name); + sendnumeric(client, RPL_QLIST, channel->name, member->client->name); } - sendnumeric(client, RPL_ENDOFQLIST, channel->chname); + sendnumeric(client, RPL_ENDOFQLIST, channel->name); return; } @@ -206,9 +206,9 @@ CMD_FUNC(cmd_mode) for (member = channel->members; member; member = member->next) { if (is_chanadmin(member->client, channel)) - sendnumeric(client, RPL_ALIST, channel->chname, member->client->name); + sendnumeric(client, RPL_ALIST, channel->name, member->client->name); } - sendnumeric(client, RPL_ENDOFALIST, channel->chname); + sendnumeric(client, RPL_ENDOFALIST, channel->name); return; } } @@ -239,11 +239,11 @@ CMD_FUNC(cmd_mode) { if (MyUser(client)) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } sendto_one(client, NULL, ":%s MODE %s -oh %s %s 0", - me.name, channel->chname, client->name, client->name); + me.name, channel->name, client->name, client->name); /* Tell the other server that the user is * de-opped. Fix op desyncs. */ bounce_mode(channel, client, parc - 2, parv + 2); @@ -259,7 +259,7 @@ CMD_FUNC(cmd_mode) /* !!! */ sendto_snomask(SNO_EYES, "*** TS bounce for %s - %lld(ours) %lld(theirs)", - channel->chname, (long long)channel->creationtime, + channel->name, (long long)channel->creationtime, (long long)sendts); bounce_mode(channel, client, parc - 2, parv + 2); } @@ -317,7 +317,7 @@ static void mode_cutoff2(Client *client, Channel *channel, int *parc_out, char * /* Calculate length of MODE if it would go through fully as-is */ /* :nick!user@host MODE #channel +something param1 param2 etc... */ len = strlen(client->name) + strlen(client->user->username) + strlen(GetHost(client)) + - strlen(channel->chname) + 11; + strlen(channel->name) + 11; len += strlen(parv[2]); @@ -376,9 +376,9 @@ static void bounce_mode(Channel *channel, Client *client, int parc, char *parv[] if (channel->creationtime) sendto_one(client, NULL, ":%s MODE %s &%s %s %lld", me.id, - channel->chname, modebuf, parabuf, (long long)channel->creationtime); + channel->name, modebuf, parabuf, (long long)channel->creationtime); else - sendto_one(client, NULL, ":%s MODE %s &%s %s", me.id, channel->chname, + sendto_one(client, NULL, ":%s MODE %s &%s %s", me.id, channel->name, modebuf, parabuf); /* the '&' denotes a bounce so servers won't bounce a bounce */ @@ -424,9 +424,9 @@ void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc { sendto_realops( "Warning! Possible desync: MODE for channel %s ('%s %s') has fishy timestamp (%lld) (from %s/%s)", - channel->chname, modebuf, parabuf, (long long)sendts, client->direction->name, client->name); + channel->name, modebuf, parabuf, (long long)sendts, client->direction->name, client->name); ircd_log(LOG_ERROR, "Possible desync: MODE for channel %s ('%s %s') has fishy timestamp (%lld) (from %s/%s)", - channel->chname, modebuf, parabuf, (long long)sendts, client->direction->name, client->name); + channel->name, modebuf, parabuf, (long long)sendts, client->direction->name, client->name); } /* new chan or our timestamp is wrong */ /* now works for double-bounce prevention */ @@ -437,7 +437,7 @@ void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc /* theirs is wrong but we let it pass anyway */ sendts = channel->creationtime; sendto_one(client, NULL, ":%s MODE %s + %lld", me.name, - channel->chname, (long long)channel->creationtime); + channel->name, (long long)channel->creationtime); } } if (sendts == -1 && channel->creationtime) @@ -452,11 +452,11 @@ void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc if (channel->creationtime) { sendto_server(client, 0, 0, NULL, ":%s MODE %s %s+ %lld", - me.id, channel->chname, isbounce ? "&" : "", + me.id, channel->name, isbounce ? "&" : "", (long long)channel->creationtime); } else { sendto_server(client, 0, 0, NULL, ":%s MODE %s %s+", - me.id, channel->chname, isbounce ? "&" : ""); + me.id, channel->name, isbounce ? "&" : ""); } free_message_tags(mtags); return; /* nothing to send */ @@ -472,12 +472,12 @@ void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc sendto_snomask(SNO_EYES, "*** OperOverride -- %s (%s@%s) MODE %s %s %s", client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); + channel->name, modebuf, parabuf); /* Logging Implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) MODE %s %s %s", client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); + channel->name, modebuf, parabuf); } sendts = 0; @@ -495,7 +495,7 @@ void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc { if (!sajoinmode) sendto_umode_global(UMODE_OPER, "%s used SAMODE %s (%s%s%s)", - client->name, channel->chname, modebuf, *parabuf ? " " : "", parabuf); + client->name, channel->name, modebuf, *parabuf ? " " : "", parabuf); client = &me; sendts = 0; @@ -503,13 +503,13 @@ void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", - client->name, channel->chname, modebuf, parabuf); + client->name, channel->name, modebuf, parabuf); if (IsServer(client) && sendts != -1) { sendto_server(client, 0, 0, mtags, ":%s MODE %s %s%s %s %lld", - client->id, channel->chname, + client->id, channel->name, isbounce ? "&" : "", modebuf, parabuf, (long long)sendts); } else @@ -518,12 +518,12 @@ void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc /* SAMODE is a special case: always send a TS of 0 (omitting TS==desync) */ sendto_server(client, 0, 0, mtags, ":%s MODE %s %s %s 0", - client->id, channel->chname, modebuf, parabuf); + client->id, channel->name, modebuf, parabuf); } else { sendto_server(client, 0, 0, mtags, ":%s MODE %s %s%s %s", - client->id, channel->chname, isbounce ? "&" : "", modebuf, parabuf); + client->id, channel->name, isbounce ? "&" : "", modebuf, parabuf); /* tell them it's not a timestamp, in case the last param ** is a number. */ } @@ -778,7 +778,7 @@ int do_mode_char(Channel *channel, long modetype, char modechar, char *param, case MODE_RGSTR: if (!IsServer(client) && !IsULine(client)) { - sendnumeric(client, ERR_ONLYSERVERSCANCHANGE, channel->chname); + sendnumeric(client, ERR_ONLYSERVERSCANCHANGE, channel->name); break; } goto setmode; @@ -813,7 +813,7 @@ int do_mode_char(Channel *channel, long modetype, char modechar, char *param, { if (MyUser(client) && !op_can_override("channel:override:mode",client,channel,&modetype)) { - sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->name); break; } if (!is_half_op(client, channel)) /* htrig will take care of halfop override notices */ @@ -828,7 +828,7 @@ int do_mode_char(Channel *channel, long modetype, char modechar, char *param, { if (MyUser(client) && !op_can_override("channel:override:mode",client,channel,&modetype)) { - sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->name); break; } if (!is_half_op(client, channel)) /* htrig will take care of halfop override notices */ @@ -847,7 +847,7 @@ process_listmode: break; if (!(membership = find_membership_link(target->user->channel, channel))) { - sendnumeric(client, ERR_USERNOTINCHANNEL, target->name, channel->chname); + sendnumeric(client, ERR_USERNOTINCHANNEL, target->name, channel->name); break; } member = find_member_link(channel->members, target); @@ -1458,7 +1458,7 @@ void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int * { if (!sent_mlock_warning) { - sendnumeric(client, ERR_MLOCKRESTRICTED, channel->chname, *curchr, channel->mode_lock); + sendnumeric(client, ERR_MLOCKRESTRICTED, channel->name, *curchr, channel->mode_lock); sent_mlock_warning++; } continue; @@ -1566,13 +1566,13 @@ void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int * { sendto_snomask(SNO_EYES, "*** OperOverride -- %s (%s@%s) MODE %s %s %s", client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); + channel->name, modebuf, parabuf); } /* Logging Implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) MODE %s %s %s", client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); + channel->name, modebuf, parabuf); htrig = 0; opermode = 0; /* stop double override notices... but is this ok??? -- Syzop */ @@ -1932,7 +1932,7 @@ CMD_FUNC(cmd_mlock) t = (time_t) atol(parv[1]); /* Now, try to find the channel in question */ - channel = find_channel(parv[2], NULL); + channel = find_channel(parv[2]); if (!channel) return; diff --git a/src/modules/names.c b/src/modules/names.c index 405405fc5..be639dadc 100644 --- a/src/modules/names.c +++ b/src/modules/names.c @@ -97,7 +97,7 @@ CMD_FUNC(cmd_names) } } - channel = find_channel(para, NULL); + channel = find_channel(para); if (!channel || (!ShowChannel(client, channel) && !ValidatePermissionsForPath("channel:see:names:secret",client,NULL,channel,NULL))) { @@ -117,7 +117,7 @@ CMD_FUNC(cmd_names) idx = 1; buf[idx++] = ' '; - for (s = channel->chname; *s; s++) + for (s = channel->name; *s; s++) buf[idx++] = *s; buf[idx++] = ' '; buf[idx++] = ':'; diff --git a/src/modules/nick.c b/src/modules/nick.c index f3e90be9c..3d9f8bc94 100644 --- a/src/modules/nick.c +++ b/src/modules/nick.c @@ -413,12 +413,12 @@ CMD_FUNC(cmd_nick_local) if (!is_skochanop(client, mp->channel) && is_banned(client, mp->channel, BANCHK_NICK, NULL, NULL)) { sendnumeric(client, ERR_BANNICKCHANGE, - mp->channel->chname); + mp->channel->name); return; } if (CHECK_TARGET_NICK_BANS && !is_skochanop(client, mp->channel) && is_banned_with_nick(client, mp->channel, BANCHK_NICK, nick, NULL, NULL)) { - sendnumeric(client, ERR_BANNICKCHANGE, mp->channel->chname); + sendnumeric(client, ERR_BANNICKCHANGE, mp->channel->name); return; } @@ -432,7 +432,7 @@ CMD_FUNC(cmd_nick_local) if (i == HOOK_DENY) { sendnumeric(client, ERR_NONICKCHANGE, - mp->channel->chname); + mp->channel->name); return; } } @@ -734,7 +734,6 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char userbad[USERLEN * 2 + 1], *ubad = userbad, noident = 0; int i, xx; Hook *h; - User *user = client->user; char *tkllayer[9] = { me.name, /*0 server.name */ "+", /*1 +|- */ @@ -773,18 +772,18 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char /* if host contained invalid ASCII _OR_ the DNS reply is an IP-like reply * (like: 1.2.3.4 or ::ffff:1.2.3.4), then reject it and use IP instead. */ - if (*tmpstr || !*user->realhost || (isdigit(*client->local->sockhost) && (client->local->sockhost > tmpstr && isdigit(*(tmpstr - 1))) ) + if (*tmpstr || !*client->user->realhost || (isdigit(*client->local->sockhost) && (client->local->sockhost > tmpstr && isdigit(*(tmpstr - 1))) ) || (client->local->sockhost[0] == ':')) strlcpy(client->local->sockhost, client->ip, sizeof(client->local->sockhost)); } if (client->local->sockhost[0]) { - strlcpy(user->realhost, client->local->sockhost, sizeof(client->local->sockhost)); /* SET HOSTNAME */ + strlcpy(client->user->realhost, client->local->sockhost, sizeof(client->local->sockhost)); /* SET HOSTNAME */ } else { sendto_realops("[HOSTNAME BUG] client->local->sockhost is empty for user %s (%s, %s)", - client->name, client->ip ? client->ip : "", user->realhost); + client->name, client->ip ? client->ip : "", client->user->realhost); ircd_log(LOG_ERROR, "[HOSTNAME BUG] client->local->sockhost is empty for user %s (%s, %s)", - client->name, client->ip ? client->ip : "", user->realhost); + client->name, client->ip ? client->ip : "", client->user->realhost); } /* @@ -801,21 +800,21 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char * Moved the noident stuff here. -OnyxDragon */ - /* because username may point to user->username */ + /* because username may point to client->user->username */ strlcpy(temp, username, USERLEN + 1); if (!IsUseIdent(client)) - strlcpy(user->username, temp, USERLEN + 1); + strlcpy(client->user->username, temp, USERLEN + 1); else if (IsIdentSuccess(client)) - strlcpy(user->username, client->ident, USERLEN+1); + strlcpy(client->user->username, client->ident, USERLEN+1); else { if (IDENT_CHECK == 0) { - strlcpy(user->username, temp, USERLEN+1); + strlcpy(client->user->username, temp, USERLEN+1); } else { - *user->username = '~'; - strlcpy((user->username + 1), temp, sizeof(user->username)-1); + *client->user->username = '~'; + strlcpy((client->user->username + 1), temp, sizeof(client->user->username)-1); noident = 1; } @@ -836,7 +835,7 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char * problems so just ban them. (Using the nick could introduce * hostile chars) -- codemastr */ - for (u2 = user->username + noident; *u2; u2++) + for (u2 = client->user->username + noident; *u2; u2++) { if (isallowed(*u2)) *u1++ = *u2; @@ -854,7 +853,7 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char } *u1 = '\0'; *ubad = '\0'; - if (strlen(stripuser) != strlen(user->username + noident)) + if (strlen(stripuser) != strlen(client->user->username + noident)) { if (stripuser[0] == '\0') { @@ -862,10 +861,10 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char return 0; } - strlcpy(olduser, user->username + noident, USERLEN+1); - strlcpy(user->username + 1, stripuser, sizeof(user->username)-1); - user->username[0] = '~'; - user->username[USERLEN] = '\0'; + strlcpy(olduser, client->user->username + noident, USERLEN+1); + strlcpy(client->user->username + 1, stripuser, sizeof(client->user->username)-1); + client->user->username[0] = '~'; + client->user->username[USERLEN] = '\0'; } else u1 = NULL; @@ -929,15 +928,15 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char } else { - strlcpy(user->username, username, USERLEN+1); + strlcpy(client->user->username, username, USERLEN+1); } SetUser(client); irccounts.clients++; if (client->srvptr && client->srvptr->serv) client->srvptr->serv->users++; - make_cloakedhost(client, user->realhost, user->cloakedhost, sizeof(user->cloakedhost)); - safe_strdup(user->virthost, user->cloakedhost); + make_cloakedhost(client, client->user->realhost, client->user->cloakedhost, sizeof(client->user->cloakedhost)); + safe_strdup(client->user->virthost, client->user->cloakedhost); if (MyConnect(client)) { @@ -958,18 +957,12 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char RunHook(HOOKTYPE_SECURE_CONNECT, client); } - if (IsHidden(client)) - { - ircd_log(LOG_CLIENT, "Connect - %s!%s@%s [%s] [vhost: %s] %s", - nick, user->username, user->realhost, GetIP(client), user->virthost, get_connect_extinfo(client)); - } else - { - ircd_log(LOG_CLIENT, "Connect - %s!%s@%s [%s] %s", - nick, user->username, user->realhost, GetIP(client), get_connect_extinfo(client)); - } + unreal_log(ULOG_INFO, "connect", "LOCAL_CLIENT_CONNECT", client, + "Client connecting: $client ($client.username@$client.hostname) [$client.ip] $extended_client_info", + log_data_string("extended_client_info", get_connect_extinfo(client))); RunHook2(HOOKTYPE_WELCOME, client, 0); - sendnumeric(client, RPL_WELCOME, ircnetwork, nick, user->username, user->realhost); + sendnumeric(client, RPL_WELCOME, ircnetwork, nick, client->user->username, client->user->realhost); RunHook2(HOOKTYPE_WELCOME, client, 1); sendnumeric(client, RPL_YOURHOST, me.name, version); @@ -988,7 +981,7 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char if (IsHidden(client)) { - sendnumeric(client, RPL_HOSTHIDDEN, user->virthost); + sendnumeric(client, RPL_HOSTHIDDEN, client->user->virthost); RunHook2(HOOKTYPE_WELCOME, client, 396); } @@ -1035,12 +1028,12 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char /* Remote client */ /* The following two cases probably cannot happen anymore? at all? */ - if (!(acptr = find_server_quick(user->server))) + if (!(acptr = find_server_quick(client->user->server))) { sendto_ops("Bad USER [%s] :%s USER %s %s : No such server", - client->name, nick, user->username, user->server); + client->name, nick, client->user->username, client->user->server); sendto_one(client, NULL, ":%s KILL %s :No such server: %s", - me.id, client->id, user->server); + me.id, client->id, client->user->server); SetKilled(client); exit_client(client, NULL, "USER without prefix(2.8) or wrong prefix"); return 0; @@ -1048,7 +1041,7 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char else if (acptr->direction != client->direction) { sendto_ops("Bad User [%s] :%s USER %s %s, != %s[%s]", - client->name, nick, user->username, user->server, + client->name, nick, client->user->username, client->user->server, acptr->name, acptr->direction->name); sendto_one(client, NULL, ":%s KILL %s :Wrong user-server-direction", me.id, client->id); @@ -1088,8 +1081,8 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char /* For remote clients we recalculate the cloakedhost here because * it may depend on the IP address (bug #5064). */ - make_cloakedhost(client, user->realhost, user->cloakedhost, sizeof(user->cloakedhost)); - safe_strdup(user->virthost, user->cloakedhost); + make_cloakedhost(client, client->user->realhost, client->user->cloakedhost, sizeof(client->user->cloakedhost)); + safe_strdup(client->user->virthost, client->user->cloakedhost); /* Set the umodes */ tkllayer[0] = nick; @@ -1112,12 +1105,12 @@ int _register_user(Client *client, char *nick, char *username, char *umode, char if (MyConnect(client)) { broadcast_moddata_client(client); - sendto_connectnotice(client, 0, NULL); /* moved down, for modules. */ + RunHook(HOOKTYPE_LOCAL_CONNECT, client); if (buf[0] != '\0' && buf[1] != '\0') sendto_one(client, NULL, ":%s MODE %s :%s", client->name, client->name, buf); - if (user->snomask) - sendnumeric(client, RPL_SNOMASK, get_snomask_string_raw(user->snomask)); + if (client->user->snomask) + sendnumeric(client, RPL_SNOMASK, get_snomask_string_raw(client->user->snomask)); if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_user == POLICY_WARN)) sendnotice_multiline(client, iConf.plaintext_policy_user_message); diff --git a/src/modules/oper.c b/src/modules/oper.c index ee7d89a84..4477d62bf 100644 --- a/src/modules/oper.c +++ b/src/modules/oper.c @@ -82,7 +82,7 @@ void set_oper_host(Client *client, char *host) CMD_FUNC(cmd_oper) { ConfigItem_oper *operblock; - char *name, *password; + char *operblock_name, *password; long old_umodes = client->umodes & ALL_UMODES; if (!MyUser(client)) @@ -108,18 +108,18 @@ CMD_FUNC(cmd_oper) return; } - name = parv[1]; + operblock_name = parv[1]; password = (parc > 2) ? parv[2] : ""; /* set::plaintext-policy::oper 'deny' */ if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_oper == POLICY_DENY)) { sendnotice_multiline(client, iConf.plaintext_policy_oper_message); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [not using SSL/TLS]", - client->name, client->user->username, client->local->sockhost); - ircd_log(LOG_OPER, "OPER NO-SSL/TLS (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Not using TLS"), + log_data_string("fail_type", "NO_TLS"), + log_data_string("oper_block", parv[1])); client->local->since += 7; return; } @@ -128,35 +128,39 @@ CMD_FUNC(cmd_oper) if (IsSecure(client) && (iConf.outdated_tls_policy_oper == POLICY_DENY) && outdated_tls_client(client)) { sendnotice(client, "%s", outdated_tls_client_build_string(iConf.outdated_tls_policy_oper_message, client)); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [outdated SSL/TLS protocol or cipher]", - client->name, client->user->username, client->local->sockhost); - ircd_log(LOG_OPER, "OPER OUTDATED-SSL/TLS (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Outdated TLS protocol or cipher"), + log_data_string("fail_type", "OUTDATED_TLS_PROTOCOL_OR_CIPHER"), + log_data_string("oper_block", parv[1])); client->local->since += 7; return; } - if (!(operblock = find_oper(name))) + if (!(operblock = find_oper(operblock_name))) { sendnumeric(client, ERR_NOOPERHOST); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [unknown oper]", - client->name, client->user->username, client->local->sockhost); - ircd_log(LOG_OPER, "OPER UNKNOWNOPER (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Unknown oper operblock_name"), + log_data_string("fail_type", "UNKNOWN_OPER_NAME"), + log_data_string("oper_block", parv[1])); client->local->since += 7; return; } + /* Below here, the oper block exists, any errors here we take (even) + * more seriously, they are logged as errors instead of warnings. + */ + if (!unreal_mask_match(client, operblock->mask)) { sendnumeric(client, ERR_NOOPERHOST); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) using UID %s [host doesnt match]", - client->name, client->user->username, client->local->sockhost, name); - ircd_log(LOG_OPER, "OPER NOHOSTMATCH (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); + unreal_log(ULOG_ERROR, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Host does not match"), + log_data_string("fail_type", "NO_HOST_MATCH"), + log_data_string("oper_block", parv[1])); client->local->since += 7; return; } @@ -167,11 +171,11 @@ CMD_FUNC(cmd_oper) if (FAILOPER_WARN) sendnotice(client, "*** Your attempt has been logged."); - ircd_log(LOG_OPER, "OPER FAILEDAUTH (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) using UID %s [FAILEDAUTH]", - client->name, client->user->username, client->local->sockhost, name); + unreal_log(ULOG_ERROR, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Authentication failed"), + log_data_string("fail_type", "AUTHENTICATION_FAILED"), + log_data_string("oper_block", parv[1])); client->local->since += 7; return; } @@ -185,12 +189,11 @@ CMD_FUNC(cmd_oper) if (operblock->require_modes & ~client->umodes) { sendnumericfmt(client, ERR_NOOPERHOST, ":You are missing user modes required to OPER"); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [lacking modes '%s' in oper::require-modes]", - client->name, client->user->username, client->local->sockhost, get_usermode_string_raw(operblock->require_modes & ~client->umodes)); - ircd_log(LOG_OPER, "OPER MISSINGMODES (%s) by (%s!%s@%s), needs modes=%s", - name, client->name, client->user->username, client->local->sockhost, - get_usermode_string_raw(operblock->require_modes & ~client->umodes)); + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Not matching oper::require-modes"), + log_data_string("fail_type", "REQUIRE_MODES_NOT_SATISFIED"), + log_data_string("oper_block", parv[1])); client->local->since += 7; return; } @@ -198,12 +201,11 @@ CMD_FUNC(cmd_oper) if (!find_operclass(operblock->operclass)) { sendnotice(client, "ERROR: There is a non-existant oper::operclass specified for your oper block"); - ircd_log(LOG_ERROR, "OPER MISSINGOPERCLASS (%s) by (%s!%s@%s), oper::operclass does not exist: %s", - name, client->name, client->user->username, client->local->sockhost, - operblock->operclass); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [oper::operclass does not exist: '%s']", - client->name, client->user->username, client->local->sockhost, operblock->operclass); + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Config error: invalid oper::operclass"), + log_data_string("fail_type", "OPER_OPERCLASS_INVALID"), + log_data_string("oper_block", parv[1])); return; } @@ -212,11 +214,11 @@ CMD_FUNC(cmd_oper) sendnumeric(client, ERR_NOOPERHOST); sendnotice(client, "Your maximum number of concurrent oper logins has been reached (%d)", operblock->maxlogins); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) using UID %s [maxlogins reached]", - client->name, client->user->username, client->local->sockhost, name); - ircd_log(LOG_OPER, "OPER TOOMANYLOGINS (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.nuh [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "oper::maxlogins limit reached"), + log_data_string("fail_type", "OPER_MAXLOGINS_LIMIT"), + log_data_string("oper_block", parv[1])); client->local->since += 4; return; } @@ -258,13 +260,9 @@ CMD_FUNC(cmd_oper) safe_strdup(client->user->virthost, client->user->cloakedhost); } - sendto_snomask_global(SNO_OPER, - "%s (%s@%s) [%s] is now an operator", - client->name, client->user->username, client->local->sockhost, - parv[1]); - - ircd_log(LOG_OPER, "OPER (%s) by (%s!%s@%s)", name, client->name, client->user->username, - client->local->sockhost); + unreal_log(ULOG_INFO, "oper", "OPER_SUCCESS", client, + "$client.nuh is now an IRC Operator [oper-block: $oper_block]", + log_data_string("oper_block", parv[1])); /* set oper snomasks */ if (operblock->snomask) @@ -316,17 +314,19 @@ CMD_FUNC(cmd_oper) if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_oper == POLICY_WARN)) { sendnotice_multiline(client, iConf.plaintext_policy_oper_message); - sendto_snomask_global - (SNO_OPER, "OPER %s [%s] used an insecure (non-SSL/TLS) connection to /OPER.", - client->name, name); + unreal_log(ULOG_WARNING, "oper", "OPER_UNSAFE", client, + "Insecure (non-TLS) connection used to OPER up by $client.nuh [oper-block: $oper_block]", + log_data_string("oper_block", parv[1]), + log_data_string("warn_type", "NO_TLS")); } /* set::outdated-tls-policy::oper 'warn' */ if (IsSecure(client) && (iConf.outdated_tls_policy_oper == POLICY_WARN) && outdated_tls_client(client)) { sendnotice(client, "%s", outdated_tls_client_build_string(iConf.outdated_tls_policy_oper_message, client)); - sendto_snomask_global - (SNO_OPER, "OPER %s [%s] used a connection with an outdated SSL/TLS protocol or cipher to /OPER.", - client->name, name); + unreal_log(ULOG_WARNING, "oper", "OPER_UNSAFE", client, + "Outdated TLS protocol/cipher used to OPER up by $client.nuh [oper-block: $oper_block]", + log_data_string("oper_block", parv[1]), + log_data_string("warn_type", "OUTDATED_TLS_PROTOCOL_OR_CIPHER")); } } diff --git a/src/modules/part.c b/src/modules/part.c index 937087a7e..add081c66 100644 --- a/src/modules/part.c +++ b/src/modules/part.c @@ -106,7 +106,7 @@ CMD_FUNC(cmd_part) break; } - channel = get_channel(client, name, 0); + channel = find_channel(name); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, name); @@ -155,11 +155,11 @@ CMD_FUNC(cmd_part) } /* Create a new message, this one is actually used by 8 calls (though at most 4 max) */ - new_message_special(client, recv_mtags, &mtags, ":%s PART %s", client->name, channel->chname); + new_message_special(client, recv_mtags, &mtags, ":%s PART %s", client->name, channel->name); /* Send to other servers... */ sendto_server(client, 0, 0, mtags, ":%s PART %s :%s", - client->id, channel->chname, comment ? comment : ""); + client->id, channel->name, comment ? comment : ""); if (invisible_user_in_channel(client, channel)) { @@ -170,11 +170,11 @@ CMD_FUNC(cmd_part) PREFIX_HALFOP|PREFIX_OP|PREFIX_OWNER|PREFIX_ADMIN, 0, SEND_LOCAL, mtags, ":%s PART %s", - client->name, channel->chname); + client->name, channel->name); if (MyUser(client)) { sendto_one(client, mtags, ":%s!%s@%s PART %s", - client->name, client->user->username, GetHost(client), channel->chname); + client->name, client->user->username, GetHost(client), channel->name); } } else @@ -183,13 +183,13 @@ CMD_FUNC(cmd_part) PREFIX_HALFOP|PREFIX_OP|PREFIX_OWNER|PREFIX_ADMIN, 0, SEND_LOCAL, mtags, ":%s PART %s %s", - client->name, channel->chname, comment); + client->name, channel->name, comment); if (MyUser(client)) { sendto_one(client, mtags, ":%s!%s@%s PART %s %s", client->name, client->user->username, GetHost(client), - channel->chname, comment); + channel->name, comment); } } } @@ -200,11 +200,11 @@ CMD_FUNC(cmd_part) { sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s", - client->name, channel->chname); + client->name, channel->name); } else { sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s :%s", - client->name, channel->chname, comment); + client->name, channel->name, comment); } } diff --git a/src/modules/quit.c b/src/modules/quit.c index 8c59821a1..66a12325f 100644 --- a/src/modules/quit.c +++ b/src/modules/quit.c @@ -124,7 +124,7 @@ CMD_FUNC(cmd_quit) int ret; parx[0] = NULL; - parx[1] = channel->chname; + parx[1] = channel->name; parx[2] = newcomment; parx[3] = NULL; diff --git a/src/modules/reputation.c b/src/modules/reputation.c index 6a768815f..c636a8605 100644 --- a/src/modules/reputation.c +++ b/src/modules/reputation.c @@ -81,9 +81,10 @@ ModuleHeader MOD_HEADER #define WARN_WRITE_ERROR(fname) \ do { \ - sendto_realops_and_log("[reputation] Error writing to temporary database file " \ - "'%s': %s (DATABASE NOT SAVED)", \ - fname, unrealdb_get_error_string()); \ + unreal_log(ULOG_ERROR, "reputation", "REPUTATION_FILE_WRITE_ERROR", NULL, \ + "[reputation] Error writing to temporary database file $filename: $system_error", \ + log_data_string("filename", fname), \ + log_data_string("system_error", unrealdb_get_error_string())); \ } while(0) #define W_SAFE(x) \ @@ -465,8 +466,9 @@ void reputation_load_db_old(void) #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: LOAD DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: LOAD DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif } @@ -529,8 +531,9 @@ int reputation_load_db_new(UnrealDB *db) unrealdb_close(db); #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: LOAD DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: LOAD DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; } @@ -656,8 +659,9 @@ write_fail: #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: SAVE DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: SAVE DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; @@ -677,7 +681,7 @@ int reputation_save_db(void) #endif #ifdef TEST - sendto_realops("REPUTATION IS RUNNING IN TEST MODE. SAVING DB'S..."); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_TEST", NULL, "Reputation in running in test mode. Saving DB's...."); #endif /* Comment this out after one or more releases (means you cannot downgrade to <=5.0.9.1 anymore) */ @@ -741,8 +745,9 @@ int reputation_save_db(void) #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: SAVE DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: SAVE DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; } @@ -924,8 +929,11 @@ EVENT(delete_old_records) if (is_reputation_expired(e)) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "Deleting expired entry for '%s' (score %hd, last seen %lld seconds ago)", - e->ip, e->score, (long long)(TStime() - e->last_seen)); + unreal_log(ULOG_INFO, "reputation", "REPUTATION_EXPIRY", NULL, + "Deleting expired entry for $ip (score $score, last seen $time_delta seconds ago)", + log_data_string("ip", e->ip), + log_data_integer("score", e->score), + log_data_integer("time_delta", TStime() - e->last_seen)); #endif DelListItem(e, ReputationHashTable[i]); safe_free(e); @@ -935,8 +943,9 @@ EVENT(delete_old_records) #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: EXPIRY IN MEM: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: EXPIRY IN MEM: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif } @@ -989,7 +998,7 @@ void reputation_channel_query(Client *client, Channel *channel) int cnt = 0, i, j; ReputationEntry *e; - sendtxtnumeric(client, "Users and reputation scores for %s:", channel->chname); + sendtxtnumeric(client, "Users and reputation scores for %s:", channel->name); /* Step 1: build a list of nicks and their reputation */ nicks = safe_alloc((channel->users+1) * sizeof(char *)); @@ -1005,8 +1014,11 @@ void reputation_channel_query(Client *client, Channel *channel) } if (++cnt > channel->users) { - sendto_ops("[BUG] reputation_channel_query() expected %d users but %d (or more) were present in %s", - channel->users, cnt, channel->chname); + unreal_log(ULOG_WARNING, "bug", "REPUTATION_CHANNEL_QUERY_BUG", client, + "[BUG] reputation_channel_query() expected $expected_users users, but $found_users (or more) users were present in $channel", + log_data_integer("expected_users", channel->users), + log_data_integer("found_users", cnt), + log_data_string("channel", channel->name)); #ifdef DEBUGMODE abort(); #endif @@ -1121,7 +1133,7 @@ CMD_FUNC(reputation_user_cmd) } else if (parv[1][0] == '#') { - Channel *channel = find_channel(parv[1], NULL); + Channel *channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); @@ -1130,7 +1142,7 @@ CMD_FUNC(reputation_user_cmd) /* corner case: ircop without proper permissions and not in channel */ if (!ValidatePermissionsForPath("channel:see:names:invisible",client,NULL,NULL,NULL) && !get_access(client,channel)) { - sendnumeric(client, ERR_NOTONCHANNEL, channel->chname); + sendnumeric(client, ERR_NOTONCHANNEL, channel->name); return; } reputation_channel_query(client, channel); @@ -1239,8 +1251,11 @@ CMD_FUNC(reputation_server_cmd) */ sendto_one(client, NULL, ":%s REPUTATION %s *%d", me.id, parv[1], e->score); #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[reputation] Score for '%s' from %s is %d, but we have %d, sending back %d", - ip, client->name, score, e->score, e->score); + unreal_log(ULOG_INFO, "reputation", "REPUTATION_DIFFERS", client, + "Reputation score for for $ip from $client is $their_score, but we have $score, sending back $score", + log_data_string("ip", e->ip), + log_data_integer("their_score", score), + log_data_integer("score", e->score)); #endif score = e->score; /* Update for propagation in the non-client direction */ } @@ -1249,8 +1264,11 @@ CMD_FUNC(reputation_server_cmd) if (e && (score > e->score)) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[reputation] Score for '%s' from %s is %d, but we have %d, updating our score to %d", - ip, client->name, score, e->score, score); + unreal_log(ULOG_INFO, "reputation", "REPUTATION_DIFFERS", client, + "Reputation score for for $ip from $client is $their_score, but we have $score, updating our score to $score", + log_data_string("ip", e->ip), + log_data_integer("their_score", score), + log_data_integer("score", e->score)); #endif e->score = score; } @@ -1259,8 +1277,11 @@ CMD_FUNC(reputation_server_cmd) if (!e && (score > 0)) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[reputation] Score for '%s' from %s is %d, we had no entry, adding it", - ip, client->name, score); + unreal_log(ULOG_INFO, "reputation", "REPUTATION_NEW", client, + "Reputation score for for $ip from $client is $their_score, we had no entry, adding it", + log_data_string("ip", e->ip), + log_data_integer("their_score", score), + log_data_integer("score", e->score)); #endif e = safe_alloc(sizeof(ReputationEntry)+strlen(ip)); strcpy(e->ip, ip); /* safe, see alloc above */ diff --git a/src/modules/sajoin.c b/src/modules/sajoin.c index 3d66b5d9c..b76fc6b14 100644 --- a/src/modules/sajoin.c +++ b/src/modules/sajoin.c @@ -52,6 +52,13 @@ MOD_UNLOAD() return MOD_SUCCESS; } +static void log_sajoin(Client *client, Client *target, char *channels) +{ + unreal_log(ULOG_INFO, "sacmds", "SAJOIN_COMMAND", client, "SAJOIN: $client used SAJOIN to make $target join $channels", + log_data_client("target", target), + log_data_string("channels", channels)); +} + /* cmd_sajoin() - Lamego - Wed Jul 21 20:04:48 1999 Copied off PTlink IRCd (C) PTlink coders team. Coded for Sadmin by Stskeeps @@ -89,20 +96,18 @@ CMD_FUNC(cmd_sajoin) return; } + /* Broadcast so other servers can log it appropriately as an SAJOIN */ + sendto_server(client, 0, 0, recv_mtags, ":%s SAPART %s %s", client->id, target->id, parv[2]); + /* If it's not for our client, then simply pass on the message... */ if (!MyUser(target)) { - sendto_one(target, NULL, ":%s SAJOIN %s %s", client->id, target->id, parv[2]); - - /* Logging function added by XeRXeS */ - ircd_log(LOG_SACMDS,"SAJOIN: %s used SAJOIN to make %s join %s", - client->name, target->name, parv[2]); - unreal_log(ULOG_INFO, "sacmds", "SAJOIN_COMMAND", client, "SAJOIN: %s used SAJOIN to make %s join %s", - log_data_client("target", target), - log_data_string("channel", parv[2])); + log_sajoin(client, target, parv[2]); return; } + /* 'target' is our client... */ + /* Can't this just use do_join() or something with a parameter to bypass some checks? * This duplicate code is damn ugly. Ah well.. */ @@ -178,7 +183,7 @@ CMD_FUNC(cmd_sajoin) continue; } - channel = get_channel(target, name, 0); + channel = make_channel(name); /* If this _specific_ channel is not permitted, skip it */ if (!IsULine(client) && !ValidatePermissionsForPath("sacmd:sajoin",client,target,channel,NULL)) @@ -225,8 +230,8 @@ CMD_FUNC(cmd_sajoin) new_message(target, NULL, &mtags); sendto_channel(channel, target, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s :%s", - target->name, channel->chname, "Left all channels"); - sendto_server(NULL, 0, 0, mtags, ":%s PART %s :Left all channels", target->name, channel->chname); + target->name, channel->name, "Left all channels"); + sendto_server(NULL, 0, 0, mtags, ":%s PART %s :Left all channels", target->name, channel->name); if (MyConnect(target)) RunHook4(HOOKTYPE_LOCAL_PART, target, channel, mtags, "Left all channels"); free_message_tags(mtags); @@ -236,7 +241,7 @@ CMD_FUNC(cmd_sajoin) continue; } flags = (ChannelExists(name)) ? CHFL_DEOPPED : LEVEL_ON_JOIN; - channel = get_channel(target, name, CREATE); + channel = make_channel(name); if (channel && (lp = find_membership_link(target->user->channel, channel))) continue; @@ -281,23 +286,10 @@ CMD_FUNC(cmd_sajoin) if (did_anything) { if (!sjmode) - { sendnotice(target, "*** You were forced to join %s", jbuf); - sendto_umode_global(UMODE_OPER, "%s used SAJOIN to make %s join %s", client->name, target->name, jbuf); - /* Logging function added by XeRXeS */ - ircd_log(LOG_SACMDS,"SAJOIN: %s used SAJOIN to make %s join %s", - client->name, target->name, jbuf); - } else - { sendnotice(target, "*** You were forced to join %s with '%c'", jbuf, sjmode); - sendto_umode_global(UMODE_OPER, "%s used SAJOIN to make %s join %c%s", client->name, target->name, sjmode, jbuf); - ircd_log(LOG_SACMDS,"SAJOIN: %s used SAJOIN to make %s join %c%s", - client->name, target->name, sjmode, jbuf); - } - unreal_log(ULOG_INFO, "sacmds", "SAJOIN_COMMAND", client, "SAJOIN: $client used SAJOIN to make $target join $channel", - log_data_client("target", target), - log_data_string("channel", jbuf)); + log_sajoin(client, target, jbuf); } } } diff --git a/src/modules/samode.c b/src/modules/samode.c index 7dc48b886..419b136be 100644 --- a/src/modules/samode.c +++ b/src/modules/samode.c @@ -68,7 +68,7 @@ CMD_FUNC(cmd_samode) return; } - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); diff --git a/src/modules/sapart.c b/src/modules/sapart.c index fc9360fd2..5d239c208 100644 --- a/src/modules/sapart.c +++ b/src/modules/sapart.c @@ -52,6 +52,24 @@ MOD_UNLOAD() return MOD_SUCCESS; } +static void log_sapart(Client *client, Client *target, char *channels, char *comment) +{ + if (comment) + { + unreal_log(ULOG_INFO, "sacmds", "SAPART_COMMAND", client, "SAPART: $client used SAPART to make $target join $channels ($reason)", + log_data_client("target", target), + log_data_string("channels", channels), + log_data_string("reason", comment)); + } + else + { + unreal_log(ULOG_INFO, "sacmds", "SAPART_COMMAND", client, "SAPART: $client used SAPART to make $target join $channels", + log_data_client("target", target), + log_data_string("channels", channels)); + } +} + + /* cmd_sapart() - Lamego - Wed Jul 21 20:04:48 1999 Copied off PTlink IRCd (C) PTlink coders team. Coded for Sadmin by Stskeeps @@ -93,25 +111,20 @@ CMD_FUNC(cmd_sapart) return; } - /* Relay it on, if it's not my target */ + /* Broadcast so other servers can log it appropriately as an SAPART */ + if (parv[3]) + sendto_server(client, 0, 0, recv_mtags, ":%s SAPART %s %s :%s", client->id, target->id, parv[2], comment); + else + sendto_server(client, 0, 0, recv_mtags, ":%s SAPART %s %s", client->id, target->id, parv[2]); + if (!MyUser(target)) { - if (comment) - { - sendto_one(target, NULL, ":%s SAPART %s %s :%s", client->id, target->id, parv[2], comment); - ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s (%s)", - client->name, target->name, parv[2], comment); - } - else - { - sendto_one(target, NULL, ":%s SAPART %s %s", client->id, target->id, parv[2]); - ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s", - client->name, target->name, parv[2]); - } + log_sapart(client, target, parv[2], comment); return; } - /* Now works like cmd_join */ + /* 'target' is our client... */ + *jbuf = 0; for (i = 0, name = strtoken(&p, parv[2], ","); name; name = strtoken(&p, NULL, ",")) { @@ -120,10 +133,10 @@ CMD_FUNC(cmd_sapart) sendnumeric(client, ERR_TOOMANYTARGETS, name, maxtargets, "SAPART"); break; } - if (!(channel = get_channel(target, name, 0))) + + if (!(channel = find_channel(name))) { - sendnumeric(client, ERR_NOSUCHCHANNEL, - name); + sendnumeric(client, ERR_NOSUCHCHANNEL, name); continue; } @@ -156,25 +169,19 @@ CMD_FUNC(cmd_sapart) strlcat(commentx, comment, 512); } + log_sapart(client, target, parv[2], comment); + + if (comment) + sendnotice(target, "*** You were forced to part %s (%s)", parv[2], commentx); + else + sendnotice(target, "*** You were forced to part %s", parv[2]); + parv[0] = target->name; // nick parv[1] = parv[2]; // chan parv[2] = comment ? commentx : NULL; // comment - if (comment) - { - sendnotice(target, "*** You were forced to part %s (%s)", parv[1], commentx); - sendto_umode_global(UMODE_OPER, "%s used SAPART to make %s part %s (%s)", - client->name, target->name, parv[1], comment); - ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s (%s)", - client->name, target->name, parv[1], comment); - } - else - { - sendnotice(target, "*** You were forced to part %s", parv[1]); - sendto_umode_global(UMODE_OPER, "%s used SAPART to make %s part %s", - client->name, target->name, parv[1]); - ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s", - client->name, target->name, parv[1]); - } + + /* Now, do the actual parting: */ do_cmd(target, NULL, "PART", comment ? 3 : 2, parv); - /* target may be killed now due to the part reason @ spamfilter */ + + /* NOTE: target may be killed now due to the part reason @ spamfilter */ } diff --git a/src/modules/server.c b/src/modules/server.c index 8743ee100..c5e518b19 100644 --- a/src/modules/server.c +++ b/src/modules/server.c @@ -51,7 +51,8 @@ void _send_server_message(Client *client); void _introduce_user(Client *to, Client *acptr); int _check_deny_version(Client *cptr, char *software, int protocol, char *flags); void _broadcast_sinfo(Client *acptr, Client *to, Client *except); -int server_sync(Client *cptr, ConfigItem_link *conf); +int server_sync(Client *cptr, ConfigItem_link *conf, int incoming); +void tls_link_notification_verify(Client *acptr, ConfigItem_link *aconf); void server_generic_free(ModData *m); int server_post_connect(Client *client); @@ -463,8 +464,8 @@ EVENT(server_handshake_timeout) ((TStime() - client->local->firsttime) >= cfg.connect_timeout)) { /* If this is a connect timeout to an outgoing server then notify ops & log it */ - sendto_ops_and_log("Connect timeout while trying to link to server '%s' (%s)", - client->name, client->ip?client->ip:""); + unreal_log(ULOG_INFO, "link", "LINK_CONNECT_TIMEOUT", client, + "Connect timeout while trying to link to server '$client' ($client.ip)"); exit_client(client, NULL, "Connection timeout"); continue; @@ -474,8 +475,8 @@ EVENT(server_handshake_timeout) if ((TStime() - client->local->firsttime) >= cfg.handshake_timeout) { /* If this is a handshake timeout to an outgoing server then notify ops & log it */ - sendto_ops_and_log("Connection handshake timeout while trying to link to server '%s' (%s)", - client->name, client->ip?client->ip:""); + unreal_log(ULOG_INFO, "link", "LINK_HANDSHAKE_TIMEOUT", client, + "Connect handshake timeout while trying to link to server '$client' ($client.ip)"); exit_client(client, NULL, "Handshake Timeout"); continue; @@ -880,6 +881,7 @@ CMD_FUNC(cmd_server) ConfigItem_link *aconf = NULL; ConfigItem_deny_link *deny; char *flags = NULL, *protocol = NULL, *inf = NULL, *num = NULL; + int incoming; if (IsUser(client)) { @@ -943,11 +945,10 @@ CMD_FUNC(cmd_server) if (strlen(client->id) != 3) { - sendto_umode_global(UMODE_OPER, "Server %s is using old unsupported protocol from UnrealIRCd 3.2.x or earlier. " - "See https://www.unrealircd.org/docs/FAQ#old-server-protocol", - servername); - ircd_log(LOG_ERROR, "Server using old unsupported protocol from UnrealIRCd 3.2.x or earlier. " - "See https://www.unrealircd.org/docs/FAQ#old-server-protocol"); + unreal_log(ULOG_ERROR, "link", "LINK_OLD_PROTOCOL", client, + "Server link $servername rejected. Server is using an old and unsupported protocol from UnrealIRCd 3.2.x or earlier. " + "See https://www.unrealircd.org/docs/FAQ#old-server-protocol", + log_data_string("servername", servername)); exit_client(client, NULL, "Server using old unsupported protocol from UnrealIRCd 3.2.x or earlier. " "See https://www.unrealircd.org/docs/FAQ#old-server-protocol"); return; @@ -956,8 +957,10 @@ CMD_FUNC(cmd_server) hop = atol(parv[2]); if (hop != 1) { - sendto_umode_global(UMODE_OPER, "Directly linked server %s provided a hopcount of %d, while 1 was expected", - servername, hop); + unreal_log(ULOG_ERROR, "link", "LINK_REJECTED_INVALID_HOPCOUNT", client, + "Server link $servername rejected. Directly linked server provided a hopcount of $hopcount, while 1 was expected.", + log_data_string("servername", servername), + log_data_integer("hopcount", hop)); exit_client(client, NULL, "Invalid SERVER message, hop count must be 1"); return; } @@ -1002,8 +1005,9 @@ CMD_FUNC(cmd_server) if (deny->flag.type == CRULE_ALL && unreal_mask_match_string(servername, deny->mask) && crule_eval(deny->rule)) { - sendto_ops_and_log("Refused connection from %s. Rejected by deny link { } block.", - get_client_host(client)); + unreal_log(ULOG_ERROR, "link", "LINK_REJECTED_DENY_LINK_BLOCK", client, + "Server link $servername rejected by deny link { } block.", + log_data_string("servername", servername)); exit_client(client, NULL, "Disallowed by connection rule"); return; } @@ -1015,7 +1019,81 @@ CMD_FUNC(cmd_server) ircsnprintf(descbuf, sizeof descbuf, "Server: %s", servername); fd_desc(client->local->fd, descbuf); - server_sync(client, aconf); + incoming = IsUnknown(client) ? 1 : 0; + + if (client->local->passwd) + safe_free(client->local->passwd); + + /* Set up server structure */ + free_pending_net(client); + SetServer(client); + irccounts.me_servers++; + irccounts.servers++; + irccounts.unknown--; + list_move(&client->client_node, &global_server_list); + list_move(&client->lclient_node, &lclient_list); + list_add(&client->special_node, &server_list); + + if (find_uline(client->name)) + { + if (client->serv && client->serv->features.software && !strncmp(client->serv->features.software, "UnrealIRCd-", 11)) + { + unreal_log(ULOG_ERROR, "link", "BAD_ULINES", client, + "Bad ulines! Server $client matches your ulines { } block, but this server " + "is an UnrealIRCd server. UnrealIRCd servers should never be ulined as it " + "causes security issues. Ulines should only be added for services! " + "See https://www.unrealircd.org/docs/FAQ#bad-ulines."); + exit_client(client, NULL, "Bad ulines. See https://www.unrealircd.org/docs/FAQ#bad-ulines"); + } + SetULine(client); + } + + find_or_add(client->name); + + if (IsSecure(client)) + { + unreal_log(ULOG_INFO, "link", "SERVER_LINKED", client, + "Server linked: $me -> $client [secure: $tls_cipher]", + log_data_string("tls_cipher", tls_get_cipher(client->local->ssl)), + log_data_client("me", &me)); + tls_link_notification_verify(client, aconf); + } + else + { + unreal_log(ULOG_INFO, "link", "SERVER_LINKED", client, + "Server linked: $me -> $client", + log_data_client("me", &me)); + /* Print out a warning if linking to a non-TLS server unless it's localhost. + * Yeah.. there are still other cases when non-TLS links are fine (eg: local IP + * of the same machine), we won't bother with detecting that. -- Syzop + */ + if (!IsLocalhost(client) && (iConf.plaintext_policy_server == POLICY_WARN)) + { + sendto_realops("\002WARNING:\002 This link is unencrypted (not SSL/TLS). We highly recommend to use " + "SSL/TLS for server linking. See https://www.unrealircd.org/docs/Linking_servers"); + } + if (IsSecure(client) && (iConf.outdated_tls_policy_server == POLICY_WARN) && outdated_tls_client(client)) + { + sendto_realops("\002WARNING:\002 This link is using an outdated SSL/TLS protocol or cipher (%s).", + tls_get_cipher(client->local->ssl)); + } + } + + add_to_client_hash_table(client->name, client); + /* doesnt duplicate client->serv if allocted this struct already */ + make_server(client); + client->serv->up = me.name; + client->srvptr = &me; + if (!client->serv->conf) + client->serv->conf = aconf; /* Only set serv->conf to aconf if not set already! Bug #0003913 */ + if (incoming) + client->serv->conf->refcount++; + client->serv->conf->class->clients++; + client->local->class = client->serv->conf->class; + + RunHook(HOOKTYPE_SERVER_CONNECT, client); + + server_sync(client, aconf, incoming); } /** Remote server command (SID). @@ -1165,7 +1243,6 @@ CMD_FUNC(cmd_sid) make_server(acptr); acptr->serv->up = find_or_add(acptr->srvptr->name); SetServer(acptr); - ircd_log(LOG_SERVER, "SERVER %s (from %s)", acptr->name, acptr->srvptr->name); /* If this server is U-lined, or the parent is, then mark it as U-lined */ if (IsULine(client) || find_uline(acptr->name)) SetULine(acptr); @@ -1176,6 +1253,8 @@ CMD_FUNC(cmd_sid) add_to_id_hash_table(acptr->id, acptr); list_move(&acptr->client_node, &global_server_list); + unreal_log(ULOG_INFO, "link", "SERVER_LINKED", acptr, "Server linked: $client (via $client.server)"); + RunHook(HOOKTYPE_SERVER_CONNECT, acptr); sendto_server(client, 0, 0, NULL, ":%s SID %s %d %s :%s", @@ -1213,6 +1292,156 @@ void _introduce_user(Client *to, Client *acptr) } } +#define SafeStr(x) ((x && *(x)) ? (x) : "*") + +/** Broadcast SINFO. + * @param cptr The server to send the information about. + * @param to The server to send the information TO (NULL for broadcast). + * @param except The direction NOT to send to. + * This function takes into account that the server may not + * provide all of the detailed info. If any information is + * absent we will send 0 for numbers and * for NULL strings. + */ +void _broadcast_sinfo(Client *acptr, Client *to, Client *except) +{ + char chanmodes[128], buf[512]; + + if (acptr->serv->features.chanmodes[0]) + { + snprintf(chanmodes, sizeof(chanmodes), "%s,%s,%s,%s", + acptr->serv->features.chanmodes[0], + acptr->serv->features.chanmodes[1], + acptr->serv->features.chanmodes[2], + acptr->serv->features.chanmodes[3]); + } else { + strlcpy(chanmodes, "*", sizeof(chanmodes)); + } + + snprintf(buf, sizeof(buf), "%lld %d %s %s %s :%s", + (long long)acptr->serv->boottime, + acptr->serv->features.protocol, + SafeStr(acptr->serv->features.usermodes), + chanmodes, + SafeStr(acptr->serv->features.nickchars), + SafeStr(acptr->serv->features.software)); + + if (to) + { + /* Targetted to one server */ + sendto_one(to, NULL, ":%s SINFO %s", acptr->id, buf); + } else { + /* Broadcast (except one side...) */ + sendto_server(except, 0, 0, NULL, ":%s SINFO %s", acptr->id, buf); + } +} + +/** Sync all information with server 'client'. + * Eg: users, channels, everything. + * @param client The newly linked in server + * @param aconf The link block that belongs to this server + * @note This function (via cmd_server) is called from both sides, so + * from the incoming side and the outgoing side. + */ +int server_sync(Client *client, ConfigItem_link *aconf, int incoming) +{ + Client *acptr; + + if (incoming) + { + /* If this is an incomming connection, then we have just received + * their stuff and now send our PASS, PROTOCTL and SERVER messages back. + */ + if (!IsEAuth(client)) /* if eauth'd then we already sent the passwd */ + sendto_one(client, NULL, "PASS :%s", (aconf->auth->type == AUTHTYPE_PLAINTEXT) ? aconf->auth->data : "*"); + + send_proto(client, aconf); + send_server_message(client); + } + + /* Broadcast new server to the rest of the network */ + sendto_server(client, 0, 0, NULL, ":%s SID %s 2 %s :%s", + client->srvptr->id, client->name, client->id, client->info); + + /* Broadcast the just-linked-in featureset to other servers on our side */ + broadcast_sinfo(client, NULL, client); + + /* Send moddata of &me (if any, likely minimal) */ + send_moddata_client(client, &me); + + list_for_each_entry_reverse(acptr, &global_server_list, client_node) + { + /* acptr->direction == acptr for acptr == client */ + if (acptr->direction == client) + continue; + + if (IsServer(acptr)) + { + sendto_one(client, NULL, ":%s SID %s %d %s :%s", + acptr->srvptr->id, + acptr->name, acptr->hopcount + 1, + acptr->id, acptr->info); + + /* Also signal to the just-linked server which + * servers are fully linked. + * Now you might ask yourself "Why don't we just + * assume every server you get during link phase + * is fully linked?", well.. there's a race condition + * if 2 servers link (almost) at the same time, + * then you would think the other one is fully linked + * while in fact he was not.. -- Syzop. + */ + if (acptr->serv->flags.synced) + sendto_one(client, NULL, ":%s EOS", acptr->id); + /* Send SINFO of our servers to their side */ + broadcast_sinfo(acptr, client, NULL); + send_moddata_client(client, acptr); /* send moddata of server 'acptr' (if any, likely minimal) */ + } + } + + /* Synching nick information */ + list_for_each_entry_reverse(acptr, &client_list, client_node) + { + /* acptr->direction == acptr for acptr == client */ + if (acptr->direction == client) + continue; + if (IsUser(acptr)) + introduce_user(client, acptr); + } + /* + ** Last, pass all channels plus statuses + */ + { + Channel *channel; + for (channel = channels; channel; channel = channel->nextch) + { + send_channel_modes_sjoin3(client, channel); + if (channel->topic_time) + sendto_one(client, NULL, "TOPIC %s %s %lld :%s", + channel->name, channel->topic_nick, + (long long)channel->topic_time, channel->topic); + send_moddata_channel(client, channel); + } + } + + /* Send ModData for all member(ship) structs */ + send_moddata_members(client); + + /* pass on TKLs */ + tkl_sync(client); + + RunHook(HOOKTYPE_SERVER_SYNC, client); + + sendto_one(client, NULL, "NETINFO %i %lld %i %s 0 0 0 :%s", + irccounts.global_max, (long long)TStime(), UnrealProtocol, + CLOAK_KEYCRC, + ircnetwork); + + /* Send EOS (End Of Sync) to the just linked server... */ + sendto_one(client, NULL, ":%s EOS", me.id); + RunHook(HOOKTYPE_POST_SERVER_CONNECT, client); + return 0; +} + void tls_link_notification_verify(Client *acptr, ConfigItem_link *aconf) { char *spki_fp; @@ -1272,231 +1501,6 @@ void tls_link_notification_verify(Client *acptr, ConfigItem_link *aconf) } } -#define SafeStr(x) ((x && *(x)) ? (x) : "*") - -/** Broadcast SINFO. - * @param cptr The server to send the information about. - * @param to The server to send the information TO (NULL for broadcast). - * @param except The direction NOT to send to. - * This function takes into account that the server may not - * provide all of the detailed info. If any information is - * absent we will send 0 for numbers and * for NULL strings. - */ -void _broadcast_sinfo(Client *acptr, Client *to, Client *except) -{ - char chanmodes[128], buf[512]; - - if (acptr->serv->features.chanmodes[0]) - { - snprintf(chanmodes, sizeof(chanmodes), "%s,%s,%s,%s", - acptr->serv->features.chanmodes[0], - acptr->serv->features.chanmodes[1], - acptr->serv->features.chanmodes[2], - acptr->serv->features.chanmodes[3]); - } else { - strlcpy(chanmodes, "*", sizeof(chanmodes)); - } - - snprintf(buf, sizeof(buf), "%lld %d %s %s %s :%s", - (long long)acptr->serv->boottime, - acptr->serv->features.protocol, - SafeStr(acptr->serv->features.usermodes), - chanmodes, - SafeStr(acptr->serv->features.nickchars), - SafeStr(acptr->serv->features.software)); - - if (to) - { - /* Targetted to one server */ - sendto_one(to, NULL, ":%s SINFO %s", acptr->id, buf); - } else { - /* Broadcast (except one side...) */ - sendto_server(except, 0, 0, NULL, ":%s SINFO %s", acptr->id, buf); - } -} - -int server_sync(Client *cptr, ConfigItem_link *aconf) -{ - char *inpath = get_client_name(cptr, TRUE); - Client *acptr; - int incoming = IsUnknown(cptr) ? 1 : 0; - - ircd_log(LOG_SERVER, "SERVER %s", cptr->name); - - if (cptr->local->passwd) - { - safe_free(cptr->local->passwd); - cptr->local->passwd = NULL; - } - if (incoming) - { - /* If this is an incomming connection, then we have just received - * their stuff and now send our stuff back. - */ - if (!IsEAuth(cptr)) /* if eauth'd then we already sent the passwd */ - sendto_one(cptr, NULL, "PASS :%s", (aconf->auth->type == AUTHTYPE_PLAINTEXT) ? aconf->auth->data : "*"); - - send_proto(cptr, aconf); - send_server_message(cptr); - } - - /* Set up server structure */ - free_pending_net(cptr); - SetServer(cptr); - irccounts.me_servers++; - irccounts.servers++; - irccounts.unknown--; - list_move(&cptr->client_node, &global_server_list); - list_move(&cptr->lclient_node, &lclient_list); - list_add(&cptr->special_node, &server_list); - if (find_uline(cptr->name)) - { - if (cptr->serv && cptr->serv->features.software && !strncmp(cptr->serv->features.software, "UnrealIRCd-", 11)) - { - sendto_realops("\002WARNING:\002 Bad ulines! It seems your server is misconfigured: " - "your ulines { } block is matching an UnrealIRCd server (%s). " - "This is not correct and will cause security issues. " - "ULines should only be added for services! " - "See https://www.unrealircd.org/docs/FAQ#bad-ulines", - cptr->name); - } - SetULine(cptr); - } - find_or_add(cptr->name); - if (IsSecure(cptr)) - { - sendto_umode_global(UMODE_OPER, - "(\2link\2) Secure link %s -> %s established (%s)", - me.name, inpath, tls_get_cipher(cptr->local->ssl)); - tls_link_notification_verify(cptr, aconf); - } - else - { - sendto_umode_global(UMODE_OPER, - "(\2link\2) Link %s -> %s established", - me.name, inpath); - /* Print out a warning if linking to a non-TLS server unless it's localhost. - * Yeah.. there are still other cases when non-TLS links are fine (eg: local IP - * of the same machine), we won't bother with detecting that. -- Syzop - */ - if (!IsLocalhost(cptr) && (iConf.plaintext_policy_server == POLICY_WARN)) - { - sendto_realops("\002WARNING:\002 This link is unencrypted (not SSL/TLS). We highly recommend to use " - "SSL/TLS for server linking. See https://www.unrealircd.org/docs/Linking_servers"); - } - if (IsSecure(cptr) && (iConf.outdated_tls_policy_server == POLICY_WARN) && outdated_tls_client(cptr)) - { - sendto_realops("\002WARNING:\002 This link is using an outdated SSL/TLS protocol or cipher (%s).", - tls_get_cipher(cptr->local->ssl)); - } - } - add_to_client_hash_table(cptr->name, cptr); - /* doesnt duplicate cptr->serv if allocted this struct already */ - make_server(cptr); - cptr->serv->up = me.name; - cptr->srvptr = &me; - if (!cptr->serv->conf) - cptr->serv->conf = aconf; /* Only set serv->conf to aconf if not set already! Bug #0003913 */ - if (incoming) - cptr->serv->conf->refcount++; - cptr->serv->conf->class->clients++; - cptr->local->class = cptr->serv->conf->class; - RunHook(HOOKTYPE_SERVER_CONNECT, cptr); - - /* Broadcast new server to the rest of the network */ - sendto_server(cptr, 0, 0, NULL, ":%s SID %s 2 %s :%s", - cptr->srvptr->id, cptr->name, cptr->id, cptr->info); - - /* Broadcast the just-linked-in featureset to other servers on our side */ - broadcast_sinfo(cptr, NULL, cptr); - - /* Send moddata of &me (if any, likely minimal) */ - send_moddata_client(cptr, &me); - - list_for_each_entry_reverse(acptr, &global_server_list, client_node) - { - /* acptr->direction == acptr for acptr == cptr */ - if (acptr->direction == cptr) - continue; - - if (IsServer(acptr)) - { - sendto_one(cptr, NULL, ":%s SID %s %d %s :%s", - acptr->srvptr->id, - acptr->name, acptr->hopcount + 1, - acptr->id, acptr->info); - - /* Also signal to the just-linked server which - * servers are fully linked. - * Now you might ask yourself "Why don't we just - * assume every server you get during link phase - * is fully linked?", well.. there's a race condition - * if 2 servers link (almost) at the same time, - * then you would think the other one is fully linked - * while in fact he was not.. -- Syzop. - */ - if (acptr->serv->flags.synced) - { - sendto_one(cptr, NULL, ":%s EOS", acptr->id); -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[EOSDBG] server_sync: sending to uplink '%s' with src %s...", - cptr->name, acptr->name); -#endif - } - /* Send SINFO of our servers to their side */ - broadcast_sinfo(acptr, cptr, NULL); - send_moddata_client(cptr, acptr); /* send moddata of server 'acptr' (if any, likely minimal) */ - } - } - - /* Synching nick information */ - list_for_each_entry_reverse(acptr, &client_list, client_node) - { - /* acptr->direction == acptr for acptr == cptr */ - if (acptr->direction == cptr) - continue; - if (IsUser(acptr)) - introduce_user(cptr, acptr); - } - /* - ** Last, pass all channels plus statuses - */ - { - Channel *channel; - for (channel = channels; channel; channel = channel->nextch) - { - send_channel_modes_sjoin3(cptr, channel); - if (channel->topic_time) - sendto_one(cptr, NULL, "TOPIC %s %s %lld :%s", - channel->chname, channel->topic_nick, - (long long)channel->topic_time, channel->topic); - send_moddata_channel(cptr, channel); - } - } - - /* Send ModData for all member(ship) structs */ - send_moddata_members(cptr); - - /* pass on TKLs */ - tkl_sync(cptr); - - RunHook(HOOKTYPE_SERVER_SYNC, cptr); - - sendto_one(cptr, NULL, "NETINFO %i %lld %i %s 0 0 0 :%s", - irccounts.global_max, (long long)TStime(), UnrealProtocol, - CLOAK_KEYCRC, - ircnetwork); - - /* Send EOS (End Of Sync) to the just linked server... */ - sendto_one(cptr, NULL, ":%s EOS", me.id); -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[EOSDBG] server_sync: sending to justlinked '%s' with src ME...", - cptr->name); -#endif - RunHook(HOOKTYPE_POST_SERVER_CONNECT, cptr); - return 0; -} - /** This will send "to" a full list of the modes for channel channel, * * Half of it recoded by Syzop: the whole buffering and size checking stuff @@ -1517,7 +1521,7 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) int prebuflen = 0; /* points to after the > : part */ int sent = 0; /* we need this so we send at least 1 message about the channel (eg if +P and no members, no bans, #4459) */ - if (*channel->chname != '#') + if (*channel->name != '#') return; nomode = 0; @@ -1546,19 +1550,19 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) { ircsnprintf(buf, sizeof(buf), ":%s SJOIN %lld %s :", me.id, - (long long)channel->creationtime, channel->chname); + (long long)channel->creationtime, channel->name); } if (nopara && !nomode) { ircsnprintf(buf, sizeof(buf), ":%s SJOIN %lld %s %s :", me.id, - (long long)channel->creationtime, channel->chname, modebuf); + (long long)channel->creationtime, channel->name, modebuf); } if (!nopara && !nomode) { ircsnprintf(buf, sizeof(buf), ":%s SJOIN %lld %s %s %s :", me.id, - (long long)channel->creationtime, channel->chname, modebuf, parabuf); + (long long)channel->creationtime, channel->name, modebuf, parabuf); } prebuflen = strlen(buf); diff --git a/src/modules/sjoin.c b/src/modules/sjoin.c index 429c050ad..c59eea056 100644 --- a/src/modules/sjoin.c +++ b/src/modules/sjoin.c @@ -82,9 +82,9 @@ void send_local_chan_mode(MessageTag *recv_mtags, Client *client, Channel *chann { MessageTag *mtags = NULL; - new_message_special(client, recv_mtags, &mtags, ":%s MODE %s %s %s", client->name, channel->chname, modebuf, parabuf); + new_message_special(client, recv_mtags, &mtags, ":%s MODE %s %s %s", client->name, channel->name, modebuf, parabuf); sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s MODE %s %s %s", client->name, channel->chname, modebuf, parabuf); + ":%s MODE %s %s %s", client->name, channel->name, modebuf, parabuf); if (MyConnect(client)) RunHook7(HOOKTYPE_LOCAL_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, -1); else @@ -178,10 +178,16 @@ CMD_FUNC(cmd_sjoin) if (parc < 5) nomode = 1; - channel = get_channel(client, parv[2], CREATE); - ts = (time_t)atol(parv[1]); + channel = find_channel(parv[2]); + if (!channel) + { + channel = make_channel(parv[2]); + channel->creationtime = ts; + oldts = -1; + } + if (channel->creationtime > ts) { removeours = 1; @@ -197,12 +203,7 @@ CMD_FUNC(cmd_sjoin) merge = 1; } - if (channel->creationtime == 0) - { - oldts = -1; - channel->creationtime = ts; - } - else + if (channel->creationtime > 0) { oldts = channel->creationtime; } @@ -213,7 +214,7 @@ CMD_FUNC(cmd_sjoin) if (ts != 0) sendto_ops ("Warning! Possible desync: SJOIN for channel %s has a fishy timestamp (%lld) [%s/%s]", - channel->chname, (long long)ts, client->name, client->direction->name); + channel->name, (long long)ts, client->name, client->direction->name); } parabuf[0] = '\0'; @@ -366,7 +367,7 @@ CMD_FUNC(cmd_sjoin) { /* this obviously should never happen */ sendto_ops("Malformed SJOIN piece from %s for channel %s: %s", - client->name, channel->chname, tp); + client->name, channel->name, tp); continue; } *end++ = '\0'; @@ -376,7 +377,7 @@ CMD_FUNC(cmd_sjoin) { /* missing setby parameter */ sendto_ops("Malformed SJOIN piece from %s for channel %s: %s", - client->name, channel->chname, tp); + client->name, channel->name, tp); continue; } *p++ = '\0'; @@ -485,11 +486,11 @@ getnick: sendto_one(client, NULL, ":%s KICK %s %s :Fake direction", - me.id, channel->chname, acptr->name); + me.id, channel->name, acptr->name); sendto_realops ("Fake direction from user %s in SJOIN from %s(%s) at %s", nick, client->srvptr->name, - client->name, channel->chname); + client->name, channel->name); continue; } @@ -506,7 +507,7 @@ getnick: add_user_to_channel(channel, acptr, modeflags); RunHook4(HOOKTYPE_REMOTE_JOIN, acptr, channel, recv_mtags, NULL); - new_message_special(acptr, recv_mtags, &mtags, ":%s JOIN %s", acptr->name, channel->chname); + new_message_special(acptr, recv_mtags, &mtags, ":%s JOIN %s", acptr->name, channel->name); send_join_to_local_users(acptr, channel, mtags); free_message_tags(mtags); } @@ -527,7 +528,7 @@ getnick: { ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s%s'", uid_buf, prefix, acptr->id); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->name); continue; } } @@ -543,7 +544,7 @@ getnick: { ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s%s'", uid_sjsby_buf, prefix, acptr->id); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->name); continue; } } @@ -602,7 +603,7 @@ getnick: { ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s%s'", uid_buf, prefix, nick); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->name); continue; } } @@ -623,7 +624,7 @@ getnick: if (strlen(uid_sjsby_buf) + strlen(scratch_buf) > BUFSIZE - 5) { ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s'", uid_sjsby_buf, scratch_buf); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->name); continue; } } @@ -886,7 +887,7 @@ getnick: new_message(client, NULL, &mtags); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, NULL, ":%s NOTICE %s :*** TS for %s changed from %lld to %lld", - me.name, channel->chname, channel->chname, + me.name, channel->name, channel->name, (long long)oldts, (long long)channel->creationtime); free_message_tags(mtags); } diff --git a/src/modules/stats.c b/src/modules/stats.c index 5520b14fc..d05d024cf 100644 --- a/src/modules/stats.c +++ b/src/modules/stats.c @@ -776,7 +776,7 @@ int stats_officialchannels(Client *client, char *para) for (x = conf_offchans; x; x = x->next) { - sendtxtnumeric(client, "%s %s", x->chname, x->topic ? x->topic : ""); + sendtxtnumeric(client, "%s %s", x->name, x->topic ? x->topic : ""); } return 0; } diff --git a/src/modules/svsmode.c b/src/modules/svsmode.c index 3f282218c..55548d50b 100644 --- a/src/modules/svsmode.c +++ b/src/modules/svsmode.c @@ -210,7 +210,7 @@ void channel_svsmode(Client *client, int parc, char *parv[]) if ((parc < 3) || BadPtr(parv[2])) return; - if (!(channel = find_channel(parv[1], NULL))) + if (!(channel = find_channel(parv[1]))) return; for(m = parv[2]; *m; m++) @@ -231,7 +231,7 @@ void channel_svsmode(Client *client, int parc, char *parv[]) if (what != MODE_DEL) { sendto_realops("Warning! Received SVS(2)MODE with +%c for %s from %s, which is invalid!!", - *m, channel->chname, client->name); + *m, channel->name, client->name); continue; } channel_flags = char_to_channelflag(*m); @@ -268,7 +268,7 @@ void channel_svsmode(Client *client, int parc, char *parv[]) break; default: sendto_realops("Warning! Invalid mode `%c' used with 'SVSMODE %s %s %s' (from %s %s)", - *m, channel->chname, parv[2], parv[3] ? parv[3] : "", + *m, channel->name, parv[2], parv[3] ? parv[3] : "", client->direction->name, client->name); break; } @@ -283,8 +283,8 @@ void channel_svsmode(Client *client, int parc, char *parv[]) sendto_channel(channel, client, client, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", - client->name, channel->chname, modebuf, parabuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", client->id, channel->chname, modebuf, parabuf); + client->name, channel->name, modebuf, parabuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", client->id, channel->name, modebuf, parabuf); /* Activate this hook just like cmd_mode.c */ RunHook7(HOOKTYPE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, 0); @@ -598,8 +598,8 @@ void add_send_mode_param(Channel *channel, Client *from, char what, char mode, c new_message(from, NULL, &mtags); sendto_channel(channel, from, from, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", - from->name, channel->chname, modebuf, parabuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", from->id, channel->chname, modebuf, parabuf); + from->name, channel->name, modebuf, parabuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", from->id, channel->name, modebuf, parabuf); free_message_tags(mtags); send = 0; *parabuf = 0; diff --git a/src/modules/tkl.c b/src/modules/tkl.c index 1e3ce21fd..ba370cd12 100644 --- a/src/modules/tkl.c +++ b/src/modules/tkl.c @@ -55,6 +55,7 @@ char _tkl_typetochar(int type); int _tkl_chartotype(char c); int tkl_banexception_chartotype(char c); char *_tkl_type_string(TKL *tk); +char *_tkl_type_config_string(TKL *tk); char *tkl_banexception_configname_to_chars(char *name); TKL *_tkl_add_serverban(int type, char *usermask, char *hostmask, char *reason, char *set_by, time_t expire_at, time_t set_at, int soft, int flags); @@ -71,6 +72,7 @@ void _sendnotice_tkl_add(TKL *tkl); void _free_tkl(TKL *tkl); void _tkl_del_line(TKL *tkl); static void _tkl_check_local_remove_shun(TKL *tmp); +char *_tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options); void tkl_expire_entry(TKL * tmp); EVENT(tkl_check_expire); int _find_tkline_match(Client *client, int skip_soft); @@ -161,6 +163,7 @@ MOD_TEST() EfunctionAdd(modinfo->handle, EFUNC_TKL_TYPETOCHAR, TO_INTFUNC(_tkl_typetochar)); EfunctionAdd(modinfo->handle, EFUNC_TKL_CHARTOTYPE, TO_INTFUNC(_tkl_chartotype)); EfunctionAddPChar(modinfo->handle, EFUNC_TKL_TYPE_STRING, _tkl_type_string); + EfunctionAddPChar(modinfo->handle, EFUNC_TKL_TYPE_CONFIG_STRING, _tkl_type_config_string); EfunctionAddPVoid(modinfo->handle, EFUNC_TKL_ADD_SERVERBAN, TO_PVOIDFUNC(_tkl_add_serverban)); EfunctionAddPVoid(modinfo->handle, EFUNC_TKL_ADD_BANEXCEPTION, TO_PVOIDFUNC(_tkl_add_banexception)); EfunctionAddPVoid(modinfo->handle, EFUNC_TKL_ADD_NAMEBAN, TO_PVOIDFUNC(_tkl_add_nameban)); @@ -191,6 +194,7 @@ MOD_TEST() EfunctionAddVoid(modinfo->handle, EFUNC_SENDNOTICE_TKL_ADD, _sendnotice_tkl_add); EfunctionAddVoid(modinfo->handle, EFUNC_SENDNOTICE_TKL_DEL, _sendnotice_tkl_del); EfunctionAdd(modinfo->handle, EFUNC_FIND_TKL_EXCEPTION, _find_tkl_exception); + EfunctionAddPChar(modinfo->handle, EFUNC_TKL_UHOST, _tkl_uhost); return MOD_SUCCESS; } @@ -2123,8 +2127,9 @@ int _tkl_hash(unsigned int c) else if ((c >= 'A') && (c <= 'Z')) return c-'A'; else { - sendto_realops("[BUG] tkl_hash() called with out of range parameter (c = '%c') !!!", c); - ircd_log(LOG_ERROR, "[BUG] tkl_hash() called with out of range parameter (c = '%c') !!!", c); + unreal_log(ULOG_ERROR, "bug", "TKL_HASH_INVALID", NULL, + "tkl_hash() called with out of range parameter (c = '$tkl_char') !!!", + log_data_char("tkl_char", c)); return 0; } #else @@ -2141,8 +2146,9 @@ char _tkl_typetochar(int type) for (i=0; tkl_types[i].config_name; i++) if ((tkl_types[i].type == type) && tkl_types[i].tkltype) return tkl_types[i].letter; - sendto_realops("[BUG]: tkl_typetochar(): unknown type 0x%x !!!", type); - ircd_log(LOG_ERROR, "[BUG] tkl_typetochar(): unknown type 0x%x !!!", type); + unreal_log(ULOG_ERROR, "bug", "TKL_TYPETOCHAR_INVALID", NULL, + "tkl_typetochar(): unknown type $tkl_type!!!", + log_data_integer("tkl_type", type)); return 0; } @@ -2201,13 +2207,13 @@ char *tkl_banexception_configname_to_chars(char *name) char *_tkl_type_string(TKL *tkl) { static char txt[256]; + int i; *txt = '\0'; if (TKLIsServerBan(tkl) && (tkl->ptr.serverban->subtype == TKL_SUBTYPE_SOFT)) strlcpy(txt, "Soft ", sizeof(txt)); - int i; for (i=0; tkl_types[i].config_name; i++) { if ((tkl_types[i].type == tkl->type) && tkl_types[i].tkltype) @@ -2221,6 +2227,18 @@ char *_tkl_type_string(TKL *tkl) return txt; } +/** Short config string, lowercase alnum with possibly hyphens (eg: 'kline') */ +char *_tkl_type_config_string(TKL *tkl) +{ + int i; + + for (i=0; tkl_types[i].config_name; i++) + if ((tkl_types[i].type == tkl->type) && tkl_types[i].tkltype) + return tkl_types[i].config_name; + + return "???"; +} + int tkl_banexception_matches_type(TKL *except, int bantype) { char *p; @@ -2746,7 +2764,7 @@ void _tkl_check_local_remove_shun(TKL *tmp) * that can be used in oper notices like expiring kline, added kline, etc. */ #define NO_SOFT_PREFIX 1 -char *tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options) +char *_tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options) { if (TKLIsServerBan(tkl)) { @@ -2784,56 +2802,29 @@ char *tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options) */ void tkl_expire_entry(TKL *tkl) { - char *whattype = tkl_type_string(tkl); - - if (!tkl) - return; - - if (tkl->type & TKL_SPAMF) - { - /* Impossible */ - } else if (TKLIsServerBan(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - sendto_snomask(SNO_TKL, - "*** Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->set_by, tkl->ptr.serverban->reason, - (long long)(TStime() - tkl->set_at)); - ircd_log - (LOG_TKL, "Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->set_by, tkl->ptr.serverban->reason, - (long long)(TStime() - tkl->set_at)); + unreal_log(ULOG_INFO, "tkl", "TKL_EXPIRE", NULL, + "Expiring $tkl.type_string '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] set $tkl.set_at_delta seconds ago", + log_data_tkl("tkl", tkl)); } else if (TKLIsNameBan(tkl)) { if (!tkl->ptr.nameban->hold) { - sendto_snomask(SNO_TKL, - "*** Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, tkl->ptr.nameban->name, tkl->set_by, tkl->ptr.nameban->reason, - (long long)(TStime() - tkl->set_at)); - ircd_log - (LOG_TKL, "Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, tkl->ptr.nameban->name, tkl->set_by, tkl->ptr.nameban->reason, - (long long)(TStime() - tkl->set_at)); + unreal_log(ULOG_INFO, "tkl", "TKL_EXPIRE", NULL, + "Expiring $tkl.type_string '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] set $tkl.set_at_delta seconds ago", + log_data_tkl("tkl", tkl)); } } else if (TKLIsBanException(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - sendto_snomask(SNO_TKL, - "*** Expiring %s (%s) for types '%s' made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->ptr.banexception->bantypes, tkl->set_by, tkl->ptr.banexception->reason, - (long long)(TStime() - tkl->set_at)); - ircd_log - (LOG_TKL, "Expiring %s (%s) for types '%s' made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->ptr.banexception->bantypes, tkl->set_by, tkl->ptr.banexception->reason, - (long long)(TStime() - tkl->set_at)); + unreal_log(ULOG_INFO, "tkl", "TKL_EXPIRE", NULL, + "Expiring $tkl.type_string '$tkl' [type: $tkl.exception_types] [reason: $tkl.reason] [by: $tkl.set_by] set $tkl.set_at_delta seconds ago", + log_data_tkl("tkl", tkl)); } + // FIXME: so.. this isn't logged? or what? if (tkl->type & TKL_SHUN) tkl_check_local_remove_shun(tkl); @@ -3161,14 +3152,12 @@ int spamfilter_check_users(TKL *tkl) continue; /* No match */ /* matched! */ - ircsnprintf(buf, sizeof(buf), "[Spamfilter] %s!%s@%s matches filter '%s': [%s: '%s'] [%s]", - client->name, client->user->username, client->user->realhost, - tkl->ptr.spamfilter->match->str, - "user", spamfilter_user, - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); + unreal_log(ULOG_INFO, "tkl", "SPAMFILTER_MATCH", client, + "[Spamfilter] $client.nuh matches filter '$tkl': [cmd: $command: '$str'] [reason: $tkl.reason] [action: $tkl.ban_action]", + log_data_tkl("tkl", tkl), + log_data_string("command", "USER"), + log_data_string("str", spamfilter_user)); - sendto_snomask_global(SNO_SPAMF, "%s", buf); - ircd_log(LOG_SPAMFILTER, "%s", buf); RunHook6(HOOKTYPE_LOCAL_SPAMFILTER, client, spamfilter_user, spamfilter_user, SPAMF_USER, NULL, tkl); matches++; } @@ -3177,36 +3166,6 @@ int spamfilter_check_users(TKL *tkl) return matches; } -/** Similarly to previous, but match against all global users. - * FUNCTION IS UNUSED !! - */ -int spamfilter_check_all_users(Client *from, TKL *tkl) -{ - char spamfilter_user[NICKLEN + USERLEN + HOSTLEN + REALLEN + 64]; /* n!u@h:r */ - int matches = 0; - Client *acptr; - - list_for_each_entry(acptr, &client_list, client_node) - { - if (IsUser(acptr)) - { - spamfilter_build_user_string(spamfilter_user, acptr->name, acptr); - if (!unreal_match(tkl->ptr.spamfilter->match, spamfilter_user)) - continue; /* No match */ - - /* matched! */ - sendnotice(from, "[Spamfilter] %s!%s@%s matches filter '%s': [%s: '%s'] [%s]", - acptr->name, acptr->user->username, acptr->user->realhost, - tkl->ptr.spamfilter->match->str, - "user", spamfilter_user, - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); - matches++; - } - } - - return matches; -} - /** Check if the nick or channel name is banned (Q-Line). * @param client The possibly affected user. * @param name The nick or channel to check. @@ -3827,66 +3786,32 @@ void _sendnotice_tkl_add(TKL *tkl) if (TKLIsServerBan(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - if (tkl->expire_at != 0) - { - ircsnprintf(buf, sizeof(buf), "%s added for %s on %s GMT (from %s to expire at %s GMT: %s)", - tkl_type_str, uhost, - set_at, tkl->set_by, expire_at, tkl->ptr.serverban->reason); - } else { - ircsnprintf(buf, sizeof(buf), "Permanent %s added for %s on %s GMT (from %s: %s)", - tkl_type_str, uhost, - set_at, tkl->set_by, tkl->ptr.serverban->reason); - } + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "$tkl.type_string added: '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] [expires: $tkl.expire_at_string]", + log_data_tkl("tkl", tkl)); } else if (TKLIsNameBan(tkl)) { - if (tkl->expire_at > 0) - { - ircsnprintf(buf, sizeof(buf), "%s added for %s on %s GMT (from %s to expire at %s GMT: %s)", - tkl_type_str, tkl->ptr.nameban->name, set_at, tkl->set_by, expire_at, tkl->ptr.nameban->reason); - } else { - ircsnprintf(buf, sizeof(buf), "Permanent %s added for %s on %s GMT (from %s: %s)", - tkl_type_str, tkl->ptr.nameban->name, set_at, tkl->set_by, tkl->ptr.nameban->reason); - } + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "$tkl.type_string added: '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] [expires: $tkl.expire_at_string]", + log_data_tkl("tkl", tkl)); } else if (TKLIsSpamfilter(tkl)) { - /* Spamfilter */ - ircsnprintf(buf, sizeof(buf), - "Spamfilter added: '%s' [type: %s] [target: %s] [action: %s] [reason: %s] on %s GMT (from %s)", - tkl->ptr.spamfilter->match->str, - unreal_match_method_valtostr(tkl->ptr.spamfilter->match->type), - spamfilter_target_inttostring(tkl->ptr.spamfilter->target), - banact_valtostring(tkl->ptr.spamfilter->action), - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason), - set_at, - tkl->set_by); + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "Spamfilter added: '$tkl' [type: $tkl.match_type] [targets: $tkl.spamfilter_targets] " + "[action: $tkl.ban_action] [reason: $tkl.reason] [by: $tkl.set_by]", + log_data_tkl("tkl", tkl)); } else if (TKLIsBanException(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - if (tkl->expire_at != 0) - { - ircsnprintf(buf, sizeof(buf), "%s added for %s for types '%s' on %s GMT (from %s to expire at %s GMT: %s)", - tkl_type_str, uhost, - tkl->ptr.banexception->bantypes, - set_at, tkl->set_by, expire_at, tkl->ptr.banexception->reason); - } else { - ircsnprintf(buf, sizeof(buf), "Permanent %s added for %s for types '%s' on %s GMT (from %s: %s)", - tkl_type_str, uhost, - tkl->ptr.banexception->bantypes, - set_at, tkl->set_by, tkl->ptr.banexception->reason); - } + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "$tkl.type_string added: '$tkl' [types: $tkl.exception_types] [by: $tkl.set_by] [expires: $tkl.expire_at_string]", + log_data_tkl("tkl", tkl)); } else { ircsnprintf(buf, sizeof(buf), "[BUG] %s added but type unhandled in sendnotice_tkl_add()!!!", tkl_type_str); } - - sendto_snomask(SNO_TKL, "*** %s", buf); - ircd_log(LOG_TKL, "%s", buf); } /** Send a notice to opers about the TKL that is being deleted */ @@ -3907,40 +3832,36 @@ void _sendnotice_tkl_del(char *removed_by, TKL *tkl) if (TKLIsServerBan(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - ircsnprintf(buf, sizeof(buf), - "%s removed %s %s (set at %s - reason: %s)", - removed_by, tkl_type_str, uhost, - set_at, tkl->ptr.serverban->reason); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "$tkl.type_string removed: '$tkl' [reason: $tkl.reason] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else if (TKLIsNameBan(tkl)) { - ircsnprintf(buf, sizeof(buf), - "%s removed %s %s (set at %s - reason: %s)", - removed_by, tkl_type_str, tkl->ptr.nameban->name, set_at, tkl->ptr.nameban->reason); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "$tkl.type_string removed: '$tkl' [reason: $tkl.reason] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else if (TKLIsSpamfilter(tkl)) { - ircsnprintf(buf, sizeof(buf), - "%s removed Spamfilter '%s' (set at %s)", - removed_by, tkl->ptr.spamfilter->match->str, set_at); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "Spamfilter removed: '$tkl' [type: $tkl.match_type] [targets: $tkl.spamfilter_targets] " + "[action: $tkl.ban_action] [reason: $tkl.reason] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else if (TKLIsBanException(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - ircsnprintf(buf, sizeof(buf), - "%s removed exception on %s (set at %s - reason: %s)", - removed_by, uhost, - set_at, tkl->ptr.banexception->reason); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "$tkl.type_string removed: '$tkl' [types: $tkl.exception_types] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else { ircsnprintf(buf, sizeof(buf), "[BUG] %s added but type unhandled in sendnotice_tkl_del()!!!!!", tkl_type_str); } - - sendto_snomask(SNO_TKL, "*** %s", buf); - ircd_log(LOG_TKL, "%s", buf); } /** Add a TKL using the TKL layer. See cmd_tkl for parv[] and protocol documentation. */ @@ -4656,11 +4577,11 @@ int _join_viruschan(Client *client, TKL *tkl, int type) sendnotice(client, "You are now restricted to talking in %s: %s", SPAMFILTER_VIRUSCHAN, unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); - channel = find_channel(SPAMFILTER_VIRUSCHAN, NULL); + channel = find_channel(SPAMFILTER_VIRUSCHAN); if (channel) { MessageTag *mtags = NULL; - ircsnprintf(chbuf, sizeof(chbuf), "@%s", channel->chname); + ircsnprintf(chbuf, sizeof(chbuf), "@%s", channel->name); ircsnprintf(buf, sizeof(buf), "[Spamfilter] %s matched filter '%s' [%s] [%s]", client->name, tkl->ptr.spamfilter->match->str, cmdname_by_spamftarget(type), unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); @@ -4751,22 +4672,26 @@ int _match_spamfilter(Client *client, char *str_in, int target, char *cmd, char if ((SPAMFILTER_DETECTSLOW_FATAL > 0) && (ms_past > SPAMFILTER_DETECTSLOW_FATAL)) { - sendto_realops("[Spamfilter] WARNING: Too slow spamfilter detected (took %ld msec to execute) " - "-- spamfilter will be \002REMOVED!\002: %s", ms_past, tkl->ptr.spamfilter->match->str); + unreal_log(ULOG_ERROR, "tkl", "SPAMFILTER_SLOW_FATAL", NULL, + "[Spamfilter] WARNING: Too slow spamfilter detected (took $msec_time msec to execute) " + "-- spamfilter will be \002REMOVED!\002: $tkl", + log_data_tkl("tkl", tkl), + log_data_integer("msec_time", ms_past)); tkl_del_line(tkl); return 0; /* Act as if it didn't match, even if it did.. it's gone now anyway.. */ } else if ((SPAMFILTER_DETECTSLOW_WARN > 0) && (ms_past > SPAMFILTER_DETECTSLOW_WARN)) { - sendto_realops("[Spamfilter] WARNING: SLOW Spamfilter detected (took %ld msec to execute): %s", - ms_past, tkl->ptr.spamfilter->match->str); + unreal_log(ULOG_WARNING, "tkl", "SPAMFILTER_SLOW_WARN", NULL, + "[Spamfilter] WARNING: Slow spamfilter detected (took $msec_time msec to execute): $tkl", + log_data_tkl("tkl", tkl), + log_data_integer("msec_time", ms_past)); } #endif if (ret) { /* We have a match! */ - char buf[1024]; char destinationbuf[48]; if (destination) { @@ -4779,14 +4704,13 @@ int _match_spamfilter(Client *client, char *str_in, int target, char *cmd, char if (!winner_tkl && destination && target_is_spamexcept(destination)) return 0; /* No problem! */ - ircsnprintf(buf, sizeof(buf), "[Spamfilter] %s!%s@%s matches filter '%s': [%s%s: '%s'] [%s]", - client->name, client->user->username, client->user->realhost, - tkl->ptr.spamfilter->match->str, - cmd, destinationbuf, str, - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); + unreal_log(ULOG_INFO, "tkl", "SPAMFILTER_MATCH", client, + "[Spamfilter] $client.nuh matches filter '$tkl': [cmd: $command$destination: '$str'] [reason: $tkl.reason] [action: $tkl.ban_action]", + log_data_tkl("tkl", tkl), + log_data_string("command", cmd), + log_data_string("destination", destinationbuf), + log_data_string("str", str)); - sendto_snomask_global(SNO_SPAMF, "%s", buf); - ircd_log(LOG_SPAMFILTER, "%s", buf); RunHook6(HOOKTYPE_LOCAL_SPAMFILTER, client, str, str_in, target, destination, tkl); /* If we should stop after the first match, we end here... */ diff --git a/src/modules/tkldb.c b/src/modules/tkldb.c index 57a22745b..4356315e6 100644 --- a/src/modules/tkldb.c +++ b/src/modules/tkldb.c @@ -38,8 +38,7 @@ ModuleHeader MOD_HEADER = { */ #define TKLDB_SAVE_EVERY_DELTA +15 -#ifdef DEBUGMODE - #define BENCHMARK +// #undef BENCHMARK /* Benchmark results (2GHz Xeon Skylake, compiled with -O2, Linux): * 100,000 zlines: * - load db: 510 ms @@ -48,7 +47,6 @@ ModuleHeader MOD_HEADER = { * which executes every 5 minutes. * Of course, exact figures will depend on the machine. */ -#endif #define FreeTKLRead() \ do { \ diff --git a/src/modules/tls_antidos.c b/src/modules/tls_antidos.c index 03615cdad..52372570d 100644 --- a/src/modules/tls_antidos.c +++ b/src/modules/tls_antidos.c @@ -81,8 +81,7 @@ void ssl_info_callback(const SSL *ssl, int where, int ret) e->n++; if (e->n >= HANDSHAKE_LIMIT_COUNT) { - ircd_log(LOG_ERROR, "TLS Handshake flood detected from %s -- killed", get_client_name(client, TRUE)); - sendto_realops("TLS Handshake flood detected from %s -- killed", get_client_name(client, TRUE)); + unreal_log(LOG_INFO, "flood", "TLS_HANDSHAKE_FLOOD", client, "TLS Handshake flood detected from $client -- killed"); dead_socket(client, "TLS Handshake flood detected"); } } diff --git a/src/modules/topic.c b/src/modules/topic.c index 309de5d6d..49fdb83d9 100644 --- a/src/modules/topic.c +++ b/src/modules/topic.c @@ -57,12 +57,12 @@ void topicoverride(Client *client, Channel *channel, char *topic) sendto_snomask(SNO_EYES, "*** OperOverride -- %s (%s@%s) TOPIC %s \'%s\'", client->name, client->user->username, client->user->realhost, - channel->chname, topic); + channel->name, topic); /* Logging implementation added by XeRXeS */ ircd_log(LOG_OVERRIDE, "OVERRIDE: %s (%s@%s) TOPIC %s \'%s\'", client->name, client->user->username, client->user->realhost, - channel->chname, topic); + channel->name, topic); } /** Query or change the channel topic. @@ -97,7 +97,7 @@ CMD_FUNC(cmd_topic) name = parv[1]; - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, name); @@ -149,12 +149,12 @@ CMD_FUNC(cmd_topic) } if (!channel->topic) - sendnumeric(client, RPL_NOTOPIC, channel->chname); + sendnumeric(client, RPL_NOTOPIC, channel->name); else { sendnumeric(client, RPL_TOPIC, - channel->chname, channel->topic); - sendnumeric(client, RPL_TOPICWHOTIME, channel->chname, + channel->name, channel->topic); + sendnumeric(client, RPL_TOPICWHOTIME, channel->name, channel->topic_nick, channel->topic_time); } return; @@ -175,11 +175,11 @@ CMD_FUNC(cmd_topic) new_message(client, recv_mtags, &mtags); RunHook4(HOOKTYPE_TOPIC, client, channel, mtags, topic); sendto_server(client, 0, 0, mtags, ":%s TOPIC %s %s %lld :%s", - client->id, channel->chname, channel->topic_nick, + client->id, channel->name, channel->topic_nick, (long long)channel->topic_time, channel->topic); sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s TOPIC %s :%s", - client->name, channel->chname, channel->topic); + client->name, channel->name, channel->topic); free_message_tags(mtags); } return; @@ -196,7 +196,7 @@ CMD_FUNC(cmd_topic) { if (MyUser(client) && !ValidatePermissionsForPath("channel:override:topic", client, NULL, channel, NULL)) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } topicoverride(client, channel, topic); @@ -211,7 +211,7 @@ CMD_FUNC(cmd_topic) if (MyUser(client) && !ValidatePermissionsForPath("channel:override:topic", client, NULL, channel, NULL)) { - ircsnprintf(buf, sizeof(buf), "You cannot change the topic on %s while being banned", channel->chname); + ircsnprintf(buf, sizeof(buf), "You cannot change the topic on %s while being banned", channel->name); sendnumeric(client, ERR_CANNOTDOCOMMAND, "TOPIC", buf); return; } @@ -230,7 +230,7 @@ CMD_FUNC(cmd_topic) topicoverride(client, channel, topic); } else { /* With +m and -t, only voice and higher may change the topic */ - ircsnprintf(buf, sizeof(buf), "Voice (+v) or higher is required in order to change the topic on %s (channel is +m)", channel->chname); + ircsnprintf(buf, sizeof(buf), "Voice (+v) or higher is required in order to change the topic on %s (channel is +m)", channel->name); sendnumeric(client, ERR_CANNOTDOCOMMAND, "TOPIC", buf); return; } @@ -242,7 +242,7 @@ CMD_FUNC(cmd_topic) Hook *tmphook; int n; - if (match_spamfilter(client, topic, SPAMF_TOPIC, "TOPIC", channel->chname, 0, NULL)) + if (match_spamfilter(client, topic, SPAMF_TOPIC, "TOPIC", channel->name, 0, NULL)) return; for (tmphook = Hooks[HOOKTYPE_PRE_LOCAL_TOPIC]; tmphook; tmphook = tmphook->next) { @@ -272,10 +272,10 @@ CMD_FUNC(cmd_topic) new_message(client, recv_mtags, &mtags); RunHook4(HOOKTYPE_TOPIC, client, channel, mtags, topic); sendto_server(client, 0, 0, mtags, ":%s TOPIC %s %s %lld :%s", - client->id, channel->chname, channel->topic_nick, + client->id, channel->name, channel->topic_nick, (long long)channel->topic_time, channel->topic); sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s TOPIC %s :%s", - client->name, channel->chname, channel->topic); + client->name, channel->name, channel->topic); free_message_tags(mtags); } diff --git a/src/modules/usermodes/nokick.c b/src/modules/usermodes/nokick.c index 7ea2440d6..6e218b9b1 100644 --- a/src/modules/usermodes/nokick.c +++ b/src/modules/usermodes/nokick.c @@ -91,7 +91,7 @@ int nokick_can_kick(Client *client, Client *target, Channel *channel, char *comm sendnotice(target, "*** umode q: %s tried to kick you from channel %s (%s)", - client->name, channel->chname, comment); + client->name, channel->name, comment); return EX_ALWAYS_DENY; } diff --git a/src/modules/who_old.c b/src/modules/who_old.c index 92acda147..2308cf708 100644 --- a/src/modules/who_old.c +++ b/src/modules/who_old.c @@ -155,7 +155,7 @@ CMD_FUNC(cmd_who) return; } - if ((target_channel = find_channel(mask, NULL)) != NULL) + if ((target_channel = find_channel(mask)) != NULL) { do_channel_who(client, target_channel, mask); sendnumeric(client, RPL_ENDOFWHO, mask); @@ -163,7 +163,7 @@ CMD_FUNC(cmd_who) } if (wfl.channel && wfl.want_channel == WHO_WANT && - (target_channel = find_channel(wfl.channel, NULL)) != NULL) + (target_channel = find_channel(wfl.channel)) != NULL) { do_channel_who(client, target_channel, mask); sendnumeric(client, RPL_ENDOFWHO, mask); @@ -418,7 +418,7 @@ static int can_see(Client *requester, Client *target, Channel *channel) /* if they only want people on a certain channel. */ if (wfl.want_channel != WHO_DONTCARE) { - Channel *chan = find_channel(wfl.channel, NULL); + Channel *chan = find_channel(wfl.channel); if (!chan && wfl.want_channel == WHO_WANT) return WHO_CANTSEE; if ((wfl.want_channel == WHO_WANT) && !IsMember(target, chan)) @@ -602,7 +602,7 @@ static void do_channel_who(Client *client, Channel *channel, char *mask) continue; make_who_status(client, acptr, channel, cm, status, cansee); - send_who_reply(client, acptr, channel->chname, status, ""); + send_who_reply(client, acptr, channel->name, status, ""); } } @@ -857,7 +857,7 @@ static char *first_visible_channel(Client *client, Client *acptr, int *flg) *flg |= FVC_HIDDEN; if (showchannel) - return channel->chname; + return channel->name; } /* no channels that they can see */ diff --git a/src/modules/whois.c b/src/modules/whois.c index 97b451c7b..42f62a907 100644 --- a/src/modules/whois.c +++ b/src/modules/whois.c @@ -196,7 +196,7 @@ CMD_FUNC(cmd_whois) if (showchannel) { long access; - if (len + strlen(channel->chname) > (size_t)BUFSIZE - 4 - mlen) + if (len + strlen(channel->name) > (size_t)BUFSIZE - 4 - mlen) { sendto_one(client, NULL, ":%s %d %s %s :%s", @@ -258,8 +258,8 @@ CMD_FUNC(cmd_whois) } if (len) *(buf + len) = '\0'; - strcpy(buf + len, channel->chname); - len += strlen(channel->chname); + strcpy(buf + len, channel->name); + len += strlen(channel->name); strcat(buf + len, " "); len++; } diff --git a/src/modules/whox.c b/src/modules/whox.c index da0bd4f12..a16df1bd8 100644 --- a/src/modules/whox.c +++ b/src/modules/whox.c @@ -342,7 +342,7 @@ CMD_FUNC(cmd_whox) Channel *channel = NULL; /* List all users on a given channel */ - if ((channel = find_channel(orig_mask, NULL)) != NULL) + if ((channel = find_channel(orig_mask)) != NULL) { if (IsMember(client, channel) || operspy) do_who_on_channel(client, channel, 1, operspy, &fmt); @@ -761,7 +761,7 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f else host = GetHost(acptr); sendnumeric(client, RPL_WHOREPLY, - channel ? channel->chname : "*", + channel ? channel->name : "*", acptr->user->username, host, hide ? "*" : acptr->user->server, acptr->name, status, hide ? 0 : acptr->hopcount, acptr->info); @@ -773,7 +773,7 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f if (HasField(fmt, FIELD_QUERYTYPE)) append_format(str, sizeof str, &pos, " %s", fmt->querytype); if (HasField(fmt, FIELD_CHANNEL)) - append_format(str, sizeof str, &pos, " %s", channel ? channel->chname : "*"); + append_format(str, sizeof str, &pos, " %s", channel ? channel->name : "*"); if (HasField(fmt, FIELD_USER)) append_format(str, sizeof str, &pos, " %s", acptr->user->username); if (HasField(fmt, FIELD_IP)) diff --git a/src/parse.c b/src/parse.c index 01344ff88..457643e00 100644 --- a/src/parse.c +++ b/src/parse.c @@ -203,7 +203,9 @@ void parse(Client *cptr, char *buffer, int length) strlcpy(backupbuf, buffer, sizeof(backupbuf)); #if defined(DEBUGMODE) && defined(RAWCMDLOGGING) - ircd_log(LOG_ERROR, "<- %s: %s", cptr->name, backupbuf); + unreal_log(ULOG_INFO, "traffic", "TRAFFIC_IN", cptr, + "<- $client: $data", + log_data_string("data", backupbuf)); #endif /* This poisons unused para elements that code should never access */ @@ -723,7 +725,7 @@ static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int p sendto_prefix_one(acptr, client, recv_mtags, ":%s %d %s", client->name, numeric, buffer); } - else if ((channel = find_channel(nick, NULL))) + else if ((channel = find_channel(nick))) { sendto_channel(channel, client, client->direction, 0, 0, SEND_ALL, recv_mtags, diff --git a/src/send.c b/src/send.c index 5515da797..93375d1e8 100644 --- a/src/send.c +++ b/src/send.c @@ -344,7 +344,9 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) if (p) *p = '\0'; p = strchr(copy, '\r'); if (p) *p = '\0'; - ircd_log(LOG_ERROR, "-> %s: %s", to->name, copy); + unreal_log(ULOG_INFO, "traffic", "TRAFFIC_OUT", to, + "-> $client: $data", + log_data_string("data", copy)); } #endif @@ -410,7 +412,7 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) * sendnumeric(client, ERR_NEEDMOREPARAMS, "SAYHELLO"); * return; * } - * channel = find_channel(parv[1], NULL); + * channel = find_channel(parv[1]); * if (!channel) * { * sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); diff --git a/src/serv.c b/src/serv.c index 22f167054..e8383612f 100644 --- a/src/serv.c +++ b/src/serv.c @@ -425,10 +425,10 @@ CMD_FUNC(cmd_error) return; } - sendto_umode_global(UMODE_OPER, "ERROR from server %s: %s", - get_client_name(client, FALSE), para); - ircd_log(LOG_ERROR, "ERROR from server %s: %s", - get_client_name(client, FALSE), para); + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_MESSAGE", client, + "Error from $client: $error_message", + log_data_string("error_message", para), + client->serv->conf ? log_data_link_block(client->serv->conf) : NULL); } /** Save the tunefile (such as: highest seen connection count) */ @@ -439,11 +439,11 @@ EVENT(save_tunefile) tunefile = fopen(conf_files->tune_file, "w"); if (!tunefile) { -#if !defined(_WIN32) && !defined(_AMIGA) - sendto_ops("Unable to write tunefile.. %s", strerror(errno)); -#else - sendto_ops("Unable to write tunefile.."); -#endif + char *errstr = strerror(errno); + unreal_log(ULOG_WARNING, "config", "WRITE_TUNE_FILE_FAILED", NULL, + "Unable to write tunefile '$filename': $system_error", + log_data_string("filename", conf_files->tune_file), + log_data_string("system_error", errstr)); return; } fprintf(tunefile, "0\n"); @@ -461,13 +461,15 @@ void load_tunefile(void) if (!tunefile) return; fprintf(stderr, "Loading tunefile..\n"); - if (!fgets(buf, sizeof(buf), tunefile)) - fprintf(stderr, "Warning: error while reading the timestamp offset from the tunefile%s%s\n", - errno? ": ": "", errno? strerror(errno): ""); - - if (!fgets(buf, sizeof(buf), tunefile)) - fprintf(stderr, "Warning: error while reading the peak user count from the tunefile%s%s\n", - errno? ": ": "", errno? strerror(errno): ""); + /* We ignore the first line, hence the weird looking double fgets here... */ + if (!fgets(buf, sizeof(buf), tunefile) || !fgets(buf, sizeof(buf), tunefile)) + { + char *errstr = strerror(errno); + unreal_log(ULOG_WARNING, "config", "READ_TUNE_FILE_FAILED", NULL, + "Unable to read tunefile '$filename': $system_error", + log_data_string("filename", conf_files->tune_file), + log_data_string("system_error", errstr)); + } irccounts.me_max = atol(buf); fclose(tunefile); } @@ -568,12 +570,9 @@ CMD_FUNC(cmd_rehash) sendnotice(client, "A rehash is already in progress"); return; } - sendto_umode_global(UMODE_OPER, "%s is remotely rehashing server %s config file", client->name, me.name); + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD", client, "Rehashing server configuration file [by: $client.nuh]"); remote_rehash_client = client; - reread_motdsandrules(); - // TODO: clean this next line up, wtf man. - rehash(client, (parc > 1) ? ((*parv[1] == 'q') ? 2 : 0) : 0); - return; + /* fallthrough... so we deal with this the same way as local rehashes */ } parv[1] = parv[2]; } else { @@ -589,16 +588,6 @@ CMD_FUNC(cmd_rehash) parv[1] = parv[2]; parv[2] = NULL; parc--; - /* Only netadmins may use /REHASH -global, which is because: - * a) it makes sense - * b) remote servers don't support remote rehashes by non-netadmins - */ - if (!ValidatePermissionsForPath("server:rehash",client,NULL,NULL,NULL)) - { - sendnumeric(client, ERR_NOPRIVILEGES); - sendnotice(client, "'/REHASH -global' requires you to have server::rehash permissions"); - return; - } if (parv[1] && *parv[1] != '-') { sendnotice(client, "You cannot specify a server name after /REHASH -global, for obvious reasons"); @@ -620,13 +609,6 @@ CMD_FUNC(cmd_rehash) if (!BadPtr(parv[1]) && strcasecmp(parv[1], "-all")) { - - if (!ValidatePermissionsForPath("server:rehash",client,NULL,NULL,NULL)) - { - sendnumeric(client, ERR_NOPRIVILEGES); - return; - } - if (*parv[1] == '-') { if (!strncasecmp("-gar", parv[1], 4)) @@ -642,47 +624,10 @@ CMD_FUNC(cmd_rehash) } if (match_simple("-ssl*", parv[1]) || match_simple("-tls*", parv[1])) { - if (IsUser(client)) - { - sendto_realops_and_log("%s (%s@%s) requested a reload of all SSL related data (/rehash -tls)", - client->name, client->user->username, client->user->realhost); - } else { - sendto_realops_and_log("%s requested a reload of all SSL related data (/rehash -tls)", - client->name); - } + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD_TLS", client, "Reloading all TLS related data. [by: $client.nuh]"); reinit_tls(); return; } - if (match_simple("-o*motd", parv[1])) - { - if (MyUser(client)) - sendto_ops("Rehashing OPERMOTD on request of %s", client->name); - else - sendto_umode_global(UMODE_OPER, "Remotely rehashing OPERMOTD on request of %s", client->name); - read_motd(conf_files->opermotd_file, &opermotd); - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); - return; - } - if (match_simple("-b*motd", parv[1])) - { - if (MyUser(client)) - sendto_ops("Rehashing BOTMOTD on request of %s", client->name); - else - sendto_umode_global(UMODE_OPER, "Remotely rehashing BOTMOTD on request of %s", client->name); - read_motd(conf_files->botmotd_file, &botmotd); - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); - return; - } - if (!strncasecmp("-motd", parv[1], 5) || !strncasecmp("-rules", parv[1], 6)) - { - if (MyUser(client)) - sendto_ops("Rehashing all MOTDs and RULES on request of %s", client->name); - else - sendto_umode_global(UMODE_OPER, "Remotely rehasing all MOTDs and RULES on request of %s", client->name); - rehash_motdrules(); - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); - return; - } RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); return; } @@ -691,17 +636,15 @@ CMD_FUNC(cmd_rehash) { if (loop.ircd_rehashing) { - sendnotice(client, "A rehash is already in progress"); + sendnotice(client, "ERROR: A rehash is already in progress"); return; } - sendto_ops("%s is rehashing server config file", client->name); + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD", client, "Rehashing server configuration file [by: $client.nuh]"); } /* Normal rehash, rehash motds&rules too, just like the on in the tld block will :p */ sendnumeric(client, RPL_REHASHING, configfile); - // TODO: fix next line - occurence #2 - x = rehash(client, (parc > 1) ? ((*parv[1] == 'q') ? 2 : 0) : 0); - reread_motdsandrules(); + x = rehash(client, 0); } /** RESTART command - restart the server (discouraged command) @@ -745,7 +688,6 @@ CMD_FUNC(cmd_restart) reason = parv[2]; } } - sendto_ops("Server is Restarting by request of %s", client->name); list_for_each_entry(acptr, &lclient_list, lclient_node) { @@ -1050,7 +992,8 @@ CMD_FUNC(cmd_die) } /* Let the +s know what is going on */ - sendto_ops("Server Terminating by request of %s", client->name); + unreal_log(ULOG_INFO, "main", "UNREALIRCD_STOP", client, + "Terminating server by request of $client.nuh"); list_for_each_entry(acptr, &lclient_list, lclient_node) { @@ -1245,10 +1188,10 @@ void charsys_check_for_changes(void) if (strcmp(langsinuse, previous_langsinuse)) { - ircd_log(LOG_ERROR, "Permitted nick characters changed at runtime: %s -> %s", - previous_langsinuse, langsinuse); - sendto_realops("Permitted nick characters changed at runtime: %s -> %s", - previous_langsinuse, langsinuse); + unreal_log(ULOG_INFO, "charsys", "NICKCHARS_CHANGED", NULL, + "Permitted nick characters changed at runtime: $old_nickchars -> $new_nickchars", + log_data_string("old_nickchars", previous_langsinuse), + log_data_string("new_nickchars", langsinuse)); /* Broadcast change to all (locally connected) servers */ sendto_server(NULL, 0, 0, NULL, "PROTOCTL NICKCHARS=%s", langsinuse); } diff --git a/src/socket.c b/src/socket.c index 5dbc1f0b4..68efee7bb 100644 --- a/src/socket.c +++ b/src/socket.c @@ -745,7 +745,7 @@ void set_sock_opts(int fd, Client *client, int ipv6) opt = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)) < 0) { - unreal_log(ULOG_WARN, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, "Could not setsockopt(SO_REUSEADDR): $socket_error", log_data_socket_error(-1)); } @@ -755,7 +755,7 @@ void set_sock_opts(int fd, Client *client, int ipv6) opt = 1; if (setsockopt(fd, SOL_SOCKET, SO_USELOOPBACK, (void *)&opt, sizeof(opt)) < 0) { - unreal_log(ULOG_WARN, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, "Could not setsockopt(SO_USELOOPBACK): $socket_error", log_data_socket_error(-1)); } @@ -772,7 +772,7 @@ void set_sock_opts(int fd, Client *client, int ipv6) { if (client) { - unreal_log(ULOG_WARN, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, "Could not get socket options (F_GETFL): $socket_error", log_data_socket_error(-1)); } @@ -781,7 +781,7 @@ void set_sock_opts(int fd, Client *client, int ipv6) { if (client) { - unreal_log(ULOG_WARN, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, "Could not get socket options (F_SETFL): $socket_error", log_data_socket_error(-1)); } @@ -792,7 +792,7 @@ void set_sock_opts(int fd, Client *client, int ipv6) { if (client) { - unreal_log(ULOG_WARN, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, "Could not ioctlsocket FIONBIO: $socket_error", log_data_socket_error(-1)); } diff --git a/src/user.c b/src/user.c index 3ba172b0c..fe53faf2b 100644 --- a/src/user.c +++ b/src/user.c @@ -947,7 +947,11 @@ char *get_connect_extinfo(Client *client) /* And some built-in: */ - /* "class": this should be first */ + /* "vhost": this should be first */ + if (IsHidden(client)) + add_nvplist(&list, -1000000, "vhost", client->user->virthost); + + /* "class": second */ if (MyUser(client) && client->local->class) add_nvplist(&list, -100000, "class", client->local->class->name); @@ -994,14 +998,9 @@ void flood_limit_exceeded_log(Client *client, char *floodname) { char buf[1024]; - snprintf(buf, sizeof(buf), "Flood blocked (%s) from %s!%s@%s [%s]", - floodname, - client->name, - client->user->username, - client->user->realhost, - GetIP(client)); - ircd_log(LOG_FLOOD, "%s", buf); - sendto_snomask_global(SNO_FLOOD, "%s", buf); + unreal_log(ULOG_INFO, "flood", "FLOOD_BLOCKED", client, + "Flood blocked ($flood_type) from $client.nuh [$client.ip]", + log_data_string("flood_type", floodname)); } /** Is the flood limit exceeded for an option? eg for away-flood.