X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/74edf6bac0e373a92ade8d6664dee53fb30145dc..2ef034d1111fe65fc4e5175896624c30b8aee9dd:/ircd/authproc.c diff --git a/ircd/authproc.c b/ircd/authproc.c index 00fec3e0..602601b0 100644 --- a/ircd/authproc.c +++ b/ircd/authproc.c @@ -4,7 +4,7 @@ * * Copyright (C) 2005 Aaron Sethman * Copyright (C) 2005-2012 ircd-ratbox development team - * Copyright (C) 2016 William Pitcock + * Copyright (C) 2016 Ariadne Conill * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -67,7 +67,7 @@ uint32_t cid; static rb_dictionary *cid_clients; static struct ev_entry *timeout_ev; -rb_dictionary *bl_stats; +rb_dictionary *dnsbl_stats; rb_dlink_list opm_list; struct OPMListener opm_listeners[LISTEN_LAST]; @@ -88,24 +88,19 @@ static int start_authd(void) { char fullpath[PATH_MAX + 1]; -#ifdef _WIN32 - const char *suffix = ".exe"; -#else - const char *suffix = ""; -#endif + if(authd_path == NULL) { - snprintf(fullpath, sizeof(fullpath), "%s%cauthd%s", ircd_paths[IRCD_PATH_LIBEXEC], RB_PATH_SEPARATOR, suffix); + snprintf(fullpath, sizeof(fullpath), "%s/authd", ircd_paths[IRCD_PATH_LIBEXEC]); if(access(fullpath, X_OK) == -1) { - snprintf(fullpath, sizeof(fullpath), "%s%cbin%cauthd%s", - ConfigFileEntry.dpath, RB_PATH_SEPARATOR, RB_PATH_SEPARATOR, suffix); + snprintf(fullpath, sizeof(fullpath), "%s/bin/authd", ConfigFileEntry.dpath); if(access(fullpath, X_OK) == -1) { ierror("Unable to execute authd in %s or %s/bin", ircd_paths[IRCD_PATH_LIBEXEC], ConfigFileEntry.dpath); - sendto_realops_snomask(SNO_GENERAL, L_ALL, + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Unable to execute authd in %s or %s/bin", ircd_paths[IRCD_PATH_LIBEXEC], ConfigFileEntry.dpath); return 1; @@ -127,12 +122,12 @@ start_authd(void) if(authd_helper == NULL) { ierror("Unable to start authd helper: %s", strerror(errno)); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "Unable to start authd helper: %s", strerror(errno)); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Unable to start authd helper: %s", strerror(errno)); return 1; } ilog(L_MAIN, "authd helper started"); - sendto_realops_snomask(SNO_GENERAL, L_ALL, "authd helper started"); + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "authd helper started"); rb_helper_run(authd_helper); return 0; } @@ -202,7 +197,10 @@ cmd_notice_client(int parc, char **parv) { struct Client *client_p; - if((client_p = str_cid_to_client(parv[1], false)) == NULL) + if ((client_p = str_cid_to_client(parv[1], false)) == NULL) + return; + + if (IsAnyDead(client_p)) return; sendto_one_notice(client_p, ":%s", parv[2]); @@ -275,13 +273,13 @@ parse_authd_reply(rb_helper * helper) ssize_t len; int parc; char buf[READBUF_SIZE]; - char *parv[MAXPARA + 1]; + char *parv[MAXPARA]; while((len = rb_helper_read(helper, buf, sizeof(buf))) > 0) { struct authd_cb *cmd; - parc = rb_string_to_array(buf, parv, MAXPARA+1); + parc = rb_string_to_array(buf, parv, sizeof(parv)); cmd = &authd_cmd_tab[(unsigned char)*parv[0]]; if(cmd->fn != NULL) { @@ -335,11 +333,9 @@ configure_authd(void) rb_helper_write(authd_helper, "O opm_listener %s %hu", opm_listeners[LISTEN_IPV4].ipaddr, opm_listeners[LISTEN_IPV4].port); -#ifdef RB_IPV6 if(opm_listeners[LISTEN_IPV6].ipaddr[0] != '\0') rb_helper_write(authd_helper, "O opm_listener %s %hu", opm_listeners[LISTEN_IPV6].ipaddr, opm_listeners[LISTEN_IPV6].port); -#endif RB_DLINK_FOREACH(ptr, opm_list.head) { @@ -387,9 +383,6 @@ authd_abort_client(struct Client *client_p) static void restart_authd_cb(rb_helper * helper) { - rb_dictionary_iter iter; - struct Client *client_p; - iwarn("authd: restart_authd_cb called, authd died?"); sendto_realops_snomask(SNO_GENERAL, L_ALL, "authd: restart_authd_cb called, authd died?"); @@ -479,7 +472,12 @@ authd_initiate_client(struct Client *client_p, bool defer) /* Add a bit of a fudge factor... */ client_p->preClient->auth.timeout = rb_current_time() + ConfigFileEntry.connect_timeout + 10; - rb_helper_write(authd_helper, "C %x %s %hu %s %hu", authd_cid, listen_ipaddr, listen_port, client_ipaddr, client_port); + rb_helper_write(authd_helper, "C %x %s %hu %s %hu %x", authd_cid, listen_ipaddr, listen_port, client_ipaddr, client_port, +#ifdef HAVE_LIBSCTP + IsSCTP(client_p) ? IPPROTO_SCTP : IPPROTO_TCP); +#else + IPPROTO_TCP); +#endif } static inline void @@ -581,17 +579,17 @@ timeout_dead_authd_clients(void *notused __unused) } } -/* Send a new blacklist to authd */ +/* Send a new DNSBL entry to authd */ void -add_blacklist(const char *host, const char *reason, uint8_t iptype, rb_dlink_list *filters) +add_dnsbl_entry(const char *host, const char *reason, uint8_t iptype, rb_dlink_list *filters) { rb_dlink_node *ptr; - struct BlacklistStats *stats = rb_malloc(sizeof(struct BlacklistStats)); + struct DNSBLEntryStats *stats = rb_malloc(sizeof(*stats)); char filterbuf[BUFSIZE] = "*"; size_t s = 0; - if(bl_stats == NULL) - bl_stats = rb_dictionary_create("blacklist statistics", rb_strcasecmp); + if(dnsbl_stats == NULL) + dnsbl_stats = rb_dictionary_create("dnsbl statistics", rb_strcasecmp); /* Build a list of comma-separated values for authd. * We don't check for validity - do it elsewhere. @@ -615,19 +613,19 @@ add_blacklist(const char *host, const char *reason, uint8_t iptype, rb_dlink_lis stats->host = rb_strdup(host); stats->iptype = iptype; stats->hits = 0; - rb_dictionary_add(bl_stats, stats->host, stats); + rb_dictionary_add(dnsbl_stats, stats->host, stats); rb_helper_write(authd_helper, "O rbl %s %hhu %s :%s", host, iptype, filterbuf, reason); } -/* Delete a blacklist */ +/* Delete a DNSBL entry. */ void -del_blacklist(const char *host) +del_dnsbl_entry(const char *host) { - struct BlacklistStats *stats = rb_dictionary_retrieve(bl_stats, host); + struct DNSBLEntryStats *stats = rb_dictionary_retrieve(dnsbl_stats, host); if(stats != NULL) { - rb_dictionary_delete(bl_stats, host); + rb_dictionary_delete(dnsbl_stats, host); rb_free(stats->host); rb_free(stats); } @@ -636,21 +634,21 @@ del_blacklist(const char *host) } static void -blacklist_delete(rb_dictionary_element *delem, void *unused) +dnsbl_delete_elem(rb_dictionary_element *delem, void *unused) { - struct BlacklistStats *stats = delem->data; + struct DNSBLEntryStats *stats = delem->data; rb_free(stats->host); rb_free(stats); } -/* Delete all the blacklists */ +/* Delete all the DNSBL entries. */ void -del_blacklist_all(void) +del_dnsbl_entry_all(void) { - if(bl_stats != NULL) - rb_dictionary_destroy(bl_stats, blacklist_delete, NULL); - bl_stats = NULL; + if(dnsbl_stats != NULL) + rb_dictionary_destroy(dnsbl_stats, dnsbl_delete_elem, NULL); + dnsbl_stats = NULL; rb_helper_write(authd_helper, "O rbl_del_all"); }