--- ircd-hybrid/trunk/src/conf_parser.y 2013/05/10 18:32:26 1992 +++ ircd-hybrid/trunk/src/conf_parser.y 2014/05/01 13:57:39 3435 @@ -1,8 +1,7 @@ /* - * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd). - * conf_parser.y: Parses the ircd configuration file. + * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd) * - * Copyright (C) 2005 by the past and present ircd coders, and others. + * Copyright (c) 2000-2014 ircd-hybrid development team * * 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 @@ -18,10 +17,14 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA - * - * $Id$ */ +/*! \file conf_parser.y + * \brief Parses the ircd configuration file. + * \version $Id$ + */ + + %{ #define YY_NO_UNPUT @@ -40,13 +43,14 @@ #include "irc_string.h" #include "memory.h" #include "modules.h" -#include "s_serv.h" +#include "server.h" #include "hostmask.h" #include "send.h" #include "listener.h" #include "resv.h" #include "numeric.h" -#include "s_user.h" +#include "user.h" +#include "motd.h" #ifdef HAVE_LIBCRYPTO #include @@ -76,6 +80,7 @@ static struct bind, file, ciph, + cert, rpass, spass, class; @@ -150,11 +155,12 @@ reset_block_state(void) %token CALLER_ID_WAIT %token CAN_FLOOD %token CHANNEL -%token CIDR_BITLEN_IPV4 -%token CIDR_BITLEN_IPV6 +%token CIDR_BITLEN_IPV4 +%token CIDR_BITLEN_IPV6 %token CLASS %token CONNECT %token CONNECTFREQ +%token CYCLE_ON_HOST_CHANGE %token DEFAULT_FLOODCOUNT %token DEFAULT_SPLIT_SERVER_COUNT %token DEFAULT_SPLIT_USER_COUNT @@ -171,7 +177,6 @@ reset_block_state(void) %token EXCEED_LIMIT %token EXEMPT %token FAILED_OPER_NOTICE -%token IRCD_FLAGS %token FLATTEN_LINKS %token GECOS %token GENERAL @@ -179,27 +184,31 @@ reset_block_state(void) %token GLINE_DURATION %token GLINE_ENABLE %token GLINE_EXEMPT -%token GLINE_REQUEST_DURATION %token GLINE_MIN_CIDR %token GLINE_MIN_CIDR6 +%token GLINE_REQUEST_DURATION %token GLOBAL_KILL -%token IRCD_AUTH -%token NEED_IDENT %token HAVENT_READ_CONF %token HIDDEN -%token HIDDEN_NAME +%token HIDDEN_NAME +%token HIDE_IDLE_FROM_OPERS %token HIDE_SERVER_IPS %token HIDE_SERVERS %token HIDE_SERVICES -%token HIDE_SPOOF_IPS +%token HIDE_SPOOF_IPS %token HOST %token HUB %token HUB_MASK %token IGNORE_BOGUS_TS %token INVISIBLE_ON_CONNECT %token IP +%token IRCD_AUTH +%token IRCD_FLAGS +%token IRCD_SID +%token JOIN_FLOOD_COUNT +%token JOIN_FLOOD_TIME %token KILL -%token KILL_CHASE_TIME_LIMIT +%token KILL_CHASE_TIME_LIMIT %token KLINE %token KLINE_EXEMPT %token KNOCK_DELAY @@ -207,7 +216,6 @@ reset_block_state(void) %token LEAF_MASK %token LINKS_DELAY %token LISTEN -%token T_LOG %token MASK %token MAX_ACCEPT %token MAX_BANS @@ -215,6 +223,7 @@ reset_block_state(void) %token MAX_CHANS_PER_USER %token MAX_GLOBAL %token MAX_IDENT +%token MAX_IDLE %token MAX_LOCAL %token MAX_NICK_CHANGES %token MAX_NICK_LENGTH @@ -223,15 +232,14 @@ reset_block_state(void) %token MAX_TARGETS %token MAX_TOPIC_LENGTH %token MAX_WATCH +%token MIN_IDLE %token MIN_NONWILDCARD %token MIN_NONWILDCARD_SIMPLE -%token MIN_IDLE -%token MAX_IDLE -%token RANDOM_IDLE -%token HIDE_IDLE_FROM_OPERS %token MODULE %token MODULES +%token MOTD %token NAME +%token NEED_IDENT %token NEED_PASSWORD %token NETWORK_DESC %token NETWORK_NAME @@ -243,13 +251,11 @@ reset_block_state(void) %token NUMBER %token NUMBER_PER_CIDR %token NUMBER_PER_IP -%token OPERATOR -%token OPERS_BYPASS_CALLERID %token OPER_ONLY_UMODES %token OPER_PASS_RESV %token OPER_UMODES -%token JOIN_FLOOD_COUNT -%token JOIN_FLOOD_TIME +%token OPERATOR +%token OPERS_BYPASS_CALLERID %token PACE_WAIT %token PACE_WAIT_SIMPLE %token PASSWORD @@ -258,108 +264,113 @@ reset_block_state(void) %token PING_TIME %token PORT %token QSTRING +%token RANDOM_IDLE %token REASON %token REDIRPORT %token REDIRSERV %token REHASH %token REMOTE %token REMOTEBAN -%token RSA_PRIVATE_KEY_FILE -%token RSA_PUBLIC_KEY_FILE -%token SSL_CERTIFICATE_FILE -%token SSL_DH_PARAM_FILE -%token T_SSL_CLIENT_METHOD -%token T_SSL_SERVER_METHOD -%token T_SSLV3 -%token T_TLSV1 %token RESV %token RESV_EXEMPT +%token RSA_PRIVATE_KEY_FILE +%token RSA_PUBLIC_KEY_FILE %token SECONDS MINUTES HOURS DAYS WEEKS MONTHS YEARS -%token SENDQ %token SEND_PASSWORD +%token SENDQ %token SERVERHIDE %token SERVERINFO -%token IRCD_SID -%token TKLINE_EXPIRE_NOTICES -%token T_SHARED -%token T_CLUSTER -%token TYPE %token SHORT_MOTD %token SPOOF %token SPOOF_NOTICE +%token SQUIT +%token SSL_CERTIFICATE_FILE +%token SSL_CERTIFICATE_FINGERPRINT +%token SSL_CONNECTION_REQUIRED +%token SSL_DH_PARAM_FILE %token STATS_E_DISABLED %token STATS_I_OPER_ONLY %token STATS_K_OPER_ONLY %token STATS_O_OPER_ONLY %token STATS_P_OPER_ONLY -%token TBOOL -%token TMASKED -%token TS_MAX_DELTA -%token TS_WARN_DELTA -%token TWODOTS +%token STATS_U_OPER_ONLY %token T_ALL %token T_BOTS -%token T_SOFTCALLERID %token T_CALLERID %token T_CCONN -%token T_CCONN_FULL -%token T_SSL_CIPHER_LIST +%token T_CLUSTER %token T_DEAF %token T_DEBUG %token T_DLINE %token T_EXTERNAL %token T_FARCONNECT +%token T_FILE %token T_FULL +%token T_GLOBOPS %token T_INVISIBLE %token T_IPV4 %token T_IPV6 %token T_LOCOPS +%token T_LOG %token T_MAX_CLIENTS %token T_NCHANGE %token T_NONONREG %token T_OPERWALL %token T_RECVQ %token T_REJ +%token T_RESTART %token T_SERVER +%token T_SERVICE +%token T_SERVICES_NAME %token T_SERVNOTICE %token T_SET +%token T_SHARED +%token T_SIZE %token T_SKILL +%token T_SOFTCALLERID %token T_SPY %token T_SSL +%token T_SSL_CIPHER_LIST +%token T_SSL_CLIENT_METHOD +%token T_SSL_SERVER_METHOD +%token T_SSLV3 +%token T_TLSV1 %token T_UMODES %token T_UNAUTH %token T_UNDLINE %token T_UNLIMITED %token T_UNRESV %token T_UNXLINE -%token T_GLOBOPS %token T_WALLOP +%token T_WALLOPS %token T_WEBIRC -%token T_RESTART -%token T_SERVICE -%token T_SERVICES_NAME +%token TBOOL %token THROTTLE_TIME +%token TKLINE_EXPIRE_NOTICES +%token TMASKED %token TRUE_NO_OPER_FLOOD +%token TS_MAX_DELTA +%token TS_WARN_DELTA +%token TWODOTS +%token TYPE %token UNKLINE -%token USER %token USE_EGD %token USE_LOGGING +%token USER %token VHOST %token VHOST6 -%token XLINE %token WARN_NO_NLINE -%token T_SIZE -%token T_FILE +%token XLINE -%type QSTRING -%type NUMBER -%type timespec -%type timespec_ -%type sizespec -%type sizespec_ +%type QSTRING +%type NUMBER +%type timespec +%type timespec_ +%type sizespec +%type sizespec_ %% -conf: +conf: | conf conf_item ; @@ -367,7 +378,7 @@ conf_item: admin_entry | logging_entry | oper_entry | channel_entry - | class_entry + | class_entry | listen_entry | auth_entry | serverinfo_entry @@ -383,6 +394,7 @@ conf_item: admin_entry | general_entry | gecos_entry | modules_entry + | motd_entry | error ';' | error '}' ; @@ -504,7 +516,7 @@ server_method_type_item: T_SSLV3 serverinfo_ssl_certificate_file: SSL_CERTIFICATE_FILE '=' QSTRING ';' { #ifdef HAVE_LIBCRYPTO - if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx) + if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx) { if (!ServerInfo.rsa_private_key_file) { @@ -546,58 +558,57 @@ serverinfo_ssl_certificate_file: SSL_CER serverinfo_rsa_private_key_file: RSA_PRIVATE_KEY_FILE '=' QSTRING ';' { #ifdef HAVE_LIBCRYPTO - if (conf_parser_ctx.pass == 1) - { - BIO *file; + BIO *file = NULL; - if (ServerInfo.rsa_private_key) - { - RSA_free(ServerInfo.rsa_private_key); - ServerInfo.rsa_private_key = NULL; - } + if (conf_parser_ctx.pass != 1) + break; - if (ServerInfo.rsa_private_key_file) - { - MyFree(ServerInfo.rsa_private_key_file); - ServerInfo.rsa_private_key_file = NULL; - } + if (ServerInfo.rsa_private_key) + { + RSA_free(ServerInfo.rsa_private_key); + ServerInfo.rsa_private_key = NULL; + } - ServerInfo.rsa_private_key_file = xstrdup(yylval.string); + if (ServerInfo.rsa_private_key_file) + { + MyFree(ServerInfo.rsa_private_key_file); + ServerInfo.rsa_private_key_file = NULL; + } - if ((file = BIO_new_file(yylval.string, "r")) == NULL) - { - conf_error_report("File open failed, ignoring"); - break; - } + ServerInfo.rsa_private_key_file = xstrdup(yylval.string); - ServerInfo.rsa_private_key = PEM_read_bio_RSAPrivateKey(file, NULL, 0, NULL); + if ((file = BIO_new_file(yylval.string, "r")) == NULL) + { + conf_error_report("File open failed, ignoring"); + break; + } - BIO_set_close(file, BIO_CLOSE); - BIO_free(file); + ServerInfo.rsa_private_key = PEM_read_bio_RSAPrivateKey(file, NULL, 0, NULL); - if (ServerInfo.rsa_private_key == NULL) - { - conf_error_report("Couldn't extract key, ignoring"); - break; - } + BIO_set_close(file, BIO_CLOSE); + BIO_free(file); - if (!RSA_check_key(ServerInfo.rsa_private_key)) - { - RSA_free(ServerInfo.rsa_private_key); - ServerInfo.rsa_private_key = NULL; + if (ServerInfo.rsa_private_key == NULL) + { + conf_error_report("Couldn't extract key, ignoring"); + break; + } - conf_error_report("Invalid key, ignoring"); - break; - } + if (!RSA_check_key(ServerInfo.rsa_private_key)) + { + RSA_free(ServerInfo.rsa_private_key); + ServerInfo.rsa_private_key = NULL; - /* require 2048 bit (256 byte) key */ - if (RSA_size(ServerInfo.rsa_private_key) != 256) - { - RSA_free(ServerInfo.rsa_private_key); - ServerInfo.rsa_private_key = NULL; + conf_error_report("Invalid key, ignoring"); + break; + } - conf_error_report("Not a 2048 bit key, ignoring"); - } + if (RSA_size(ServerInfo.rsa_private_key) < 128) + { + RSA_free(ServerInfo.rsa_private_key); + ServerInfo.rsa_private_key = NULL; + + conf_error_report("Ignoring serverinfo::rsa_private_key_file -- need at least a 1024 bit key size"); } #endif }; @@ -638,7 +649,7 @@ serverinfo_ssl_cipher_list: T_SSL_CIPHER #endif }; -serverinfo_name: NAME '=' QSTRING ';' +serverinfo_name: NAME '=' QSTRING ';' { /* this isn't rehashable */ if (conf_parser_ctx.pass == 2 && !ServerInfo.name) @@ -653,7 +664,7 @@ serverinfo_name: NAME '=' QSTRING ';' } }; -serverinfo_sid: IRCD_SID '=' QSTRING ';' +serverinfo_sid: IRCD_SID '=' QSTRING ';' { /* this isn't rehashable */ if (conf_parser_ctx.pass == 2 && !ServerInfo.sid) @@ -693,11 +704,11 @@ serverinfo_network_name: NETWORK_NAME '= serverinfo_network_desc: NETWORK_DESC '=' QSTRING ';' { - if (conf_parser_ctx.pass == 2) - { - MyFree(ServerInfo.network_desc); - ServerInfo.network_desc = xstrdup(yylval.string); - } + if (conf_parser_ctx.pass != 2) + break; + + MyFree(ServerInfo.network_desc); + ServerInfo.network_desc = xstrdup(yylval.string); }; serverinfo_vhost: VHOST '=' QSTRING ';' @@ -827,7 +838,7 @@ serverinfo_max_topic_length: MAX_TOPIC_L ServerInfo.max_topic_length = $3; }; -serverinfo_hub: HUB '=' TBOOL ';' +serverinfo_hub: HUB '=' TBOOL ';' { if (conf_parser_ctx.pass == 2) ServerInfo.hub = yylval.number; @@ -842,31 +853,67 @@ admin_items: admin_items admin_item | ad admin_item: admin_name | admin_description | admin_email | error ';' ; -admin_name: NAME '=' QSTRING ';' +admin_name: NAME '=' QSTRING ';' { - if (conf_parser_ctx.pass == 2) - { - MyFree(AdminInfo.name); - AdminInfo.name = xstrdup(yylval.string); - } + if (conf_parser_ctx.pass != 2) + break; + + MyFree(AdminInfo.name); + AdminInfo.name = xstrdup(yylval.string); }; admin_email: EMAIL '=' QSTRING ';' { - if (conf_parser_ctx.pass == 2) - { - MyFree(AdminInfo.email); - AdminInfo.email = xstrdup(yylval.string); - } + if (conf_parser_ctx.pass != 2) + break; + + MyFree(AdminInfo.email); + AdminInfo.email = xstrdup(yylval.string); }; admin_description: DESCRIPTION '=' QSTRING ';' { + if (conf_parser_ctx.pass != 2) + break; + + MyFree(AdminInfo.description); + AdminInfo.description = xstrdup(yylval.string); +}; + +/*************************************************************************** + * motd section + ***************************************************************************/ +motd_entry: MOTD +{ if (conf_parser_ctx.pass == 2) - { - MyFree(AdminInfo.description); - AdminInfo.description = xstrdup(yylval.string); - } + reset_block_state(); +} '{' motd_items '}' ';' +{ + dlink_node *ptr = NULL; + + if (conf_parser_ctx.pass != 2) + break; + + if (!block_state.file.buf[0]) + break; + + DLINK_FOREACH(ptr, block_state.mask.list.head) + motd_add(ptr->data, block_state.file.buf); +}; + +motd_items: motd_items motd_item | motd_item; +motd_item: motd_mask | motd_file | error ';' ; + +motd_mask: MASK '=' QSTRING ';' +{ + if (conf_parser_ctx.pass == 2) + dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list); +}; + +motd_file: T_FILE '=' QSTRING ';' +{ + if (conf_parser_ctx.pass == 2) + strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf)); }; /*************************************************************************** @@ -939,6 +986,14 @@ logging_file_type_item: USER { if (conf_parser_ctx.pass == 2) block_state.type.value = LOG_TYPE_GLINE; +} | XLINE +{ + if (conf_parser_ctx.pass == 2) + block_state.type.value = LOG_TYPE_XLINE; +} | RESV +{ + if (conf_parser_ctx.pass == 2) + block_state.type.value = LOG_TYPE_RESV; } | T_DLINE { if (conf_parser_ctx.pass == 2) @@ -961,7 +1016,7 @@ logging_file_type_item: USER /*************************************************************************** * section oper ***************************************************************************/ -oper_entry: OPERATOR +oper_entry: OPERATOR { if (conf_parser_ctx.pass != 2) break; @@ -978,8 +1033,8 @@ oper_entry: OPERATOR if (!block_state.name.buf[0]) break; #ifdef HAVE_LIBCRYPTO - if (!(block_state.file.buf[0] || - block_state.rpass.buf[0])) + if (!block_state.file.buf[0] && + !block_state.rpass.buf[0]) break; #else if (!block_state.rpass.buf[0]) @@ -1000,10 +1055,13 @@ oper_entry: OPERATOR nuh.hostsize = sizeof(block_state.host.buf); split_nuh(&nuh); - conf = conf_make(CONF_OPER); - conf->name = xstrdup(block_state.name.buf); - conf->user = xstrdup(block_state.user.buf); - conf->host = xstrdup(block_state.host.buf); + conf = conf_make(CONF_OPER); + conf->name = xstrdup(block_state.name.buf); + conf->user = xstrdup(block_state.user.buf); + conf->host = xstrdup(block_state.host.buf); + + if (block_state.cert.buf[0]) + conf->certfp = xstrdup(block_state.cert.buf); if (block_state.rpass.buf[0]) conf->passwd = xstrdup(block_state.rpass.buf); @@ -1041,7 +1099,9 @@ oper_entry: OPERATOR oper_items: oper_items oper_item | oper_item; oper_item: oper_name | oper_user | oper_password | oper_umodes | oper_class | oper_encrypted | - oper_rsa_public_key_file | oper_flags | error ';' ; + oper_rsa_public_key_file | oper_ssl_certificate_fingerprint | + oper_ssl_connection_required | + oper_flags | error ';' ; oper_name: NAME '=' QSTRING ';' { @@ -1063,13 +1123,13 @@ oper_password: PASSWORD '=' QSTRING ';' oper_encrypted: ENCRYPTED '=' TBOOL ';' { - if (conf_parser_ctx.pass == 2) - { - if (yylval.number) - block_state.flags.value |= CONF_FLAGS_ENCRYPTED; - else - block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED; - } + if (conf_parser_ctx.pass != 2) + break; + + if (yylval.number) + block_state.flags.value |= CONF_FLAGS_ENCRYPTED; + else + block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED; }; oper_rsa_public_key_file: RSA_PUBLIC_KEY_FILE '=' QSTRING ';' @@ -1078,6 +1138,23 @@ oper_rsa_public_key_file: RSA_PUBLIC_KEY strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf)); }; +oper_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';' +{ + if (conf_parser_ctx.pass == 2) + strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf)); +}; + +oper_ssl_connection_required: SSL_CONNECTION_REQUIRED '=' TBOOL ';' +{ + if (conf_parser_ctx.pass != 2) + break; + + if (yylval.number) + block_state.flags.value |= CONF_FLAGS_SSL; + else + block_state.flags.value &= ~CONF_FLAGS_SSL; +}; + oper_class: CLASS '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) @@ -1099,10 +1176,6 @@ oper_umodes_item: T_BOTS { if (conf_parser_ctx.pass == 2) block_state.modes.value |= UMODE_CCONN; -} | T_CCONN_FULL -{ - if (conf_parser_ctx.pass == 2) - block_state.modes.value |= UMODE_CCONN_FULL; } | T_DEAF { if (conf_parser_ctx.pass == 2) @@ -1188,14 +1261,30 @@ oper_flags: IRCD_FLAGS } '=' oper_flags_items ';'; oper_flags_items: oper_flags_items ',' oper_flags_item | oper_flags_item; -oper_flags_item: GLOBAL_KILL +oper_flags_item: KILL ':' REMOTE +{ + if (conf_parser_ctx.pass == 2) + block_state.port.value |= OPER_FLAG_KILL_REMOTE; +} | KILL +{ + if (conf_parser_ctx.pass == 2) + block_state.port.value |= OPER_FLAG_KILL; +} | CONNECT ':' REMOTE +{ + if (conf_parser_ctx.pass == 2) + block_state.port.value |= OPER_FLAG_CONNECT_REMOTE; +} | CONNECT +{ + if (conf_parser_ctx.pass == 2) + block_state.port.value |= OPER_FLAG_CONNECT; +} | SQUIT ':' REMOTE { if (conf_parser_ctx.pass == 2) - block_state.port.value |= OPER_FLAG_GLOBAL_KILL; -} | REMOTE + block_state.port.value |= OPER_FLAG_SQUIT_REMOTE; +} | SQUIT { if (conf_parser_ctx.pass == 2) - block_state.port.value |= OPER_FLAG_REMOTE; + block_state.port.value |= OPER_FLAG_SQUIT; } | KLINE { if (conf_parser_ctx.pass == 2) @@ -1215,7 +1304,11 @@ oper_flags_item: GLOBAL_KILL } | XLINE { if (conf_parser_ctx.pass == 2) - block_state.port.value |= OPER_FLAG_X; + block_state.port.value |= OPER_FLAG_XLINE; +} | T_UNXLINE +{ + if (conf_parser_ctx.pass == 2) + block_state.port.value |= OPER_FLAG_UNXLINE; } | GLINE { if (conf_parser_ctx.pass == 2) @@ -1244,6 +1337,14 @@ oper_flags_item: GLOBAL_KILL { if (conf_parser_ctx.pass == 2) block_state.port.value |= OPER_FLAG_GLOBOPS; +} | T_WALLOPS +{ + if (conf_parser_ctx.pass == 2) + block_state.port.value |= OPER_FLAG_WALLOPS; +} | T_LOCOPS +{ + if (conf_parser_ctx.pass == 2) + block_state.port.value |= OPER_FLAG_LOCOPS; } | REMOTEBAN { if (conf_parser_ctx.pass == 2) @@ -1340,7 +1441,7 @@ class_item: class_name | class_flags | error ';' ; -class_name: NAME '=' QSTRING ';' +class_name: NAME '=' QSTRING ';' { if (conf_parser_ctx.pass == 1) strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf)); @@ -1566,8 +1667,8 @@ auth_entry: IRCD_AUTH split_nuh(&nuh); conf = conf_make(CONF_CLIENT); - conf->user = xstrdup(collapse(block_state.user.buf)); - conf->host = xstrdup(collapse(block_state.host.buf)); + conf->user = xstrdup(block_state.user.buf); + conf->host = xstrdup(block_state.host.buf); if (block_state.rpass.buf[0]) conf->passwd = xstrdup(block_state.rpass.buf); @@ -1580,7 +1681,7 @@ auth_entry: IRCD_AUTH conf_add_class_to_conf(conf, block_state.class.buf); add_conf_by_address(CONF_CLIENT, conf); } -}; +}; auth_items: auth_items auth_item | auth_item; auth_item: auth_user | auth_passwd | auth_class | auth_flags | @@ -1619,7 +1720,7 @@ auth_encrypted: ENCRYPTED '=' TBOOL ';' auth_flags: IRCD_FLAGS { if (conf_parser_ctx.pass == 2) - block_state.flags.value &= CONF_FLAGS_ENCRYPTED; + block_state.flags.value &= (CONF_FLAGS_ENCRYPTED | CONF_FLAGS_SPOOF_IP); } '=' auth_flags_items ';'; auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item; @@ -1665,7 +1766,7 @@ auth_flags_item: SPOOF_NOTICE block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD; }; -auth_spoof: SPOOF '=' QSTRING ';' +auth_spoof: SPOOF '=' QSTRING ';' { if (conf_parser_ctx.pass != 2) break; @@ -1748,13 +1849,13 @@ service_item: service_name | error; service_name: NAME '=' QSTRING ';' { - if (conf_parser_ctx.pass == 2) + if (conf_parser_ctx.pass != 2) + break; + + if (valid_servname(yylval.string)) { - if (valid_servname(yylval.string)) - { - struct MaskItem *conf = conf_make(CONF_SERVICE); - conf->name = xstrdup(yylval.string); - } + struct MaskItem *conf = conf_make(CONF_SERVICE); + conf->name = xstrdup(yylval.string); } }; @@ -1948,13 +2049,14 @@ cluster_type_item: KLINE /*************************************************************************** * section connect ***************************************************************************/ -connect_entry: CONNECT +connect_entry: CONNECT { if (conf_parser_ctx.pass != 2) break; reset_block_state(); + block_state.aftype.value = AF_INET; block_state.port.value = PORTNUM; } '{' connect_items '}' ';' { @@ -1968,8 +2070,8 @@ connect_entry: CONNECT !block_state.host.buf[0]) break; - if (!(block_state.rpass.buf[0] || - block_state.spass.buf[0])) + if (!block_state.rpass.buf[0] || + !block_state.spass.buf[0]) break; if (has_wildcards(block_state.name.buf) || @@ -1984,7 +2086,12 @@ connect_entry: CONNECT conf->name = xstrdup(block_state.name.buf); conf->passwd = xstrdup(block_state.rpass.buf); conf->spasswd = xstrdup(block_state.spass.buf); - conf->cipher_list = xstrdup(block_state.ciph.buf); + + if (block_state.cert.buf[0]) + conf->certfp = xstrdup(block_state.cert.buf); + + if (block_state.ciph.buf[0]) + conf->cipher_list = xstrdup(block_state.ciph.buf); dlinkMoveList(&block_state.leaf.list, &conf->leaf_list); dlinkMoveList(&block_state.hub.list, &conf->hub_list); @@ -2017,9 +2124,10 @@ connect_entry: CONNECT connect_items: connect_items connect_item | connect_item; connect_item: connect_name | connect_host | connect_vhost | connect_send_password | connect_accept_password | + connect_ssl_certificate_fingerprint | connect_aftype | connect_port | connect_ssl_cipher_list | connect_flags | connect_hub_mask | connect_leaf_mask | - connect_class | connect_encrypted | + connect_class | connect_encrypted | error ';' ; connect_name: NAME '=' QSTRING ';' @@ -2028,18 +2136,18 @@ connect_name: NAME '=' QSTRING ';' strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf)); }; -connect_host: HOST '=' QSTRING ';' +connect_host: HOST '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) strlcpy(block_state.host.buf, yylval.string, sizeof(block_state.host.buf)); }; -connect_vhost: VHOST '=' QSTRING ';' +connect_vhost: VHOST '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) strlcpy(block_state.bind.buf, yylval.string, sizeof(block_state.bind.buf)); }; - + connect_send_password: SEND_PASSWORD '=' QSTRING ';' { if (conf_parser_ctx.pass != 2) @@ -2066,6 +2174,12 @@ connect_accept_password: ACCEPT_PASSWORD strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf)); }; +connect_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';' +{ + if (conf_parser_ctx.pass == 2) + strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf)); +}; + connect_port: PORT '=' NUMBER ';' { if (conf_parser_ctx.pass == 2) @@ -2111,13 +2225,13 @@ connect_encrypted: ENCRYPTED '=' TBOOL ' } }; -connect_hub_mask: HUB_MASK '=' QSTRING ';' +connect_hub_mask: HUB_MASK '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.hub.list); }; -connect_leaf_mask: LEAF_MASK '=' QSTRING ';' +connect_leaf_mask: LEAF_MASK '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.leaf.list); @@ -2168,7 +2282,7 @@ kill_entry: KILL else conf->reason = xstrdup(CONF_NOREASON); add_conf_by_address(CONF_KLINE, conf); -}; +}; kill_items: kill_items kill_item | kill_item; kill_item: kill_user | kill_reason | error; @@ -2193,7 +2307,7 @@ kill_user: USER '=' QSTRING ';' } }; -kill_reason: REASON '=' QSTRING ';' +kill_reason: REASON '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf)); @@ -2202,7 +2316,7 @@ kill_reason: REASON '=' QSTRING ';' /*************************************************************************** * section deny ***************************************************************************/ -deny_entry: DENY +deny_entry: DENY { if (conf_parser_ctx.pass == 2) reset_block_state(); @@ -2227,7 +2341,7 @@ deny_entry: DENY conf->reason = xstrdup(CONF_NOREASON); add_conf_by_address(CONF_DLINE, conf); } -}; +}; deny_items: deny_items deny_item | deny_item; deny_item: deny_ip | deny_reason | error; @@ -2238,7 +2352,7 @@ deny_ip: IP '=' QSTRING ';' strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf)); }; -deny_reason: REASON '=' QSTRING ';' +deny_reason: REASON '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf)); @@ -2295,13 +2409,13 @@ gecos_entry: GECOS gecos_items: gecos_items gecos_item | gecos_item; gecos_item: gecos_name | gecos_reason | error; -gecos_name: NAME '=' QSTRING ';' +gecos_name: NAME '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf)); }; -gecos_reason: REASON '=' QSTRING ';' +gecos_reason: REASON '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf)); @@ -2325,6 +2439,7 @@ general_item: general_hide_spoof_i general_stats_o_oper_only | general_stats_k_oper_only | general_pace_wait | general_stats_i_oper_only | general_pace_wait_simple | general_stats_P_oper_only | + general_stats_u_oper_only | general_short_motd | general_no_oper_flood | general_true_no_oper_flood | general_oper_pass_resv | general_oper_only_umodes | general_max_targets | @@ -2332,16 +2447,16 @@ general_item: general_hide_spoof_i general_oper_umodes | general_caller_id_wait | general_opers_bypass_callerid | general_default_floodcount | general_min_nonwildcard | general_min_nonwildcard_simple | - general_disable_remote_commands | general_throttle_time | general_havent_read_conf | general_ping_cookie | - general_disable_auth | + general_disable_auth | general_tkline_expire_notices | general_gline_enable | general_gline_duration | general_gline_request_duration | general_gline_min_cidr | general_gline_min_cidr6 | general_stats_e_disabled | general_max_watch | general_services_name | + general_cycle_on_host_change | error; @@ -2350,6 +2465,12 @@ general_max_watch: MAX_WATCH '=' NUMBER ConfigFileEntry.max_watch = $3; }; +general_cycle_on_host_change: CYCLE_ON_HOST_CHANGE '=' TBOOL ';' +{ + if (conf_parser_ctx.pass == 2) + ConfigFileEntry.cycle_on_host_change = yylval.number; +}; + general_gline_enable: GLINE_ENABLE '=' TBOOL ';' { if (conf_parser_ctx.pass == 2) @@ -2398,11 +2519,6 @@ general_ignore_bogus_ts: IGNORE_BOGUS_TS ConfigFileEntry.ignore_bogus_ts = yylval.number; }; -general_disable_remote_commands: DISABLE_REMOTE_COMMANDS '=' TBOOL ';' -{ - ConfigFileEntry.disable_remote = yylval.number; -}; - general_failed_oper_notice: FAILED_OPER_NOTICE '=' TBOOL ';' { ConfigFileEntry.failed_oper_notice = yylval.number; @@ -2415,7 +2531,7 @@ general_anti_nick_flood: ANTI_NICK_FLOOD general_max_nick_time: MAX_NICK_TIME '=' timespec ';' { - ConfigFileEntry.max_nick_time = $3; + ConfigFileEntry.max_nick_time = $3; }; general_max_nick_changes: MAX_NICK_CHANGES '=' NUMBER ';' @@ -2480,6 +2596,11 @@ general_stats_P_oper_only: STATS_P_OPER_ ConfigFileEntry.stats_P_oper_only = yylval.number; }; +general_stats_u_oper_only: STATS_U_OPER_ONLY '=' TBOOL ';' +{ + ConfigFileEntry.stats_u_oper_only = yylval.number; +}; + general_stats_k_oper_only: STATS_K_OPER_ONLY '=' TBOOL ';' { ConfigFileEntry.stats_k_oper_only = 2 * yylval.number; @@ -2520,7 +2641,7 @@ general_short_motd: SHORT_MOTD '=' TBOOL { ConfigFileEntry.short_motd = yylval.number; }; - + general_no_oper_flood: NO_OPER_FLOOD '=' TBOOL ';' { ConfigFileEntry.no_oper_flood = yylval.number; @@ -2581,7 +2702,7 @@ general_disable_auth: DISABLE_AUTH '=' T general_throttle_time: THROTTLE_TIME '=' timespec ';' { - ConfigFileEntry.throttle_time = yylval.number; + ConfigFileEntry.throttle_time = $3; }; general_oper_umodes: OPER_UMODES @@ -2596,9 +2717,6 @@ umode_oitem: T_BOTS } | T_CCONN { ConfigFileEntry.oper_umodes |= UMODE_CCONN; -} | T_CCONN_FULL -{ - ConfigFileEntry.oper_umodes |= UMODE_CCONN_FULL; } | T_DEAF { ConfigFileEntry.oper_umodes |= UMODE_DEAF; @@ -2658,21 +2776,18 @@ umode_oitem: T_BOTS ConfigFileEntry.oper_umodes |= UMODE_FARCONNECT; }; -general_oper_only_umodes: OPER_ONLY_UMODES +general_oper_only_umodes: OPER_ONLY_UMODES { ConfigFileEntry.oper_only_umodes = 0; } '=' umode_items ';' ; umode_items: umode_items ',' umode_item | umode_item; -umode_item: T_BOTS +umode_item: T_BOTS { ConfigFileEntry.oper_only_umodes |= UMODE_BOTS; } | T_CCONN { ConfigFileEntry.oper_only_umodes |= UMODE_CCONN; -} | T_CCONN_FULL -{ - ConfigFileEntry.oper_only_umodes |= UMODE_CCONN_FULL; } | T_DEAF { ConfigFileEntry.oper_only_umodes |= UMODE_DEAF; @@ -2680,7 +2795,7 @@ umode_item: T_BOTS { ConfigFileEntry.oper_only_umodes |= UMODE_DEBUG; } | T_FULL -{ +{ ConfigFileEntry.oper_only_umodes |= UMODE_FULL; } | T_SKILL { @@ -2822,7 +2937,7 @@ channel_jflood_count: JOIN_FLOOD_COUNT ' channel_jflood_time: JOIN_FLOOD_TIME '=' timespec ';' { - GlobalSetOptions.joinfloodtime = yylval.number; + GlobalSetOptions.joinfloodtime = $3; }; /*************************************************************************** @@ -2832,7 +2947,8 @@ serverhide_entry: SERVERHIDE '{' serverhide_items '}' ';'; serverhide_items: serverhide_items serverhide_item | serverhide_item; -serverhide_item: serverhide_flatten_links | serverhide_hide_servers | +serverhide_item: serverhide_flatten_links | serverhide_disable_remote_commands | + serverhide_hide_servers | serverhide_hide_services | serverhide_links_delay | serverhide_hidden | serverhide_hidden_name | @@ -2845,6 +2961,12 @@ serverhide_flatten_links: FLATTEN_LINKS ConfigServerHide.flatten_links = yylval.number; }; +serverhide_disable_remote_commands: DISABLE_REMOTE_COMMANDS '=' TBOOL ';' +{ + if (conf_parser_ctx.pass == 2) + ConfigServerHide.disable_remote_commands = yylval.number; +}; + serverhide_hide_servers: HIDE_SERVERS '=' TBOOL ';' { if (conf_parser_ctx.pass == 2)