X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/212380e3f42f585dc1ea927402252eb943f91f7b..255130dde8eed921fea4b23786a5743fbd50cbda:/src/s_newconf.c diff --git a/src/s_newconf.c b/src/s_newconf.c index 97cd475..6114a51 100644 --- a/src/s_newconf.c +++ b/src/s_newconf.c @@ -29,7 +29,6 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $Id: s_newconf.c 1747 2006-07-25 21:22:45Z jilles $ */ #include "stdinc.h" @@ -37,83 +36,82 @@ #include "common.h" #include "s_conf.h" #include "s_newconf.h" -#include "tools.h" #include "client.h" -#include "memory.h" #include "s_serv.h" #include "send.h" #include "hostmask.h" #include "newconf.h" #include "hash.h" -#include "balloc.h" -#include "event.h" -#include "sprintf_irc.h" +#include "irc_dictionary.h" -dlink_list shared_conf_list; -dlink_list cluster_conf_list; -dlink_list oper_conf_list; -dlink_list hubleaf_conf_list; -dlink_list server_conf_list; -dlink_list xline_conf_list; -dlink_list resv_conf_list; /* nicks only! */ -dlink_list nd_list; /* nick delay */ -dlink_list tgchange_list; +rb_dlink_list shared_conf_list; +rb_dlink_list cluster_conf_list; +rb_dlink_list oper_conf_list; +rb_dlink_list hubleaf_conf_list; +rb_dlink_list server_conf_list; +rb_dlink_list xline_conf_list; +rb_dlink_list resv_conf_list; /* nicks only! */ +rb_dlink_list nd_list; /* nick delay */ +rb_dlink_list tgchange_list; -patricia_tree_t *tgchange_tree; +rb_patricia_tree_t *tgchange_tree; -static BlockHeap *nd_heap = NULL; +static rb_bh *nd_heap = NULL; static void expire_temp_rxlines(void *unused); static void expire_nd_entries(void *unused); +struct ev_entry *expire_nd_entries_ev = NULL; +struct ev_entry *expire_temp_rxlines_ev = NULL; + void init_s_newconf(void) { - tgchange_tree = New_Patricia(PATRICIA_BITS); - nd_heap = BlockHeapCreate(sizeof(struct nd_entry), ND_HEAP_SIZE); - eventAddIsh("expire_nd_entries", expire_nd_entries, NULL, 30); - eventAddIsh("expire_temp_rxlines", expire_temp_rxlines, NULL, 60); + tgchange_tree = rb_new_patricia(PATRICIA_BITS); + nd_heap = rb_bh_create(sizeof(struct nd_entry), ND_HEAP_SIZE, "nd_heap"); + expire_nd_entries_ev = rb_event_addish("expire_nd_entries", expire_nd_entries, NULL, 30); + expire_temp_rxlines_ev = rb_event_addish("expire_temp_rxlines", expire_temp_rxlines, NULL, 60); } void clear_s_newconf(void) { struct server_conf *server_p; - dlink_node *ptr; - dlink_node *next_ptr; + rb_dlink_node *ptr; + rb_dlink_node *next_ptr; - DLINK_FOREACH_SAFE(ptr, next_ptr, shared_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, shared_conf_list.head) { /* ptr here is ptr->data->node */ - dlinkDelete(ptr, &shared_conf_list); + rb_dlinkDelete(ptr, &shared_conf_list); free_remote_conf(ptr->data); } - DLINK_FOREACH_SAFE(ptr, next_ptr, cluster_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, cluster_conf_list.head) { - dlinkDelete(ptr, &cluster_conf_list); + rb_dlinkDelete(ptr, &cluster_conf_list); free_remote_conf(ptr->data); } - DLINK_FOREACH_SAFE(ptr, next_ptr, hubleaf_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, hubleaf_conf_list.head) { - dlinkDelete(ptr, &hubleaf_conf_list); + rb_dlinkDelete(ptr, &hubleaf_conf_list); free_remote_conf(ptr->data); } - DLINK_FOREACH_SAFE(ptr, next_ptr, oper_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, oper_conf_list.head) { free_oper_conf(ptr->data); - dlinkDestroy(ptr, &oper_conf_list); + rb_dlinkDestroy(ptr, &oper_conf_list); } - DLINK_FOREACH_SAFE(ptr, next_ptr, server_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, server_conf_list.head) { server_p = ptr->data; if(!server_p->servers) { - dlinkDelete(ptr, &server_conf_list); + rb_dlinkDelete(ptr, &server_conf_list); free_server_conf(ptr->data); } else @@ -125,9 +123,9 @@ void clear_s_newconf_bans(void) { struct ConfItem *aconf; - dlink_node *ptr, *next_ptr; + rb_dlink_node *ptr, *next_ptr; - DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head) { aconf = ptr->data; @@ -135,10 +133,10 @@ clear_s_newconf_bans(void) continue; free_conf(aconf); - dlinkDestroy(ptr, &xline_conf_list); + rb_dlinkDestroy(ptr, &xline_conf_list); } - DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head) { aconf = ptr->data; @@ -147,7 +145,7 @@ clear_s_newconf_bans(void) continue; free_conf(aconf); - dlinkDestroy(ptr, &resv_conf_list); + rb_dlinkDestroy(ptr, &resv_conf_list); } clear_resv_hash(); @@ -156,7 +154,7 @@ clear_s_newconf_bans(void) struct remote_conf * make_remote_conf(void) { - struct remote_conf *remote_p = MyMalloc(sizeof(struct remote_conf)); + struct remote_conf *remote_p = rb_malloc(sizeof(struct remote_conf)); return remote_p; } @@ -167,10 +165,10 @@ free_remote_conf(struct remote_conf *remote_p) if(remote_p == NULL) return; - MyFree(remote_p->username); - MyFree(remote_p->host); - MyFree(remote_p->server); - MyFree(remote_p); + rb_free(remote_p->username); + rb_free(remote_p->host); + rb_free(remote_p->server); + rb_free(remote_p); } int @@ -178,9 +176,9 @@ find_shared_conf(const char *username, const char *host, const char *server, int flags) { struct remote_conf *shared_p; - dlink_node *ptr; + rb_dlink_node *ptr; - DLINK_FOREACH(ptr, shared_conf_list.head) + RB_DLINK_FOREACH(ptr, shared_conf_list.head) { shared_p = ptr->data; @@ -206,7 +204,7 @@ propagate_generic(struct Client *source_p, const char *command, va_list args; va_start(args, format); - ircvsnprintf(buffer, sizeof(buffer), format, args); + rb_vsnprintf(buffer, sizeof(buffer), format, args); va_end(args); sendto_match_servs(source_p, target, cap, NOCAPS, @@ -224,13 +222,13 @@ cluster_generic(struct Client *source_p, const char *command, char buffer[BUFSIZE]; struct remote_conf *shared_p; va_list args; - dlink_node *ptr; + rb_dlink_node *ptr; va_start(args, format); - ircvsnprintf(buffer, sizeof(buffer), format, args); + rb_vsnprintf(buffer, sizeof(buffer), format, args); va_end(args); - DLINK_FOREACH(ptr, cluster_conf_list.head) + RB_DLINK_FOREACH(ptr, cluster_conf_list.head) { shared_p = ptr->data; @@ -249,7 +247,7 @@ cluster_generic(struct Client *source_p, const char *command, struct oper_conf * make_oper_conf(void) { - struct oper_conf *oper_p = MyMalloc(sizeof(struct oper_conf)); + struct oper_conf *oper_p = rb_malloc(sizeof(struct oper_conf)); return oper_p; } @@ -260,38 +258,38 @@ free_oper_conf(struct oper_conf *oper_p) if(oper_p == NULL) return; - MyFree(oper_p->username); - MyFree(oper_p->host); - MyFree(oper_p->name); + rb_free(oper_p->username); + rb_free(oper_p->host); + rb_free(oper_p->name); if(oper_p->passwd) { memset(oper_p->passwd, 0, strlen(oper_p->passwd)); - MyFree(oper_p->passwd); + rb_free(oper_p->passwd); } #ifdef HAVE_LIBCRYPTO - MyFree(oper_p->rsa_pubkey_file); + rb_free(oper_p->rsa_pubkey_file); if(oper_p->rsa_pubkey) RSA_free(oper_p->rsa_pubkey); #endif - MyFree(oper_p); + rb_free(oper_p); } struct oper_conf * find_oper_conf(const char *username, const char *host, const char *locip, const char *name) { struct oper_conf *oper_p; - struct irc_sockaddr_storage ip, cip; + struct rb_sockaddr_storage ip, cip; char addr[HOSTLEN+1]; int bits, cbits; - dlink_node *ptr; + rb_dlink_node *ptr; parse_netmask(locip, (struct sockaddr *)&cip, &cbits); - DLINK_FOREACH(ptr, oper_conf_list.head) + RB_DLINK_FOREACH(ptr, oper_conf_list.head) { oper_p = ptr->data; @@ -299,7 +297,7 @@ find_oper_conf(const char *username, const char *host, const char *locip, const if(irccmp(oper_p->name, name) || !match(oper_p->username, username)) continue; - strlcpy(addr, oper_p->host, sizeof(addr)); + rb_strlcpy(addr, oper_p->host, sizeof(addr)); if(parse_netmask(addr, (struct sockaddr *)&ip, &bits) != HM_HOST) { @@ -319,58 +317,10 @@ find_oper_conf(const char *username, const char *host, const char *locip, const return NULL; } -struct oper_flags -{ - int flag; - char has; - char hasnt; -}; -static struct oper_flags oper_flagtable[] = -{ - { OPER_GLINE, 'G', 'g' }, - { OPER_KLINE, 'K', 'k' }, - { OPER_XLINE, 'X', 'x' }, - { OPER_GLOBKILL, 'O', 'o' }, - { OPER_LOCKILL, 'C', 'c' }, - { OPER_REMOTE, 'R', 'r' }, - { OPER_UNKLINE, 'U', 'u' }, - { OPER_REHASH, 'H', 'h' }, - { OPER_DIE, 'D', 'd' }, - { OPER_ADMIN, 'A', 'a' }, - { OPER_NICKS, 'N', 'n' }, - { OPER_OPERWALL, 'L', 'l' }, - { OPER_SPY, 'S', 's' }, - { OPER_INVIS, 'P', 'p' }, - { OPER_REMOTEBAN, 'B', 'b' }, - { 0, '\0', '\0' } -}; - -const char * -get_oper_privs(int flags) -{ - static char buf[20]; - char *p; - int i; - - p = buf; - - for(i = 0; oper_flagtable[i].flag; i++) - { - if(flags & oper_flagtable[i].flag) - *p++ = oper_flagtable[i].has; - else - *p++ = oper_flagtable[i].hasnt; - } - - *p = '\0'; - - return buf; -} - struct server_conf * make_server_conf(void) { - struct server_conf *server_p = MyMalloc(sizeof(struct server_conf)); + struct server_conf *server_p = rb_malloc(sizeof(struct server_conf)); server_p->aftype = AF_INET; return server_p; } @@ -385,19 +335,19 @@ free_server_conf(struct server_conf *server_p) if(!EmptyString(server_p->passwd)) { memset(server_p->passwd, 0, strlen(server_p->passwd)); - MyFree(server_p->passwd); + rb_free(server_p->passwd); } if(!EmptyString(server_p->spasswd)) { memset(server_p->spasswd, 0, strlen(server_p->spasswd)); - MyFree(server_p->spasswd); + rb_free(server_p->spasswd); } - MyFree(server_p->name); - MyFree(server_p->host); - MyFree(server_p->class_name); - MyFree(server_p); + rb_free(server_p->name); + rb_free(server_p->host); + rb_free(server_p->class_name); + rb_free(server_p); } void @@ -405,7 +355,7 @@ add_server_conf(struct server_conf *server_p) { if(EmptyString(server_p->class_name)) { - DupString(server_p->class_name, "default"); + server_p->class_name = rb_strdup("default"); server_p->class = default_class; return; } @@ -417,8 +367,8 @@ add_server_conf(struct server_conf *server_p) conf_report_error("Warning connect::class invalid for %s", server_p->name); - MyFree(server_p->class_name); - DupString(server_p->class_name, "default"); + rb_free(server_p->class_name); + server_p->class_name = rb_strdup("default"); } if(strchr(server_p->host, '*') || strchr(server_p->host, '?')) @@ -429,9 +379,9 @@ struct server_conf * find_server_conf(const char *name) { struct server_conf *server_p; - dlink_node *ptr; + rb_dlink_node *ptr; - DLINK_FOREACH(ptr, server_conf_list.head) + RB_DLINK_FOREACH(ptr, server_conf_list.head) { server_p = ptr->data; @@ -482,13 +432,13 @@ detach_server_conf(struct Client *client_p) if(MaxUsers(server_p->class) < 0 && CurrUsers(server_p->class) <= 0) free_class(server_p->class); - dlinkDelete(&server_p->node, &server_conf_list); + rb_dlinkDelete(&server_p->node, &server_conf_list); free_server_conf(server_p); } } void -set_server_conf_autoconn(struct Client *source_p, char *name, int newval) +set_server_conf_autoconn(struct Client *source_p, const char *name, int newval) { struct server_conf *server_p; @@ -504,21 +454,38 @@ set_server_conf_autoconn(struct Client *source_p, char *name, int newval) get_oper_name(source_p), name, newval); } else - sendto_one(source_p, ":%s NOTICE %s :Can't find %s", - me.name, source_p->name, name); + sendto_one_notice(source_p, ":Can't find %s", name); +} + +void +disable_server_conf_autoconn(const char *name) +{ + struct server_conf *server_p; + + server_p = find_server_conf(name); + if(server_p != NULL && server_p->flags & SERVER_AUTOCONN) + { + server_p->flags &= ~SERVER_AUTOCONN; + + sendto_realops_snomask(SNO_GENERAL, L_ALL, + "Disabling AUTOCONN for %s because of error", + name); + ilog(L_SERVER, "Disabling AUTOCONN for %s because of error", + name); + } } struct ConfItem * find_xline(const char *gecos, int counter) { struct ConfItem *aconf; - dlink_node *ptr; + rb_dlink_node *ptr; - DLINK_FOREACH(ptr, xline_conf_list.head) + RB_DLINK_FOREACH(ptr, xline_conf_list.head) { aconf = ptr->data; - if(match_esc(aconf->name, gecos)) + if(match_esc(aconf->host, gecos)) { if(counter) aconf->port++; @@ -529,17 +496,34 @@ find_xline(const char *gecos, int counter) return NULL; } +struct ConfItem * +find_xline_mask(const char *gecos) +{ + struct ConfItem *aconf; + rb_dlink_node *ptr; + + RB_DLINK_FOREACH(ptr, xline_conf_list.head) + { + aconf = ptr->data; + + if(!irccmp(aconf->host, gecos)) + return aconf; + } + + return NULL; +} + struct ConfItem * find_nick_resv(const char *name) { struct ConfItem *aconf; - dlink_node *ptr; + rb_dlink_node *ptr; - DLINK_FOREACH(ptr, resv_conf_list.head) + RB_DLINK_FOREACH(ptr, resv_conf_list.head) { aconf = ptr->data; - if(match_esc(aconf->name, name)) + if(match_esc(aconf->host, name)) { aconf->port++; return aconf; @@ -549,6 +533,23 @@ find_nick_resv(const char *name) return NULL; } +struct ConfItem * +find_nick_resv_mask(const char *name) +{ + struct ConfItem *aconf; + rb_dlink_node *ptr; + + RB_DLINK_FOREACH(ptr, resv_conf_list.head) + { + aconf = ptr->data; + + if(!irccmp(aconf->host, name)) + return aconf; + } + + return NULL; +} + /* clean_resv_nick() * * inputs - nick @@ -596,6 +597,7 @@ valid_wild_card_simple(const char *data) const char *p; char tmpch; int nonwild = 0; + int wild = 0; /* check the string for minimum number of nonwildcard chars */ p = data; @@ -605,9 +607,11 @@ valid_wild_card_simple(const char *data) /* found an escape, p points to the char after it, so skip * that and move on. */ - if(tmpch == '\\') + if(tmpch == '\\' && *p) { p++; + if(++nonwild >= ConfigFileEntry.min_nonwildcard_simple) + return 1; } else if(!IsMWildChar(tmpch)) { @@ -615,9 +619,12 @@ valid_wild_card_simple(const char *data) if(++nonwild >= ConfigFileEntry.min_nonwildcard_simple) return 1; } + else + wild++; } - return 0; + /* strings without wilds are also ok */ + return wild == 0; } time_t @@ -643,58 +650,65 @@ valid_temp_time(const char *p) return(result * 60); } +/* Propagated bans are expired elsewhere. */ static void expire_temp_rxlines(void *unused) { struct ConfItem *aconf; - dlink_node *ptr; - dlink_node *next_ptr; + rb_dlink_node *ptr; + rb_dlink_node *next_ptr; int i; HASH_WALK_SAFE(i, R_MAX, ptr, next_ptr, resvTable) { aconf = ptr->data; - if(aconf->hold && aconf->hold <= CurrentTime) + if(aconf->lifetime != 0) + continue; + if(aconf->hold && aconf->hold <= rb_current_time()) { if(ConfigFileEntry.tkline_expire_notices) sendto_realops_snomask(SNO_GENERAL, L_ALL, "Temporary RESV for [%s] expired", - aconf->name); + aconf->host); free_conf(aconf); - dlinkDestroy(ptr, &resvTable[i]); + rb_dlinkDestroy(ptr, &resvTable[i]); } } HASH_WALK_END - DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head) { aconf = ptr->data; - if(aconf->hold && aconf->hold <= CurrentTime) + if(aconf->lifetime != 0) + continue; + if(aconf->hold && aconf->hold <= rb_current_time()) { if(ConfigFileEntry.tkline_expire_notices) sendto_realops_snomask(SNO_GENERAL, L_ALL, "Temporary RESV for [%s] expired", - aconf->name); + aconf->host); free_conf(aconf); - dlinkDestroy(ptr, &resv_conf_list); + rb_dlinkDestroy(ptr, &resv_conf_list); } } - DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head) { aconf = ptr->data; - if(aconf->hold && aconf->hold <= CurrentTime) + if(aconf->lifetime != 0) + continue; + if(aconf->hold && aconf->hold <= rb_current_time()) { if(ConfigFileEntry.tkline_expire_notices) sendto_realops_snomask(SNO_GENERAL, L_ALL, "Temporary X-line for [%s] expired", - aconf->name); + aconf->host); free_conf(aconf); - dlinkDestroy(ptr, &xline_conf_list); + rb_dlinkDestroy(ptr, &xline_conf_list); } } } @@ -702,51 +716,52 @@ expire_temp_rxlines(void *unused) unsigned long get_nd_count(void) { - return(dlink_list_length(&nd_list)); + return(rb_dlink_list_length(&nd_list)); } - void add_nd_entry(const char *name) { struct nd_entry *nd; - if(hash_find_nd(name) != NULL) + if(irc_dictionary_find(nd_dict, name) != NULL) return; - nd = BlockHeapAlloc(nd_heap); + nd = rb_bh_alloc(nd_heap); - strlcpy(nd->name, name, sizeof(nd->name)); - nd->expire = CurrentTime + ConfigFileEntry.nick_delay; + rb_strlcpy(nd->name, name, sizeof(nd->name)); + nd->expire = rb_current_time() + ConfigFileEntry.nick_delay; /* this list is ordered */ - dlinkAddTail(nd, &nd->lnode, &nd_list); - add_to_nd_hash(name, nd); + rb_dlinkAddTail(nd, &nd->lnode, &nd_list); + + irc_dictionary_add(nd_dict, nd->name, nd); } void free_nd_entry(struct nd_entry *nd) { - dlinkDelete(&nd->lnode, &nd_list); - dlinkDelete(&nd->hnode, &ndTable[nd->hashv]); - BlockHeapFree(nd_heap, nd); + irc_dictionary_delete(nd_dict, nd->name); + + rb_dlinkDelete(&nd->lnode, &nd_list); + rb_bh_free(nd_heap, nd); } void expire_nd_entries(void *unused) { struct nd_entry *nd; - dlink_node *ptr; - dlink_node *next_ptr; + rb_dlink_node *ptr; + rb_dlink_node *next_ptr; - DLINK_FOREACH_SAFE(ptr, next_ptr, nd_list.head) + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, nd_list.head) { nd = ptr->data; /* this list is ordered - we can stop when we hit the first * entry that doesnt expire.. */ - if(nd->expire > CurrentTime) + if(nd->expire > rb_current_time()) return; free_nd_entry(nd); @@ -757,29 +772,29 @@ void add_tgchange(const char *host) { tgchange *target; - patricia_node_t *pnode; + rb_patricia_node_t *pnode; if(find_tgchange(host)) return; - target = MyMalloc(sizeof(tgchange)); + target = rb_malloc(sizeof(tgchange)); pnode = make_and_lookup(tgchange_tree, host); pnode->data = target; target->pnode = pnode; - DupString(target->ip, host); - target->expiry = CurrentTime + (60*60*12); + target->ip = rb_strdup(host); + target->expiry = rb_current_time() + (60*60*12); - dlinkAdd(target, &target->node, &tgchange_list); + rb_dlinkAdd(target, &target->node, &tgchange_list); } tgchange * find_tgchange(const char *host) { - patricia_node_t *pnode; + rb_patricia_node_t *pnode; - if((pnode = match_exact_string(tgchange_tree, host))) + if((pnode = rb_match_exact_string(tgchange_tree, host))) return pnode->data; return NULL;