ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 2244
Committed: Sat Jun 15 22:08:10 2013 UTC (13 years, 3 months ago) by michael
File size: 74424 byte(s)
Log Message:
- rename 'fingerprint' configuration directive to 'ssl_certificate_fingerprint'

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 * conf_parser.y: Parses the ircd configuration file.
4 *
5 * Copyright (C) 2005 by the past and present ircd coders, and others.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 * USA
21 *
22 * $Id$
23 */
24
25 %{
26
27 #define YY_NO_UNPUT
28 #include <sys/types.h>
29 #include <string.h>
30
31 #include "config.h"
32 #include "stdinc.h"
33 #include "ircd.h"
34 #include "list.h"
35 #include "conf.h"
36 #include "conf_class.h"
37 #include "event.h"
38 #include "log.h"
39 #include "client.h" /* for UMODE_ALL only */
40 #include "irc_string.h"
41 #include "memory.h"
42 #include "modules.h"
43 #include "s_serv.h"
44 #include "hostmask.h"
45 #include "send.h"
46 #include "listener.h"
47 #include "resv.h"
48 #include "numeric.h"
49 #include "s_user.h"
50 #include "motd.h"
51
52 #ifdef HAVE_LIBCRYPTO
53 #include <openssl/rsa.h>
54 #include <openssl/bio.h>
55 #include <openssl/pem.h>
56 #include <openssl/dh.h>
57 #endif
58
59 #include "rsa.h"
60
61 int yylex(void);
62
63 static struct
64 {
65 struct {
66 dlink_list list;
67 } mask,
68 leaf,
69 hub;
70
71 struct {
72 char buf[IRCD_BUFSIZE];
73 } name,
74 user,
75 host,
76 addr,
77 bind,
78 file,
79 ciph,
80 cert,
81 rpass,
82 spass,
83 class;
84
85 struct {
86 unsigned int value;
87 } flags,
88 modes,
89 size,
90 type,
91 port,
92 aftype,
93 ping_freq,
94 max_perip,
95 con_freq,
96 min_idle,
97 max_idle,
98 max_total,
99 max_global,
100 max_local,
101 max_ident,
102 max_sendq,
103 max_recvq,
104 cidr_bitlen_ipv4,
105 cidr_bitlen_ipv6,
106 number_per_cidr;
107 } block_state;
108
109 static void
110 reset_block_state(void)
111 {
112 dlink_node *ptr = NULL, *ptr_next = NULL;
113
114 DLINK_FOREACH_SAFE(ptr, ptr_next, block_state.mask.list.head)
115 {
116 MyFree(ptr->data);
117 dlinkDelete(ptr, &block_state.mask.list);
118 free_dlink_node(ptr);
119 }
120
121 DLINK_FOREACH_SAFE(ptr, ptr_next, block_state.leaf.list.head)
122 {
123 MyFree(ptr->data);
124 dlinkDelete(ptr, &block_state.leaf.list);
125 free_dlink_node(ptr);
126 }
127
128 DLINK_FOREACH_SAFE(ptr, ptr_next, block_state.hub.list.head)
129 {
130 MyFree(ptr->data);
131 dlinkDelete(ptr, &block_state.hub.list);
132 free_dlink_node(ptr);
133 }
134
135 memset(&block_state, 0, sizeof(block_state));
136 }
137
138 %}
139
140 %union {
141 int number;
142 char *string;
143 }
144
145 %token ACCEPT_PASSWORD
146 %token ADMIN
147 %token AFTYPE
148 %token ANTI_NICK_FLOOD
149 %token ANTI_SPAM_EXIT_MESSAGE_TIME
150 %token AUTOCONN
151 %token BYTES KBYTES MBYTES
152 %token CALLER_ID_WAIT
153 %token CAN_FLOOD
154 %token CHANNEL
155 %token CIDR_BITLEN_IPV4
156 %token CIDR_BITLEN_IPV6
157 %token CLASS
158 %token CONNECT
159 %token CONNECTFREQ
160 %token DEFAULT_FLOODCOUNT
161 %token DEFAULT_SPLIT_SERVER_COUNT
162 %token DEFAULT_SPLIT_USER_COUNT
163 %token DENY
164 %token DESCRIPTION
165 %token DIE
166 %token DISABLE_AUTH
167 %token DISABLE_FAKE_CHANNELS
168 %token DISABLE_REMOTE_COMMANDS
169 %token DOTS_IN_IDENT
170 %token EGDPOOL_PATH
171 %token EMAIL
172 %token ENCRYPTED
173 %token EXCEED_LIMIT
174 %token EXEMPT
175 %token FAILED_OPER_NOTICE
176 %token FLATTEN_LINKS
177 %token GECOS
178 %token GENERAL
179 %token GLINE
180 %token GLINE_DURATION
181 %token GLINE_ENABLE
182 %token GLINE_EXEMPT
183 %token GLINE_MIN_CIDR
184 %token GLINE_MIN_CIDR6
185 %token GLINE_REQUEST_DURATION
186 %token GLOBAL_KILL
187 %token HAVENT_READ_CONF
188 %token HIDDEN
189 %token HIDDEN_NAME
190 %token HIDE_IDLE_FROM_OPERS
191 %token HIDE_SERVER_IPS
192 %token HIDE_SERVERS
193 %token HIDE_SERVICES
194 %token HIDE_SPOOF_IPS
195 %token HOST
196 %token HUB
197 %token HUB_MASK
198 %token IGNORE_BOGUS_TS
199 %token INVISIBLE_ON_CONNECT
200 %token IP
201 %token IRCD_AUTH
202 %token IRCD_FLAGS
203 %token IRCD_SID
204 %token JOIN_FLOOD_COUNT
205 %token JOIN_FLOOD_TIME
206 %token KILL
207 %token KILL_CHASE_TIME_LIMIT
208 %token KLINE
209 %token KLINE_EXEMPT
210 %token KNOCK_DELAY
211 %token KNOCK_DELAY_CHANNEL
212 %token LEAF_MASK
213 %token LINKS_DELAY
214 %token LISTEN
215 %token MASK
216 %token MAX_ACCEPT
217 %token MAX_BANS
218 %token MAX_CHANS_PER_OPER
219 %token MAX_CHANS_PER_USER
220 %token MAX_GLOBAL
221 %token MAX_IDENT
222 %token MAX_IDLE
223 %token MAX_LOCAL
224 %token MAX_NICK_CHANGES
225 %token MAX_NICK_LENGTH
226 %token MAX_NICK_TIME
227 %token MAX_NUMBER
228 %token MAX_TARGETS
229 %token MAX_TOPIC_LENGTH
230 %token MAX_WATCH
231 %token MIN_IDLE
232 %token MIN_NONWILDCARD
233 %token MIN_NONWILDCARD_SIMPLE
234 %token MODULE
235 %token MODULES
236 %token MOTD
237 %token NAME
238 %token NEED_IDENT
239 %token NEED_PASSWORD
240 %token NETWORK_DESC
241 %token NETWORK_NAME
242 %token NICK
243 %token NO_CREATE_ON_SPLIT
244 %token NO_JOIN_ON_SPLIT
245 %token NO_OPER_FLOOD
246 %token NO_TILDE
247 %token NUMBER
248 %token NUMBER_PER_CIDR
249 %token NUMBER_PER_IP
250 %token OPER_ONLY_UMODES
251 %token OPER_PASS_RESV
252 %token OPER_UMODES
253 %token OPERATOR
254 %token OPERS_BYPASS_CALLERID
255 %token PACE_WAIT
256 %token PACE_WAIT_SIMPLE
257 %token PASSWORD
258 %token PATH
259 %token PING_COOKIE
260 %token PING_TIME
261 %token PORT
262 %token QSTRING
263 %token RANDOM_IDLE
264 %token REASON
265 %token REDIRPORT
266 %token REDIRSERV
267 %token REHASH
268 %token REMOTE
269 %token REMOTEBAN
270 %token RESV
271 %token RESV_EXEMPT
272 %token RSA_PRIVATE_KEY_FILE
273 %token RSA_PUBLIC_KEY_FILE
274 %token SECONDS MINUTES HOURS DAYS WEEKS MONTHS YEARS
275 %token SEND_PASSWORD
276 %token SENDQ
277 %token SERVERHIDE
278 %token SERVERINFO
279 %token SHORT_MOTD
280 %token SPOOF
281 %token SPOOF_NOTICE
282 %token SQUIT
283 %token SSL_CERTIFICATE_FILE
284 %token SSL_CERTIFICATE_FINGERPRINT
285 %token SSL_DH_PARAM_FILE
286 %token STATS_E_DISABLED
287 %token STATS_I_OPER_ONLY
288 %token STATS_K_OPER_ONLY
289 %token STATS_O_OPER_ONLY
290 %token STATS_P_OPER_ONLY
291 %token T_ALL
292 %token T_BOTS
293 %token T_CALLERID
294 %token T_CCONN
295 %token T_CLUSTER
296 %token T_DEAF
297 %token T_DEBUG
298 %token T_DLINE
299 %token T_EXTERNAL
300 %token T_FARCONNECT
301 %token T_FILE
302 %token T_FULL
303 %token T_GLOBOPS
304 %token T_INVISIBLE
305 %token T_IPV4
306 %token T_IPV6
307 %token T_LOCOPS
308 %token T_LOG
309 %token T_MAX_CLIENTS
310 %token T_NCHANGE
311 %token T_NONONREG
312 %token T_OPERWALL
313 %token T_RECVQ
314 %token T_REJ
315 %token T_RESTART
316 %token T_SERVER
317 %token T_SERVICE
318 %token T_SERVICES_NAME
319 %token T_SERVNOTICE
320 %token T_SET
321 %token T_SHARED
322 %token T_SIZE
323 %token T_SKILL
324 %token T_SOFTCALLERID
325 %token T_SPY
326 %token T_SSL
327 %token T_SSL_CIPHER_LIST
328 %token T_SSL_CLIENT_METHOD
329 %token T_SSL_SERVER_METHOD
330 %token T_SSLV3
331 %token T_TLSV1
332 %token T_UMODES
333 %token T_UNAUTH
334 %token T_UNDLINE
335 %token T_UNLIMITED
336 %token T_UNRESV
337 %token T_UNXLINE
338 %token T_WALLOP
339 %token T_WALLOPS
340 %token T_WEBIRC
341 %token TBOOL
342 %token THROTTLE_TIME
343 %token TKLINE_EXPIRE_NOTICES
344 %token TMASKED
345 %token TRUE_NO_OPER_FLOOD
346 %token TS_MAX_DELTA
347 %token TS_WARN_DELTA
348 %token TWODOTS
349 %token TYPE
350 %token UNKLINE
351 %token USE_EGD
352 %token USE_LOGGING
353 %token USER
354 %token VHOST
355 %token VHOST6
356 %token WARN_NO_NLINE
357 %token XLINE
358
359 %type <string> QSTRING
360 %type <number> NUMBER
361 %type <number> timespec
362 %type <number> timespec_
363 %type <number> sizespec
364 %type <number> sizespec_
365
366 %%
367 conf:
368 | conf conf_item
369 ;
370
371 conf_item: admin_entry
372 | logging_entry
373 | oper_entry
374 | channel_entry
375 | class_entry
376 | listen_entry
377 | auth_entry
378 | serverinfo_entry
379 | serverhide_entry
380 | resv_entry
381 | service_entry
382 | shared_entry
383 | cluster_entry
384 | connect_entry
385 | kill_entry
386 | deny_entry
387 | exempt_entry
388 | general_entry
389 | gecos_entry
390 | modules_entry
391 | motd_entry
392 | error ';'
393 | error '}'
394 ;
395
396
397 timespec_: { $$ = 0; } | timespec;
398 timespec: NUMBER timespec_
399 {
400 $$ = $1 + $2;
401 }
402 | NUMBER SECONDS timespec_
403 {
404 $$ = $1 + $3;
405 }
406 | NUMBER MINUTES timespec_
407 {
408 $$ = $1 * 60 + $3;
409 }
410 | NUMBER HOURS timespec_
411 {
412 $$ = $1 * 60 * 60 + $3;
413 }
414 | NUMBER DAYS timespec_
415 {
416 $$ = $1 * 60 * 60 * 24 + $3;
417 }
418 | NUMBER WEEKS timespec_
419 {
420 $$ = $1 * 60 * 60 * 24 * 7 + $3;
421 }
422 | NUMBER MONTHS timespec_
423 {
424 $$ = $1 * 60 * 60 * 24 * 7 * 4 + $3;
425 }
426 | NUMBER YEARS timespec_
427 {
428 $$ = $1 * 60 * 60 * 24 * 365 + $3;
429 }
430 ;
431
432 sizespec_: { $$ = 0; } | sizespec;
433 sizespec: NUMBER sizespec_ { $$ = $1 + $2; }
434 | NUMBER BYTES sizespec_ { $$ = $1 + $3; }
435 | NUMBER KBYTES sizespec_ { $$ = $1 * 1024 + $3; }
436 | NUMBER MBYTES sizespec_ { $$ = $1 * 1024 * 1024 + $3; }
437 ;
438
439
440 /***************************************************************************
441 * section modules
442 ***************************************************************************/
443 modules_entry: MODULES
444 '{' modules_items '}' ';';
445
446 modules_items: modules_items modules_item | modules_item;
447 modules_item: modules_module | modules_path | error ';' ;
448
449 modules_module: MODULE '=' QSTRING ';'
450 {
451 if (conf_parser_ctx.pass == 2)
452 add_conf_module(libio_basename(yylval.string));
453 };
454
455 modules_path: PATH '=' QSTRING ';'
456 {
457 if (conf_parser_ctx.pass == 2)
458 mod_add_path(yylval.string);
459 };
460
461
462 serverinfo_entry: SERVERINFO '{' serverinfo_items '}' ';';
463
464 serverinfo_items: serverinfo_items serverinfo_item | serverinfo_item ;
465 serverinfo_item: serverinfo_name | serverinfo_vhost |
466 serverinfo_hub | serverinfo_description |
467 serverinfo_network_name | serverinfo_network_desc |
468 serverinfo_max_clients | serverinfo_max_nick_length |
469 serverinfo_max_topic_length | serverinfo_ssl_dh_param_file |
470 serverinfo_rsa_private_key_file | serverinfo_vhost6 |
471 serverinfo_sid | serverinfo_ssl_certificate_file |
472 serverinfo_ssl_client_method | serverinfo_ssl_server_method |
473 serverinfo_ssl_cipher_list |
474 error ';' ;
475
476
477 serverinfo_ssl_client_method: T_SSL_CLIENT_METHOD '=' client_method_types ';' ;
478 serverinfo_ssl_server_method: T_SSL_SERVER_METHOD '=' server_method_types ';' ;
479
480 client_method_types: client_method_types ',' client_method_type_item | client_method_type_item;
481 client_method_type_item: T_SSLV3
482 {
483 #ifdef HAVE_LIBCRYPTO
484 if (conf_parser_ctx.pass == 2 && ServerInfo.client_ctx)
485 SSL_CTX_clear_options(ServerInfo.client_ctx, SSL_OP_NO_SSLv3);
486 #endif
487 } | T_TLSV1
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_TLSv1);
492 #endif
493 };
494
495 server_method_types: server_method_types ',' server_method_type_item | server_method_type_item;
496 server_method_type_item: T_SSLV3
497 {
498 #ifdef HAVE_LIBCRYPTO
499 if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
500 SSL_CTX_clear_options(ServerInfo.server_ctx, SSL_OP_NO_SSLv3);
501 #endif
502 } | T_TLSV1
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_TLSv1);
507 #endif
508 };
509
510 serverinfo_ssl_certificate_file: SSL_CERTIFICATE_FILE '=' QSTRING ';'
511 {
512 #ifdef HAVE_LIBCRYPTO
513 if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
514 {
515 if (!ServerInfo.rsa_private_key_file)
516 {
517 conf_error_report("No rsa_private_key_file specified, SSL disabled");
518 break;
519 }
520
521 if (SSL_CTX_use_certificate_file(ServerInfo.server_ctx, yylval.string,
522 SSL_FILETYPE_PEM) <= 0 ||
523 SSL_CTX_use_certificate_file(ServerInfo.client_ctx, yylval.string,
524 SSL_FILETYPE_PEM) <= 0)
525 {
526 report_crypto_errors();
527 conf_error_report("Could not open/read certificate file");
528 break;
529 }
530
531 if (SSL_CTX_use_PrivateKey_file(ServerInfo.server_ctx, ServerInfo.rsa_private_key_file,
532 SSL_FILETYPE_PEM) <= 0 ||
533 SSL_CTX_use_PrivateKey_file(ServerInfo.client_ctx, ServerInfo.rsa_private_key_file,
534 SSL_FILETYPE_PEM) <= 0)
535 {
536 report_crypto_errors();
537 conf_error_report("Could not read RSA private key");
538 break;
539 }
540
541 if (!SSL_CTX_check_private_key(ServerInfo.server_ctx) ||
542 !SSL_CTX_check_private_key(ServerInfo.client_ctx))
543 {
544 report_crypto_errors();
545 conf_error_report("Could not read RSA private key");
546 break;
547 }
548 }
549 #endif
550 };
551
552 serverinfo_rsa_private_key_file: RSA_PRIVATE_KEY_FILE '=' QSTRING ';'
553 {
554 #ifdef HAVE_LIBCRYPTO
555 BIO *file = NULL;
556
557 if (conf_parser_ctx.pass != 1)
558 break;
559
560 if (ServerInfo.rsa_private_key)
561 {
562 RSA_free(ServerInfo.rsa_private_key);
563 ServerInfo.rsa_private_key = NULL;
564 }
565
566 if (ServerInfo.rsa_private_key_file)
567 {
568 MyFree(ServerInfo.rsa_private_key_file);
569 ServerInfo.rsa_private_key_file = NULL;
570 }
571
572 ServerInfo.rsa_private_key_file = xstrdup(yylval.string);
573
574 if ((file = BIO_new_file(yylval.string, "r")) == NULL)
575 {
576 conf_error_report("File open failed, ignoring");
577 break;
578 }
579
580 ServerInfo.rsa_private_key = PEM_read_bio_RSAPrivateKey(file, NULL, 0, NULL);
581
582 BIO_set_close(file, BIO_CLOSE);
583 BIO_free(file);
584
585 if (ServerInfo.rsa_private_key == NULL)
586 {
587 conf_error_report("Couldn't extract key, ignoring");
588 break;
589 }
590
591 if (!RSA_check_key(ServerInfo.rsa_private_key))
592 {
593 RSA_free(ServerInfo.rsa_private_key);
594 ServerInfo.rsa_private_key = NULL;
595
596 conf_error_report("Invalid key, ignoring");
597 break;
598 }
599
600 /* require 2048 bit (256 byte) key */
601 if (RSA_size(ServerInfo.rsa_private_key) != 256)
602 {
603 RSA_free(ServerInfo.rsa_private_key);
604 ServerInfo.rsa_private_key = NULL;
605
606 conf_error_report("Not a 2048 bit key, ignoring");
607 }
608 #endif
609 };
610
611 serverinfo_ssl_dh_param_file: SSL_DH_PARAM_FILE '=' QSTRING ';'
612 {
613 /* TBD - XXX: error reporting */
614 #ifdef HAVE_LIBCRYPTO
615 if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
616 {
617 BIO *file = BIO_new_file(yylval.string, "r");
618
619 if (file)
620 {
621 DH *dh = PEM_read_bio_DHparams(file, NULL, NULL, NULL);
622
623 BIO_free(file);
624
625 if (dh)
626 {
627 if (DH_size(dh) < 128)
628 conf_error_report("Ignoring serverinfo::ssl_dh_param_file -- need at least a 1024 bit DH prime size");
629 else
630 SSL_CTX_set_tmp_dh(ServerInfo.server_ctx, dh);
631
632 DH_free(dh);
633 }
634 }
635 }
636 #endif
637 };
638
639 serverinfo_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
640 {
641 #ifdef HAVE_LIBCRYPTO
642 if (conf_parser_ctx.pass == 2 && ServerInfo.server_ctx)
643 SSL_CTX_set_cipher_list(ServerInfo.server_ctx, yylval.string);
644 #endif
645 };
646
647 serverinfo_name: NAME '=' QSTRING ';'
648 {
649 /* this isn't rehashable */
650 if (conf_parser_ctx.pass == 2 && !ServerInfo.name)
651 {
652 if (valid_servname(yylval.string))
653 ServerInfo.name = xstrdup(yylval.string);
654 else
655 {
656 conf_error_report("Ignoring serverinfo::name -- invalid name. Aborting.");
657 exit(0);
658 }
659 }
660 };
661
662 serverinfo_sid: IRCD_SID '=' QSTRING ';'
663 {
664 /* this isn't rehashable */
665 if (conf_parser_ctx.pass == 2 && !ServerInfo.sid)
666 {
667 if (valid_sid(yylval.string))
668 ServerInfo.sid = xstrdup(yylval.string);
669 else
670 {
671 conf_error_report("Ignoring serverinfo::sid -- invalid SID. Aborting.");
672 exit(0);
673 }
674 }
675 };
676
677 serverinfo_description: DESCRIPTION '=' QSTRING ';'
678 {
679 if (conf_parser_ctx.pass == 2)
680 {
681 MyFree(ServerInfo.description);
682 ServerInfo.description = xstrdup(yylval.string);
683 }
684 };
685
686 serverinfo_network_name: NETWORK_NAME '=' QSTRING ';'
687 {
688 if (conf_parser_ctx.pass == 2)
689 {
690 char *p;
691
692 if ((p = strchr(yylval.string, ' ')) != NULL)
693 p = '\0';
694
695 MyFree(ServerInfo.network_name);
696 ServerInfo.network_name = xstrdup(yylval.string);
697 }
698 };
699
700 serverinfo_network_desc: NETWORK_DESC '=' QSTRING ';'
701 {
702 if (conf_parser_ctx.pass != 2)
703 break;
704
705 MyFree(ServerInfo.network_desc);
706 ServerInfo.network_desc = xstrdup(yylval.string);
707 };
708
709 serverinfo_vhost: VHOST '=' QSTRING ';'
710 {
711 if (conf_parser_ctx.pass == 2 && *yylval.string != '*')
712 {
713 struct addrinfo hints, *res;
714
715 memset(&hints, 0, sizeof(hints));
716
717 hints.ai_family = AF_UNSPEC;
718 hints.ai_socktype = SOCK_STREAM;
719 hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
720
721 if (getaddrinfo(yylval.string, NULL, &hints, &res))
722 ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", yylval.string);
723 else
724 {
725 assert(res != NULL);
726
727 memcpy(&ServerInfo.ip, res->ai_addr, res->ai_addrlen);
728 ServerInfo.ip.ss.ss_family = res->ai_family;
729 ServerInfo.ip.ss_len = res->ai_addrlen;
730 freeaddrinfo(res);
731
732 ServerInfo.specific_ipv4_vhost = 1;
733 }
734 }
735 };
736
737 serverinfo_vhost6: VHOST6 '=' QSTRING ';'
738 {
739 #ifdef IPV6
740 if (conf_parser_ctx.pass == 2 && *yylval.string != '*')
741 {
742 struct addrinfo hints, *res;
743
744 memset(&hints, 0, sizeof(hints));
745
746 hints.ai_family = AF_UNSPEC;
747 hints.ai_socktype = SOCK_STREAM;
748 hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
749
750 if (getaddrinfo(yylval.string, NULL, &hints, &res))
751 ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost6(%s)", yylval.string);
752 else
753 {
754 assert(res != NULL);
755
756 memcpy(&ServerInfo.ip6, res->ai_addr, res->ai_addrlen);
757 ServerInfo.ip6.ss.ss_family = res->ai_family;
758 ServerInfo.ip6.ss_len = res->ai_addrlen;
759 freeaddrinfo(res);
760
761 ServerInfo.specific_ipv6_vhost = 1;
762 }
763 }
764 #endif
765 };
766
767 serverinfo_max_clients: T_MAX_CLIENTS '=' NUMBER ';'
768 {
769 if (conf_parser_ctx.pass != 2)
770 break;
771
772 if ($3 < MAXCLIENTS_MIN)
773 {
774 char buf[IRCD_BUFSIZE];
775
776 snprintf(buf, sizeof(buf), "MAXCLIENTS too low, setting to %d", MAXCLIENTS_MIN);
777 conf_error_report(buf);
778 ServerInfo.max_clients = MAXCLIENTS_MIN;
779 }
780 else if ($3 > MAXCLIENTS_MAX)
781 {
782 char buf[IRCD_BUFSIZE];
783
784 snprintf(buf, sizeof(buf), "MAXCLIENTS too high, setting to %d", MAXCLIENTS_MAX);
785 conf_error_report(buf);
786 ServerInfo.max_clients = MAXCLIENTS_MAX;
787 }
788 else
789 ServerInfo.max_clients = $3;
790 };
791
792 serverinfo_max_nick_length: MAX_NICK_LENGTH '=' NUMBER ';'
793 {
794 if (conf_parser_ctx.pass != 2)
795 break;
796
797 if ($3 < 9)
798 {
799 conf_error_report("max_nick_length too low, setting to 9");
800 ServerInfo.max_nick_length = 9;
801 }
802 else if ($3 > NICKLEN)
803 {
804 char buf[IRCD_BUFSIZE];
805
806 snprintf(buf, sizeof(buf), "max_nick_length too high, setting to %d", NICKLEN);
807 conf_error_report(buf);
808 ServerInfo.max_nick_length = NICKLEN;
809 }
810 else
811 ServerInfo.max_nick_length = $3;
812 };
813
814 serverinfo_max_topic_length: MAX_TOPIC_LENGTH '=' NUMBER ';'
815 {
816 if (conf_parser_ctx.pass != 2)
817 break;
818
819 if ($3 < 80)
820 {
821 conf_error_report("max_topic_length too low, setting to 80");
822 ServerInfo.max_topic_length = 80;
823 }
824 else if ($3 > TOPICLEN)
825 {
826 char buf[IRCD_BUFSIZE];
827
828 snprintf(buf, sizeof(buf), "max_topic_length too high, setting to %d", TOPICLEN);
829 conf_error_report(buf);
830 ServerInfo.max_topic_length = TOPICLEN;
831 }
832 else
833 ServerInfo.max_topic_length = $3;
834 };
835
836 serverinfo_hub: HUB '=' TBOOL ';'
837 {
838 if (conf_parser_ctx.pass == 2)
839 ServerInfo.hub = yylval.number;
840 };
841
842 /***************************************************************************
843 * admin section
844 ***************************************************************************/
845 admin_entry: ADMIN '{' admin_items '}' ';' ;
846
847 admin_items: admin_items admin_item | admin_item;
848 admin_item: admin_name | admin_description |
849 admin_email | error ';' ;
850
851 admin_name: NAME '=' QSTRING ';'
852 {
853 if (conf_parser_ctx.pass != 2)
854 break;
855
856 MyFree(AdminInfo.name);
857 AdminInfo.name = xstrdup(yylval.string);
858 };
859
860 admin_email: EMAIL '=' QSTRING ';'
861 {
862 if (conf_parser_ctx.pass != 2)
863 break;
864
865 MyFree(AdminInfo.email);
866 AdminInfo.email = xstrdup(yylval.string);
867 };
868
869 admin_description: DESCRIPTION '=' QSTRING ';'
870 {
871 if (conf_parser_ctx.pass != 2)
872 break;
873
874 MyFree(AdminInfo.description);
875 AdminInfo.description = xstrdup(yylval.string);
876 };
877
878 /***************************************************************************
879 * motd section
880 ***************************************************************************/
881 motd_entry: MOTD
882 {
883 if (conf_parser_ctx.pass == 2)
884 reset_block_state();
885 } '{' motd_items '}' ';'
886 {
887 dlink_node *ptr = NULL;
888
889 if (conf_parser_ctx.pass != 2)
890 break;
891
892 if (!block_state.file.buf[0])
893 break;
894
895 DLINK_FOREACH(ptr, block_state.mask.list.head)
896 motd_add(ptr->data, block_state.file.buf);
897 };
898
899 motd_items: motd_items motd_item | motd_item;
900 motd_item: motd_mask | motd_file | error ';' ;
901
902 motd_mask: MASK '=' QSTRING ';'
903 {
904 if (conf_parser_ctx.pass == 2)
905 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
906 };
907
908 motd_file: T_FILE '=' QSTRING ';'
909 {
910 if (conf_parser_ctx.pass == 2)
911 strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
912 };
913
914 /***************************************************************************
915 * section logging
916 ***************************************************************************/
917 logging_entry: T_LOG '{' logging_items '}' ';' ;
918 logging_items: logging_items logging_item | logging_item ;
919
920 logging_item: logging_use_logging | logging_file_entry |
921 error ';' ;
922
923 logging_use_logging: USE_LOGGING '=' TBOOL ';'
924 {
925 if (conf_parser_ctx.pass == 2)
926 ConfigLoggingEntry.use_logging = yylval.number;
927 };
928
929 logging_file_entry:
930 {
931 if (conf_parser_ctx.pass == 2)
932 reset_block_state();
933 } T_FILE '{' logging_file_items '}' ';'
934 {
935 if (conf_parser_ctx.pass != 2)
936 break;
937
938 if (block_state.type.value && block_state.file.buf[0])
939 log_set_file(block_state.type.value, block_state.size.value,
940 block_state.file.buf);
941 };
942
943 logging_file_items: logging_file_items logging_file_item |
944 logging_file_item ;
945
946 logging_file_item: logging_file_name | logging_file_type |
947 logging_file_size | error ';' ;
948
949 logging_file_name: NAME '=' QSTRING ';'
950 {
951 if (conf_parser_ctx.pass != 2)
952 break;
953
954 strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
955 }
956
957 logging_file_size: T_SIZE '=' sizespec ';'
958 {
959 block_state.size.value = $3;
960 } | T_SIZE '=' T_UNLIMITED ';'
961 {
962 block_state.size.value = 0;
963 };
964
965 logging_file_type: TYPE
966 {
967 if (conf_parser_ctx.pass == 2)
968 block_state.type.value = 0;
969 } '=' logging_file_type_items ';' ;
970
971 logging_file_type_items: logging_file_type_items ',' logging_file_type_item | logging_file_type_item;
972 logging_file_type_item: USER
973 {
974 if (conf_parser_ctx.pass == 2)
975 block_state.type.value = LOG_TYPE_USER;
976 } | OPERATOR
977 {
978 if (conf_parser_ctx.pass == 2)
979 block_state.type.value = LOG_TYPE_OPER;
980 } | GLINE
981 {
982 if (conf_parser_ctx.pass == 2)
983 block_state.type.value = LOG_TYPE_GLINE;
984 } | T_DLINE
985 {
986 if (conf_parser_ctx.pass == 2)
987 block_state.type.value = LOG_TYPE_DLINE;
988 } | KLINE
989 {
990 if (conf_parser_ctx.pass == 2)
991 block_state.type.value = LOG_TYPE_KLINE;
992 } | KILL
993 {
994 if (conf_parser_ctx.pass == 2)
995 block_state.type.value = LOG_TYPE_KILL;
996 } | T_DEBUG
997 {
998 if (conf_parser_ctx.pass == 2)
999 block_state.type.value = LOG_TYPE_DEBUG;
1000 };
1001
1002
1003 /***************************************************************************
1004 * section oper
1005 ***************************************************************************/
1006 oper_entry: OPERATOR
1007 {
1008 if (conf_parser_ctx.pass != 2)
1009 break;
1010
1011 reset_block_state();
1012 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1013 } '{' oper_items '}' ';'
1014 {
1015 dlink_node *ptr = NULL;
1016
1017 if (conf_parser_ctx.pass != 2)
1018 break;
1019
1020 if (!block_state.name.buf[0])
1021 break;
1022 #ifdef HAVE_LIBCRYPTO
1023 if (!block_state.file.buf[0] &&
1024 !block_state.rpass.buf[0])
1025 break;
1026 #else
1027 if (!block_state.rpass.buf[0])
1028 break;
1029 #endif
1030
1031 DLINK_FOREACH(ptr, block_state.mask.list.head)
1032 {
1033 struct MaskItem *conf = NULL;
1034 struct split_nuh_item nuh;
1035
1036 nuh.nuhmask = ptr->data;
1037 nuh.nickptr = NULL;
1038 nuh.userptr = block_state.user.buf;
1039 nuh.hostptr = block_state.host.buf;
1040 nuh.nicksize = 0;
1041 nuh.usersize = sizeof(block_state.user.buf);
1042 nuh.hostsize = sizeof(block_state.host.buf);
1043 split_nuh(&nuh);
1044
1045 conf = conf_make(CONF_OPER);
1046 conf->name = xstrdup(block_state.name.buf);
1047 conf->user = xstrdup(block_state.user.buf);
1048 conf->host = xstrdup(block_state.host.buf);
1049
1050 if (block_state.cert.buf[0])
1051 conf->certfp = xstrdup(block_state.cert.buf);
1052
1053 if (block_state.rpass.buf[0])
1054 conf->passwd = xstrdup(block_state.rpass.buf);
1055
1056 conf->flags = block_state.flags.value;
1057 conf->modes = block_state.modes.value;
1058 conf->port = block_state.port.value;
1059 conf->htype = parse_netmask(conf->host, &conf->addr, &conf->bits);
1060
1061 conf_add_class_to_conf(conf, block_state.class.buf);
1062
1063 #ifdef HAVE_LIBCRYPTO
1064 if (block_state.file.buf[0])
1065 {
1066 BIO *file = NULL;
1067 RSA *pkey = NULL;
1068
1069 if ((file = BIO_new_file(block_state.file.buf, "r")) == NULL)
1070 {
1071 conf_error_report("Ignoring rsa_public_key_file -- file doesn't exist");
1072 break;
1073 }
1074
1075 if ((pkey = PEM_read_bio_RSA_PUBKEY(file, NULL, 0, NULL)) == NULL)
1076 conf_error_report("Ignoring rsa_public_key_file -- Key invalid; check key syntax.");
1077
1078 conf->rsa_public_key = pkey;
1079 BIO_set_close(file, BIO_CLOSE);
1080 BIO_free(file);
1081 }
1082 #endif /* HAVE_LIBCRYPTO */
1083 }
1084 };
1085
1086 oper_items: oper_items oper_item | oper_item;
1087 oper_item: oper_name | oper_user | oper_password |
1088 oper_umodes | oper_class | oper_encrypted |
1089 oper_rsa_public_key_file | oper_ssl_certificate_fingerprint |
1090 oper_flags | error ';' ;
1091
1092 oper_name: NAME '=' QSTRING ';'
1093 {
1094 if (conf_parser_ctx.pass == 2)
1095 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1096 };
1097
1098 oper_user: USER '=' QSTRING ';'
1099 {
1100 if (conf_parser_ctx.pass == 2)
1101 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1102 };
1103
1104 oper_password: PASSWORD '=' QSTRING ';'
1105 {
1106 if (conf_parser_ctx.pass == 2)
1107 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1108 };
1109
1110 oper_encrypted: ENCRYPTED '=' TBOOL ';'
1111 {
1112 if (conf_parser_ctx.pass != 2)
1113 break;
1114
1115 if (yylval.number)
1116 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1117 else
1118 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1119 };
1120
1121 oper_rsa_public_key_file: RSA_PUBLIC_KEY_FILE '=' QSTRING ';'
1122 {
1123 if (conf_parser_ctx.pass == 2)
1124 strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
1125 };
1126
1127 oper_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
1128 {
1129 if (conf_parser_ctx.pass == 2)
1130 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
1131 };
1132
1133 oper_class: CLASS '=' QSTRING ';'
1134 {
1135 if (conf_parser_ctx.pass == 2)
1136 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1137 };
1138
1139 oper_umodes: T_UMODES
1140 {
1141 if (conf_parser_ctx.pass == 2)
1142 block_state.modes.value = 0;
1143 } '=' oper_umodes_items ';' ;
1144
1145 oper_umodes_items: oper_umodes_items ',' oper_umodes_item | oper_umodes_item;
1146 oper_umodes_item: T_BOTS
1147 {
1148 if (conf_parser_ctx.pass == 2)
1149 block_state.modes.value |= UMODE_BOTS;
1150 } | T_CCONN
1151 {
1152 if (conf_parser_ctx.pass == 2)
1153 block_state.modes.value |= UMODE_CCONN;
1154 } | T_DEAF
1155 {
1156 if (conf_parser_ctx.pass == 2)
1157 block_state.modes.value |= UMODE_DEAF;
1158 } | T_DEBUG
1159 {
1160 if (conf_parser_ctx.pass == 2)
1161 block_state.modes.value |= UMODE_DEBUG;
1162 } | T_FULL
1163 {
1164 if (conf_parser_ctx.pass == 2)
1165 block_state.modes.value |= UMODE_FULL;
1166 } | HIDDEN
1167 {
1168 if (conf_parser_ctx.pass == 2)
1169 block_state.modes.value |= UMODE_HIDDEN;
1170 } | T_SKILL
1171 {
1172 if (conf_parser_ctx.pass == 2)
1173 block_state.modes.value |= UMODE_SKILL;
1174 } | T_NCHANGE
1175 {
1176 if (conf_parser_ctx.pass == 2)
1177 block_state.modes.value |= UMODE_NCHANGE;
1178 } | T_REJ
1179 {
1180 if (conf_parser_ctx.pass == 2)
1181 block_state.modes.value |= UMODE_REJ;
1182 } | T_UNAUTH
1183 {
1184 if (conf_parser_ctx.pass == 2)
1185 block_state.modes.value |= UMODE_UNAUTH;
1186 } | T_SPY
1187 {
1188 if (conf_parser_ctx.pass == 2)
1189 block_state.modes.value |= UMODE_SPY;
1190 } | T_EXTERNAL
1191 {
1192 if (conf_parser_ctx.pass == 2)
1193 block_state.modes.value |= UMODE_EXTERNAL;
1194 } | T_OPERWALL
1195 {
1196 if (conf_parser_ctx.pass == 2)
1197 block_state.modes.value |= UMODE_OPERWALL;
1198 } | T_SERVNOTICE
1199 {
1200 if (conf_parser_ctx.pass == 2)
1201 block_state.modes.value |= UMODE_SERVNOTICE;
1202 } | T_INVISIBLE
1203 {
1204 if (conf_parser_ctx.pass == 2)
1205 block_state.modes.value |= UMODE_INVISIBLE;
1206 } | T_WALLOP
1207 {
1208 if (conf_parser_ctx.pass == 2)
1209 block_state.modes.value |= UMODE_WALLOP;
1210 } | T_SOFTCALLERID
1211 {
1212 if (conf_parser_ctx.pass == 2)
1213 block_state.modes.value |= UMODE_SOFTCALLERID;
1214 } | T_CALLERID
1215 {
1216 if (conf_parser_ctx.pass == 2)
1217 block_state.modes.value |= UMODE_CALLERID;
1218 } | T_LOCOPS
1219 {
1220 if (conf_parser_ctx.pass == 2)
1221 block_state.modes.value |= UMODE_LOCOPS;
1222 } | T_NONONREG
1223 {
1224 if (conf_parser_ctx.pass == 2)
1225 block_state.modes.value |= UMODE_REGONLY;
1226 } | T_FARCONNECT
1227 {
1228 if (conf_parser_ctx.pass == 2)
1229 block_state.modes.value |= UMODE_FARCONNECT;
1230 };
1231
1232 oper_flags: IRCD_FLAGS
1233 {
1234 if (conf_parser_ctx.pass == 2)
1235 block_state.port.value = 0;
1236 } '=' oper_flags_items ';';
1237
1238 oper_flags_items: oper_flags_items ',' oper_flags_item | oper_flags_item;
1239 oper_flags_item: KILL ':' REMOTE
1240 {
1241 if (conf_parser_ctx.pass == 2)
1242 block_state.port.value |= OPER_FLAG_KILL_REMOTE;
1243 } | KILL
1244 {
1245 if (conf_parser_ctx.pass == 2)
1246 block_state.port.value |= OPER_FLAG_KILL;
1247 } | CONNECT ':' REMOTE
1248 {
1249 if (conf_parser_ctx.pass == 2)
1250 block_state.port.value |= OPER_FLAG_CONNECT_REMOTE;
1251 } | CONNECT
1252 {
1253 if (conf_parser_ctx.pass == 2)
1254 block_state.port.value |= OPER_FLAG_CONNECT;
1255 } | SQUIT ':' REMOTE
1256 {
1257 if (conf_parser_ctx.pass == 2)
1258 block_state.port.value |= OPER_FLAG_SQUIT_REMOTE;
1259 } | SQUIT
1260 {
1261 if (conf_parser_ctx.pass == 2)
1262 block_state.port.value |= OPER_FLAG_SQUIT;
1263 } | KLINE
1264 {
1265 if (conf_parser_ctx.pass == 2)
1266 block_state.port.value |= OPER_FLAG_K;
1267 } | UNKLINE
1268 {
1269 if (conf_parser_ctx.pass == 2)
1270 block_state.port.value |= OPER_FLAG_UNKLINE;
1271 } | T_DLINE
1272 {
1273 if (conf_parser_ctx.pass == 2)
1274 block_state.port.value |= OPER_FLAG_DLINE;
1275 } | T_UNDLINE
1276 {
1277 if (conf_parser_ctx.pass == 2)
1278 block_state.port.value |= OPER_FLAG_UNDLINE;
1279 } | XLINE
1280 {
1281 if (conf_parser_ctx.pass == 2)
1282 block_state.port.value |= OPER_FLAG_X;
1283 } | GLINE
1284 {
1285 if (conf_parser_ctx.pass == 2)
1286 block_state.port.value |= OPER_FLAG_GLINE;
1287 } | DIE
1288 {
1289 if (conf_parser_ctx.pass == 2)
1290 block_state.port.value |= OPER_FLAG_DIE;
1291 } | T_RESTART
1292 {
1293 if (conf_parser_ctx.pass == 2)
1294 block_state.port.value |= OPER_FLAG_RESTART;
1295 } | REHASH
1296 {
1297 if (conf_parser_ctx.pass == 2)
1298 block_state.port.value |= OPER_FLAG_REHASH;
1299 } | ADMIN
1300 {
1301 if (conf_parser_ctx.pass == 2)
1302 block_state.port.value |= OPER_FLAG_ADMIN;
1303 } | T_OPERWALL
1304 {
1305 if (conf_parser_ctx.pass == 2)
1306 block_state.port.value |= OPER_FLAG_OPERWALL;
1307 } | T_GLOBOPS
1308 {
1309 if (conf_parser_ctx.pass == 2)
1310 block_state.port.value |= OPER_FLAG_GLOBOPS;
1311 } | T_WALLOPS
1312 {
1313 if (conf_parser_ctx.pass == 2)
1314 block_state.port.value |= OPER_FLAG_WALLOPS;
1315 } | T_LOCOPS
1316 {
1317 if (conf_parser_ctx.pass == 2)
1318 block_state.port.value |= OPER_FLAG_LOCOPS;
1319 } | REMOTEBAN
1320 {
1321 if (conf_parser_ctx.pass == 2)
1322 block_state.port.value |= OPER_FLAG_REMOTEBAN;
1323 } | T_SET
1324 {
1325 if (conf_parser_ctx.pass == 2)
1326 block_state.port.value |= OPER_FLAG_SET;
1327 } | MODULE
1328 {
1329 if (conf_parser_ctx.pass == 2)
1330 block_state.port.value |= OPER_FLAG_MODULE;
1331 };
1332
1333
1334 /***************************************************************************
1335 * section class
1336 ***************************************************************************/
1337 class_entry: CLASS
1338 {
1339 if (conf_parser_ctx.pass != 1)
1340 break;
1341
1342 reset_block_state();
1343
1344 block_state.ping_freq.value = DEFAULT_PINGFREQUENCY;
1345 block_state.con_freq.value = DEFAULT_CONNECTFREQUENCY;
1346 block_state.max_total.value = MAXIMUM_LINKS_DEFAULT;
1347 block_state.max_sendq.value = DEFAULT_SENDQ;
1348 block_state.max_recvq.value = DEFAULT_RECVQ;
1349 } '{' class_items '}' ';'
1350 {
1351 struct ClassItem *class = NULL;
1352
1353 if (conf_parser_ctx.pass != 1)
1354 break;
1355
1356 if (!block_state.class.buf[0])
1357 break;
1358
1359 if (!(class = class_find(block_state.class.buf, 0)))
1360 class = class_make();
1361
1362 class->active = 1;
1363 MyFree(class->name);
1364 class->name = xstrdup(block_state.class.buf);
1365 class->ping_freq = block_state.ping_freq.value;
1366 class->max_perip = block_state.max_perip.value;
1367 class->con_freq = block_state.con_freq.value;
1368 class->max_total = block_state.max_total.value;
1369 class->max_global = block_state.max_global.value;
1370 class->max_local = block_state.max_local.value;
1371 class->max_ident = block_state.max_ident.value;
1372 class->max_sendq = block_state.max_sendq.value;
1373 class->max_recvq = block_state.max_recvq.value;
1374
1375 if (block_state.min_idle.value > block_state.max_idle.value)
1376 {
1377 block_state.min_idle.value = 0;
1378 block_state.max_idle.value = 0;
1379 block_state.flags.value &= ~CLASS_FLAGS_FAKE_IDLE;
1380 }
1381
1382 class->flags = block_state.flags.value;
1383 class->min_idle = block_state.min_idle.value;
1384 class->max_idle = block_state.max_idle.value;
1385
1386 if (class->number_per_cidr && block_state.number_per_cidr.value)
1387 if ((class->cidr_bitlen_ipv4 && block_state.cidr_bitlen_ipv4.value) ||
1388 (class->cidr_bitlen_ipv6 && block_state.cidr_bitlen_ipv6.value))
1389 if ((class->cidr_bitlen_ipv4 != block_state.cidr_bitlen_ipv4.value) ||
1390 (class->cidr_bitlen_ipv6 != block_state.cidr_bitlen_ipv6.value))
1391 rebuild_cidr_list(class);
1392
1393 class->cidr_bitlen_ipv4 = block_state.cidr_bitlen_ipv4.value;
1394 class->cidr_bitlen_ipv6 = block_state.cidr_bitlen_ipv6.value;
1395 class->number_per_cidr = block_state.number_per_cidr.value;
1396 };
1397
1398 class_items: class_items class_item | class_item;
1399 class_item: class_name |
1400 class_cidr_bitlen_ipv4 | class_cidr_bitlen_ipv6 |
1401 class_ping_time |
1402 class_number_per_cidr |
1403 class_number_per_ip |
1404 class_connectfreq |
1405 class_max_number |
1406 class_max_global |
1407 class_max_local |
1408 class_max_ident |
1409 class_sendq | class_recvq |
1410 class_min_idle |
1411 class_max_idle |
1412 class_flags |
1413 error ';' ;
1414
1415 class_name: NAME '=' QSTRING ';'
1416 {
1417 if (conf_parser_ctx.pass == 1)
1418 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1419 };
1420
1421 class_ping_time: PING_TIME '=' timespec ';'
1422 {
1423 if (conf_parser_ctx.pass == 1)
1424 block_state.ping_freq.value = $3;
1425 };
1426
1427 class_number_per_ip: NUMBER_PER_IP '=' NUMBER ';'
1428 {
1429 if (conf_parser_ctx.pass == 1)
1430 block_state.max_perip.value = $3;
1431 };
1432
1433 class_connectfreq: CONNECTFREQ '=' timespec ';'
1434 {
1435 if (conf_parser_ctx.pass == 1)
1436 block_state.con_freq.value = $3;
1437 };
1438
1439 class_max_number: MAX_NUMBER '=' NUMBER ';'
1440 {
1441 if (conf_parser_ctx.pass == 1)
1442 block_state.max_total.value = $3;
1443 };
1444
1445 class_max_global: MAX_GLOBAL '=' NUMBER ';'
1446 {
1447 if (conf_parser_ctx.pass == 1)
1448 block_state.max_global.value = $3;
1449 };
1450
1451 class_max_local: MAX_LOCAL '=' NUMBER ';'
1452 {
1453 if (conf_parser_ctx.pass == 1)
1454 block_state.max_local.value = $3;
1455 };
1456
1457 class_max_ident: MAX_IDENT '=' NUMBER ';'
1458 {
1459 if (conf_parser_ctx.pass == 1)
1460 block_state.max_ident.value = $3;
1461 };
1462
1463 class_sendq: SENDQ '=' sizespec ';'
1464 {
1465 if (conf_parser_ctx.pass == 1)
1466 block_state.max_sendq.value = $3;
1467 };
1468
1469 class_recvq: T_RECVQ '=' sizespec ';'
1470 {
1471 if (conf_parser_ctx.pass == 1)
1472 if ($3 >= CLIENT_FLOOD_MIN && $3 <= CLIENT_FLOOD_MAX)
1473 block_state.max_recvq.value = $3;
1474 };
1475
1476 class_cidr_bitlen_ipv4: CIDR_BITLEN_IPV4 '=' NUMBER ';'
1477 {
1478 if (conf_parser_ctx.pass == 1)
1479 block_state.cidr_bitlen_ipv4.value = $3 > 32 ? 32 : $3;
1480 };
1481
1482 class_cidr_bitlen_ipv6: CIDR_BITLEN_IPV6 '=' NUMBER ';'
1483 {
1484 if (conf_parser_ctx.pass == 1)
1485 block_state.cidr_bitlen_ipv6.value = $3 > 128 ? 128 : $3;
1486 };
1487
1488 class_number_per_cidr: NUMBER_PER_CIDR '=' NUMBER ';'
1489 {
1490 if (conf_parser_ctx.pass == 1)
1491 block_state.number_per_cidr.value = $3;
1492 };
1493
1494 class_min_idle: MIN_IDLE '=' timespec ';'
1495 {
1496 if (conf_parser_ctx.pass != 1)
1497 break;
1498
1499 block_state.min_idle.value = $3;
1500 block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1501 };
1502
1503 class_max_idle: MAX_IDLE '=' timespec ';'
1504 {
1505 if (conf_parser_ctx.pass != 1)
1506 break;
1507
1508 block_state.max_idle.value = $3;
1509 block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1510 };
1511
1512 class_flags: IRCD_FLAGS
1513 {
1514 if (conf_parser_ctx.pass == 1)
1515 block_state.flags.value &= CLASS_FLAGS_FAKE_IDLE;
1516 } '=' class_flags_items ';';
1517
1518 class_flags_items: class_flags_items ',' class_flags_item | class_flags_item;
1519 class_flags_item: RANDOM_IDLE
1520 {
1521 if (conf_parser_ctx.pass == 1)
1522 block_state.flags.value |= CLASS_FLAGS_RANDOM_IDLE;
1523 } | HIDE_IDLE_FROM_OPERS
1524 {
1525 if (conf_parser_ctx.pass == 1)
1526 block_state.flags.value |= CLASS_FLAGS_HIDE_IDLE_FROM_OPERS;
1527 };
1528
1529
1530 /***************************************************************************
1531 * section listen
1532 ***************************************************************************/
1533 listen_entry: LISTEN
1534 {
1535 if (conf_parser_ctx.pass == 2)
1536 reset_block_state();
1537 } '{' listen_items '}' ';';
1538
1539 listen_flags: IRCD_FLAGS
1540 {
1541 block_state.flags.value = 0;
1542 } '=' listen_flags_items ';';
1543
1544 listen_flags_items: listen_flags_items ',' listen_flags_item | listen_flags_item;
1545 listen_flags_item: T_SSL
1546 {
1547 if (conf_parser_ctx.pass == 2)
1548 block_state.flags.value |= LISTENER_SSL;
1549 } | HIDDEN
1550 {
1551 if (conf_parser_ctx.pass == 2)
1552 block_state.flags.value |= LISTENER_HIDDEN;
1553 } | T_SERVER
1554 {
1555 if (conf_parser_ctx.pass == 2)
1556 block_state.flags.value |= LISTENER_SERVER;
1557 };
1558
1559 listen_items: listen_items listen_item | listen_item;
1560 listen_item: listen_port | listen_flags | listen_address | listen_host | error ';';
1561
1562 listen_port: PORT '=' port_items { block_state.flags.value = 0; } ';';
1563
1564 port_items: port_items ',' port_item | port_item;
1565
1566 port_item: NUMBER
1567 {
1568 if (conf_parser_ctx.pass == 2)
1569 {
1570 if (block_state.flags.value & LISTENER_SSL)
1571 #ifdef HAVE_LIBCRYPTO
1572 if (!ServerInfo.server_ctx)
1573 #endif
1574 {
1575 conf_error_report("SSL not available - port closed");
1576 break;
1577 }
1578 add_listener($1, block_state.addr.buf, block_state.flags.value);
1579 }
1580 } | NUMBER TWODOTS NUMBER
1581 {
1582 if (conf_parser_ctx.pass == 2)
1583 {
1584 int i;
1585
1586 if (block_state.flags.value & LISTENER_SSL)
1587 #ifdef HAVE_LIBCRYPTO
1588 if (!ServerInfo.server_ctx)
1589 #endif
1590 {
1591 conf_error_report("SSL not available - port closed");
1592 break;
1593 }
1594
1595 for (i = $1; i <= $3; ++i)
1596 add_listener(i, block_state.addr.buf, block_state.flags.value);
1597 }
1598 };
1599
1600 listen_address: IP '=' QSTRING ';'
1601 {
1602 if (conf_parser_ctx.pass == 2)
1603 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1604 };
1605
1606 listen_host: HOST '=' QSTRING ';'
1607 {
1608 if (conf_parser_ctx.pass == 2)
1609 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1610 };
1611
1612 /***************************************************************************
1613 * section auth
1614 ***************************************************************************/
1615 auth_entry: IRCD_AUTH
1616 {
1617 if (conf_parser_ctx.pass == 2)
1618 reset_block_state();
1619 } '{' auth_items '}' ';'
1620 {
1621 dlink_node *ptr = NULL;
1622
1623 if (conf_parser_ctx.pass != 2)
1624 break;
1625
1626 DLINK_FOREACH(ptr, block_state.mask.list.head)
1627 {
1628 struct MaskItem *conf = NULL;
1629 struct split_nuh_item nuh;
1630
1631 nuh.nuhmask = ptr->data;
1632 nuh.nickptr = NULL;
1633 nuh.userptr = block_state.user.buf;
1634 nuh.hostptr = block_state.host.buf;
1635 nuh.nicksize = 0;
1636 nuh.usersize = sizeof(block_state.user.buf);
1637 nuh.hostsize = sizeof(block_state.host.buf);
1638 split_nuh(&nuh);
1639
1640 conf = conf_make(CONF_CLIENT);
1641 conf->user = xstrdup(block_state.user.buf);
1642 conf->host = xstrdup(block_state.host.buf);
1643
1644 if (block_state.rpass.buf[0])
1645 conf->passwd = xstrdup(block_state.rpass.buf);
1646 if (block_state.name.buf[0])
1647 conf->name = xstrdup(block_state.name.buf);
1648
1649 conf->flags = block_state.flags.value;
1650 conf->port = block_state.port.value;
1651
1652 conf_add_class_to_conf(conf, block_state.class.buf);
1653 add_conf_by_address(CONF_CLIENT, conf);
1654 }
1655 };
1656
1657 auth_items: auth_items auth_item | auth_item;
1658 auth_item: auth_user | auth_passwd | auth_class | auth_flags |
1659 auth_spoof | auth_redir_serv | auth_redir_port |
1660 auth_encrypted | error ';' ;
1661
1662 auth_user: USER '=' QSTRING ';'
1663 {
1664 if (conf_parser_ctx.pass == 2)
1665 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1666 };
1667
1668 auth_passwd: PASSWORD '=' QSTRING ';'
1669 {
1670 if (conf_parser_ctx.pass == 2)
1671 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1672 };
1673
1674 auth_class: CLASS '=' QSTRING ';'
1675 {
1676 if (conf_parser_ctx.pass == 2)
1677 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1678 };
1679
1680 auth_encrypted: ENCRYPTED '=' TBOOL ';'
1681 {
1682 if (conf_parser_ctx.pass == 2)
1683 {
1684 if (yylval.number)
1685 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1686 else
1687 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1688 }
1689 };
1690
1691 auth_flags: IRCD_FLAGS
1692 {
1693 if (conf_parser_ctx.pass == 2)
1694 block_state.flags.value &= (CONF_FLAGS_ENCRYPTED | CONF_FLAGS_SPOOF_IP);
1695 } '=' auth_flags_items ';';
1696
1697 auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item;
1698 auth_flags_item: SPOOF_NOTICE
1699 {
1700 if (conf_parser_ctx.pass == 2)
1701 block_state.flags.value |= CONF_FLAGS_SPOOF_NOTICE;
1702 } | EXCEED_LIMIT
1703 {
1704 if (conf_parser_ctx.pass == 2)
1705 block_state.flags.value |= CONF_FLAGS_NOLIMIT;
1706 } | KLINE_EXEMPT
1707 {
1708 if (conf_parser_ctx.pass == 2)
1709 block_state.flags.value |= CONF_FLAGS_EXEMPTKLINE;
1710 } | NEED_IDENT
1711 {
1712 if (conf_parser_ctx.pass == 2)
1713 block_state.flags.value |= CONF_FLAGS_NEED_IDENTD;
1714 } | CAN_FLOOD
1715 {
1716 if (conf_parser_ctx.pass == 2)
1717 block_state.flags.value |= CONF_FLAGS_CAN_FLOOD;
1718 } | NO_TILDE
1719 {
1720 if (conf_parser_ctx.pass == 2)
1721 block_state.flags.value |= CONF_FLAGS_NO_TILDE;
1722 } | GLINE_EXEMPT
1723 {
1724 if (conf_parser_ctx.pass == 2)
1725 block_state.flags.value |= CONF_FLAGS_EXEMPTGLINE;
1726 } | RESV_EXEMPT
1727 {
1728 if (conf_parser_ctx.pass == 2)
1729 block_state.flags.value |= CONF_FLAGS_EXEMPTRESV;
1730 } | T_WEBIRC
1731 {
1732 if (conf_parser_ctx.pass == 2)
1733 block_state.flags.value |= CONF_FLAGS_WEBIRC;
1734 } | NEED_PASSWORD
1735 {
1736 if (conf_parser_ctx.pass == 2)
1737 block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD;
1738 };
1739
1740 auth_spoof: SPOOF '=' QSTRING ';'
1741 {
1742 if (conf_parser_ctx.pass != 2)
1743 break;
1744
1745 if (strlen(yylval.string) <= HOSTLEN && valid_hostname(yylval.string))
1746 {
1747 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1748 block_state.flags.value |= CONF_FLAGS_SPOOF_IP;
1749 }
1750 else
1751 ilog(LOG_TYPE_IRCD, "Spoof either is too long or contains invalid characters. Ignoring it.");
1752 };
1753
1754 auth_redir_serv: REDIRSERV '=' QSTRING ';'
1755 {
1756 if (conf_parser_ctx.pass != 2)
1757 break;
1758
1759 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1760 block_state.flags.value |= CONF_FLAGS_REDIR;
1761 };
1762
1763 auth_redir_port: REDIRPORT '=' NUMBER ';'
1764 {
1765 if (conf_parser_ctx.pass != 2)
1766 break;
1767
1768 block_state.flags.value |= CONF_FLAGS_REDIR;
1769 block_state.port.value = $3;
1770 };
1771
1772
1773 /***************************************************************************
1774 * section resv
1775 ***************************************************************************/
1776 resv_entry: RESV
1777 {
1778 if (conf_parser_ctx.pass != 2)
1779 break;
1780
1781 reset_block_state();
1782 strlcpy(block_state.rpass.buf, CONF_NOREASON, sizeof(block_state.rpass.buf));
1783 } '{' resv_items '}' ';'
1784 {
1785 if (conf_parser_ctx.pass != 2)
1786 break;
1787
1788 create_resv(block_state.name.buf, block_state.rpass.buf, &block_state.mask.list);
1789 };
1790
1791 resv_items: resv_items resv_item | resv_item;
1792 resv_item: resv_mask | resv_reason | resv_exempt | error ';' ;
1793
1794 resv_mask: MASK '=' QSTRING ';'
1795 {
1796 if (conf_parser_ctx.pass == 2)
1797 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1798 };
1799
1800 resv_reason: REASON '=' QSTRING ';'
1801 {
1802 if (conf_parser_ctx.pass == 2)
1803 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1804 };
1805
1806 resv_exempt: EXEMPT '=' QSTRING ';'
1807 {
1808 if (conf_parser_ctx.pass == 2)
1809 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1810 };
1811
1812
1813 /***************************************************************************
1814 * section service
1815 ***************************************************************************/
1816 service_entry: T_SERVICE '{' service_items '}' ';';
1817
1818 service_items: service_items service_item | service_item;
1819 service_item: service_name | error;
1820
1821 service_name: NAME '=' QSTRING ';'
1822 {
1823 if (conf_parser_ctx.pass != 2)
1824 break;
1825
1826 if (valid_servname(yylval.string))
1827 {
1828 struct MaskItem *conf = conf_make(CONF_SERVICE);
1829 conf->name = xstrdup(yylval.string);
1830 }
1831 };
1832
1833 /***************************************************************************
1834 * section shared, for sharing remote klines etc.
1835 ***************************************************************************/
1836 shared_entry: T_SHARED
1837 {
1838 if (conf_parser_ctx.pass != 2)
1839 break;
1840
1841 reset_block_state();
1842
1843 strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1844 strlcpy(block_state.user.buf, "*", sizeof(block_state.user.buf));
1845 strlcpy(block_state.host.buf, "*", sizeof(block_state.host.buf));
1846 block_state.flags.value = SHARED_ALL;
1847 } '{' shared_items '}' ';'
1848 {
1849 struct MaskItem *conf = NULL;
1850
1851 if (conf_parser_ctx.pass != 2)
1852 break;
1853
1854 conf = conf_make(CONF_ULINE);
1855 conf->flags = block_state.flags.value;
1856 conf->name = xstrdup(block_state.name.buf);
1857 conf->user = xstrdup(block_state.user.buf);
1858 conf->host = xstrdup(block_state.host.buf);
1859 };
1860
1861 shared_items: shared_items shared_item | shared_item;
1862 shared_item: shared_name | shared_user | shared_type | error ';' ;
1863
1864 shared_name: NAME '=' QSTRING ';'
1865 {
1866 if (conf_parser_ctx.pass == 2)
1867 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1868 };
1869
1870 shared_user: USER '=' QSTRING ';'
1871 {
1872 if (conf_parser_ctx.pass == 2)
1873 {
1874 struct split_nuh_item nuh;
1875
1876 nuh.nuhmask = yylval.string;
1877 nuh.nickptr = NULL;
1878 nuh.userptr = block_state.user.buf;
1879 nuh.hostptr = block_state.host.buf;
1880
1881 nuh.nicksize = 0;
1882 nuh.usersize = sizeof(block_state.user.buf);
1883 nuh.hostsize = sizeof(block_state.host.buf);
1884
1885 split_nuh(&nuh);
1886 }
1887 };
1888
1889 shared_type: TYPE
1890 {
1891 if (conf_parser_ctx.pass == 2)
1892 block_state.flags.value = 0;
1893 } '=' shared_types ';' ;
1894
1895 shared_types: shared_types ',' shared_type_item | shared_type_item;
1896 shared_type_item: KLINE
1897 {
1898 if (conf_parser_ctx.pass == 2)
1899 block_state.flags.value |= SHARED_KLINE;
1900 } | UNKLINE
1901 {
1902 if (conf_parser_ctx.pass == 2)
1903 block_state.flags.value |= SHARED_UNKLINE;
1904 } | T_DLINE
1905 {
1906 if (conf_parser_ctx.pass == 2)
1907 block_state.flags.value |= SHARED_DLINE;
1908 } | T_UNDLINE
1909 {
1910 if (conf_parser_ctx.pass == 2)
1911 block_state.flags.value |= SHARED_UNDLINE;
1912 } | XLINE
1913 {
1914 if (conf_parser_ctx.pass == 2)
1915 block_state.flags.value |= SHARED_XLINE;
1916 } | T_UNXLINE
1917 {
1918 if (conf_parser_ctx.pass == 2)
1919 block_state.flags.value |= SHARED_UNXLINE;
1920 } | RESV
1921 {
1922 if (conf_parser_ctx.pass == 2)
1923 block_state.flags.value |= SHARED_RESV;
1924 } | T_UNRESV
1925 {
1926 if (conf_parser_ctx.pass == 2)
1927 block_state.flags.value |= SHARED_UNRESV;
1928 } | T_LOCOPS
1929 {
1930 if (conf_parser_ctx.pass == 2)
1931 block_state.flags.value |= SHARED_LOCOPS;
1932 } | T_ALL
1933 {
1934 if (conf_parser_ctx.pass == 2)
1935 block_state.flags.value = SHARED_ALL;
1936 };
1937
1938 /***************************************************************************
1939 * section cluster
1940 ***************************************************************************/
1941 cluster_entry: T_CLUSTER
1942 {
1943 if (conf_parser_ctx.pass != 2)
1944 break;
1945
1946 reset_block_state();
1947
1948 strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1949 block_state.flags.value = SHARED_ALL;
1950 } '{' cluster_items '}' ';'
1951 {
1952 struct MaskItem *conf = NULL;
1953
1954 if (conf_parser_ctx.pass != 2)
1955 break;
1956
1957 conf = conf_make(CONF_CLUSTER);
1958 conf->flags = block_state.flags.value;
1959 conf->name = xstrdup(block_state.name.buf);
1960 };
1961
1962 cluster_items: cluster_items cluster_item | cluster_item;
1963 cluster_item: cluster_name | cluster_type | error ';' ;
1964
1965 cluster_name: NAME '=' QSTRING ';'
1966 {
1967 if (conf_parser_ctx.pass == 2)
1968 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1969 };
1970
1971 cluster_type: TYPE
1972 {
1973 if (conf_parser_ctx.pass == 2)
1974 block_state.flags.value = 0;
1975 } '=' cluster_types ';' ;
1976
1977 cluster_types: cluster_types ',' cluster_type_item | cluster_type_item;
1978 cluster_type_item: KLINE
1979 {
1980 if (conf_parser_ctx.pass == 2)
1981 block_state.flags.value |= SHARED_KLINE;
1982 } | UNKLINE
1983 {
1984 if (conf_parser_ctx.pass == 2)
1985 block_state.flags.value |= SHARED_UNKLINE;
1986 } | T_DLINE
1987 {
1988 if (conf_parser_ctx.pass == 2)
1989 block_state.flags.value |= SHARED_DLINE;
1990 } | T_UNDLINE
1991 {
1992 if (conf_parser_ctx.pass == 2)
1993 block_state.flags.value |= SHARED_UNDLINE;
1994 } | XLINE
1995 {
1996 if (conf_parser_ctx.pass == 2)
1997 block_state.flags.value |= SHARED_XLINE;
1998 } | T_UNXLINE
1999 {
2000 if (conf_parser_ctx.pass == 2)
2001 block_state.flags.value |= SHARED_UNXLINE;
2002 } | RESV
2003 {
2004 if (conf_parser_ctx.pass == 2)
2005 block_state.flags.value |= SHARED_RESV;
2006 } | T_UNRESV
2007 {
2008 if (conf_parser_ctx.pass == 2)
2009 block_state.flags.value |= SHARED_UNRESV;
2010 } | T_LOCOPS
2011 {
2012 if (conf_parser_ctx.pass == 2)
2013 block_state.flags.value |= SHARED_LOCOPS;
2014 } | T_ALL
2015 {
2016 if (conf_parser_ctx.pass == 2)
2017 block_state.flags.value = SHARED_ALL;
2018 };
2019
2020 /***************************************************************************
2021 * section connect
2022 ***************************************************************************/
2023 connect_entry: CONNECT
2024 {
2025
2026 if (conf_parser_ctx.pass != 2)
2027 break;
2028
2029 reset_block_state();
2030 block_state.port.value = PORTNUM;
2031 } '{' connect_items '}' ';'
2032 {
2033 struct MaskItem *conf = NULL;
2034 struct addrinfo hints, *res;
2035
2036 if (conf_parser_ctx.pass != 2)
2037 break;
2038
2039 if (!block_state.name.buf[0] ||
2040 !block_state.host.buf[0])
2041 break;
2042
2043 if (!block_state.rpass.buf[0] ||
2044 !block_state.spass.buf[0])
2045 break;
2046
2047 if (has_wildcards(block_state.name.buf) ||
2048 has_wildcards(block_state.host.buf))
2049 break;
2050
2051 conf = conf_make(CONF_SERVER);
2052 conf->port = block_state.port.value;
2053 conf->flags = block_state.flags.value;
2054 conf->aftype = block_state.aftype.value;
2055 conf->host = xstrdup(block_state.host.buf);
2056 conf->name = xstrdup(block_state.name.buf);
2057 conf->passwd = xstrdup(block_state.rpass.buf);
2058 conf->spasswd = xstrdup(block_state.spass.buf);
2059
2060 if (block_state.cert.buf[0])
2061 conf->certfp = xstrdup(block_state.cert.buf);
2062
2063 conf->cipher_list = xstrdup(block_state.ciph.buf);
2064
2065 dlinkMoveList(&block_state.leaf.list, &conf->leaf_list);
2066 dlinkMoveList(&block_state.hub.list, &conf->hub_list);
2067
2068 if (block_state.bind.buf[0])
2069 {
2070 memset(&hints, 0, sizeof(hints));
2071
2072 hints.ai_family = AF_UNSPEC;
2073 hints.ai_socktype = SOCK_STREAM;
2074 hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
2075
2076 if (getaddrinfo(block_state.bind.buf, NULL, &hints, &res))
2077 ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", block_state.bind.buf);
2078 else
2079 {
2080 assert(res != NULL);
2081
2082 memcpy(&conf->bind, res->ai_addr, res->ai_addrlen);
2083 conf->bind.ss.ss_family = res->ai_family;
2084 conf->bind.ss_len = res->ai_addrlen;
2085 freeaddrinfo(res);
2086 }
2087 }
2088
2089 conf_add_class_to_conf(conf, block_state.class.buf);
2090 lookup_confhost(conf);
2091 };
2092
2093 connect_items: connect_items connect_item | connect_item;
2094 connect_item: connect_name | connect_host | connect_vhost |
2095 connect_send_password | connect_accept_password |
2096 connect_ssl_certificate_fingerprint |
2097 connect_aftype | connect_port | connect_ssl_cipher_list |
2098 connect_flags | connect_hub_mask | connect_leaf_mask |
2099 connect_class | connect_encrypted |
2100 error ';' ;
2101
2102 connect_name: NAME '=' QSTRING ';'
2103 {
2104 if (conf_parser_ctx.pass == 2)
2105 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2106 };
2107
2108 connect_host: HOST '=' QSTRING ';'
2109 {
2110 if (conf_parser_ctx.pass == 2)
2111 strlcpy(block_state.host.buf, yylval.string, sizeof(block_state.host.buf));
2112 };
2113
2114 connect_vhost: VHOST '=' QSTRING ';'
2115 {
2116 if (conf_parser_ctx.pass == 2)
2117 strlcpy(block_state.bind.buf, yylval.string, sizeof(block_state.bind.buf));
2118 };
2119
2120 connect_send_password: SEND_PASSWORD '=' QSTRING ';'
2121 {
2122 if (conf_parser_ctx.pass != 2)
2123 break;
2124
2125 if ($3[0] == ':')
2126 conf_error_report("Server passwords cannot begin with a colon");
2127 else if (strchr($3, ' ') != NULL)
2128 conf_error_report("Server passwords cannot contain spaces");
2129 else
2130 strlcpy(block_state.spass.buf, yylval.string, sizeof(block_state.spass.buf));
2131 };
2132
2133 connect_accept_password: ACCEPT_PASSWORD '=' QSTRING ';'
2134 {
2135 if (conf_parser_ctx.pass != 2)
2136 break;
2137
2138 if ($3[0] == ':')
2139 conf_error_report("Server passwords cannot begin with a colon");
2140 else if (strchr($3, ' ') != NULL)
2141 conf_error_report("Server passwords cannot contain spaces");
2142 else
2143 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2144 };
2145
2146 connect_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
2147 {
2148 if (conf_parser_ctx.pass == 2)
2149 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
2150 };
2151
2152 connect_port: PORT '=' NUMBER ';'
2153 {
2154 if (conf_parser_ctx.pass == 2)
2155 block_state.port.value = $3;
2156 };
2157
2158 connect_aftype: AFTYPE '=' T_IPV4 ';'
2159 {
2160 if (conf_parser_ctx.pass == 2)
2161 block_state.aftype.value = AF_INET;
2162 } | AFTYPE '=' T_IPV6 ';'
2163 {
2164 #ifdef IPV6
2165 if (conf_parser_ctx.pass == 2)
2166 block_state.aftype.value = AF_INET6;
2167 #endif
2168 };
2169
2170 connect_flags: IRCD_FLAGS
2171 {
2172 block_state.flags.value &= CONF_FLAGS_ENCRYPTED;
2173 } '=' connect_flags_items ';';
2174
2175 connect_flags_items: connect_flags_items ',' connect_flags_item | connect_flags_item;
2176 connect_flags_item: AUTOCONN
2177 {
2178 if (conf_parser_ctx.pass == 2)
2179 block_state.flags.value |= CONF_FLAGS_ALLOW_AUTO_CONN;
2180 } | T_SSL
2181 {
2182 if (conf_parser_ctx.pass == 2)
2183 block_state.flags.value |= CONF_FLAGS_SSL;
2184 };
2185
2186 connect_encrypted: ENCRYPTED '=' TBOOL ';'
2187 {
2188 if (conf_parser_ctx.pass == 2)
2189 {
2190 if (yylval.number)
2191 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
2192 else
2193 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
2194 }
2195 };
2196
2197 connect_hub_mask: HUB_MASK '=' QSTRING ';'
2198 {
2199 if (conf_parser_ctx.pass == 2)
2200 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.hub.list);
2201 };
2202
2203 connect_leaf_mask: LEAF_MASK '=' QSTRING ';'
2204 {
2205 if (conf_parser_ctx.pass == 2)
2206 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.leaf.list);
2207 };
2208
2209 connect_class: CLASS '=' QSTRING ';'
2210 {
2211 if (conf_parser_ctx.pass == 2)
2212 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
2213 };
2214
2215 connect_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
2216 {
2217 #ifdef HAVE_LIBCRYPTO
2218 if (conf_parser_ctx.pass == 2)
2219 strlcpy(block_state.ciph.buf, yylval.string, sizeof(block_state.ciph.buf));
2220 #else
2221 if (conf_parser_ctx.pass == 2)
2222 conf_error_report("Ignoring connect::ciphers -- no OpenSSL support");
2223 #endif
2224 };
2225
2226
2227 /***************************************************************************
2228 * section kill
2229 ***************************************************************************/
2230 kill_entry: KILL
2231 {
2232 if (conf_parser_ctx.pass == 2)
2233 reset_block_state();
2234 } '{' kill_items '}' ';'
2235 {
2236 struct MaskItem *conf = NULL;
2237
2238 if (conf_parser_ctx.pass != 2)
2239 break;
2240
2241 if (!block_state.user.buf[0] ||
2242 !block_state.host.buf[0])
2243 break;
2244
2245 conf = conf_make(CONF_KLINE);
2246 conf->user = xstrdup(block_state.user.buf);
2247 conf->host = xstrdup(block_state.host.buf);
2248
2249 if (block_state.rpass.buf[0])
2250 conf->reason = xstrdup(block_state.rpass.buf);
2251 else
2252 conf->reason = xstrdup(CONF_NOREASON);
2253 add_conf_by_address(CONF_KLINE, conf);
2254 };
2255
2256 kill_items: kill_items kill_item | kill_item;
2257 kill_item: kill_user | kill_reason | error;
2258
2259 kill_user: USER '=' QSTRING ';'
2260 {
2261
2262 if (conf_parser_ctx.pass == 2)
2263 {
2264 struct split_nuh_item nuh;
2265
2266 nuh.nuhmask = yylval.string;
2267 nuh.nickptr = NULL;
2268 nuh.userptr = block_state.user.buf;
2269 nuh.hostptr = block_state.host.buf;
2270
2271 nuh.nicksize = 0;
2272 nuh.usersize = sizeof(block_state.user.buf);
2273 nuh.hostsize = sizeof(block_state.host.buf);
2274
2275 split_nuh(&nuh);
2276 }
2277 };
2278
2279 kill_reason: REASON '=' QSTRING ';'
2280 {
2281 if (conf_parser_ctx.pass == 2)
2282 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2283 };
2284
2285 /***************************************************************************
2286 * section deny
2287 ***************************************************************************/
2288 deny_entry: DENY
2289 {
2290 if (conf_parser_ctx.pass == 2)
2291 reset_block_state();
2292 } '{' deny_items '}' ';'
2293 {
2294 struct MaskItem *conf = NULL;
2295
2296 if (conf_parser_ctx.pass != 2)
2297 break;
2298
2299 if (!block_state.addr.buf[0])
2300 break;
2301
2302 if (parse_netmask(block_state.addr.buf, NULL, NULL) != HM_HOST)
2303 {
2304 conf = conf_make(CONF_DLINE);
2305 conf->host = xstrdup(block_state.addr.buf);
2306
2307 if (block_state.rpass.buf[0])
2308 conf->reason = xstrdup(block_state.rpass.buf);
2309 else
2310 conf->reason = xstrdup(CONF_NOREASON);
2311 add_conf_by_address(CONF_DLINE, conf);
2312 }
2313 };
2314
2315 deny_items: deny_items deny_item | deny_item;
2316 deny_item: deny_ip | deny_reason | error;
2317
2318 deny_ip: IP '=' QSTRING ';'
2319 {
2320 if (conf_parser_ctx.pass == 2)
2321 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
2322 };
2323
2324 deny_reason: REASON '=' QSTRING ';'
2325 {
2326 if (conf_parser_ctx.pass == 2)
2327 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2328 };
2329
2330 /***************************************************************************
2331 * section exempt
2332 ***************************************************************************/
2333 exempt_entry: EXEMPT '{' exempt_items '}' ';';
2334
2335 exempt_items: exempt_items exempt_item | exempt_item;
2336 exempt_item: exempt_ip | error;
2337
2338 exempt_ip: IP '=' QSTRING ';'
2339 {
2340 if (conf_parser_ctx.pass == 2)
2341 {
2342 if (yylval.string[0] && parse_netmask(yylval.string, NULL, NULL) != HM_HOST)
2343 {
2344 struct MaskItem *conf = conf_make(CONF_EXEMPT);
2345 conf->host = xstrdup(yylval.string);
2346
2347 add_conf_by_address(CONF_EXEMPT, conf);
2348 }
2349 }
2350 };
2351
2352 /***************************************************************************
2353 * section gecos
2354 ***************************************************************************/
2355 gecos_entry: GECOS
2356 {
2357 if (conf_parser_ctx.pass == 2)
2358 reset_block_state();
2359 } '{' gecos_items '}' ';'
2360 {
2361 struct MaskItem *conf = NULL;
2362
2363 if (conf_parser_ctx.pass != 2)
2364 break;
2365
2366 if (!block_state.name.buf[0])
2367 break;
2368
2369 conf = conf_make(CONF_XLINE);
2370 conf->name = xstrdup(block_state.name.buf);
2371
2372 if (block_state.rpass.buf[0])
2373 conf->reason = xstrdup(block_state.rpass.buf);
2374 else
2375 conf->reason = xstrdup(CONF_NOREASON);
2376 };
2377
2378 gecos_items: gecos_items gecos_item | gecos_item;
2379 gecos_item: gecos_name | gecos_reason | error;
2380
2381 gecos_name: NAME '=' QSTRING ';'
2382 {
2383 if (conf_parser_ctx.pass == 2)
2384 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2385 };
2386
2387 gecos_reason: REASON '=' QSTRING ';'
2388 {
2389 if (conf_parser_ctx.pass == 2)
2390 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2391 };
2392
2393 /***************************************************************************
2394 * section general
2395 ***************************************************************************/
2396 general_entry: GENERAL
2397 '{' general_items '}' ';';
2398
2399 general_items: general_items general_item | general_item;
2400 general_item: general_hide_spoof_ips | general_ignore_bogus_ts |
2401 general_failed_oper_notice | general_anti_nick_flood |
2402 general_max_nick_time | general_max_nick_changes |
2403 general_max_accept | general_anti_spam_exit_message_time |
2404 general_ts_warn_delta | general_ts_max_delta |
2405 general_kill_chase_time_limit |
2406 general_invisible_on_connect |
2407 general_warn_no_nline | general_dots_in_ident |
2408 general_stats_o_oper_only | general_stats_k_oper_only |
2409 general_pace_wait | general_stats_i_oper_only |
2410 general_pace_wait_simple | general_stats_P_oper_only |
2411 general_short_motd | general_no_oper_flood |
2412 general_true_no_oper_flood | general_oper_pass_resv |
2413 general_oper_only_umodes | general_max_targets |
2414 general_use_egd | general_egdpool_path |
2415 general_oper_umodes | general_caller_id_wait |
2416 general_opers_bypass_callerid | general_default_floodcount |
2417 general_min_nonwildcard | general_min_nonwildcard_simple |
2418 general_throttle_time | general_havent_read_conf |
2419 general_ping_cookie |
2420 general_disable_auth |
2421 general_tkline_expire_notices | general_gline_enable |
2422 general_gline_duration | general_gline_request_duration |
2423 general_gline_min_cidr |
2424 general_gline_min_cidr6 |
2425 general_stats_e_disabled |
2426 general_max_watch | general_services_name |
2427 error;
2428
2429
2430 general_max_watch: MAX_WATCH '=' NUMBER ';'
2431 {
2432 ConfigFileEntry.max_watch = $3;
2433 };
2434
2435 general_gline_enable: GLINE_ENABLE '=' TBOOL ';'
2436 {
2437 if (conf_parser_ctx.pass == 2)
2438 ConfigFileEntry.glines = yylval.number;
2439 };
2440
2441 general_gline_duration: GLINE_DURATION '=' timespec ';'
2442 {
2443 if (conf_parser_ctx.pass == 2)
2444 ConfigFileEntry.gline_time = $3;
2445 };
2446
2447 general_gline_request_duration: GLINE_REQUEST_DURATION '=' timespec ';'
2448 {
2449 if (conf_parser_ctx.pass == 2)
2450 ConfigFileEntry.gline_request_time = $3;
2451 };
2452
2453 general_gline_min_cidr: GLINE_MIN_CIDR '=' NUMBER ';'
2454 {
2455 ConfigFileEntry.gline_min_cidr = $3;
2456 };
2457
2458 general_gline_min_cidr6: GLINE_MIN_CIDR6 '=' NUMBER ';'
2459 {
2460 ConfigFileEntry.gline_min_cidr6 = $3;
2461 };
2462
2463 general_tkline_expire_notices: TKLINE_EXPIRE_NOTICES '=' TBOOL ';'
2464 {
2465 ConfigFileEntry.tkline_expire_notices = yylval.number;
2466 };
2467
2468 general_kill_chase_time_limit: KILL_CHASE_TIME_LIMIT '=' timespec ';'
2469 {
2470 ConfigFileEntry.kill_chase_time_limit = $3;
2471 };
2472
2473 general_hide_spoof_ips: HIDE_SPOOF_IPS '=' TBOOL ';'
2474 {
2475 ConfigFileEntry.hide_spoof_ips = yylval.number;
2476 };
2477
2478 general_ignore_bogus_ts: IGNORE_BOGUS_TS '=' TBOOL ';'
2479 {
2480 ConfigFileEntry.ignore_bogus_ts = yylval.number;
2481 };
2482
2483 general_failed_oper_notice: FAILED_OPER_NOTICE '=' TBOOL ';'
2484 {
2485 ConfigFileEntry.failed_oper_notice = yylval.number;
2486 };
2487
2488 general_anti_nick_flood: ANTI_NICK_FLOOD '=' TBOOL ';'
2489 {
2490 ConfigFileEntry.anti_nick_flood = yylval.number;
2491 };
2492
2493 general_max_nick_time: MAX_NICK_TIME '=' timespec ';'
2494 {
2495 ConfigFileEntry.max_nick_time = $3;
2496 };
2497
2498 general_max_nick_changes: MAX_NICK_CHANGES '=' NUMBER ';'
2499 {
2500 ConfigFileEntry.max_nick_changes = $3;
2501 };
2502
2503 general_max_accept: MAX_ACCEPT '=' NUMBER ';'
2504 {
2505 ConfigFileEntry.max_accept = $3;
2506 };
2507
2508 general_anti_spam_exit_message_time: ANTI_SPAM_EXIT_MESSAGE_TIME '=' timespec ';'
2509 {
2510 ConfigFileEntry.anti_spam_exit_message_time = $3;
2511 };
2512
2513 general_ts_warn_delta: TS_WARN_DELTA '=' timespec ';'
2514 {
2515 ConfigFileEntry.ts_warn_delta = $3;
2516 };
2517
2518 general_ts_max_delta: TS_MAX_DELTA '=' timespec ';'
2519 {
2520 if (conf_parser_ctx.pass == 2)
2521 ConfigFileEntry.ts_max_delta = $3;
2522 };
2523
2524 general_havent_read_conf: HAVENT_READ_CONF '=' NUMBER ';'
2525 {
2526 if (($3 > 0) && conf_parser_ctx.pass == 1)
2527 {
2528 ilog(LOG_TYPE_IRCD, "You haven't read your config file properly.");
2529 ilog(LOG_TYPE_IRCD, "There is a line in the example conf that will kill your server if not removed.");
2530 ilog(LOG_TYPE_IRCD, "Consider actually reading/editing the conf file, and removing this line.");
2531 exit(0);
2532 }
2533 };
2534
2535 general_invisible_on_connect: INVISIBLE_ON_CONNECT '=' TBOOL ';'
2536 {
2537 ConfigFileEntry.invisible_on_connect = yylval.number;
2538 };
2539
2540 general_warn_no_nline: WARN_NO_NLINE '=' TBOOL ';'
2541 {
2542 ConfigFileEntry.warn_no_nline = yylval.number;
2543 };
2544
2545 general_stats_e_disabled: STATS_E_DISABLED '=' TBOOL ';'
2546 {
2547 ConfigFileEntry.stats_e_disabled = yylval.number;
2548 };
2549
2550 general_stats_o_oper_only: STATS_O_OPER_ONLY '=' TBOOL ';'
2551 {
2552 ConfigFileEntry.stats_o_oper_only = yylval.number;
2553 };
2554
2555 general_stats_P_oper_only: STATS_P_OPER_ONLY '=' TBOOL ';'
2556 {
2557 ConfigFileEntry.stats_P_oper_only = yylval.number;
2558 };
2559
2560 general_stats_k_oper_only: STATS_K_OPER_ONLY '=' TBOOL ';'
2561 {
2562 ConfigFileEntry.stats_k_oper_only = 2 * yylval.number;
2563 } | STATS_K_OPER_ONLY '=' TMASKED ';'
2564 {
2565 ConfigFileEntry.stats_k_oper_only = 1;
2566 };
2567
2568 general_stats_i_oper_only: STATS_I_OPER_ONLY '=' TBOOL ';'
2569 {
2570 ConfigFileEntry.stats_i_oper_only = 2 * yylval.number;
2571 } | STATS_I_OPER_ONLY '=' TMASKED ';'
2572 {
2573 ConfigFileEntry.stats_i_oper_only = 1;
2574 };
2575
2576 general_pace_wait: PACE_WAIT '=' timespec ';'
2577 {
2578 ConfigFileEntry.pace_wait = $3;
2579 };
2580
2581 general_caller_id_wait: CALLER_ID_WAIT '=' timespec ';'
2582 {
2583 ConfigFileEntry.caller_id_wait = $3;
2584 };
2585
2586 general_opers_bypass_callerid: OPERS_BYPASS_CALLERID '=' TBOOL ';'
2587 {
2588 ConfigFileEntry.opers_bypass_callerid = yylval.number;
2589 };
2590
2591 general_pace_wait_simple: PACE_WAIT_SIMPLE '=' timespec ';'
2592 {
2593 ConfigFileEntry.pace_wait_simple = $3;
2594 };
2595
2596 general_short_motd: SHORT_MOTD '=' TBOOL ';'
2597 {
2598 ConfigFileEntry.short_motd = yylval.number;
2599 };
2600
2601 general_no_oper_flood: NO_OPER_FLOOD '=' TBOOL ';'
2602 {
2603 ConfigFileEntry.no_oper_flood = yylval.number;
2604 };
2605
2606 general_true_no_oper_flood: TRUE_NO_OPER_FLOOD '=' TBOOL ';'
2607 {
2608 ConfigFileEntry.true_no_oper_flood = yylval.number;
2609 };
2610
2611 general_oper_pass_resv: OPER_PASS_RESV '=' TBOOL ';'
2612 {
2613 ConfigFileEntry.oper_pass_resv = yylval.number;
2614 };
2615
2616 general_dots_in_ident: DOTS_IN_IDENT '=' NUMBER ';'
2617 {
2618 ConfigFileEntry.dots_in_ident = $3;
2619 };
2620
2621 general_max_targets: MAX_TARGETS '=' NUMBER ';'
2622 {
2623 ConfigFileEntry.max_targets = $3;
2624 };
2625
2626 general_use_egd: USE_EGD '=' TBOOL ';'
2627 {
2628 ConfigFileEntry.use_egd = yylval.number;
2629 };
2630
2631 general_egdpool_path: EGDPOOL_PATH '=' QSTRING ';'
2632 {
2633 if (conf_parser_ctx.pass == 2)
2634 {
2635 MyFree(ConfigFileEntry.egdpool_path);
2636 ConfigFileEntry.egdpool_path = xstrdup(yylval.string);
2637 }
2638 };
2639
2640 general_services_name: T_SERVICES_NAME '=' QSTRING ';'
2641 {
2642 if (conf_parser_ctx.pass == 2 && valid_servname(yylval.string))
2643 {
2644 MyFree(ConfigFileEntry.service_name);
2645 ConfigFileEntry.service_name = xstrdup(yylval.string);
2646 }
2647 };
2648
2649 general_ping_cookie: PING_COOKIE '=' TBOOL ';'
2650 {
2651 ConfigFileEntry.ping_cookie = yylval.number;
2652 };
2653
2654 general_disable_auth: DISABLE_AUTH '=' TBOOL ';'
2655 {
2656 ConfigFileEntry.disable_auth = yylval.number;
2657 };
2658
2659 general_throttle_time: THROTTLE_TIME '=' timespec ';'
2660 {
2661 ConfigFileEntry.throttle_time = yylval.number;
2662 };
2663
2664 general_oper_umodes: OPER_UMODES
2665 {
2666 ConfigFileEntry.oper_umodes = 0;
2667 } '=' umode_oitems ';' ;
2668
2669 umode_oitems: umode_oitems ',' umode_oitem | umode_oitem;
2670 umode_oitem: T_BOTS
2671 {
2672 ConfigFileEntry.oper_umodes |= UMODE_BOTS;
2673 } | T_CCONN
2674 {
2675 ConfigFileEntry.oper_umodes |= UMODE_CCONN;
2676 } | T_DEAF
2677 {
2678 ConfigFileEntry.oper_umodes |= UMODE_DEAF;
2679 } | T_DEBUG
2680 {
2681 ConfigFileEntry.oper_umodes |= UMODE_DEBUG;
2682 } | T_FULL
2683 {
2684 ConfigFileEntry.oper_umodes |= UMODE_FULL;
2685 } | HIDDEN
2686 {
2687 ConfigFileEntry.oper_umodes |= UMODE_HIDDEN;
2688 } | T_SKILL
2689 {
2690 ConfigFileEntry.oper_umodes |= UMODE_SKILL;
2691 } | T_NCHANGE
2692 {
2693 ConfigFileEntry.oper_umodes |= UMODE_NCHANGE;
2694 } | T_REJ
2695 {
2696 ConfigFileEntry.oper_umodes |= UMODE_REJ;
2697 } | T_UNAUTH
2698 {
2699 ConfigFileEntry.oper_umodes |= UMODE_UNAUTH;
2700 } | T_SPY
2701 {
2702 ConfigFileEntry.oper_umodes |= UMODE_SPY;
2703 } | T_EXTERNAL
2704 {
2705 ConfigFileEntry.oper_umodes |= UMODE_EXTERNAL;
2706 } | T_OPERWALL
2707 {
2708 ConfigFileEntry.oper_umodes |= UMODE_OPERWALL;
2709 } | T_SERVNOTICE
2710 {
2711 ConfigFileEntry.oper_umodes |= UMODE_SERVNOTICE;
2712 } | T_INVISIBLE
2713 {
2714 ConfigFileEntry.oper_umodes |= UMODE_INVISIBLE;
2715 } | T_WALLOP
2716 {
2717 ConfigFileEntry.oper_umodes |= UMODE_WALLOP;
2718 } | T_SOFTCALLERID
2719 {
2720 ConfigFileEntry.oper_umodes |= UMODE_SOFTCALLERID;
2721 } | T_CALLERID
2722 {
2723 ConfigFileEntry.oper_umodes |= UMODE_CALLERID;
2724 } | T_LOCOPS
2725 {
2726 ConfigFileEntry.oper_umodes |= UMODE_LOCOPS;
2727 } | T_NONONREG
2728 {
2729 ConfigFileEntry.oper_umodes |= UMODE_REGONLY;
2730 } | T_FARCONNECT
2731 {
2732 ConfigFileEntry.oper_umodes |= UMODE_FARCONNECT;
2733 };
2734
2735 general_oper_only_umodes: OPER_ONLY_UMODES
2736 {
2737 ConfigFileEntry.oper_only_umodes = 0;
2738 } '=' umode_items ';' ;
2739
2740 umode_items: umode_items ',' umode_item | umode_item;
2741 umode_item: T_BOTS
2742 {
2743 ConfigFileEntry.oper_only_umodes |= UMODE_BOTS;
2744 } | T_CCONN
2745 {
2746 ConfigFileEntry.oper_only_umodes |= UMODE_CCONN;
2747 } | T_DEAF
2748 {
2749 ConfigFileEntry.oper_only_umodes |= UMODE_DEAF;
2750 } | T_DEBUG
2751 {
2752 ConfigFileEntry.oper_only_umodes |= UMODE_DEBUG;
2753 } | T_FULL
2754 {
2755 ConfigFileEntry.oper_only_umodes |= UMODE_FULL;
2756 } | T_SKILL
2757 {
2758 ConfigFileEntry.oper_only_umodes |= UMODE_SKILL;
2759 } | HIDDEN
2760 {
2761 ConfigFileEntry.oper_only_umodes |= UMODE_HIDDEN;
2762 } | T_NCHANGE
2763 {
2764 ConfigFileEntry.oper_only_umodes |= UMODE_NCHANGE;
2765 } | T_REJ
2766 {
2767 ConfigFileEntry.oper_only_umodes |= UMODE_REJ;
2768 } | T_UNAUTH
2769 {
2770 ConfigFileEntry.oper_only_umodes |= UMODE_UNAUTH;
2771 } | T_SPY
2772 {
2773 ConfigFileEntry.oper_only_umodes |= UMODE_SPY;
2774 } | T_EXTERNAL
2775 {
2776 ConfigFileEntry.oper_only_umodes |= UMODE_EXTERNAL;
2777 } | T_OPERWALL
2778 {
2779 ConfigFileEntry.oper_only_umodes |= UMODE_OPERWALL;
2780 } | T_SERVNOTICE
2781 {
2782 ConfigFileEntry.oper_only_umodes |= UMODE_SERVNOTICE;
2783 } | T_INVISIBLE
2784 {
2785 ConfigFileEntry.oper_only_umodes |= UMODE_INVISIBLE;
2786 } | T_WALLOP
2787 {
2788 ConfigFileEntry.oper_only_umodes |= UMODE_WALLOP;
2789 } | T_SOFTCALLERID
2790 {
2791 ConfigFileEntry.oper_only_umodes |= UMODE_SOFTCALLERID;
2792 } | T_CALLERID
2793 {
2794 ConfigFileEntry.oper_only_umodes |= UMODE_CALLERID;
2795 } | T_LOCOPS
2796 {
2797 ConfigFileEntry.oper_only_umodes |= UMODE_LOCOPS;
2798 } | T_NONONREG
2799 {
2800 ConfigFileEntry.oper_only_umodes |= UMODE_REGONLY;
2801 } | T_FARCONNECT
2802 {
2803 ConfigFileEntry.oper_only_umodes |= UMODE_FARCONNECT;
2804 };
2805
2806 general_min_nonwildcard: MIN_NONWILDCARD '=' NUMBER ';'
2807 {
2808 ConfigFileEntry.min_nonwildcard = $3;
2809 };
2810
2811 general_min_nonwildcard_simple: MIN_NONWILDCARD_SIMPLE '=' NUMBER ';'
2812 {
2813 ConfigFileEntry.min_nonwildcard_simple = $3;
2814 };
2815
2816 general_default_floodcount: DEFAULT_FLOODCOUNT '=' NUMBER ';'
2817 {
2818 ConfigFileEntry.default_floodcount = $3;
2819 };
2820
2821
2822 /***************************************************************************
2823 * section channel
2824 ***************************************************************************/
2825 channel_entry: CHANNEL
2826 '{' channel_items '}' ';';
2827
2828 channel_items: channel_items channel_item | channel_item;
2829 channel_item: channel_max_bans |
2830 channel_knock_delay | channel_knock_delay_channel |
2831 channel_max_chans_per_user | channel_max_chans_per_oper |
2832 channel_default_split_user_count |
2833 channel_default_split_server_count |
2834 channel_no_create_on_split |
2835 channel_no_join_on_split |
2836 channel_jflood_count | channel_jflood_time |
2837 channel_disable_fake_channels | error;
2838
2839 channel_disable_fake_channels: DISABLE_FAKE_CHANNELS '=' TBOOL ';'
2840 {
2841 ConfigChannel.disable_fake_channels = yylval.number;
2842 };
2843
2844 channel_knock_delay: KNOCK_DELAY '=' timespec ';'
2845 {
2846 ConfigChannel.knock_delay = $3;
2847 };
2848
2849 channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
2850 {
2851 ConfigChannel.knock_delay_channel = $3;
2852 };
2853
2854 channel_max_chans_per_user: MAX_CHANS_PER_USER '=' NUMBER ';'
2855 {
2856 ConfigChannel.max_chans_per_user = $3;
2857 };
2858
2859 channel_max_chans_per_oper: MAX_CHANS_PER_OPER '=' NUMBER ';'
2860 {
2861 ConfigChannel.max_chans_per_oper = $3;
2862 };
2863
2864 channel_max_bans: MAX_BANS '=' NUMBER ';'
2865 {
2866 ConfigChannel.max_bans = $3;
2867 };
2868
2869 channel_default_split_user_count: DEFAULT_SPLIT_USER_COUNT '=' NUMBER ';'
2870 {
2871 ConfigChannel.default_split_user_count = $3;
2872 };
2873
2874 channel_default_split_server_count: DEFAULT_SPLIT_SERVER_COUNT '=' NUMBER ';'
2875 {
2876 ConfigChannel.default_split_server_count = $3;
2877 };
2878
2879 channel_no_create_on_split: NO_CREATE_ON_SPLIT '=' TBOOL ';'
2880 {
2881 ConfigChannel.no_create_on_split = yylval.number;
2882 };
2883
2884 channel_no_join_on_split: NO_JOIN_ON_SPLIT '=' TBOOL ';'
2885 {
2886 ConfigChannel.no_join_on_split = yylval.number;
2887 };
2888
2889 channel_jflood_count: JOIN_FLOOD_COUNT '=' NUMBER ';'
2890 {
2891 GlobalSetOptions.joinfloodcount = yylval.number;
2892 };
2893
2894 channel_jflood_time: JOIN_FLOOD_TIME '=' timespec ';'
2895 {
2896 GlobalSetOptions.joinfloodtime = yylval.number;
2897 };
2898
2899 /***************************************************************************
2900 * section serverhide
2901 ***************************************************************************/
2902 serverhide_entry: SERVERHIDE
2903 '{' serverhide_items '}' ';';
2904
2905 serverhide_items: serverhide_items serverhide_item | serverhide_item;
2906 serverhide_item: serverhide_flatten_links | serverhide_disable_remote_commands |
2907 serverhide_hide_servers |
2908 serverhide_hide_services |
2909 serverhide_links_delay |
2910 serverhide_hidden | serverhide_hidden_name |
2911 serverhide_hide_server_ips |
2912 error;
2913
2914 serverhide_flatten_links: FLATTEN_LINKS '=' TBOOL ';'
2915 {
2916 if (conf_parser_ctx.pass == 2)
2917 ConfigServerHide.flatten_links = yylval.number;
2918 };
2919
2920 serverhide_disable_remote_commands: DISABLE_REMOTE_COMMANDS '=' TBOOL ';'
2921 {
2922 if (conf_parser_ctx.pass == 2)
2923 ConfigServerHide.disable_remote_commands = yylval.number;
2924 };
2925
2926 serverhide_hide_servers: HIDE_SERVERS '=' TBOOL ';'
2927 {
2928 if (conf_parser_ctx.pass == 2)
2929 ConfigServerHide.hide_servers = yylval.number;
2930 };
2931
2932 serverhide_hide_services: HIDE_SERVICES '=' TBOOL ';'
2933 {
2934 if (conf_parser_ctx.pass == 2)
2935 ConfigServerHide.hide_services = yylval.number;
2936 };
2937
2938 serverhide_hidden_name: HIDDEN_NAME '=' QSTRING ';'
2939 {
2940 if (conf_parser_ctx.pass == 2)
2941 {
2942 MyFree(ConfigServerHide.hidden_name);
2943 ConfigServerHide.hidden_name = xstrdup(yylval.string);
2944 }
2945 };
2946
2947 serverhide_links_delay: LINKS_DELAY '=' timespec ';'
2948 {
2949 if (conf_parser_ctx.pass == 2)
2950 {
2951 if (($3 > 0) && ConfigServerHide.links_disabled == 1)
2952 {
2953 eventAddIsh("write_links_file", write_links_file, NULL, $3);
2954 ConfigServerHide.links_disabled = 0;
2955 }
2956
2957 ConfigServerHide.links_delay = $3;
2958 }
2959 };
2960
2961 serverhide_hidden: HIDDEN '=' TBOOL ';'
2962 {
2963 if (conf_parser_ctx.pass == 2)
2964 ConfigServerHide.hidden = yylval.number;
2965 };
2966
2967 serverhide_hide_server_ips: HIDE_SERVER_IPS '=' TBOOL ';'
2968 {
2969 if (conf_parser_ctx.pass == 2)
2970 ConfigServerHide.hide_server_ips = yylval.number;
2971 };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision