X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/1859e9d7d7a0fe3569ab4cc91b8dcc3d44722cd9..485d245ec0f48cff273377bc5babacd8641a2668:/ircd/s_conf.c diff --git a/ircd/s_conf.c b/ircd/s_conf.c index 78bf23d8..20211851 100644 --- a/ircd/s_conf.c +++ b/ircd/s_conf.c @@ -25,6 +25,7 @@ #include "stdinc.h" #include "ircd_defs.h" #include "s_conf.h" +#include "s_user.h" #include "s_newconf.h" #include "newconf.h" #include "s_serv.h" @@ -32,7 +33,6 @@ #include "channel.h" #include "class.h" #include "client.h" -#include "common.h" #include "hash.h" #include "match.h" #include "ircd.h" @@ -44,24 +44,21 @@ #include "send.h" #include "reject.h" #include "cache.h" -#include "blacklist.h" #include "privilege.h" #include "sslproc.h" +#include "wsproc.h" #include "bandbi.h" #include "operhash.h" #include "chmode.h" #include "hook.h" #include "s_assert.h" -#include "authd.h" +#include "authproc.h" +#include "supported.h" struct config_server_hide ConfigServerHide; extern int yyparse(void); /* defined in y.tab.c */ -extern char linebuf[]; - -#ifndef INADDR_NONE -#define INADDR_NONE ((unsigned int) 0xffffffff) -#endif +extern char yy_linebuf[16384]; /* defined in ircd_lexer.l */ static rb_bh *confitem_heap = NULL; @@ -169,7 +166,7 @@ free_conf(struct ConfItem *aconf) * inputs - pointer to client * output - 0 = Success * NOT_AUTHORISED (-1) = Access denied (no I line match) - * SOCKET_ERROR (-2) = Bad socket. + * I_SOCKET_ERROR (-2) = Bad socket. * I_LINE_FULL (-3) = I-line is full * TOO_MANY (-4) = Too many connections from hostname * BANNED_CLIENT (-5) = K-lined @@ -190,7 +187,7 @@ check_client(struct Client *client_p, struct Client *source_p, const char *usern switch (i) { - case SOCKET_ERROR: + case I_SOCKET_ERROR: exit_client(client_p, source_p, &me, "Socket Error"); break; @@ -260,12 +257,7 @@ check_client(struct Client *client_p, struct Client *source_p, const char *usern case NOT_AUTHORISED: { int port = -1; -#ifdef RB_IPV6 - if(source_p->localClient->ip.ss_family == AF_INET6) - port = ntohs(((struct sockaddr_in6 *)&source_p->localClient->listener->addr)->sin6_port); - else -#endif - port = ntohs(((struct sockaddr_in *)&source_p->localClient->listener->addr)->sin_port); + port = ntohs(GET_SS_PORT(&source_p->localClient->listener->addr[0])); ServerStats.is_ref++; /* jdc - lists server name & port connections are on */ @@ -288,9 +280,8 @@ check_client(struct Client *client_p, struct Client *source_p, const char *usern source_p->name, IsGotId(source_p) ? "" : "~", source_p->username, source_p->sockhost, source_p->localClient->listener->name, port); - add_reject(client_p, NULL, NULL); - exit_client(client_p, source_p, &me, - "You are not authorised to use this server"); + add_reject(client_p, NULL, NULL, NULL, "You are not authorised to use this server."); + exit_client(client_p, source_p, &me, "You are not authorised to use this server."); break; } case BANNED_CLIENT: @@ -372,7 +363,7 @@ verify_access(struct Client *client_p, const char *username) form_str(ERR_YOUREBANNEDCREEP), me.name, client_p->name, get_user_ban_reason(aconf)); - add_reject(client_p, aconf->user, aconf->host); + add_reject(client_p, aconf->user, aconf->host, aconf, NULL); return (BANNED_CLIENT); } @@ -394,7 +385,7 @@ find_address_conf_by_client(struct Client *client_p, const char *username) aconf = find_address_conf(client_p->host, client_p->sockhost, client_p->username, client_p->username, (struct sockaddr *) &client_p->localClient->ip, - client_p->localClient->ip.ss_family, + GET_SS_FAMILY(&client_p->localClient->ip), client_p->localClient->auth_user); } else @@ -404,7 +395,7 @@ find_address_conf_by_client(struct Client *client_p, const char *username) aconf = find_address_conf(client_p->host, client_p->sockhost, non_ident, client_p->username, (struct sockaddr *) &client_p->localClient->ip, - client_p->localClient->ip.ss_family, + GET_SS_FAMILY(&client_p->localClient->ip), client_p->localClient->auth_user); } return aconf; @@ -539,6 +530,20 @@ attach_iline(struct Client *client_p, struct ConfItem *aconf) return (attach_conf(client_p, aconf)); } +/* + * deref_conf + * + * inputs - ConfItem that is referenced by something other than a client + * side effects - Decrement and free ConfItem if appropriate + */ +void +deref_conf(struct ConfItem *aconf) +{ + aconf->clients--; + if(!aconf->clients && IsIllegal(aconf)) + free_conf(aconf); +} + /* * detach_conf * @@ -599,11 +604,11 @@ attach_conf(struct Client *client_p, struct ConfItem *aconf) if(IsIllegal(aconf)) return (NOT_AUTHORISED); - if(ClassPtr(aconf)) - { - if(!add_ip_limit(client_p, aconf)) - return (TOO_MANY_LOCAL); - } + if(s_assert(ClassPtr(aconf))) + return (NOT_AUTHORISED); + + if(!add_ip_limit(client_p, aconf)) + return (TOO_MANY_LOCAL); if((aconf->status & CONF_CLIENT) && ConfCurrUsers(aconf) >= ConfMaxUsers(aconf) && ConfMaxUsers(aconf) > 0) @@ -636,18 +641,21 @@ attach_conf(struct Client *client_p, struct ConfItem *aconf) * as a result of an operator issuing this command, else assume it has been * called as a result of the server receiving a HUP signal. */ -int -rehash(int sig) +bool +rehash(bool sig) { - if(sig != 0) - { + rb_dlink_node *n; + + hook_data_rehash hdata = { sig }; + + if(sig) sendto_realops_snomask(SNO_GENERAL, L_ALL, "Got signal SIGHUP, reloading ircd conf. file"); - } rehash_authd(); + /* don't close listeners until we know we can go ahead with the rehash */ - read_conf_files(NO); + read_conf_files(false); if(ServerInfo.description != NULL) rb_strlcpy(me.info, ServerInfo.description, sizeof(me.info)); @@ -655,11 +663,23 @@ rehash(int sig) rb_strlcpy(me.info, "unknown", sizeof(me.info)); open_logfiles(); - return (0); + + RB_DLINK_FOREACH(n, local_oper_list.head) + { + struct Client *oper = n->data; + const char *modeparv[4]; + modeparv[0] = modeparv[1] = oper->name; + modeparv[2] = "+"; + modeparv[3] = NULL; + user_mode(oper, oper, 3, modeparv); + } + + call_hook(h_rehash, &hdata); + return false; } void -rehash_bans(int sig) +rehash_bans(void) { bandb_rehash_bans(); } @@ -683,12 +703,10 @@ set_default_conf(void) ServerInfo.description = NULL; ServerInfo.network_name = NULL; - memset(&ServerInfo.ip, 0, sizeof(ServerInfo.ip)); - ServerInfo.specific_ipv4_vhost = 0; -#ifdef RB_IPV6 - memset(&ServerInfo.ip6, 0, sizeof(ServerInfo.ip6)); - ServerInfo.specific_ipv6_vhost = 0; -#endif + memset(&ServerInfo.bind4, 0, sizeof(ServerInfo.bind4)); + SET_SS_FAMILY(&ServerInfo.bind4, AF_UNSPEC); + memset(&ServerInfo.bind6, 0, sizeof(ServerInfo.bind6)); + SET_SS_FAMILY(&ServerInfo.bind6, AF_UNSPEC); AdminInfo.name = NULL; AdminInfo.email = NULL; @@ -715,7 +733,6 @@ set_default_conf(void) ConfigFileEntry.client_exit = true; ConfigFileEntry.dline_with_reason = true; ConfigFileEntry.kline_with_reason = true; - ConfigFileEntry.kline_delay = 0; ConfigFileEntry.warn_no_nline = true; ConfigFileEntry.non_redundant_klines = true; ConfigFileEntry.stats_e_disabled = false; @@ -816,11 +833,12 @@ set_default_conf(void) ServerInfo.default_max_clients = MAXCONNECTIONS; ConfigFileEntry.nicklen = NICKLEN; - ConfigFileEntry.certfp_method = RB_SSL_CERTFP_METH_SHA1; + ConfigFileEntry.certfp_method = RB_SSL_CERTFP_METH_CERT_SHA1; ConfigFileEntry.hide_opers_in_whois = 0; + ConfigFileEntry.hide_opers = 0; if (!alias_dict) - alias_dict = rb_dictionary_create("alias", strcasecmp); + alias_dict = rb_dictionary_create("alias", rb_strcasecmp); } /* @@ -863,20 +881,29 @@ validate_conf(void) if(ServerInfo.ssld_count < 1) ServerInfo.ssld_count = 1; + /* XXX: configurable? */ + ServerInfo.wsockd_count = 1; + if(!rb_setup_ssl_server(ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params, ServerInfo.ssl_cipher_list)) { ilog(L_MAIN, "WARNING: Unable to setup SSL."); ircd_ssl_ok = false; } else { ircd_ssl_ok = true; - send_new_ssl_certs(ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params, ServerInfo.ssl_cipher_list); + ssld_update_config(); } if(ServerInfo.ssld_count > get_ssld_count()) { int start = ServerInfo.ssld_count - get_ssld_count(); /* start up additional ssld if needed */ - start_ssldaemon(start, ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params, ServerInfo.ssl_cipher_list); + start_ssldaemon(start); + } + + if(ServerInfo.wsockd_count > get_wsockd_count()) + { + int start = ServerInfo.wsockd_count - get_wsockd_count(); + start_wsockd(start); } /* General conf */ @@ -916,6 +943,12 @@ validate_conf(void) splitmode = 0; splitchecking = 0; } + + CharAttrs['&'] |= CHANPFX_C; + if (ConfigChannel.disable_local_channels) + CharAttrs['&'] &= ~CHANPFX_C; + + chantypes_update(); } /* add_temp_kline() @@ -1103,12 +1136,17 @@ deactivate_conf(struct ConfItem *aconf, rb_dlink_node *ptr, time_t now) break; } if (aconf->lifetime != 0 && now < aconf->lifetime) + { aconf->status |= CONF_ILLEGAL; + } else { if (aconf->lifetime != 0) rb_dlinkDestroy(ptr, &prop_bans); - free_conf(aconf); + if (aconf->clients == 0) + free_conf(aconf); + else + aconf->status |= CONF_ILLEGAL; } } @@ -1254,13 +1292,13 @@ char * get_oper_name(struct Client *client_p) { /* +5 for !,@,{,} and null */ - static char buffer[NICKLEN + USERLEN + HOSTLEN + HOSTLEN + 5]; + static char buffer[NAMELEN + USERLEN + HOSTLEN + HOSTLEN + 5]; if(MyOper(client_p)) { snprintf(buffer, sizeof(buffer), "%s!%s@%s{%s}", client_p->name, client_p->username, - client_p->host, client_p->localClient->opername); + client_p->host, client_p->user->opername); return buffer; } @@ -1306,7 +1344,8 @@ get_user_ban_reason(struct ConfItem *aconf) { static char reasonbuf[BUFSIZE]; - if (aconf->flags & CONF_FLAGS_TEMPORARY && + if (!ConfigFileEntry.hide_tkdline_duration && + aconf->flags & CONF_FLAGS_TEMPORARY && (aconf->status == CONF_KILL || aconf->status == CONF_DLINE)) snprintf(reasonbuf, sizeof reasonbuf, "Temporary %c-line %d min. - ", @@ -1417,7 +1456,7 @@ read_conf_files(bool cold) * free an alias{} entry. */ static void -free_alias_cb(struct DictionaryElement *ptr, void *unused) +free_alias_cb(rb_dictionary_element *ptr, void *unused) { struct alias_entry *aptr = ptr->data; @@ -1527,7 +1566,7 @@ clear_out_old_conf(void) alias_dict = NULL; } - destroy_blacklists(); + del_blacklist_all(); privilegeset_mark_all_illegal(); @@ -1606,15 +1645,15 @@ conf_add_d_conf(struct ConfItem *aconf) } } -static char * -strip_tabs(char *dest, const char *src, size_t len) +static void +strip_tabs(char *dest, const char *src, size_t size) { char *d = dest; if(dest == NULL || src == NULL) - return NULL; + return; - rb_strlcpy(dest, src, len); + rb_strlcpy(dest, src, size); while(*d) { @@ -1622,7 +1661,6 @@ strip_tabs(char *dest, const char *src, size_t len) *d = ' '; d++; } - return dest; } /* @@ -1637,7 +1675,7 @@ yyerror(const char *msg) { char newlinebuf[BUFSIZE]; - strip_tabs(newlinebuf, linebuf, strlen(linebuf)); + strip_tabs(newlinebuf, yy_linebuf, sizeof(newlinebuf)); ierror("\"%s\", line %d: %s at '%s'", conffilebuf, lineno + 1, msg, newlinebuf); sendto_realops_snomask(SNO_GENERAL, L_ALL, "\"%s\", line %d: %s at '%s'",