ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 6599
Committed: Thu Oct 22 17:52:15 2015 UTC (10 years, 11 months ago) by michael
File size: 77395 byte(s)
Log Message:
- Added serverhide::flatten_links_file configuration option and get rid of LIPATH

File Contents

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

Properties

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