ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
(Generate patch)

Comparing ircd-hybrid/trunk/src/conf_parser.y (file contents):
Revision 3435 by michael, Thu May 1 13:57:39 2014 UTC vs.
Revision 4313 by michael, Thu Jul 31 18:50:11 2014 UTC

# Line 65 | Line 65 | int yylex(void);
65  
66   static struct
67   {
68 <  struct {
68 >  struct
69 >  {
70      dlink_list list;
71    } mask,
72      leaf,
73      hub;
74  
75 <  struct {
75 >  struct
76 >  {
77      char buf[IRCD_BUFSIZE];
78    } name,
79      user,
# Line 85 | Line 87 | static struct
87      spass,
88      class;
89  
90 <  struct {
90 >  struct
91 >  {
92      unsigned int value;
93    } flags,
94      modes,
# Line 104 | Line 107 | static struct
107      max_ident,
108      max_sendq,
109      max_recvq,
110 +    max_channels,
111      cidr_bitlen_ipv4,
112      cidr_bitlen_ipv6,
113      number_per_cidr;
# Line 151 | Line 155 | reset_block_state(void)
155   %token  ANTI_NICK_FLOOD
156   %token  ANTI_SPAM_EXIT_MESSAGE_TIME
157   %token  AUTOCONN
158 + %token  AWAY_COUNT
159 + %token  AWAY_TIME
160   %token  BYTES KBYTES MBYTES
161   %token  CALLER_ID_WAIT
162   %token  CAN_FLOOD
# Line 191 | Line 197 | reset_block_state(void)
197   %token  HAVENT_READ_CONF
198   %token  HIDDEN
199   %token  HIDDEN_NAME
200 + %token  HIDE_CHANS
201 + %token  HIDE_IDLE
202   %token  HIDE_IDLE_FROM_OPERS
203   %token  HIDE_SERVER_IPS
204   %token  HIDE_SERVERS
# Line 201 | Line 209 | reset_block_state(void)
209   %token  HUB_MASK
210   %token  IGNORE_BOGUS_TS
211   %token  INVISIBLE_ON_CONNECT
212 + %token  INVITE_CLIENT_COUNT
213 + %token  INVITE_CLIENT_TIME
214   %token  IP
215   %token  IRCD_AUTH
216   %token  IRCD_FLAGS
# Line 211 | Line 221 | reset_block_state(void)
221   %token  KILL_CHASE_TIME_LIMIT
222   %token  KLINE
223   %token  KLINE_EXEMPT
224 < %token  KNOCK_DELAY
224 > %token  KNOCK_CLIENT_COUNT
225 > %token  KNOCK_CLIENT_TIME
226   %token  KNOCK_DELAY_CHANNEL
227   %token  LEAF_MASK
228   %token  LINKS_DELAY
# Line 219 | Line 230 | reset_block_state(void)
230   %token  MASK
231   %token  MAX_ACCEPT
232   %token  MAX_BANS
233 < %token  MAX_CHANS_PER_OPER
223 < %token  MAX_CHANS_PER_USER
233 > %token  MAX_CHANNELS
234   %token  MAX_GLOBAL
235   %token  MAX_IDENT
236   %token  MAX_IDLE
# Line 287 | Line 297 | reset_block_state(void)
297   %token  SSL_CERTIFICATE_FILE
298   %token  SSL_CERTIFICATE_FINGERPRINT
299   %token  SSL_CONNECTION_REQUIRED
300 + %token  SSL_DH_ELLIPTIC_CURVE
301   %token  SSL_DH_PARAM_FILE
302 + %token  SSL_MESSAGE_DIGEST_ALGORITHM
303   %token  STATS_E_DISABLED
304   %token  STATS_I_OPER_ONLY
305   %token  STATS_K_OPER_ONLY
# Line 315 | Line 327 | reset_block_state(void)
327   %token  T_MAX_CLIENTS
328   %token  T_NCHANGE
329   %token  T_NONONREG
318 %token  T_OPERWALL
330   %token  T_RECVQ
331   %token  T_REJ
332   %token  T_RESTART
# Line 331 | Line 342 | reset_block_state(void)
342   %token  T_SPY
343   %token  T_SSL
344   %token  T_SSL_CIPHER_LIST
334 %token  T_SSL_CLIENT_METHOD
335 %token  T_SSL_SERVER_METHOD
336 %token  T_SSLV3
337 %token  T_TLSV1
345   %token  T_UMODES
346   %token  T_UNAUTH
347   %token  T_UNDLINE
# Line 345 | Line 352 | reset_block_state(void)
352   %token  T_WALLOPS
353   %token  T_WEBIRC
354   %token  TBOOL
355 + %token  THROTTLE_COUNT
356   %token  THROTTLE_TIME
357   %token  TKLINE_EXPIRE_NOTICES
358   %token  TMASKED
# Line 359 | Line 367 | reset_block_state(void)
367   %token  USER
368   %token  VHOST
369   %token  VHOST6
370 < %token  WARN_NO_NLINE
370 > %token  WARN_NO_CONNECT_BLOCK
371   %token  XLINE
372  
373   %type  <string> QSTRING
# Line 377 | Line 385 | conf:
385   conf_item:        admin_entry
386                  | logging_entry
387                  | oper_entry
388 <                | channel_entry
388 >                | channel_entry
389                  | class_entry
390                  | listen_entry
391                  | auth_entry
392                  | serverinfo_entry
393 <                | serverhide_entry
393 >                | serverhide_entry
394                  | resv_entry
395                  | service_entry
396                  | shared_entry
397 <                | cluster_entry
397 >                | cluster_entry
398                  | connect_entry
399                  | kill_entry
400                  | deny_entry
401 <                | exempt_entry
402 <                | general_entry
401 >                | exempt_entry
402 >                | general_entry
403                  | gecos_entry
404                  | modules_entry
405                  | motd_entry
# Line 401 | Line 409 | conf_item:        admin_entry
409  
410  
411   timespec_: { $$ = 0; } | timespec;
412 < timespec:       NUMBER timespec_
413 <                {
414 <                        $$ = $1 + $2;
415 <                }
416 <                | NUMBER SECONDS timespec_
417 <                {
418 <                        $$ = $1 + $3;
419 <                }
420 <                | NUMBER MINUTES timespec_
421 <                {
422 <                        $$ = $1 * 60 + $3;
423 <                }
424 <                | NUMBER HOURS timespec_
425 <                {
426 <                        $$ = $1 * 60 * 60 + $3;
427 <                }
420 <                | NUMBER DAYS timespec_
421 <                {
422 <                        $$ = $1 * 60 * 60 * 24 + $3;
423 <                }
424 <                | NUMBER WEEKS timespec_
425 <                {
426 <                        $$ = $1 * 60 * 60 * 24 * 7 + $3;
427 <                }
428 <                | NUMBER MONTHS timespec_
429 <                {
430 <                        $$ = $1 * 60 * 60 * 24 * 7 * 4 + $3;
431 <                }
432 <                | NUMBER YEARS timespec_
433 <                {
434 <                        $$ = $1 * 60 * 60 * 24 * 365 + $3;
435 <                }
436 <                ;
437 <
438 < sizespec_:      { $$ = 0; } | sizespec;
439 < sizespec:       NUMBER sizespec_ { $$ = $1 + $2; }
440 <                | NUMBER BYTES sizespec_ { $$ = $1 + $3; }
441 <                | NUMBER KBYTES sizespec_ { $$ = $1 * 1024 + $3; }
442 <                | NUMBER MBYTES sizespec_ { $$ = $1 * 1024 * 1024 + $3; }
443 <                ;
412 > timespec:  NUMBER timespec_         { $$ = $1 + $2; } |
413 >           NUMBER SECONDS timespec_ { $$ = $1 + $3; } |
414 >           NUMBER MINUTES timespec_ { $$ = $1 * 60 + $3; } |
415 >           NUMBER HOURS timespec_   { $$ = $1 * 60 * 60 + $3; } |
416 >           NUMBER DAYS timespec_    { $$ = $1 * 60 * 60 * 24 + $3; } |
417 >           NUMBER WEEKS timespec_   { $$ = $1 * 60 * 60 * 24 * 7 + $3; } |
418 >           NUMBER MONTHS timespec_  { $$ = $1 * 60 * 60 * 24 * 7 * 4 + $3; } |
419 >           NUMBER YEARS timespec_   { $$ = $1 * 60 * 60 * 24 * 365 + $3; }
420 >           ;
421 >
422 > sizespec_:  { $$ = 0; } | sizespec;
423 > sizespec:   NUMBER sizespec_ { $$ = $1 + $2; } |
424 >            NUMBER BYTES sizespec_ { $$ = $1 + $3; } |
425 >            NUMBER KBYTES sizespec_ { $$ = $1 * 1024 + $3; } |
426 >            NUMBER MBYTES sizespec_ { $$ = $1 * 1024 * 1024 + $3; }
427 >            ;
428  
429  
430   /***************************************************************************
# Line 468 | Line 452 | modules_path: PATH '=' QSTRING ';'
452   serverinfo_entry: SERVERINFO '{' serverinfo_items '}' ';';
453  
454   serverinfo_items:       serverinfo_items serverinfo_item | serverinfo_item ;
455 < serverinfo_item:        serverinfo_name | serverinfo_vhost |
456 <                        serverinfo_hub | serverinfo_description |
457 <                        serverinfo_network_name | serverinfo_network_desc |
458 <                        serverinfo_max_clients | serverinfo_max_nick_length |
459 <                        serverinfo_max_topic_length | serverinfo_ssl_dh_param_file |
460 <                        serverinfo_rsa_private_key_file | serverinfo_vhost6 |
461 <                        serverinfo_sid | serverinfo_ssl_certificate_file |
462 <                        serverinfo_ssl_client_method | serverinfo_ssl_server_method |
455 > serverinfo_item:        serverinfo_name |
456 >                        serverinfo_vhost |
457 >                        serverinfo_hub |
458 >                        serverinfo_description |
459 >                        serverinfo_network_name |
460 >                        serverinfo_network_desc |
461 >                        serverinfo_max_clients |
462 >                        serverinfo_max_nick_length |
463 >                        serverinfo_max_topic_length |
464 >                        serverinfo_ssl_dh_param_file |
465 >                        serverinfo_ssl_dh_elliptic_curve |
466 >                        serverinfo_rsa_private_key_file |
467 >                        serverinfo_vhost6 |
468 >                        serverinfo_sid |
469 >                        serverinfo_ssl_certificate_file |
470                          serverinfo_ssl_cipher_list |
471 <                        error ';' ;
472 <
482 <
483 < serverinfo_ssl_client_method: T_SSL_CLIENT_METHOD '=' client_method_types ';' ;
484 < serverinfo_ssl_server_method: T_SSL_SERVER_METHOD '=' server_method_types ';' ;
485 <
486 < client_method_types: client_method_types ',' client_method_type_item | client_method_type_item;
487 < client_method_type_item: T_SSLV3
488 < {
489 < #ifdef HAVE_LIBCRYPTO
490 <  if (conf_parser_ctx.pass == 2 && ServerInfo.client_ctx)
491 <    SSL_CTX_clear_options(ServerInfo.client_ctx, SSL_OP_NO_SSLv3);
492 < #endif
493 < } | T_TLSV1
494 < {
495 < #ifdef HAVE_LIBCRYPTO
496 <  if (conf_parser_ctx.pass == 2 && ServerInfo.client_ctx)
497 <    SSL_CTX_clear_options(ServerInfo.client_ctx, SSL_OP_NO_TLSv1);
498 < #endif
499 < };
471 >                        serverinfo_ssl_message_digest_algorithm |
472 >                        error ';' ;
473  
501 server_method_types: server_method_types ',' server_method_type_item | server_method_type_item;
502 server_method_type_item: T_SSLV3
503 {
504 #ifdef HAVE_LIBCRYPTO
505  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
506    SSL_CTX_clear_options(ServerInfo.server_ctx, SSL_OP_NO_SSLv3);
507 #endif
508 } | T_TLSV1
509 {
510 #ifdef HAVE_LIBCRYPTO
511  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
512    SSL_CTX_clear_options(ServerInfo.server_ctx, SSL_OP_NO_TLSv1);
513 #endif
514 };
474  
475   serverinfo_ssl_certificate_file: SSL_CERTIFICATE_FILE '=' QSTRING ';'
476   {
# Line 615 | Line 574 | serverinfo_rsa_private_key_file: RSA_PRI
574  
575   serverinfo_ssl_dh_param_file: SSL_DH_PARAM_FILE '=' QSTRING ';'
576   {
618 /* TBD - XXX: error reporting */
577   #ifdef HAVE_LIBCRYPTO
578    if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
579    {
# Line 637 | Line 595 | serverinfo_ssl_dh_param_file: SSL_DH_PAR
595          DH_free(dh);
596        }
597      }
598 +    else
599 +      conf_error_report("Ignoring serverinfo::ssl_dh_param_file -- could not open/read Diffie-Hellman parameter file");
600    }
601   #endif
602   };
# Line 649 | Line 609 | serverinfo_ssl_cipher_list: T_SSL_CIPHER
609   #endif
610   };
611  
612 + serverinfo_ssl_message_digest_algorithm: SSL_MESSAGE_DIGEST_ALGORITHM '=' QSTRING ';'
613 + {
614 + #ifdef HAVE_LIBCRYPTO
615 +  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
616 +  {
617 +    if ((ServerInfo.message_digest_algorithm = EVP_get_digestbyname(yylval.string)) == NULL)
618 +    {
619 +      ServerInfo.message_digest_algorithm = EVP_sha256();
620 +      conf_error_report("Ignoring serverinfo::ssl_message_digest_algorithm -- unknown message digest algorithm");
621 +    }
622 +  }
623 + #endif
624 + }
625 +
626 + serverinfo_ssl_dh_elliptic_curve: SSL_DH_ELLIPTIC_CURVE '=' QSTRING ';'
627 + {
628 + #ifdef HAVE_LIBCRYPTO
629 + #if OPENSSL_VERSION_NUMBER >= 0x1000005FL && !defined(OPENSSL_NO_ECDH)
630 +  int nid = 0;
631 +  EC_KEY *key = NULL;
632 +
633 +  if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
634 +  {
635 +    if ((nid = OBJ_sn2nid(yylval.string)) == 0)
636 +    {
637 +        conf_error_report("Ignoring serverinfo::serverinfo_ssl_dh_elliptic_curve -- unknown curve name");
638 +        break;
639 +    }
640 +
641 +    if ((key = EC_KEY_new_by_curve_name(nid)) == NULL)
642 +    {
643 +      conf_error_report("Ignoring serverinfo::serverinfo_ssl_dh_elliptic_curve -- could not create curve");
644 +      break;
645 +    }
646 +
647 +    SSL_CTX_set_tmp_ecdh(ServerInfo.server_ctx, key);
648 +    EC_KEY_free(key);
649 + }
650 + #endif
651 + #endif
652 + };
653 +
654   serverinfo_name: NAME '=' QSTRING ';'
655   {
656    /* this isn't rehashable */
# Line 694 | Line 696 | serverinfo_network_name: NETWORK_NAME '=
696    {
697      char *p;
698  
699 <    if ((p = strchr(yylval.string, ' ')) != NULL)
700 <      p = '\0';
699 >    if ((p = strchr(yylval.string, ' ')))
700 >      *p = '\0';
701  
702      MyFree(ServerInfo.network_name);
703      ServerInfo.network_name = xstrdup(yylval.string);
# Line 727 | Line 729 | serverinfo_vhost: VHOST '=' QSTRING ';'
729        ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", yylval.string);
730      else
731      {
732 <      assert(res != NULL);
732 >      assert(res);
733  
734        memcpy(&ServerInfo.ip, res->ai_addr, res->ai_addrlen);
735        ServerInfo.ip.ss.ss_family = res->ai_family;
# Line 756 | Line 758 | serverinfo_vhost6: VHOST6 '=' QSTRING ';
758        ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost6(%s)", yylval.string);
759      else
760      {
761 <      assert(res != NULL);
761 >      assert(res);
762  
763        memcpy(&ServerInfo.ip6, res->ai_addr, res->ai_addrlen);
764        ServerInfo.ip6.ss.ss_family = res->ai_family;
# Line 776 | Line 778 | serverinfo_max_clients: T_MAX_CLIENTS '=
778  
779    if ($3 < MAXCLIENTS_MIN)
780    {
781 <    char buf[IRCD_BUFSIZE];
781 >    char buf[IRCD_BUFSIZE] = "";
782  
783      snprintf(buf, sizeof(buf), "MAXCLIENTS too low, setting to %d", MAXCLIENTS_MIN);
784      conf_error_report(buf);
# Line 784 | Line 786 | serverinfo_max_clients: T_MAX_CLIENTS '=
786    }
787    else if ($3 > MAXCLIENTS_MAX)
788    {
789 <    char buf[IRCD_BUFSIZE];
789 >    char buf[IRCD_BUFSIZE] = "";
790  
791      snprintf(buf, sizeof(buf), "MAXCLIENTS too high, setting to %d", MAXCLIENTS_MAX);
792      conf_error_report(buf);
# Line 806 | Line 808 | serverinfo_max_nick_length: MAX_NICK_LEN
808    }
809    else if ($3 > NICKLEN)
810    {
811 <    char buf[IRCD_BUFSIZE];
811 >    char buf[IRCD_BUFSIZE] = "";
812  
813      snprintf(buf, sizeof(buf), "max_nick_length too high, setting to %d", NICKLEN);
814      conf_error_report(buf);
# Line 828 | Line 830 | serverinfo_max_topic_length: MAX_TOPIC_L
830    }
831    else if ($3 > TOPICLEN)
832    {
833 <    char buf[IRCD_BUFSIZE];
833 >    char buf[IRCD_BUFSIZE] = "";
834  
835      snprintf(buf, sizeof(buf), "max_topic_length too high, setting to %d", TOPICLEN);
836      conf_error_report(buf);
# Line 850 | Line 852 | serverinfo_hub: HUB '=' TBOOL ';'
852   admin_entry: ADMIN  '{' admin_items '}' ';' ;
853  
854   admin_items: admin_items admin_item | admin_item;
855 < admin_item:  admin_name | admin_description |
856 <             admin_email | error ';' ;
855 > admin_item:  admin_name |
856 >             admin_description |
857 >             admin_email |
858 >             error ';' ;
859  
860   admin_name: NAME '=' QSTRING ';'
861   {
# Line 922 | Line 926 | motd_file: T_FILE '=' QSTRING ';'
926   logging_entry:          T_LOG  '{' logging_items '}' ';' ;
927   logging_items:          logging_items logging_item | logging_item ;
928  
929 < logging_item:           logging_use_logging | logging_file_entry |
930 <                        error ';' ;
929 > logging_item:           logging_use_logging | logging_file_entry |
930 >                        error ';' ;
931  
932   logging_use_logging: USE_LOGGING '=' TBOOL ';'
933   {
# Line 1081 | Line 1085 | oper_entry: OPERATOR
1085  
1086        if ((file = BIO_new_file(block_state.file.buf, "r")) == NULL)
1087        {
1088 <        conf_error_report("Ignoring rsa_public_key_file -- file doesn't exist");
1088 >        ilog(LOG_TYPE_IRCD, "Ignoring rsa_public_key_file -- file doesn't exist");
1089          break;
1090        }
1091  
1092        if ((pkey = PEM_read_bio_RSA_PUBKEY(file, NULL, 0, NULL)) == NULL)
1093 <        conf_error_report("Ignoring rsa_public_key_file -- Key invalid; check key syntax.");
1093 >        ilog(LOG_TYPE_IRCD, "Ignoring rsa_public_key_file -- key invalid; check key syntax");
1094 >      else
1095 >      {
1096 >        if (RSA_size(pkey) > 128)
1097 >          ilog(LOG_TYPE_IRCD, "Ignoring rsa_public_key_file -- key size must be 1024 or below");
1098 >        else
1099 >          conf->rsa_public_key = pkey;
1100 >      }
1101  
1091      conf->rsa_public_key = pkey;
1102        BIO_set_close(file, BIO_CLOSE);
1103        BIO_free(file);
1104      }
# Line 1097 | Line 1107 | oper_entry: OPERATOR
1107   };
1108  
1109   oper_items:     oper_items oper_item | oper_item;
1110 < oper_item:      oper_name | oper_user | oper_password |
1111 <                oper_umodes | oper_class | oper_encrypted |
1112 <                oper_rsa_public_key_file | oper_ssl_certificate_fingerprint |
1113 <                oper_ssl_connection_required |
1114 <                oper_flags | error ';' ;
1110 > oper_item:      oper_name |
1111 >                oper_user |
1112 >                oper_password |
1113 >                oper_umodes |
1114 >                oper_class |
1115 >                oper_encrypted |
1116 >                oper_rsa_public_key_file |
1117 >                oper_ssl_certificate_fingerprint |
1118 >                oper_ssl_connection_required |
1119 >                oper_flags |
1120 >                error ';' ;
1121  
1122   oper_name: NAME '=' QSTRING ';'
1123   {
# Line 1192 | Line 1208 | oper_umodes_item:  T_BOTS
1208   {
1209    if (conf_parser_ctx.pass == 2)
1210      block_state.modes.value |= UMODE_HIDDEN;
1211 + } | HIDE_CHANS
1212 + {
1213 +  if (conf_parser_ctx.pass == 2)
1214 +    block_state.modes.value |= UMODE_HIDECHANS;
1215 + } | HIDE_IDLE
1216 + {
1217 +  if (conf_parser_ctx.pass == 2)
1218 +    block_state.modes.value |= UMODE_HIDEIDLE;
1219   } | T_SKILL
1220   {
1221    if (conf_parser_ctx.pass == 2)
# Line 1216 | Line 1240 | oper_umodes_item:  T_BOTS
1240   {
1241    if (conf_parser_ctx.pass == 2)
1242      block_state.modes.value |= UMODE_EXTERNAL;
1219 } | T_OPERWALL
1220 {
1221  if (conf_parser_ctx.pass == 2)
1222    block_state.modes.value |= UMODE_OPERWALL;
1243   } | T_SERVNOTICE
1244   {
1245    if (conf_parser_ctx.pass == 2)
# Line 1288 | Line 1308 | oper_flags_item: KILL ':' REMOTE
1308   } | KLINE
1309   {
1310    if (conf_parser_ctx.pass == 2)
1311 <    block_state.port.value |= OPER_FLAG_K;
1311 >    block_state.port.value |= OPER_FLAG_KLINE;
1312   } | UNKLINE
1313   {
1314    if (conf_parser_ctx.pass == 2)
# Line 1329 | Line 1349 | oper_flags_item: KILL ':' REMOTE
1349   {
1350    if (conf_parser_ctx.pass == 2)
1351      block_state.port.value |= OPER_FLAG_ADMIN;
1332 } | T_OPERWALL
1333 {
1334  if (conf_parser_ctx.pass == 2)
1335    block_state.port.value |= OPER_FLAG_OPERWALL;
1352   } | T_GLOBOPS
1353   {
1354    if (conf_parser_ctx.pass == 2)
# Line 1400 | Line 1416 | class_entry: CLASS
1416    class->max_ident = block_state.max_ident.value;
1417    class->max_sendq = block_state.max_sendq.value;
1418    class->max_recvq = block_state.max_recvq.value;
1419 +  class->max_channels = block_state.max_channels.value;
1420  
1421    if (block_state.min_idle.value > block_state.max_idle.value)
1422    {
# Line 1426 | Line 1443 | class_entry: CLASS
1443  
1444   class_items:    class_items class_item | class_item;
1445   class_item:     class_name |
1446 <                class_cidr_bitlen_ipv4 | class_cidr_bitlen_ipv6 |
1446 >                class_cidr_bitlen_ipv4 |
1447 >                class_cidr_bitlen_ipv6 |
1448                  class_ping_time |
1449 <                class_number_per_cidr |
1449 >                class_number_per_cidr |
1450                  class_number_per_ip |
1451                  class_connectfreq |
1452 +                class_max_channels |
1453                  class_max_number |
1454 <                class_max_global |
1455 <                class_max_local |
1456 <                class_max_ident |
1454 >                class_max_global |
1455 >                class_max_local |
1456 >                class_max_ident |
1457                  class_sendq | class_recvq |
1458                  class_min_idle |
1459                  class_max_idle |
1460                  class_flags |
1461 <                error ';' ;
1461 >                error ';' ;
1462  
1463   class_name: NAME '=' QSTRING ';'
1464   {
# Line 1465 | Line 1484 | class_connectfreq: CONNECTFREQ '=' times
1484      block_state.con_freq.value = $3;
1485   };
1486  
1487 + class_max_channels: MAX_CHANNELS '=' NUMBER ';'
1488 + {
1489 +  if (conf_parser_ctx.pass == 1)
1490 +    block_state.max_channels.value = $3;
1491 + };
1492 +
1493   class_max_number: MAX_NUMBER '=' NUMBER ';'
1494   {
1495    if (conf_parser_ctx.pass == 1)
# Line 1602 | Line 1627 | port_item: NUMBER
1627   #endif
1628        {
1629          conf_error_report("SSL not available - port closed");
1630 <        break;
1630 >        break;
1631        }
1632      add_listener($1, block_state.addr.buf, block_state.flags.value);
1633    }
# Line 1610 | Line 1635 | port_item: NUMBER
1635   {
1636    if (conf_parser_ctx.pass == 2)
1637    {
1613    int i;
1614
1638      if (block_state.flags.value & LISTENER_SSL)
1639   #ifdef HAVE_LIBCRYPTO
1640        if (!ServerInfo.server_ctx)
1641   #endif
1642        {
1643          conf_error_report("SSL not available - port closed");
1644 <        break;
1644 >        break;
1645        }
1646  
1647 <    for (i = $1; i <= $3; ++i)
1647 >    for (int i = $1; i <= $3; ++i)
1648        add_listener(i, block_state.addr.buf, block_state.flags.value);
1649    }
1650   };
# Line 1684 | Line 1707 | auth_entry: IRCD_AUTH
1707   };
1708  
1709   auth_items:     auth_items auth_item | auth_item;
1710 < auth_item:      auth_user | auth_passwd | auth_class | auth_flags |
1711 <                auth_spoof | auth_redir_serv | auth_redir_port |
1712 <                auth_encrypted | error ';' ;
1710 > auth_item:      auth_user |
1711 >                auth_passwd |
1712 >                auth_class |
1713 >                auth_flags |
1714 >                auth_spoof |
1715 >                auth_redir_serv |
1716 >                auth_redir_port |
1717 >                auth_encrypted |
1718 >                error ';' ;
1719  
1720   auth_user: USER '=' QSTRING ';'
1721   {
# Line 1771 | Line 1800 | auth_spoof: SPOOF '=' QSTRING ';'
1800    if (conf_parser_ctx.pass != 2)
1801      break;
1802  
1803 <  if (strlen(yylval.string) <= HOSTLEN && valid_hostname(yylval.string))
1803 >  if (valid_hostname(yylval.string))
1804    {
1805      strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1806      block_state.flags.value |= CONF_FLAGS_SPOOF_IP;
# Line 1817 | Line 1846 | resv_entry: RESV
1846    create_resv(block_state.name.buf, block_state.rpass.buf, &block_state.mask.list);
1847   };
1848  
1849 < resv_items:     resv_items resv_item | resv_item;
1850 < resv_item:      resv_mask | resv_reason | resv_exempt | error ';' ;
1849 > resv_items:     resv_items resv_item | resv_item;
1850 > resv_item:      resv_mask | resv_reason | resv_exempt | error ';' ;
1851  
1852   resv_mask: MASK '=' QSTRING ';'
1853   {
# Line 1988 | Line 2017 | cluster_entry: T_CLUSTER
2017    conf->name = xstrdup(block_state.name.buf);
2018   };
2019  
2020 < cluster_items:  cluster_items cluster_item | cluster_item;
2021 < cluster_item:   cluster_name | cluster_type | error ';' ;
2020 > cluster_items:  cluster_items cluster_item | cluster_item;
2021 > cluster_item:   cluster_name | cluster_type | error ';' ;
2022  
2023   cluster_name: NAME '=' QSTRING ';'
2024   {
# Line 2003 | Line 2032 | cluster_type: TYPE
2032      block_state.flags.value = 0;
2033   } '=' cluster_types ';' ;
2034  
2035 < cluster_types:  cluster_types ',' cluster_type_item | cluster_type_item;
2035 > cluster_types:  cluster_types ',' cluster_type_item | cluster_type_item;
2036   cluster_type_item: KLINE
2037   {
2038    if (conf_parser_ctx.pass == 2)
# Line 2108 | Line 2137 | connect_entry: CONNECT
2137        ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", block_state.bind.buf);
2138      else
2139      {
2140 <      assert(res != NULL);
2140 >      assert(res);
2141  
2142        memcpy(&conf->bind, res->ai_addr, res->ai_addrlen);
2143        conf->bind.ss.ss_family = res->ai_family;
# Line 2122 | Line 2151 | connect_entry: CONNECT
2151   };
2152  
2153   connect_items:  connect_items connect_item | connect_item;
2154 < connect_item:   connect_name | connect_host | connect_vhost |
2155 <                connect_send_password | connect_accept_password |
2156 <                connect_ssl_certificate_fingerprint |
2157 <                connect_aftype | connect_port | connect_ssl_cipher_list |
2158 <                connect_flags | connect_hub_mask | connect_leaf_mask |
2159 <                connect_class | connect_encrypted |
2154 > connect_item:   connect_name |
2155 >                connect_host |
2156 >                connect_vhost |
2157 >                connect_send_password |
2158 >                connect_accept_password |
2159 >                connect_ssl_certificate_fingerprint |
2160 >                connect_aftype |
2161 >                connect_port |
2162 >                connect_ssl_cipher_list |
2163 >                connect_flags |
2164 >                connect_hub_mask |
2165 >                connect_leaf_mask |
2166 >                connect_class |
2167 >                connect_encrypted |
2168                  error ';' ;
2169  
2170   connect_name: NAME '=' QSTRING ';'
# Line 2155 | Line 2192 | connect_send_password: SEND_PASSWORD '='
2192  
2193    if ($3[0] == ':')
2194      conf_error_report("Server passwords cannot begin with a colon");
2195 <  else if (strchr($3, ' ') != NULL)
2195 >  else if (strchr($3, ' '))
2196      conf_error_report("Server passwords cannot contain spaces");
2197    else
2198      strlcpy(block_state.spass.buf, yylval.string, sizeof(block_state.spass.buf));
# Line 2168 | Line 2205 | connect_accept_password: ACCEPT_PASSWORD
2205  
2206    if ($3[0] == ':')
2207      conf_error_report("Server passwords cannot begin with a colon");
2208 <  else if (strchr($3, ' ') != NULL)
2208 >  else if (strchr($3, ' '))
2209      conf_error_report("Server passwords cannot contain spaces");
2210    else
2211      strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
# Line 2428 | Line 2465 | general_entry: GENERAL
2465    '{' general_items '}' ';';
2466  
2467   general_items:      general_items general_item | general_item;
2468 < general_item:       general_hide_spoof_ips | general_ignore_bogus_ts |
2469 <                    general_failed_oper_notice | general_anti_nick_flood |
2470 <                    general_max_nick_time | general_max_nick_changes |
2471 <                    general_max_accept | general_anti_spam_exit_message_time |
2472 <                    general_ts_warn_delta | general_ts_max_delta |
2468 > general_item:       general_away_count |
2469 >                    general_away_time |
2470 >                    general_hide_spoof_ips |
2471 >                    general_ignore_bogus_ts |
2472 >                    general_failed_oper_notice |
2473 >                    general_anti_nick_flood |
2474 >                    general_max_nick_time |
2475 >                    general_max_nick_changes |
2476 >                    general_max_accept |
2477 >                    general_anti_spam_exit_message_time |
2478 >                    general_ts_warn_delta |
2479 >                    general_ts_max_delta |
2480                      general_kill_chase_time_limit |
2481                      general_invisible_on_connect |
2482 <                    general_warn_no_nline | general_dots_in_ident |
2483 <                    general_stats_o_oper_only | general_stats_k_oper_only |
2484 <                    general_pace_wait | general_stats_i_oper_only |
2485 <                    general_pace_wait_simple | general_stats_P_oper_only |
2482 >                    general_warn_no_connect_block |
2483 >                    general_dots_in_ident |
2484 >                    general_stats_o_oper_only |
2485 >                    general_stats_k_oper_only |
2486 >                    general_pace_wait |
2487 >                    general_stats_i_oper_only |
2488 >                    general_pace_wait_simple |
2489 >                    general_stats_P_oper_only |
2490                      general_stats_u_oper_only |
2491 <                    general_short_motd | general_no_oper_flood |
2492 <                    general_true_no_oper_flood | general_oper_pass_resv |
2493 <                    general_oper_only_umodes | general_max_targets |
2494 <                    general_use_egd | general_egdpool_path |
2495 <                    general_oper_umodes | general_caller_id_wait |
2496 <                    general_opers_bypass_callerid | general_default_floodcount |
2497 <                    general_min_nonwildcard | general_min_nonwildcard_simple |
2498 <                    general_throttle_time | general_havent_read_conf |
2491 >                    general_short_motd |
2492 >                    general_no_oper_flood |
2493 >                    general_true_no_oper_flood |
2494 >                    general_oper_pass_resv |
2495 >                    general_oper_only_umodes |
2496 >                    general_max_targets |
2497 >                    general_oper_umodes |
2498 >                    general_caller_id_wait |
2499 >                    general_opers_bypass_callerid |
2500 >                    general_default_floodcount |
2501 >                    general_min_nonwildcard |
2502 >                    general_min_nonwildcard_simple |
2503 >                    general_throttle_count |
2504 >                    general_throttle_time |
2505 >                    general_havent_read_conf |
2506                      general_ping_cookie |
2507                      general_disable_auth |
2508 <                    general_tkline_expire_notices | general_gline_enable |
2509 <                    general_gline_duration | general_gline_request_duration |
2508 >                    general_tkline_expire_notices |
2509 >                    general_gline_enable |
2510 >                    general_gline_duration |
2511 >                    general_gline_request_duration |
2512                      general_gline_min_cidr |
2513                      general_gline_min_cidr6 |
2514 <                    general_stats_e_disabled |
2515 <                    general_max_watch | general_services_name |
2516 <                    general_cycle_on_host_change |
2517 <                    error;
2514 >                    general_stats_e_disabled |
2515 >                    general_max_watch |
2516 >                    general_services_name |
2517 >                    general_cycle_on_host_change |
2518 >                    error;
2519 >
2520  
2521 + general_away_count: AWAY_COUNT '=' NUMBER ';'
2522 + {
2523 +  ConfigFileEntry.away_count = $3;
2524 + };
2525 +
2526 + general_away_time: AWAY_TIME '=' timespec ';'
2527 + {
2528 +  ConfigFileEntry.away_time = $3;
2529 + };
2530  
2531   general_max_watch: MAX_WATCH '=' NUMBER ';'
2532   {
# Line 2576 | Line 2644 | general_invisible_on_connect: INVISIBLE_
2644    ConfigFileEntry.invisible_on_connect = yylval.number;
2645   };
2646  
2647 < general_warn_no_nline: WARN_NO_NLINE '=' TBOOL ';'
2647 > general_warn_no_connect_block: WARN_NO_CONNECT_BLOCK '=' TBOOL ';'
2648   {
2649 <  ConfigFileEntry.warn_no_nline = yylval.number;
2649 >  ConfigFileEntry.warn_no_connect_block = yylval.number;
2650   };
2651  
2652   general_stats_e_disabled: STATS_E_DISABLED '=' TBOOL ';'
# Line 2667 | Line 2735 | general_max_targets: MAX_TARGETS '=' NUM
2735    ConfigFileEntry.max_targets = $3;
2736   };
2737  
2670 general_use_egd: USE_EGD '=' TBOOL ';'
2671 {
2672  ConfigFileEntry.use_egd = yylval.number;
2673 };
2674
2675 general_egdpool_path: EGDPOOL_PATH '=' QSTRING ';'
2676 {
2677  if (conf_parser_ctx.pass == 2)
2678  {
2679    MyFree(ConfigFileEntry.egdpool_path);
2680    ConfigFileEntry.egdpool_path = xstrdup(yylval.string);
2681  }
2682 };
2683
2738   general_services_name: T_SERVICES_NAME '=' QSTRING ';'
2739   {
2740    if (conf_parser_ctx.pass == 2 && valid_servname(yylval.string))
# Line 2700 | Line 2754 | general_disable_auth: DISABLE_AUTH '=' T
2754    ConfigFileEntry.disable_auth = yylval.number;
2755   };
2756  
2757 + general_throttle_count: THROTTLE_COUNT '=' NUMBER ';'
2758 + {
2759 +  ConfigFileEntry.throttle_count = $3;
2760 + };
2761 +
2762   general_throttle_time: THROTTLE_TIME '=' timespec ';'
2763   {
2764    ConfigFileEntry.throttle_time = $3;
# Line 2729 | Line 2788 | umode_oitem:     T_BOTS
2788   } | HIDDEN
2789   {
2790    ConfigFileEntry.oper_umodes |= UMODE_HIDDEN;
2791 + } | HIDE_CHANS
2792 + {
2793 +  ConfigFileEntry.oper_umodes |= UMODE_HIDECHANS;
2794 + } | HIDE_IDLE
2795 + {
2796 +  ConfigFileEntry.oper_umodes |= UMODE_HIDEIDLE;
2797   } | T_SKILL
2798   {
2799    ConfigFileEntry.oper_umodes |= UMODE_SKILL;
# Line 2747 | Line 2812 | umode_oitem:     T_BOTS
2812   } | T_EXTERNAL
2813   {
2814    ConfigFileEntry.oper_umodes |= UMODE_EXTERNAL;
2750 } | T_OPERWALL
2751 {
2752  ConfigFileEntry.oper_umodes |= UMODE_OPERWALL;
2815   } | T_SERVNOTICE
2816   {
2817    ConfigFileEntry.oper_umodes |= UMODE_SERVNOTICE;
# Line 2781 | Line 2843 | general_oper_only_umodes: OPER_ONLY_UMOD
2843    ConfigFileEntry.oper_only_umodes = 0;
2844   } '='  umode_items ';' ;
2845  
2846 < umode_items:    umode_items ',' umode_item | umode_item;
2847 < umode_item:     T_BOTS
2846 > umode_items:  umode_items ',' umode_item | umode_item;
2847 > umode_item:   T_BOTS
2848   {
2849    ConfigFileEntry.oper_only_umodes |= UMODE_BOTS;
2850   } | T_CCONN
# Line 2818 | Line 2880 | umode_item:    T_BOTS
2880   } | T_EXTERNAL
2881   {
2882    ConfigFileEntry.oper_only_umodes |= UMODE_EXTERNAL;
2821 } | T_OPERWALL
2822 {
2823  ConfigFileEntry.oper_only_umodes |= UMODE_OPERWALL;
2883   } | T_SERVNOTICE
2884   {
2885    ConfigFileEntry.oper_only_umodes |= UMODE_SERVNOTICE;
# Line 2871 | Line 2930 | channel_entry: CHANNEL
2930  
2931   channel_items:      channel_items channel_item | channel_item;
2932   channel_item:       channel_max_bans |
2933 <                    channel_knock_delay | channel_knock_delay_channel |
2934 <                    channel_max_chans_per_user | channel_max_chans_per_oper |
2933 >                    channel_invite_client_count |
2934 >                    channel_invite_client_time |
2935 >                    channel_knock_client_count |
2936 >                    channel_knock_client_time |
2937 >                    channel_knock_delay_channel |
2938 >                    channel_max_channels |
2939                      channel_default_split_user_count |
2940                      channel_default_split_server_count |
2941                      channel_no_create_on_split |
2942                      channel_no_join_on_split |
2943 <                    channel_jflood_count | channel_jflood_time |
2944 <                    channel_disable_fake_channels | error;
2943 >                    channel_jflood_count |
2944 >                    channel_jflood_time |
2945 >                    channel_disable_fake_channels |
2946 >                    error;
2947  
2948   channel_disable_fake_channels: DISABLE_FAKE_CHANNELS '=' TBOOL ';'
2949   {
2950    ConfigChannel.disable_fake_channels = yylval.number;
2951   };
2952  
2953 < channel_knock_delay: KNOCK_DELAY '=' timespec ';'
2953 > channel_invite_client_count: INVITE_CLIENT_COUNT '=' NUMBER ';'
2954   {
2955 <  ConfigChannel.knock_delay = $3;
2955 >  ConfigChannel.invite_client_count = $3;
2956   };
2957  
2958 < channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
2958 > channel_invite_client_time: INVITE_CLIENT_TIME '=' timespec ';'
2959   {
2960 <  ConfigChannel.knock_delay_channel = $3;
2960 >  ConfigChannel.invite_client_time = $3;
2961   };
2962  
2963 < channel_max_chans_per_user: MAX_CHANS_PER_USER '=' NUMBER ';'
2963 > channel_knock_client_count: KNOCK_CLIENT_COUNT '=' NUMBER ';'
2964   {
2965 <  ConfigChannel.max_chans_per_user = $3;
2965 >  ConfigChannel.knock_client_count = $3;
2966 > };
2967 >
2968 > channel_knock_client_time: KNOCK_CLIENT_TIME '=' timespec ';'
2969 > {
2970 >  ConfigChannel.knock_client_time = $3;
2971 > };
2972 >
2973 > channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
2974 > {
2975 >  ConfigChannel.knock_delay_channel = $3;
2976   };
2977  
2978 < channel_max_chans_per_oper: MAX_CHANS_PER_OPER '=' NUMBER ';'
2978 > channel_max_channels: MAX_CHANNELS '=' NUMBER ';'
2979   {
2980 <  ConfigChannel.max_chans_per_oper = $3;
2980 >  ConfigChannel.max_channels = $3;
2981   };
2982  
2983   channel_max_bans: MAX_BANS '=' NUMBER ';'
# Line 2947 | Line 3022 | serverhide_entry: SERVERHIDE
3022    '{' serverhide_items '}' ';';
3023  
3024   serverhide_items:   serverhide_items serverhide_item | serverhide_item;
3025 < serverhide_item:    serverhide_flatten_links | serverhide_disable_remote_commands |
3025 > serverhide_item:    serverhide_flatten_links |
3026 >                    serverhide_disable_remote_commands |
3027                      serverhide_hide_servers |
3028 <                    serverhide_hide_services |
3029 <                    serverhide_links_delay |
3030 <                    serverhide_hidden | serverhide_hidden_name |
3031 <                    serverhide_hide_server_ips |
3028 >                    serverhide_hide_services |
3029 >                    serverhide_links_delay |
3030 >                    serverhide_hidden |
3031 >                    serverhide_hidden_name |
3032 >                    serverhide_hide_server_ips |
3033                      error;
3034  
3035   serverhide_flatten_links: FLATTEN_LINKS '=' TBOOL ';'
# Line 2994 | Line 3071 | serverhide_links_delay: LINKS_DELAY '='
3071    {
3072      if (($3 > 0) && ConfigServerHide.links_disabled == 1)
3073      {
3074 <      eventAddIsh("write_links_file", write_links_file, NULL, $3);
3074 >      event_write_links_file.when = $3;
3075 >      event_addish(&event_write_links_file, NULL);
3076        ConfigServerHide.links_disabled = 0;
3077      }
3078  

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)