ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 6662
Committed: Mon Oct 26 19:04:16 2015 UTC (10 years, 11 months ago) by michael
File size: 77271 byte(s)
Log Message:
- conf_parser.y: removed CHALLENGE leftover

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 6645 exit(EXIT_FAILURE);
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 michael 6645 exit(EXIT_FAILURE);
680 adx 30 }
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 michael 6662
1096 michael 1647 if (!block_state.rpass.buf[0])
1097 michael 1646 break;
1098 adx 30
1099 michael 4915 DLINK_FOREACH(node, block_state.mask.list.head)
1100 michael 1646 {
1101     struct MaskItem *conf = NULL;
1102     struct split_nuh_item nuh;
1103 adx 30
1104 michael 4915 nuh.nuhmask = node->data;
1105 michael 1646 nuh.nickptr = NULL;
1106 michael 1647 nuh.userptr = block_state.user.buf;
1107     nuh.hostptr = block_state.host.buf;
1108 michael 1646 nuh.nicksize = 0;
1109 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
1110     nuh.hostsize = sizeof(block_state.host.buf);
1111 michael 1646 split_nuh(&nuh);
1112 adx 30
1113 michael 2228 conf = conf_make(CONF_OPER);
1114     conf->name = xstrdup(block_state.name.buf);
1115     conf->user = xstrdup(block_state.user.buf);
1116     conf->host = xstrdup(block_state.host.buf);
1117 michael 1285
1118 michael 2228 if (block_state.cert.buf[0])
1119     conf->certfp = xstrdup(block_state.cert.buf);
1120    
1121 michael 1647 if (block_state.rpass.buf[0])
1122     conf->passwd = xstrdup(block_state.rpass.buf);
1123 michael 1285
1124 michael 5556 if (block_state.whois.buf[0])
1125     conf->whois = xstrdup(block_state.whois.buf);
1126    
1127 michael 1646 conf->flags = block_state.flags.value;
1128     conf->modes = block_state.modes.value;
1129     conf->port = block_state.port.value;
1130     conf->htype = parse_netmask(conf->host, &conf->addr, &conf->bits);
1131 adx 30
1132 michael 1646 conf_add_class_to_conf(conf, block_state.class.buf);
1133 adx 30 }
1134 michael 1646 };
1135 adx 30
1136     oper_items: oper_items oper_item | oper_item;
1137 michael 3439 oper_item: oper_name |
1138     oper_user |
1139     oper_password |
1140 michael 5556 oper_whois |
1141 michael 3439 oper_umodes |
1142     oper_class |
1143     oper_encrypted |
1144     oper_ssl_certificate_fingerprint |
1145     oper_ssl_connection_required |
1146     oper_flags |
1147     error ';' ;
1148 adx 30
1149     oper_name: NAME '=' QSTRING ';'
1150     {
1151 michael 967 if (conf_parser_ctx.pass == 2)
1152 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1153 adx 30 };
1154    
1155     oper_user: USER '=' QSTRING ';'
1156     {
1157 michael 967 if (conf_parser_ctx.pass == 2)
1158 michael 1646 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1159 adx 30 };
1160    
1161     oper_password: PASSWORD '=' QSTRING ';'
1162     {
1163 michael 967 if (conf_parser_ctx.pass == 2)
1164 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1165 adx 30 };
1166    
1167 michael 5556 oper_whois: WHOIS '=' QSTRING ';'
1168     {
1169     if (conf_parser_ctx.pass == 2)
1170     strlcpy(block_state.whois.buf, yylval.string, sizeof(block_state.whois.buf));
1171     };
1172    
1173 adx 30 oper_encrypted: ENCRYPTED '=' TBOOL ';'
1174     {
1175 michael 2129 if (conf_parser_ctx.pass != 2)
1176     break;
1177    
1178     if (yylval.number)
1179     block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1180     else
1181     block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1182 adx 30 };
1183    
1184 michael 2244 oper_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
1185 michael 2228 {
1186     if (conf_parser_ctx.pass == 2)
1187 michael 2229 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
1188 michael 2228 };
1189    
1190 michael 2248 oper_ssl_connection_required: SSL_CONNECTION_REQUIRED '=' TBOOL ';'
1191     {
1192     if (conf_parser_ctx.pass != 2)
1193     break;
1194    
1195     if (yylval.number)
1196     block_state.flags.value |= CONF_FLAGS_SSL;
1197     else
1198     block_state.flags.value &= ~CONF_FLAGS_SSL;
1199     };
1200    
1201 adx 30 oper_class: CLASS '=' QSTRING ';'
1202     {
1203 michael 967 if (conf_parser_ctx.pass == 2)
1204 michael 1646 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1205 adx 30 };
1206    
1207 michael 56 oper_umodes: T_UMODES
1208     {
1209 michael 967 if (conf_parser_ctx.pass == 2)
1210 michael 1646 block_state.modes.value = 0;
1211 michael 56 } '=' oper_umodes_items ';' ;
1212    
1213     oper_umodes_items: oper_umodes_items ',' oper_umodes_item | oper_umodes_item;
1214     oper_umodes_item: T_BOTS
1215     {
1216 michael 967 if (conf_parser_ctx.pass == 2)
1217 michael 1646 block_state.modes.value |= UMODE_BOTS;
1218 michael 56 } | T_CCONN
1219     {
1220 michael 967 if (conf_parser_ctx.pass == 2)
1221 michael 1646 block_state.modes.value |= UMODE_CCONN;
1222 michael 56 } | T_DEAF
1223     {
1224 michael 967 if (conf_parser_ctx.pass == 2)
1225 michael 1646 block_state.modes.value |= UMODE_DEAF;
1226 michael 56 } | T_DEBUG
1227     {
1228 michael 967 if (conf_parser_ctx.pass == 2)
1229 michael 1646 block_state.modes.value |= UMODE_DEBUG;
1230 michael 56 } | T_FULL
1231     {
1232 michael 967 if (conf_parser_ctx.pass == 2)
1233 michael 1646 block_state.modes.value |= UMODE_FULL;
1234 michael 1294 } | HIDDEN
1235     {
1236     if (conf_parser_ctx.pass == 2)
1237 michael 1646 block_state.modes.value |= UMODE_HIDDEN;
1238 michael 3513 } | HIDE_CHANS
1239     {
1240     if (conf_parser_ctx.pass == 2)
1241     block_state.modes.value |= UMODE_HIDECHANS;
1242 michael 3506 } | HIDE_IDLE
1243     {
1244     if (conf_parser_ctx.pass == 2)
1245     block_state.modes.value |= UMODE_HIDEIDLE;
1246 michael 56 } | T_SKILL
1247     {
1248 michael 967 if (conf_parser_ctx.pass == 2)
1249 michael 1646 block_state.modes.value |= UMODE_SKILL;
1250 michael 56 } | T_NCHANGE
1251     {
1252 michael 967 if (conf_parser_ctx.pass == 2)
1253 michael 1646 block_state.modes.value |= UMODE_NCHANGE;
1254 michael 56 } | T_REJ
1255     {
1256 michael 967 if (conf_parser_ctx.pass == 2)
1257 michael 1646 block_state.modes.value |= UMODE_REJ;
1258 michael 56 } | T_UNAUTH
1259     {
1260 michael 967 if (conf_parser_ctx.pass == 2)
1261 michael 1646 block_state.modes.value |= UMODE_UNAUTH;
1262 michael 56 } | T_SPY
1263     {
1264 michael 967 if (conf_parser_ctx.pass == 2)
1265 michael 1646 block_state.modes.value |= UMODE_SPY;
1266 michael 56 } | T_EXTERNAL
1267     {
1268 michael 967 if (conf_parser_ctx.pass == 2)
1269 michael 1646 block_state.modes.value |= UMODE_EXTERNAL;
1270 michael 56 } | T_SERVNOTICE
1271     {
1272 michael 967 if (conf_parser_ctx.pass == 2)
1273 michael 1646 block_state.modes.value |= UMODE_SERVNOTICE;
1274 michael 56 } | T_INVISIBLE
1275     {
1276 michael 967 if (conf_parser_ctx.pass == 2)
1277 michael 1646 block_state.modes.value |= UMODE_INVISIBLE;
1278 michael 56 } | T_WALLOP
1279     {
1280 michael 967 if (conf_parser_ctx.pass == 2)
1281 michael 1646 block_state.modes.value |= UMODE_WALLOP;
1282 michael 56 } | T_SOFTCALLERID
1283     {
1284 michael 967 if (conf_parser_ctx.pass == 2)
1285 michael 1646 block_state.modes.value |= UMODE_SOFTCALLERID;
1286 michael 56 } | T_CALLERID
1287     {
1288 michael 967 if (conf_parser_ctx.pass == 2)
1289 michael 1646 block_state.modes.value |= UMODE_CALLERID;
1290 michael 56 } | T_LOCOPS
1291     {
1292 michael 967 if (conf_parser_ctx.pass == 2)
1293 michael 1646 block_state.modes.value |= UMODE_LOCOPS;
1294 michael 1855 } | T_NONONREG
1295     {
1296     if (conf_parser_ctx.pass == 2)
1297     block_state.modes.value |= UMODE_REGONLY;
1298 michael 1976 } | T_FARCONNECT
1299     {
1300     if (conf_parser_ctx.pass == 2)
1301     block_state.modes.value |= UMODE_FARCONNECT;
1302 michael 56 };
1303    
1304 adx 30 oper_flags: IRCD_FLAGS
1305     {
1306 michael 1228 if (conf_parser_ctx.pass == 2)
1307 michael 1646 block_state.port.value = 0;
1308 adx 30 } '=' oper_flags_items ';';
1309    
1310     oper_flags_items: oper_flags_items ',' oper_flags_item | oper_flags_item;
1311 michael 2012 oper_flags_item: KILL ':' REMOTE
1312 adx 30 {
1313 michael 967 if (conf_parser_ctx.pass == 2)
1314 michael 2012 block_state.port.value |= OPER_FLAG_KILL_REMOTE;
1315     } | KILL
1316 adx 30 {
1317 michael 967 if (conf_parser_ctx.pass == 2)
1318 michael 2012 block_state.port.value |= OPER_FLAG_KILL;
1319     } | CONNECT ':' REMOTE
1320     {
1321     if (conf_parser_ctx.pass == 2)
1322     block_state.port.value |= OPER_FLAG_CONNECT_REMOTE;
1323     } | CONNECT
1324     {
1325     if (conf_parser_ctx.pass == 2)
1326     block_state.port.value |= OPER_FLAG_CONNECT;
1327     } | SQUIT ':' REMOTE
1328     {
1329     if (conf_parser_ctx.pass == 2)
1330     block_state.port.value |= OPER_FLAG_SQUIT_REMOTE;
1331     } | SQUIT
1332     {
1333     if (conf_parser_ctx.pass == 2)
1334     block_state.port.value |= OPER_FLAG_SQUIT;
1335 adx 30 } | KLINE
1336     {
1337 michael 967 if (conf_parser_ctx.pass == 2)
1338 michael 4019 block_state.port.value |= OPER_FLAG_KLINE;
1339 adx 30 } | UNKLINE
1340     {
1341 michael 967 if (conf_parser_ctx.pass == 2)
1342 michael 1646 block_state.port.value |= OPER_FLAG_UNKLINE;
1343 michael 1301 } | T_DLINE
1344     {
1345     if (conf_parser_ctx.pass == 2)
1346 michael 1646 block_state.port.value |= OPER_FLAG_DLINE;
1347 michael 1301 } | T_UNDLINE
1348     {
1349     if (conf_parser_ctx.pass == 2)
1350 michael 1646 block_state.port.value |= OPER_FLAG_UNDLINE;
1351 adx 30 } | XLINE
1352     {
1353 michael 967 if (conf_parser_ctx.pass == 2)
1354 michael 2852 block_state.port.value |= OPER_FLAG_XLINE;
1355     } | T_UNXLINE
1356     {
1357     if (conf_parser_ctx.pass == 2)
1358     block_state.port.value |= OPER_FLAG_UNXLINE;
1359 adx 30 } | DIE
1360     {
1361 michael 967 if (conf_parser_ctx.pass == 2)
1362 michael 1646 block_state.port.value |= OPER_FLAG_DIE;
1363 michael 1228 } | T_RESTART
1364     {
1365     if (conf_parser_ctx.pass == 2)
1366 michael 1646 block_state.port.value |= OPER_FLAG_RESTART;
1367 adx 30 } | REHASH
1368     {
1369 michael 967 if (conf_parser_ctx.pass == 2)
1370 michael 1646 block_state.port.value |= OPER_FLAG_REHASH;
1371 adx 30 } | ADMIN
1372     {
1373 michael 967 if (conf_parser_ctx.pass == 2)
1374 michael 1646 block_state.port.value |= OPER_FLAG_ADMIN;
1375 michael 1216 } | T_GLOBOPS
1376     {
1377     if (conf_parser_ctx.pass == 2)
1378 michael 1646 block_state.port.value |= OPER_FLAG_GLOBOPS;
1379 michael 2038 } | T_WALLOPS
1380     {
1381     if (conf_parser_ctx.pass == 2)
1382     block_state.port.value |= OPER_FLAG_WALLOPS;
1383     } | T_LOCOPS
1384     {
1385     if (conf_parser_ctx.pass == 2)
1386     block_state.port.value |= OPER_FLAG_LOCOPS;
1387 adx 30 } | REMOTEBAN
1388     {
1389 michael 967 if (conf_parser_ctx.pass == 2)
1390 michael 1646 block_state.port.value |= OPER_FLAG_REMOTEBAN;
1391 michael 1460 } | T_SET
1392     {
1393     if (conf_parser_ctx.pass == 2)
1394 michael 1646 block_state.port.value |= OPER_FLAG_SET;
1395 michael 1228 } | MODULE
1396 adx 30 {
1397 michael 967 if (conf_parser_ctx.pass == 2)
1398 michael 1646 block_state.port.value |= OPER_FLAG_MODULE;
1399 michael 5004 } | T_OPME
1400     {
1401     if (conf_parser_ctx.pass == 2)
1402     block_state.port.value |= OPER_FLAG_OPME;
1403 michael 6447 } | NICK ':' RESV
1404     {
1405     if (conf_parser_ctx.pass == 2)
1406     block_state.port.value |= OPER_FLAG_NICK_RESV;
1407     } | JOIN ':' RESV
1408     {
1409     if (conf_parser_ctx.pass == 2)
1410     block_state.port.value |= OPER_FLAG_JOIN_RESV;
1411 michael 6454 } | RESV
1412     {
1413     if (conf_parser_ctx.pass == 2)
1414     block_state.port.value |= OPER_FLAG_RESV;
1415     } | T_UNRESV
1416     {
1417     if (conf_parser_ctx.pass == 2)
1418     block_state.port.value |= OPER_FLAG_UNRESV;
1419 michael 6488 } | CLOSE
1420     {
1421     if (conf_parser_ctx.pass == 2)
1422     block_state.port.value |= OPER_FLAG_CLOSE;
1423 adx 30 };
1424    
1425    
1426     /***************************************************************************
1427     * section class
1428     ***************************************************************************/
1429     class_entry: CLASS
1430     {
1431 michael 1651 if (conf_parser_ctx.pass != 1)
1432     break;
1433    
1434     reset_block_state();
1435    
1436     block_state.ping_freq.value = DEFAULT_PINGFREQUENCY;
1437     block_state.con_freq.value = DEFAULT_CONNECTFREQUENCY;
1438     block_state.max_total.value = MAXIMUM_LINKS_DEFAULT;
1439     block_state.max_sendq.value = DEFAULT_SENDQ;
1440     block_state.max_recvq.value = DEFAULT_RECVQ;
1441 michael 1285 } '{' class_items '}' ';'
1442 adx 30 {
1443 michael 1647 struct ClassItem *class = NULL;
1444 adx 30
1445 michael 1647 if (conf_parser_ctx.pass != 1)
1446     break;
1447 adx 30
1448 michael 1647 if (!block_state.class.buf[0])
1449     break;
1450 michael 671
1451 michael 1647 if (!(class = class_find(block_state.class.buf, 0)))
1452     class = class_make();
1453 michael 671
1454 michael 1647 class->active = 1;
1455     MyFree(class->name);
1456     class->name = xstrdup(block_state.class.buf);
1457     class->ping_freq = block_state.ping_freq.value;
1458     class->max_perip = block_state.max_perip.value;
1459     class->con_freq = block_state.con_freq.value;
1460     class->max_total = block_state.max_total.value;
1461     class->max_global = block_state.max_global.value;
1462     class->max_local = block_state.max_local.value;
1463     class->max_ident = block_state.max_ident.value;
1464     class->max_sendq = block_state.max_sendq.value;
1465     class->max_recvq = block_state.max_recvq.value;
1466 michael 3933 class->max_channels = block_state.max_channels.value;
1467 michael 671
1468 michael 1785 if (block_state.min_idle.value > block_state.max_idle.value)
1469     {
1470     block_state.min_idle.value = 0;
1471     block_state.max_idle.value = 0;
1472     block_state.flags.value &= ~CLASS_FLAGS_FAKE_IDLE;
1473     }
1474    
1475     class->flags = block_state.flags.value;
1476     class->min_idle = block_state.min_idle.value;
1477     class->max_idle = block_state.max_idle.value;
1478    
1479 michael 6008 rebuild_cidr_list(class);
1480 adx 30
1481 michael 1647 class->cidr_bitlen_ipv4 = block_state.cidr_bitlen_ipv4.value;
1482     class->cidr_bitlen_ipv6 = block_state.cidr_bitlen_ipv6.value;
1483     class->number_per_cidr = block_state.number_per_cidr.value;
1484 adx 30 };
1485    
1486     class_items: class_items class_item | class_item;
1487     class_item: class_name |
1488 michael 3439 class_cidr_bitlen_ipv4 |
1489     class_cidr_bitlen_ipv6 |
1490 adx 30 class_ping_time |
1491 michael 3439 class_number_per_cidr |
1492 adx 30 class_number_per_ip |
1493     class_connectfreq |
1494 michael 3933 class_max_channels |
1495 adx 30 class_max_number |
1496 michael 3439 class_max_global |
1497     class_max_local |
1498     class_max_ident |
1499 michael 1516 class_sendq | class_recvq |
1500 michael 1783 class_min_idle |
1501     class_max_idle |
1502     class_flags |
1503 michael 3439 error ';' ;
1504 adx 30
1505 michael 2916 class_name: NAME '=' QSTRING ';'
1506 adx 30 {
1507 michael 967 if (conf_parser_ctx.pass == 1)
1508 michael 1647 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1509 adx 30 };
1510    
1511     class_ping_time: PING_TIME '=' timespec ';'
1512     {
1513 michael 967 if (conf_parser_ctx.pass == 1)
1514 michael 1647 block_state.ping_freq.value = $3;
1515 adx 30 };
1516    
1517     class_number_per_ip: NUMBER_PER_IP '=' NUMBER ';'
1518     {
1519 michael 967 if (conf_parser_ctx.pass == 1)
1520 michael 1647 block_state.max_perip.value = $3;
1521 adx 30 };
1522    
1523     class_connectfreq: CONNECTFREQ '=' timespec ';'
1524     {
1525 michael 967 if (conf_parser_ctx.pass == 1)
1526 michael 1647 block_state.con_freq.value = $3;
1527 adx 30 };
1528    
1529 michael 3933 class_max_channels: MAX_CHANNELS '=' NUMBER ';'
1530     {
1531     if (conf_parser_ctx.pass == 1)
1532     block_state.max_channels.value = $3;
1533     };
1534    
1535 adx 30 class_max_number: MAX_NUMBER '=' NUMBER ';'
1536     {
1537 michael 967 if (conf_parser_ctx.pass == 1)
1538 michael 1647 block_state.max_total.value = $3;
1539 adx 30 };
1540    
1541     class_max_global: MAX_GLOBAL '=' NUMBER ';'
1542     {
1543 michael 967 if (conf_parser_ctx.pass == 1)
1544 michael 1647 block_state.max_global.value = $3;
1545 adx 30 };
1546    
1547     class_max_local: MAX_LOCAL '=' NUMBER ';'
1548     {
1549 michael 967 if (conf_parser_ctx.pass == 1)
1550 michael 1647 block_state.max_local.value = $3;
1551 adx 30 };
1552    
1553     class_max_ident: MAX_IDENT '=' NUMBER ';'
1554     {
1555 michael 967 if (conf_parser_ctx.pass == 1)
1556 michael 1647 block_state.max_ident.value = $3;
1557 adx 30 };
1558    
1559     class_sendq: SENDQ '=' sizespec ';'
1560     {
1561 michael 967 if (conf_parser_ctx.pass == 1)
1562 michael 1647 block_state.max_sendq.value = $3;
1563 adx 30 };
1564    
1565 michael 1516 class_recvq: T_RECVQ '=' sizespec ';'
1566     {
1567     if (conf_parser_ctx.pass == 1)
1568     if ($3 >= CLIENT_FLOOD_MIN && $3 <= CLIENT_FLOOD_MAX)
1569 michael 1647 block_state.max_recvq.value = $3;
1570 michael 1516 };
1571    
1572 adx 30 class_cidr_bitlen_ipv4: CIDR_BITLEN_IPV4 '=' NUMBER ';'
1573     {
1574 michael 967 if (conf_parser_ctx.pass == 1)
1575 michael 1647 block_state.cidr_bitlen_ipv4.value = $3 > 32 ? 32 : $3;
1576 adx 30 };
1577    
1578     class_cidr_bitlen_ipv6: CIDR_BITLEN_IPV6 '=' NUMBER ';'
1579     {
1580 michael 967 if (conf_parser_ctx.pass == 1)
1581 michael 1647 block_state.cidr_bitlen_ipv6.value = $3 > 128 ? 128 : $3;
1582 adx 30 };
1583    
1584     class_number_per_cidr: NUMBER_PER_CIDR '=' NUMBER ';'
1585     {
1586 michael 967 if (conf_parser_ctx.pass == 1)
1587 michael 1647 block_state.number_per_cidr.value = $3;
1588 adx 30 };
1589    
1590 michael 1783 class_min_idle: MIN_IDLE '=' timespec ';'
1591     {
1592 michael 1785 if (conf_parser_ctx.pass != 1)
1593     break;
1594    
1595     block_state.min_idle.value = $3;
1596     block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1597 michael 1783 };
1598    
1599     class_max_idle: MAX_IDLE '=' timespec ';'
1600     {
1601 michael 1785 if (conf_parser_ctx.pass != 1)
1602     break;
1603    
1604     block_state.max_idle.value = $3;
1605     block_state.flags.value |= CLASS_FLAGS_FAKE_IDLE;
1606 michael 1783 };
1607    
1608     class_flags: IRCD_FLAGS
1609     {
1610     if (conf_parser_ctx.pass == 1)
1611 michael 1785 block_state.flags.value &= CLASS_FLAGS_FAKE_IDLE;
1612 michael 1783 } '=' class_flags_items ';';
1613    
1614     class_flags_items: class_flags_items ',' class_flags_item | class_flags_item;
1615     class_flags_item: RANDOM_IDLE
1616     {
1617     if (conf_parser_ctx.pass == 1)
1618     block_state.flags.value |= CLASS_FLAGS_RANDOM_IDLE;
1619     } | HIDE_IDLE_FROM_OPERS
1620     {
1621     if (conf_parser_ctx.pass == 1)
1622     block_state.flags.value |= CLASS_FLAGS_HIDE_IDLE_FROM_OPERS;
1623     };
1624    
1625    
1626 adx 30 /***************************************************************************
1627     * section listen
1628     ***************************************************************************/
1629     listen_entry: LISTEN
1630     {
1631 michael 967 if (conf_parser_ctx.pass == 2)
1632 michael 1646 reset_block_state();
1633     } '{' listen_items '}' ';';
1634 adx 30
1635     listen_flags: IRCD_FLAGS
1636     {
1637 michael 1646 block_state.flags.value = 0;
1638 adx 30 } '=' listen_flags_items ';';
1639    
1640     listen_flags_items: listen_flags_items ',' listen_flags_item | listen_flags_item;
1641     listen_flags_item: T_SSL
1642     {
1643 michael 967 if (conf_parser_ctx.pass == 2)
1644 michael 1646 block_state.flags.value |= LISTENER_SSL;
1645 adx 30 } | HIDDEN
1646     {
1647 michael 967 if (conf_parser_ctx.pass == 2)
1648 michael 1647 block_state.flags.value |= LISTENER_HIDDEN;
1649 michael 900 } | T_SERVER
1650     {
1651 michael 967 if (conf_parser_ctx.pass == 2)
1652 michael 1647 block_state.flags.value |= LISTENER_SERVER;
1653 adx 30 };
1654    
1655     listen_items: listen_items listen_item | listen_item;
1656 michael 440 listen_item: listen_port | listen_flags | listen_address | listen_host | error ';';
1657 adx 30
1658 michael 1648 listen_port: PORT '=' port_items { block_state.flags.value = 0; } ';';
1659 adx 30
1660     port_items: port_items ',' port_item | port_item;
1661    
1662     port_item: NUMBER
1663     {
1664 michael 967 if (conf_parser_ctx.pass == 2)
1665 adx 30 {
1666 michael 4499 #ifndef HAVE_LIBCRYPTO
1667 michael 1646 if (block_state.flags.value & LISTENER_SSL)
1668 michael 4499 {
1669     conf_error_report("SSL not available - port closed");
1670     break;
1671     }
1672 adx 30 #endif
1673 michael 6367 listener_add($1, block_state.addr.buf, block_state.flags.value);
1674 adx 30 }
1675     } | NUMBER TWODOTS NUMBER
1676     {
1677 michael 967 if (conf_parser_ctx.pass == 2)
1678 adx 30 {
1679 michael 4499 #ifndef HAVE_LIBCRYPTO
1680 michael 1646 if (block_state.flags.value & LISTENER_SSL)
1681 michael 4499 {
1682     conf_error_report("SSL not available - port closed");
1683     break;
1684     }
1685 adx 30 #endif
1686    
1687 michael 3439 for (int i = $1; i <= $3; ++i)
1688 michael 6367 listener_add(i, block_state.addr.buf, block_state.flags.value);
1689 adx 30 }
1690     };
1691    
1692     listen_address: IP '=' QSTRING ';'
1693     {
1694 michael 967 if (conf_parser_ctx.pass == 2)
1695 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1696 adx 30 };
1697    
1698     listen_host: HOST '=' QSTRING ';'
1699     {
1700 michael 967 if (conf_parser_ctx.pass == 2)
1701 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
1702 adx 30 };
1703    
1704     /***************************************************************************
1705     * section auth
1706     ***************************************************************************/
1707     auth_entry: IRCD_AUTH
1708     {
1709 michael 967 if (conf_parser_ctx.pass == 2)
1710 michael 1646 reset_block_state();
1711 adx 30 } '{' auth_items '}' ';'
1712     {
1713 michael 4915 dlink_node *node = NULL;
1714 adx 30
1715 michael 1646 if (conf_parser_ctx.pass != 2)
1716     break;
1717 adx 30
1718 michael 4915 DLINK_FOREACH(node, block_state.mask.list.head)
1719 michael 1646 {
1720     struct MaskItem *conf = NULL;
1721     struct split_nuh_item nuh;
1722 adx 30
1723 michael 4915 nuh.nuhmask = node->data;
1724 michael 1646 nuh.nickptr = NULL;
1725 michael 1647 nuh.userptr = block_state.user.buf;
1726     nuh.hostptr = block_state.host.buf;
1727 michael 1646 nuh.nicksize = 0;
1728 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
1729     nuh.hostsize = sizeof(block_state.host.buf);
1730 michael 1646 split_nuh(&nuh);
1731 adx 30
1732 michael 1646 conf = conf_make(CONF_CLIENT);
1733 michael 2106 conf->user = xstrdup(block_state.user.buf);
1734     conf->host = xstrdup(block_state.host.buf);
1735 adx 30
1736 michael 1647 if (block_state.rpass.buf[0])
1737     conf->passwd = xstrdup(block_state.rpass.buf);
1738 michael 1646 if (block_state.name.buf[0])
1739 michael 1911 conf->name = xstrdup(block_state.name.buf);
1740 adx 30
1741 michael 1646 conf->flags = block_state.flags.value;
1742     conf->port = block_state.port.value;
1743 adx 30
1744 michael 1646 conf_add_class_to_conf(conf, block_state.class.buf);
1745     add_conf_by_address(CONF_CLIENT, conf);
1746 adx 30 }
1747 michael 2916 };
1748 adx 30
1749     auth_items: auth_items auth_item | auth_item;
1750 michael 3439 auth_item: auth_user |
1751     auth_passwd |
1752     auth_class |
1753     auth_flags |
1754     auth_spoof |
1755 michael 3441 auth_redir_serv |
1756 michael 3439 auth_redir_port |
1757     auth_encrypted |
1758     error ';' ;
1759 adx 30
1760     auth_user: USER '=' QSTRING ';'
1761     {
1762 michael 967 if (conf_parser_ctx.pass == 2)
1763 michael 1646 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1764 adx 30 };
1765    
1766     auth_passwd: PASSWORD '=' QSTRING ';'
1767     {
1768 michael 967 if (conf_parser_ctx.pass == 2)
1769 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1770 adx 30 };
1771    
1772     auth_class: CLASS '=' QSTRING ';'
1773     {
1774 michael 967 if (conf_parser_ctx.pass == 2)
1775 michael 1646 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
1776 adx 30 };
1777    
1778     auth_encrypted: ENCRYPTED '=' TBOOL ';'
1779     {
1780 michael 967 if (conf_parser_ctx.pass == 2)
1781 adx 30 {
1782     if (yylval.number)
1783 michael 1646 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1784 adx 30 else
1785 michael 1646 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1786 adx 30 }
1787     };
1788    
1789     auth_flags: IRCD_FLAGS
1790     {
1791 michael 1646 if (conf_parser_ctx.pass == 2)
1792 michael 2093 block_state.flags.value &= (CONF_FLAGS_ENCRYPTED | CONF_FLAGS_SPOOF_IP);
1793 adx 30 } '=' auth_flags_items ';';
1794    
1795     auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item;
1796 michael 1228 auth_flags_item: SPOOF_NOTICE
1797 adx 30 {
1798 michael 967 if (conf_parser_ctx.pass == 2)
1799 michael 1646 block_state.flags.value |= CONF_FLAGS_SPOOF_NOTICE;
1800 adx 30 } | EXCEED_LIMIT
1801     {
1802 michael 967 if (conf_parser_ctx.pass == 2)
1803 michael 1646 block_state.flags.value |= CONF_FLAGS_NOLIMIT;
1804 adx 30 } | KLINE_EXEMPT
1805     {
1806 michael 967 if (conf_parser_ctx.pass == 2)
1807 michael 1646 block_state.flags.value |= CONF_FLAGS_EXEMPTKLINE;
1808 michael 5985 } | XLINE_EXEMPT
1809     {
1810     if (conf_parser_ctx.pass == 2)
1811     block_state.flags.value |= CONF_FLAGS_EXEMPTXLINE;
1812 adx 30 } | NEED_IDENT
1813     {
1814 michael 967 if (conf_parser_ctx.pass == 2)
1815 michael 1646 block_state.flags.value |= CONF_FLAGS_NEED_IDENTD;
1816 adx 30 } | CAN_FLOOD
1817     {
1818 michael 967 if (conf_parser_ctx.pass == 2)
1819 michael 1646 block_state.flags.value |= CONF_FLAGS_CAN_FLOOD;
1820 adx 30 } | NO_TILDE
1821     {
1822 michael 967 if (conf_parser_ctx.pass == 2)
1823 michael 1646 block_state.flags.value |= CONF_FLAGS_NO_TILDE;
1824 adx 30 } | RESV_EXEMPT
1825     {
1826 michael 967 if (conf_parser_ctx.pass == 2)
1827 michael 1646 block_state.flags.value |= CONF_FLAGS_EXEMPTRESV;
1828 michael 1715 } | T_WEBIRC
1829     {
1830     if (conf_parser_ctx.pass == 2)
1831     block_state.flags.value |= CONF_FLAGS_WEBIRC;
1832 adx 30 } | NEED_PASSWORD
1833     {
1834 michael 967 if (conf_parser_ctx.pass == 2)
1835 michael 1646 block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD;
1836 adx 30 };
1837    
1838 michael 2916 auth_spoof: SPOOF '=' QSTRING ';'
1839 adx 30 {
1840 michael 1646 if (conf_parser_ctx.pass != 2)
1841     break;
1842    
1843 michael 3441 if (valid_hostname(yylval.string))
1844 adx 30 {
1845 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1846     block_state.flags.value |= CONF_FLAGS_SPOOF_IP;
1847 adx 30 }
1848 michael 1646 else
1849     ilog(LOG_TYPE_IRCD, "Spoof either is too long or contains invalid characters. Ignoring it.");
1850 adx 30 };
1851    
1852     auth_redir_serv: REDIRSERV '=' QSTRING ';'
1853     {
1854 michael 1646 if (conf_parser_ctx.pass != 2)
1855     break;
1856    
1857     strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1858     block_state.flags.value |= CONF_FLAGS_REDIR;
1859 adx 30 };
1860    
1861     auth_redir_port: REDIRPORT '=' NUMBER ';'
1862     {
1863 michael 1646 if (conf_parser_ctx.pass != 2)
1864     break;
1865 michael 1647
1866 michael 1646 block_state.flags.value |= CONF_FLAGS_REDIR;
1867     block_state.port.value = $3;
1868 adx 30 };
1869    
1870    
1871     /***************************************************************************
1872     * section resv
1873     ***************************************************************************/
1874     resv_entry: RESV
1875     {
1876 michael 1647 if (conf_parser_ctx.pass != 2)
1877     break;
1878 adx 30
1879 michael 1647 reset_block_state();
1880     strlcpy(block_state.rpass.buf, CONF_NOREASON, sizeof(block_state.rpass.buf));
1881 michael 1823 } '{' resv_items '}' ';'
1882     {
1883 michael 1858 if (conf_parser_ctx.pass != 2)
1884     break;
1885    
1886     create_resv(block_state.name.buf, block_state.rpass.buf, &block_state.mask.list);
1887 michael 1823 };
1888 michael 1647
1889 michael 3439 resv_items: resv_items resv_item | resv_item;
1890     resv_item: resv_mask | resv_reason | resv_exempt | error ';' ;
1891 adx 30
1892 michael 1858 resv_mask: MASK '=' QSTRING ';'
1893 adx 30 {
1894 michael 967 if (conf_parser_ctx.pass == 2)
1895 michael 1858 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1896 adx 30 };
1897    
1898 michael 1858 resv_reason: REASON '=' QSTRING ';'
1899 adx 30 {
1900 michael 1823 if (conf_parser_ctx.pass == 2)
1901 michael 1858 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
1902 adx 30 };
1903    
1904 michael 1858 resv_exempt: EXEMPT '=' QSTRING ';'
1905 adx 30 {
1906 michael 967 if (conf_parser_ctx.pass == 2)
1907 michael 1858 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
1908 adx 30 };
1909    
1910 michael 1858
1911 adx 30 /***************************************************************************
1912 michael 1157 * section service
1913     ***************************************************************************/
1914     service_entry: T_SERVICE '{' service_items '}' ';';
1915    
1916     service_items: service_items service_item | service_item;
1917     service_item: service_name | error;
1918    
1919     service_name: NAME '=' QSTRING ';'
1920     {
1921 michael 2129 if (conf_parser_ctx.pass != 2)
1922     break;
1923    
1924     if (valid_servname(yylval.string))
1925 michael 1157 {
1926 michael 2129 struct MaskItem *conf = conf_make(CONF_SERVICE);
1927     conf->name = xstrdup(yylval.string);
1928 michael 1157 }
1929     };
1930    
1931     /***************************************************************************
1932 adx 30 * section shared, for sharing remote klines etc.
1933     ***************************************************************************/
1934     shared_entry: T_SHARED
1935     {
1936 michael 1647 if (conf_parser_ctx.pass != 2)
1937     break;
1938    
1939     reset_block_state();
1940    
1941     strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
1942     strlcpy(block_state.user.buf, "*", sizeof(block_state.user.buf));
1943     strlcpy(block_state.host.buf, "*", sizeof(block_state.host.buf));
1944     block_state.flags.value = SHARED_ALL;
1945 adx 30 } '{' shared_items '}' ';'
1946     {
1947 michael 1647 struct MaskItem *conf = NULL;
1948    
1949     if (conf_parser_ctx.pass != 2)
1950     break;
1951    
1952 michael 6628 conf = conf_make(CONF_SHARED);
1953 michael 1647 conf->flags = block_state.flags.value;
1954     conf->name = xstrdup(block_state.name.buf);
1955     conf->user = xstrdup(block_state.user.buf);
1956 michael 1911 conf->host = xstrdup(block_state.host.buf);
1957 adx 30 };
1958    
1959     shared_items: shared_items shared_item | shared_item;
1960     shared_item: shared_name | shared_user | shared_type | error ';' ;
1961    
1962     shared_name: NAME '=' QSTRING ';'
1963     {
1964 michael 967 if (conf_parser_ctx.pass == 2)
1965 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
1966 adx 30 };
1967    
1968     shared_user: USER '=' QSTRING ';'
1969     {
1970 michael 967 if (conf_parser_ctx.pass == 2)
1971 adx 30 {
1972 michael 593 struct split_nuh_item nuh;
1973    
1974     nuh.nuhmask = yylval.string;
1975     nuh.nickptr = NULL;
1976 michael 1647 nuh.userptr = block_state.user.buf;
1977     nuh.hostptr = block_state.host.buf;
1978 michael 593
1979     nuh.nicksize = 0;
1980 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
1981     nuh.hostsize = sizeof(block_state.host.buf);
1982 michael 593
1983     split_nuh(&nuh);
1984 adx 30 }
1985     };
1986    
1987     shared_type: TYPE
1988     {
1989 michael 967 if (conf_parser_ctx.pass == 2)
1990 michael 1647 block_state.flags.value = 0;
1991 adx 30 } '=' shared_types ';' ;
1992    
1993     shared_types: shared_types ',' shared_type_item | shared_type_item;
1994     shared_type_item: KLINE
1995     {
1996 michael 967 if (conf_parser_ctx.pass == 2)
1997 michael 1647 block_state.flags.value |= SHARED_KLINE;
1998 michael 1301 } | UNKLINE
1999 adx 30 {
2000 michael 967 if (conf_parser_ctx.pass == 2)
2001 michael 1647 block_state.flags.value |= SHARED_UNKLINE;
2002 michael 1301 } | T_DLINE
2003 adx 30 {
2004 michael 967 if (conf_parser_ctx.pass == 2)
2005 michael 1647 block_state.flags.value |= SHARED_DLINE;
2006 michael 1301 } | T_UNDLINE
2007     {
2008     if (conf_parser_ctx.pass == 2)
2009 michael 1647 block_state.flags.value |= SHARED_UNDLINE;
2010 adx 30 } | XLINE
2011     {
2012 michael 967 if (conf_parser_ctx.pass == 2)
2013 michael 1647 block_state.flags.value |= SHARED_XLINE;
2014 adx 30 } | T_UNXLINE
2015     {
2016 michael 967 if (conf_parser_ctx.pass == 2)
2017 michael 1647 block_state.flags.value |= SHARED_UNXLINE;
2018 adx 30 } | RESV
2019     {
2020 michael 967 if (conf_parser_ctx.pass == 2)
2021 michael 1647 block_state.flags.value |= SHARED_RESV;
2022 adx 30 } | T_UNRESV
2023     {
2024 michael 967 if (conf_parser_ctx.pass == 2)
2025 michael 1647 block_state.flags.value |= SHARED_UNRESV;
2026 adx 30 } | T_LOCOPS
2027     {
2028 michael 967 if (conf_parser_ctx.pass == 2)
2029 michael 1647 block_state.flags.value |= SHARED_LOCOPS;
2030 adx 30 } | T_ALL
2031     {
2032 michael 967 if (conf_parser_ctx.pass == 2)
2033 michael 1647 block_state.flags.value = SHARED_ALL;
2034 adx 30 };
2035    
2036     /***************************************************************************
2037     * section cluster
2038     ***************************************************************************/
2039     cluster_entry: T_CLUSTER
2040     {
2041 michael 1647 if (conf_parser_ctx.pass != 2)
2042     break;
2043    
2044     reset_block_state();
2045    
2046     strlcpy(block_state.name.buf, "*", sizeof(block_state.name.buf));
2047     block_state.flags.value = SHARED_ALL;
2048 adx 30 } '{' cluster_items '}' ';'
2049     {
2050 michael 1647 struct MaskItem *conf = NULL;
2051    
2052     if (conf_parser_ctx.pass != 2)
2053     break;
2054    
2055     conf = conf_make(CONF_CLUSTER);
2056     conf->flags = block_state.flags.value;
2057     conf->name = xstrdup(block_state.name.buf);
2058 adx 30 };
2059    
2060 michael 3439 cluster_items: cluster_items cluster_item | cluster_item;
2061     cluster_item: cluster_name | cluster_type | error ';' ;
2062 adx 30
2063     cluster_name: NAME '=' QSTRING ';'
2064     {
2065 michael 967 if (conf_parser_ctx.pass == 2)
2066 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2067 adx 30 };
2068    
2069     cluster_type: TYPE
2070     {
2071 michael 967 if (conf_parser_ctx.pass == 2)
2072 michael 1647 block_state.flags.value = 0;
2073 adx 30 } '=' cluster_types ';' ;
2074    
2075 michael 3439 cluster_types: cluster_types ',' cluster_type_item | cluster_type_item;
2076 adx 30 cluster_type_item: KLINE
2077     {
2078 michael 967 if (conf_parser_ctx.pass == 2)
2079 michael 1647 block_state.flags.value |= SHARED_KLINE;
2080 michael 1301 } | UNKLINE
2081 adx 30 {
2082 michael 967 if (conf_parser_ctx.pass == 2)
2083 michael 1647 block_state.flags.value |= SHARED_UNKLINE;
2084 michael 1301 } | T_DLINE
2085 adx 30 {
2086 michael 967 if (conf_parser_ctx.pass == 2)
2087 michael 1647 block_state.flags.value |= SHARED_DLINE;
2088 michael 1301 } | T_UNDLINE
2089     {
2090     if (conf_parser_ctx.pass == 2)
2091 michael 1647 block_state.flags.value |= SHARED_UNDLINE;
2092 adx 30 } | XLINE
2093     {
2094 michael 967 if (conf_parser_ctx.pass == 2)
2095 michael 1647 block_state.flags.value |= SHARED_XLINE;
2096 adx 30 } | T_UNXLINE
2097     {
2098 michael 967 if (conf_parser_ctx.pass == 2)
2099 michael 1647 block_state.flags.value |= SHARED_UNXLINE;
2100 adx 30 } | RESV
2101     {
2102 michael 967 if (conf_parser_ctx.pass == 2)
2103 michael 1647 block_state.flags.value |= SHARED_RESV;
2104 adx 30 } | T_UNRESV
2105     {
2106 michael 967 if (conf_parser_ctx.pass == 2)
2107 michael 1647 block_state.flags.value |= SHARED_UNRESV;
2108 adx 30 } | T_LOCOPS
2109     {
2110 michael 967 if (conf_parser_ctx.pass == 2)
2111 michael 1647 block_state.flags.value |= SHARED_LOCOPS;
2112 adx 30 } | T_ALL
2113     {
2114 michael 967 if (conf_parser_ctx.pass == 2)
2115 michael 1647 block_state.flags.value = SHARED_ALL;
2116 adx 30 };
2117    
2118     /***************************************************************************
2119     * section connect
2120     ***************************************************************************/
2121 michael 2916 connect_entry: CONNECT
2122 adx 30 {
2123 michael 1265
2124 michael 1647 if (conf_parser_ctx.pass != 2)
2125     break;
2126    
2127     reset_block_state();
2128 michael 2397 block_state.aftype.value = AF_INET;
2129 michael 1647 block_state.port.value = PORTNUM;
2130 michael 1285 } '{' connect_items '}' ';'
2131 adx 30 {
2132 michael 1647 struct MaskItem *conf = NULL;
2133     struct addrinfo hints, *res;
2134    
2135     if (conf_parser_ctx.pass != 2)
2136     break;
2137    
2138 michael 1648 if (!block_state.name.buf[0] ||
2139     !block_state.host.buf[0])
2140 michael 1647 break;
2141    
2142 michael 2126 if (!block_state.rpass.buf[0] ||
2143     !block_state.spass.buf[0])
2144 michael 1647 break;
2145    
2146     if (has_wildcards(block_state.name.buf) ||
2147     has_wildcards(block_state.host.buf))
2148     break;
2149    
2150     conf = conf_make(CONF_SERVER);
2151     conf->port = block_state.port.value;
2152     conf->flags = block_state.flags.value;
2153     conf->aftype = block_state.aftype.value;
2154     conf->host = xstrdup(block_state.host.buf);
2155     conf->name = xstrdup(block_state.name.buf);
2156     conf->passwd = xstrdup(block_state.rpass.buf);
2157     conf->spasswd = xstrdup(block_state.spass.buf);
2158 michael 2228
2159     if (block_state.cert.buf[0])
2160     conf->certfp = xstrdup(block_state.cert.buf);
2161    
2162 michael 2252 if (block_state.ciph.buf[0])
2163     conf->cipher_list = xstrdup(block_state.ciph.buf);
2164 michael 1647
2165     dlinkMoveList(&block_state.leaf.list, &conf->leaf_list);
2166     dlinkMoveList(&block_state.hub.list, &conf->hub_list);
2167    
2168     if (block_state.bind.buf[0])
2169 adx 30 {
2170 michael 1647 memset(&hints, 0, sizeof(hints));
2171    
2172     hints.ai_family = AF_UNSPEC;
2173     hints.ai_socktype = SOCK_STREAM;
2174     hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
2175    
2176     if (getaddrinfo(block_state.bind.buf, NULL, &hints, &res))
2177     ilog(LOG_TYPE_IRCD, "Invalid netmask for server vhost(%s)", block_state.bind.buf);
2178 michael 1302 else
2179     {
2180 michael 3443 assert(res);
2181 adx 30
2182 michael 1647 memcpy(&conf->bind, res->ai_addr, res->ai_addrlen);
2183     conf->bind.ss.ss_family = res->ai_family;
2184     conf->bind.ss_len = res->ai_addrlen;
2185     freeaddrinfo(res);
2186 michael 1302 }
2187 michael 1647 }
2188 adx 30
2189 michael 1647 conf_add_class_to_conf(conf, block_state.class.buf);
2190     lookup_confhost(conf);
2191 adx 30 };
2192    
2193     connect_items: connect_items connect_item | connect_item;
2194 michael 3439 connect_item: connect_name |
2195     connect_host |
2196     connect_vhost |
2197     connect_send_password |
2198     connect_accept_password |
2199     connect_ssl_certificate_fingerprint |
2200     connect_aftype |
2201     connect_port |
2202     connect_ssl_cipher_list |
2203     connect_flags |
2204     connect_hub_mask |
2205     connect_leaf_mask |
2206     connect_class |
2207     connect_encrypted |
2208 michael 1076 error ';' ;
2209 adx 30
2210     connect_name: NAME '=' QSTRING ';'
2211     {
2212 michael 967 if (conf_parser_ctx.pass == 2)
2213 michael 1647 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2214 adx 30 };
2215    
2216 michael 2916 connect_host: HOST '=' QSTRING ';'
2217 adx 30 {
2218 michael 967 if (conf_parser_ctx.pass == 2)
2219 michael 1647 strlcpy(block_state.host.buf, yylval.string, sizeof(block_state.host.buf));
2220 adx 30 };
2221    
2222 michael 2916 connect_vhost: VHOST '=' QSTRING ';'
2223 adx 30 {
2224 michael 967 if (conf_parser_ctx.pass == 2)
2225 michael 1647 strlcpy(block_state.bind.buf, yylval.string, sizeof(block_state.bind.buf));
2226 adx 30 };
2227 michael 2916
2228 adx 30 connect_send_password: SEND_PASSWORD '=' QSTRING ';'
2229     {
2230 michael 1647 if (conf_parser_ctx.pass != 2)
2231     break;
2232 adx 30
2233 michael 1647 if ($3[0] == ':')
2234 michael 1752 conf_error_report("Server passwords cannot begin with a colon");
2235 michael 3443 else if (strchr($3, ' '))
2236 michael 1752 conf_error_report("Server passwords cannot contain spaces");
2237 michael 1647 else
2238     strlcpy(block_state.spass.buf, yylval.string, sizeof(block_state.spass.buf));
2239 adx 30 };
2240    
2241     connect_accept_password: ACCEPT_PASSWORD '=' QSTRING ';'
2242     {
2243 michael 1647 if (conf_parser_ctx.pass != 2)
2244     break;
2245 adx 30
2246 michael 1647 if ($3[0] == ':')
2247 michael 1752 conf_error_report("Server passwords cannot begin with a colon");
2248 michael 3443 else if (strchr($3, ' '))
2249 michael 1752 conf_error_report("Server passwords cannot contain spaces");
2250 michael 1647 else
2251     strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2252 adx 30 };
2253    
2254 michael 2244 connect_ssl_certificate_fingerprint: SSL_CERTIFICATE_FINGERPRINT '=' QSTRING ';'
2255 michael 2228 {
2256     if (conf_parser_ctx.pass == 2)
2257 michael 2229 strlcpy(block_state.cert.buf, yylval.string, sizeof(block_state.cert.buf));
2258 michael 2228 };
2259    
2260 adx 30 connect_port: PORT '=' NUMBER ';'
2261     {
2262 michael 967 if (conf_parser_ctx.pass == 2)
2263 michael 1647 block_state.port.value = $3;
2264 adx 30 };
2265    
2266     connect_aftype: AFTYPE '=' T_IPV4 ';'
2267     {
2268 michael 967 if (conf_parser_ctx.pass == 2)
2269 michael 1647 block_state.aftype.value = AF_INET;
2270 adx 30 } | AFTYPE '=' T_IPV6 ';'
2271     {
2272 michael 967 if (conf_parser_ctx.pass == 2)
2273 michael 1647 block_state.aftype.value = AF_INET6;
2274 adx 30 };
2275    
2276     connect_flags: IRCD_FLAGS
2277     {
2278 michael 1648 block_state.flags.value &= CONF_FLAGS_ENCRYPTED;
2279 adx 30 } '=' connect_flags_items ';';
2280    
2281     connect_flags_items: connect_flags_items ',' connect_flags_item | connect_flags_item;
2282 michael 1302 connect_flags_item: AUTOCONN
2283 adx 30 {
2284 michael 967 if (conf_parser_ctx.pass == 2)
2285 michael 1647 block_state.flags.value |= CONF_FLAGS_ALLOW_AUTO_CONN;
2286 michael 1303 } | T_SSL
2287     {
2288     if (conf_parser_ctx.pass == 2)
2289 michael 1647 block_state.flags.value |= CONF_FLAGS_SSL;
2290 michael 1228 };
2291 adx 30
2292     connect_encrypted: ENCRYPTED '=' TBOOL ';'
2293     {
2294 michael 967 if (conf_parser_ctx.pass == 2)
2295 adx 30 {
2296     if (yylval.number)
2297 michael 1647 block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
2298 adx 30 else
2299 michael 1647 block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
2300 adx 30 }
2301     };
2302    
2303 michael 2916 connect_hub_mask: HUB_MASK '=' QSTRING ';'
2304 adx 30 {
2305 michael 967 if (conf_parser_ctx.pass == 2)
2306 michael 1647 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.hub.list);
2307 adx 30 };
2308    
2309 michael 2916 connect_leaf_mask: LEAF_MASK '=' QSTRING ';'
2310 adx 30 {
2311 michael 967 if (conf_parser_ctx.pass == 2)
2312 michael 1647 dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.leaf.list);
2313 adx 30 };
2314    
2315     connect_class: CLASS '=' QSTRING ';'
2316     {
2317 michael 967 if (conf_parser_ctx.pass == 2)
2318 michael 1647 strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf));
2319 adx 30 };
2320    
2321 michael 1306 connect_ssl_cipher_list: T_SSL_CIPHER_LIST '=' QSTRING ';'
2322     {
2323     #ifdef HAVE_LIBCRYPTO
2324     if (conf_parser_ctx.pass == 2)
2325 michael 1647 strlcpy(block_state.ciph.buf, yylval.string, sizeof(block_state.ciph.buf));
2326 michael 1306 #else
2327     if (conf_parser_ctx.pass == 2)
2328 michael 1752 conf_error_report("Ignoring connect::ciphers -- no OpenSSL support");
2329 michael 1306 #endif
2330     };
2331    
2332    
2333 adx 30 /***************************************************************************
2334     * section kill
2335     ***************************************************************************/
2336     kill_entry: KILL
2337     {
2338 michael 967 if (conf_parser_ctx.pass == 2)
2339 michael 1647 reset_block_state();
2340 adx 30 } '{' kill_items '}' ';'
2341     {
2342 michael 1647 struct MaskItem *conf = NULL;
2343    
2344     if (conf_parser_ctx.pass != 2)
2345     break;
2346    
2347     if (!block_state.user.buf[0] ||
2348     !block_state.host.buf[0])
2349     break;
2350    
2351 michael 1921 conf = conf_make(CONF_KLINE);
2352     conf->user = xstrdup(block_state.user.buf);
2353     conf->host = xstrdup(block_state.host.buf);
2354 michael 1647
2355 michael 1921 if (block_state.rpass.buf[0])
2356     conf->reason = xstrdup(block_state.rpass.buf);
2357 michael 1647 else
2358 michael 1921 conf->reason = xstrdup(CONF_NOREASON);
2359     add_conf_by_address(CONF_KLINE, conf);
2360 michael 2916 };
2361 adx 30
2362     kill_items: kill_items kill_item | kill_item;
2363 michael 1921 kill_item: kill_user | kill_reason | error;
2364 adx 30
2365     kill_user: USER '=' QSTRING ';'
2366     {
2367 michael 1647
2368 michael 967 if (conf_parser_ctx.pass == 2)
2369 adx 30 {
2370 michael 593 struct split_nuh_item nuh;
2371 adx 30
2372 michael 593 nuh.nuhmask = yylval.string;
2373     nuh.nickptr = NULL;
2374 michael 1647 nuh.userptr = block_state.user.buf;
2375     nuh.hostptr = block_state.host.buf;
2376 adx 30
2377 michael 593 nuh.nicksize = 0;
2378 michael 1647 nuh.usersize = sizeof(block_state.user.buf);
2379     nuh.hostsize = sizeof(block_state.host.buf);
2380 adx 30
2381 michael 593 split_nuh(&nuh);
2382 adx 30 }
2383     };
2384    
2385 michael 2916 kill_reason: REASON '=' QSTRING ';'
2386 adx 30 {
2387 michael 967 if (conf_parser_ctx.pass == 2)
2388 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2389 adx 30 };
2390    
2391     /***************************************************************************
2392     * section deny
2393     ***************************************************************************/
2394 michael 2916 deny_entry: DENY
2395 adx 30 {
2396 michael 967 if (conf_parser_ctx.pass == 2)
2397 michael 1646 reset_block_state();
2398 adx 30 } '{' deny_items '}' ';'
2399     {
2400 michael 1646 struct MaskItem *conf = NULL;
2401    
2402     if (conf_parser_ctx.pass != 2)
2403     break;
2404    
2405     if (!block_state.addr.buf[0])
2406     break;
2407    
2408     if (parse_netmask(block_state.addr.buf, NULL, NULL) != HM_HOST)
2409 adx 30 {
2410 michael 1646 conf = conf_make(CONF_DLINE);
2411     conf->host = xstrdup(block_state.addr.buf);
2412 michael 1005
2413 michael 1647 if (block_state.rpass.buf[0])
2414     conf->reason = xstrdup(block_state.rpass.buf);
2415 michael 1646 else
2416     conf->reason = xstrdup(CONF_NOREASON);
2417     add_conf_by_address(CONF_DLINE, conf);
2418 adx 30 }
2419 michael 2916 };
2420 adx 30
2421     deny_items: deny_items deny_item | deny_item;
2422     deny_item: deny_ip | deny_reason | error;
2423    
2424     deny_ip: IP '=' QSTRING ';'
2425     {
2426 michael 967 if (conf_parser_ctx.pass == 2)
2427 michael 1646 strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf));
2428 adx 30 };
2429    
2430 michael 2916 deny_reason: REASON '=' QSTRING ';'
2431 adx 30 {
2432 michael 967 if (conf_parser_ctx.pass == 2)
2433 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2434 adx 30 };
2435    
2436     /***************************************************************************
2437     * section exempt
2438     ***************************************************************************/
2439     exempt_entry: EXEMPT '{' exempt_items '}' ';';
2440    
2441     exempt_items: exempt_items exempt_item | exempt_item;
2442     exempt_item: exempt_ip | error;
2443    
2444     exempt_ip: IP '=' QSTRING ';'
2445     {
2446 michael 967 if (conf_parser_ctx.pass == 2)
2447 adx 30 {
2448     if (yylval.string[0] && parse_netmask(yylval.string, NULL, NULL) != HM_HOST)
2449     {
2450 michael 1646 struct MaskItem *conf = conf_make(CONF_EXEMPT);
2451     conf->host = xstrdup(yylval.string);
2452 adx 30
2453 michael 1646 add_conf_by_address(CONF_EXEMPT, conf);
2454 adx 30 }
2455     }
2456     };
2457    
2458     /***************************************************************************
2459     * section gecos
2460     ***************************************************************************/
2461     gecos_entry: GECOS
2462     {
2463 michael 967 if (conf_parser_ctx.pass == 2)
2464 michael 1646 reset_block_state();
2465 adx 30 } '{' gecos_items '}' ';'
2466     {
2467 michael 1646 struct MaskItem *conf = NULL;
2468    
2469     if (conf_parser_ctx.pass != 2)
2470     break;
2471    
2472     if (!block_state.name.buf[0])
2473     break;
2474    
2475 michael 1921 conf = conf_make(CONF_XLINE);
2476 michael 1646 conf->name = xstrdup(block_state.name.buf);
2477 adx 30
2478 michael 1647 if (block_state.rpass.buf[0])
2479     conf->reason = xstrdup(block_state.rpass.buf);
2480 michael 1646 else
2481     conf->reason = xstrdup(CONF_NOREASON);
2482 adx 30 };
2483    
2484     gecos_items: gecos_items gecos_item | gecos_item;
2485 michael 1921 gecos_item: gecos_name | gecos_reason | error;
2486 adx 30
2487 michael 2916 gecos_name: NAME '=' QSTRING ';'
2488 adx 30 {
2489 michael 967 if (conf_parser_ctx.pass == 2)
2490 michael 1646 strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf));
2491 adx 30 };
2492    
2493 michael 2916 gecos_reason: REASON '=' QSTRING ';'
2494 adx 30 {
2495 michael 967 if (conf_parser_ctx.pass == 2)
2496 michael 1647 strlcpy(block_state.rpass.buf, yylval.string, sizeof(block_state.rpass.buf));
2497 adx 30 };
2498    
2499     /***************************************************************************
2500     * section general
2501     ***************************************************************************/
2502     general_entry: GENERAL
2503     '{' general_items '}' ';';
2504    
2505     general_items: general_items general_item | general_item;
2506 michael 4313 general_item: general_away_count |
2507     general_away_time |
2508 michael 3439 general_ignore_bogus_ts |
2509     general_failed_oper_notice |
2510     general_anti_nick_flood |
2511     general_max_nick_time |
2512     general_max_nick_changes |
2513     general_max_accept |
2514     general_anti_spam_exit_message_time |
2515     general_ts_warn_delta |
2516     general_ts_max_delta |
2517 michael 1549 general_kill_chase_time_limit |
2518     general_invisible_on_connect |
2519 michael 3473 general_warn_no_connect_block |
2520 michael 3439 general_dots_in_ident |
2521 michael 5025 general_stats_i_oper_only |
2522     general_stats_k_oper_only |
2523     general_stats_m_oper_only |
2524 michael 3439 general_stats_o_oper_only |
2525 michael 5025 general_stats_P_oper_only |
2526     general_stats_u_oper_only |
2527 michael 3439 general_pace_wait |
2528     general_pace_wait_simple |
2529     general_short_motd |
2530     general_no_oper_flood |
2531     general_oper_only_umodes |
2532     general_max_targets |
2533     general_oper_umodes |
2534     general_caller_id_wait |
2535     general_opers_bypass_callerid |
2536     general_default_floodcount |
2537     general_min_nonwildcard |
2538     general_min_nonwildcard_simple |
2539 michael 3877 general_throttle_count |
2540 michael 3439 general_throttle_time |
2541 michael 1072 general_ping_cookie |
2542 michael 2916 general_disable_auth |
2543 michael 3439 general_tkline_expire_notices |
2544 michael 5805 general_dline_min_cidr |
2545     general_dline_min_cidr6 |
2546     general_kline_min_cidr |
2547     general_kline_min_cidr6 |
2548 michael 3439 general_stats_e_disabled |
2549     general_max_watch |
2550     general_cycle_on_host_change |
2551     error;
2552 adx 30
2553    
2554 michael 4313 general_away_count: AWAY_COUNT '=' NUMBER ';'
2555     {
2556 michael 4340 ConfigGeneral.away_count = $3;
2557 michael 4313 };
2558    
2559     general_away_time: AWAY_TIME '=' timespec ';'
2560     {
2561 michael 4340 ConfigGeneral.away_time = $3;
2562 michael 4313 };
2563    
2564 michael 876 general_max_watch: MAX_WATCH '=' NUMBER ';'
2565     {
2566 michael 4340 ConfigGeneral.max_watch = $3;
2567 michael 876 };
2568 adx 30
2569 michael 2283 general_cycle_on_host_change: CYCLE_ON_HOST_CHANGE '=' TBOOL ';'
2570     {
2571     if (conf_parser_ctx.pass == 2)
2572 michael 4340 ConfigGeneral.cycle_on_host_change = yylval.number;
2573 michael 2283 };
2574    
2575 michael 5805 general_dline_min_cidr: DLINE_MIN_CIDR '=' NUMBER ';'
2576 michael 1459 {
2577 michael 5805 ConfigGeneral.dline_min_cidr = $3;
2578 michael 1459 };
2579    
2580 michael 5805 general_dline_min_cidr6: DLINE_MIN_CIDR6 '=' NUMBER ';'
2581 michael 1459 {
2582 michael 5805 ConfigGeneral.dline_min_cidr6 = $3;
2583 michael 1459 };
2584    
2585 michael 5805 general_kline_min_cidr: KLINE_MIN_CIDR '=' NUMBER ';'
2586 michael 1459 {
2587 michael 5805 ConfigGeneral.kline_min_cidr = $3;
2588 michael 1459 };
2589    
2590 michael 5805 general_kline_min_cidr6: KLINE_MIN_CIDR6 '=' NUMBER ';'
2591 adx 30 {
2592 michael 5805 ConfigGeneral.kline_min_cidr6 = $3;
2593 adx 30 };
2594    
2595     general_tkline_expire_notices: TKLINE_EXPIRE_NOTICES '=' TBOOL ';'
2596     {
2597 michael 4340 ConfigGeneral.tkline_expire_notices = yylval.number;
2598 adx 30 };
2599    
2600 michael 1074 general_kill_chase_time_limit: KILL_CHASE_TIME_LIMIT '=' timespec ';'
2601 adx 30 {
2602 michael 4340 ConfigGeneral.kill_chase_time_limit = $3;
2603 adx 30 };
2604    
2605     general_ignore_bogus_ts: IGNORE_BOGUS_TS '=' TBOOL ';'
2606     {
2607 michael 4340 ConfigGeneral.ignore_bogus_ts = yylval.number;
2608 adx 30 };
2609    
2610     general_failed_oper_notice: FAILED_OPER_NOTICE '=' TBOOL ';'
2611     {
2612 michael 4340 ConfigGeneral.failed_oper_notice = yylval.number;
2613 adx 30 };
2614    
2615     general_anti_nick_flood: ANTI_NICK_FLOOD '=' TBOOL ';'
2616     {
2617 michael 4340 ConfigGeneral.anti_nick_flood = yylval.number;
2618 adx 30 };
2619    
2620     general_max_nick_time: MAX_NICK_TIME '=' timespec ';'
2621     {
2622 michael 4340 ConfigGeneral.max_nick_time = $3;
2623 adx 30 };
2624    
2625     general_max_nick_changes: MAX_NICK_CHANGES '=' NUMBER ';'
2626     {
2627 michael 4340 ConfigGeneral.max_nick_changes = $3;
2628 adx 30 };
2629    
2630     general_max_accept: MAX_ACCEPT '=' NUMBER ';'
2631     {
2632 michael 4340 ConfigGeneral.max_accept = $3;
2633 adx 30 };
2634    
2635     general_anti_spam_exit_message_time: ANTI_SPAM_EXIT_MESSAGE_TIME '=' timespec ';'
2636     {
2637 michael 4340 ConfigGeneral.anti_spam_exit_message_time = $3;
2638 adx 30 };
2639    
2640     general_ts_warn_delta: TS_WARN_DELTA '=' timespec ';'
2641     {
2642 michael 4340 ConfigGeneral.ts_warn_delta = $3;
2643 adx 30 };
2644    
2645     general_ts_max_delta: TS_MAX_DELTA '=' timespec ';'
2646     {
2647 michael 967 if (conf_parser_ctx.pass == 2)
2648 michael 4340 ConfigGeneral.ts_max_delta = $3;
2649 adx 30 };
2650    
2651     general_invisible_on_connect: INVISIBLE_ON_CONNECT '=' TBOOL ';'
2652     {
2653 michael 4340 ConfigGeneral.invisible_on_connect = yylval.number;
2654 adx 30 };
2655    
2656 michael 3473 general_warn_no_connect_block: WARN_NO_CONNECT_BLOCK '=' TBOOL ';'
2657 adx 30 {
2658 michael 4340 ConfigGeneral.warn_no_connect_block = yylval.number;
2659 adx 30 };
2660    
2661 michael 584 general_stats_e_disabled: STATS_E_DISABLED '=' TBOOL ';'
2662     {
2663 michael 4340 ConfigGeneral.stats_e_disabled = yylval.number;
2664 michael 584 };
2665    
2666 michael 5025 general_stats_m_oper_only: STATS_M_OPER_ONLY '=' TBOOL ';'
2667     {
2668     ConfigGeneral.stats_m_oper_only = yylval.number;
2669     };
2670    
2671 adx 30 general_stats_o_oper_only: STATS_O_OPER_ONLY '=' TBOOL ';'
2672     {
2673 michael 4340 ConfigGeneral.stats_o_oper_only = yylval.number;
2674 adx 30 };
2675    
2676     general_stats_P_oper_only: STATS_P_OPER_ONLY '=' TBOOL ';'
2677     {
2678 michael 4340 ConfigGeneral.stats_P_oper_only = yylval.number;
2679 adx 30 };
2680    
2681 michael 2269 general_stats_u_oper_only: STATS_U_OPER_ONLY '=' TBOOL ';'
2682     {
2683 michael 4340 ConfigGeneral.stats_u_oper_only = yylval.number;
2684 michael 2269 };
2685    
2686 adx 30 general_stats_k_oper_only: STATS_K_OPER_ONLY '=' TBOOL ';'
2687     {
2688 michael 4340 ConfigGeneral.stats_k_oper_only = 2 * yylval.number;
2689 adx 30 } | STATS_K_OPER_ONLY '=' TMASKED ';'
2690     {
2691 michael 4340 ConfigGeneral.stats_k_oper_only = 1;
2692 adx 30 };
2693    
2694     general_stats_i_oper_only: STATS_I_OPER_ONLY '=' TBOOL ';'
2695     {
2696 michael 4340 ConfigGeneral.stats_i_oper_only = 2 * yylval.number;
2697 adx 30 } | STATS_I_OPER_ONLY '=' TMASKED ';'
2698     {
2699 michael 4340 ConfigGeneral.stats_i_oper_only = 1;
2700 adx 30 };
2701    
2702     general_pace_wait: PACE_WAIT '=' timespec ';'
2703     {
2704 michael 4340 ConfigGeneral.pace_wait = $3;
2705 adx 30 };
2706    
2707     general_caller_id_wait: CALLER_ID_WAIT '=' timespec ';'
2708     {
2709 michael 4340 ConfigGeneral.caller_id_wait = $3;
2710 adx 30 };
2711    
2712     general_opers_bypass_callerid: OPERS_BYPASS_CALLERID '=' TBOOL ';'
2713     {
2714 michael 4340 ConfigGeneral.opers_bypass_callerid = yylval.number;
2715 adx 30 };
2716    
2717     general_pace_wait_simple: PACE_WAIT_SIMPLE '=' timespec ';'
2718     {
2719 michael 4340 ConfigGeneral.pace_wait_simple = $3;
2720 adx 30 };
2721    
2722     general_short_motd: SHORT_MOTD '=' TBOOL ';'
2723     {
2724 michael 4340 ConfigGeneral.short_motd = yylval.number;
2725 adx 30 };
2726 michael 2916
2727 adx 30 general_no_oper_flood: NO_OPER_FLOOD '=' TBOOL ';'
2728     {
2729 michael 4340 ConfigGeneral.no_oper_flood = yylval.number;
2730 adx 30 };
2731    
2732     general_dots_in_ident: DOTS_IN_IDENT '=' NUMBER ';'
2733     {
2734 michael 4340 ConfigGeneral.dots_in_ident = $3;
2735 adx 30 };
2736    
2737     general_max_targets: MAX_TARGETS '=' NUMBER ';'
2738     {
2739 michael 4340 ConfigGeneral.max_targets = $3;
2740 adx 30 };
2741    
2742     general_ping_cookie: PING_COOKIE '=' TBOOL ';'
2743     {
2744 michael 4340 ConfigGeneral.ping_cookie = yylval.number;
2745 adx 30 };
2746    
2747     general_disable_auth: DISABLE_AUTH '=' TBOOL ';'
2748     {
2749 michael 4340 ConfigGeneral.disable_auth = yylval.number;
2750 adx 30 };
2751    
2752 michael 3877 general_throttle_count: THROTTLE_COUNT '=' NUMBER ';'
2753     {
2754 michael 4340 ConfigGeneral.throttle_count = $3;
2755 michael 3877 };
2756    
2757 adx 30 general_throttle_time: THROTTLE_TIME '=' timespec ';'
2758     {
2759 michael 4340 ConfigGeneral.throttle_time = $3;
2760 adx 30 };
2761    
2762     general_oper_umodes: OPER_UMODES
2763     {
2764 michael 4340 ConfigGeneral.oper_umodes = 0;
2765 adx 30 } '=' umode_oitems ';' ;
2766    
2767     umode_oitems: umode_oitems ',' umode_oitem | umode_oitem;
2768     umode_oitem: T_BOTS
2769     {
2770 michael 4340 ConfigGeneral.oper_umodes |= UMODE_BOTS;
2771 adx 30 } | T_CCONN
2772     {
2773 michael 4340 ConfigGeneral.oper_umodes |= UMODE_CCONN;
2774 adx 30 } | T_DEAF
2775     {
2776 michael 4340 ConfigGeneral.oper_umodes |= UMODE_DEAF;
2777 adx 30 } | T_DEBUG
2778     {
2779 michael 4340 ConfigGeneral.oper_umodes |= UMODE_DEBUG;
2780 adx 30 } | T_FULL
2781     {
2782 michael 4340 ConfigGeneral.oper_umodes |= UMODE_FULL;
2783 michael 1294 } | HIDDEN
2784     {
2785 michael 4340 ConfigGeneral.oper_umodes |= UMODE_HIDDEN;
2786 michael 3513 } | HIDE_CHANS
2787     {
2788 michael 4340 ConfigGeneral.oper_umodes |= UMODE_HIDECHANS;
2789 michael 3506 } | HIDE_IDLE
2790     {
2791 michael 4340 ConfigGeneral.oper_umodes |= UMODE_HIDEIDLE;
2792 adx 30 } | T_SKILL
2793     {
2794 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SKILL;
2795 adx 30 } | T_NCHANGE
2796     {
2797 michael 4340 ConfigGeneral.oper_umodes |= UMODE_NCHANGE;
2798 adx 30 } | T_REJ
2799     {
2800 michael 4340 ConfigGeneral.oper_umodes |= UMODE_REJ;
2801 adx 30 } | T_UNAUTH
2802     {
2803 michael 4340 ConfigGeneral.oper_umodes |= UMODE_UNAUTH;
2804 adx 30 } | T_SPY
2805     {
2806 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SPY;
2807 adx 30 } | T_EXTERNAL
2808     {
2809 michael 4340 ConfigGeneral.oper_umodes |= UMODE_EXTERNAL;
2810 adx 30 } | T_SERVNOTICE
2811     {
2812 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SERVNOTICE;
2813 adx 30 } | T_INVISIBLE
2814     {
2815 michael 4340 ConfigGeneral.oper_umodes |= UMODE_INVISIBLE;
2816 adx 30 } | T_WALLOP
2817     {
2818 michael 4340 ConfigGeneral.oper_umodes |= UMODE_WALLOP;
2819 adx 30 } | T_SOFTCALLERID
2820     {
2821 michael 4340 ConfigGeneral.oper_umodes |= UMODE_SOFTCALLERID;
2822 adx 30 } | T_CALLERID
2823     {
2824 michael 4340 ConfigGeneral.oper_umodes |= UMODE_CALLERID;
2825 adx 30 } | T_LOCOPS
2826     {
2827 michael 4340 ConfigGeneral.oper_umodes |= UMODE_LOCOPS;
2828 michael 1979 } | T_NONONREG
2829     {
2830 michael 4340 ConfigGeneral.oper_umodes |= UMODE_REGONLY;
2831 michael 1976 } | T_FARCONNECT
2832     {
2833 michael 4340 ConfigGeneral.oper_umodes |= UMODE_FARCONNECT;
2834 adx 30 };
2835    
2836 michael 2916 general_oper_only_umodes: OPER_ONLY_UMODES
2837 adx 30 {
2838 michael 4340 ConfigGeneral.oper_only_umodes = 0;
2839 adx 30 } '=' umode_items ';' ;
2840    
2841 michael 3439 umode_items: umode_items ',' umode_item | umode_item;
2842     umode_item: T_BOTS
2843 adx 30 {
2844 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_BOTS;
2845 adx 30 } | T_CCONN
2846     {
2847 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_CCONN;
2848 adx 30 } | T_DEAF
2849     {
2850 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_DEAF;
2851 adx 30 } | T_DEBUG
2852     {
2853 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_DEBUG;
2854 adx 30 } | T_FULL
2855 michael 2916 {
2856 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_FULL;
2857 adx 30 } | T_SKILL
2858     {
2859 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SKILL;
2860 michael 1294 } | HIDDEN
2861     {
2862 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_HIDDEN;
2863 adx 30 } | T_NCHANGE
2864     {
2865 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_NCHANGE;
2866 adx 30 } | T_REJ
2867     {
2868 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_REJ;
2869 adx 30 } | T_UNAUTH
2870     {
2871 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_UNAUTH;
2872 adx 30 } | T_SPY
2873     {
2874 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SPY;
2875 adx 30 } | T_EXTERNAL
2876     {
2877 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_EXTERNAL;
2878 adx 30 } | T_SERVNOTICE
2879     {
2880 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SERVNOTICE;
2881 adx 30 } | T_INVISIBLE
2882     {
2883 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_INVISIBLE;
2884 adx 30 } | T_WALLOP
2885     {
2886 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_WALLOP;
2887 adx 30 } | T_SOFTCALLERID
2888     {
2889 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_SOFTCALLERID;
2890 adx 30 } | T_CALLERID
2891     {
2892 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_CALLERID;
2893 adx 30 } | T_LOCOPS
2894     {
2895 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_LOCOPS;
2896 michael 1855 } | T_NONONREG
2897     {
2898 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_REGONLY;
2899 michael 1976 } | T_FARCONNECT
2900     {
2901 michael 4340 ConfigGeneral.oper_only_umodes |= UMODE_FARCONNECT;
2902 adx 30 };
2903    
2904     general_min_nonwildcard: MIN_NONWILDCARD '=' NUMBER ';'
2905     {
2906 michael 4340 ConfigGeneral.min_nonwildcard = $3;
2907 adx 30 };
2908    
2909     general_min_nonwildcard_simple: MIN_NONWILDCARD_SIMPLE '=' NUMBER ';'
2910     {
2911 michael 4340 ConfigGeneral.min_nonwildcard_simple = $3;
2912 adx 30 };
2913    
2914     general_default_floodcount: DEFAULT_FLOODCOUNT '=' NUMBER ';'
2915     {
2916 michael 4340 ConfigGeneral.default_floodcount = $3;
2917 adx 30 };
2918    
2919    
2920     /***************************************************************************
2921     * section channel
2922     ***************************************************************************/
2923     channel_entry: CHANNEL
2924     '{' channel_items '}' ';';
2925    
2926     channel_items: channel_items channel_item | channel_item;
2927 michael 1495 channel_item: channel_max_bans |
2928 michael 3860 channel_invite_client_count |
2929     channel_invite_client_time |
2930     channel_knock_client_count |
2931     channel_knock_client_time |
2932 michael 3439 channel_knock_delay_channel |
2933 michael 3933 channel_max_channels |
2934 michael 5489 channel_default_join_flood_count |
2935     channel_default_join_flood_time |
2936 michael 3439 channel_disable_fake_channels |
2937     error;
2938 adx 30
2939 michael 632 channel_disable_fake_channels: DISABLE_FAKE_CHANNELS '=' TBOOL ';'
2940     {
2941     ConfigChannel.disable_fake_channels = yylval.number;
2942     };
2943    
2944 michael 3860 channel_invite_client_count: INVITE_CLIENT_COUNT '=' NUMBER ';'
2945 adx 30 {
2946 michael 3860 ConfigChannel.invite_client_count = $3;
2947 adx 30 };
2948    
2949 michael 3860 channel_invite_client_time: INVITE_CLIENT_TIME '=' timespec ';'
2950 adx 30 {
2951 michael 3860 ConfigChannel.invite_client_time = $3;
2952 adx 30 };
2953    
2954 michael 3860 channel_knock_client_count: KNOCK_CLIENT_COUNT '=' NUMBER ';'
2955 michael 3762 {
2956 michael 3860 ConfigChannel.knock_client_count = $3;
2957 michael 3762 };
2958    
2959 michael 3860 channel_knock_client_time: KNOCK_CLIENT_TIME '=' timespec ';'
2960 michael 3762 {
2961 michael 3860 ConfigChannel.knock_client_time = $3;
2962 michael 3762 };
2963    
2964 michael 3860 channel_knock_delay_channel: KNOCK_DELAY_CHANNEL '=' timespec ';'
2965     {
2966     ConfigChannel.knock_delay_channel = $3;
2967     };
2968    
2969 michael 3933 channel_max_channels: MAX_CHANNELS '=' NUMBER ';'
2970 adx 30 {
2971 michael 3933 ConfigChannel.max_channels = $3;
2972 adx 30 };
2973    
2974     channel_max_bans: MAX_BANS '=' NUMBER ';'
2975     {
2976     ConfigChannel.max_bans = $3;
2977     };
2978    
2979 michael 5489 channel_default_join_flood_count: DEFAULT_JOIN_FLOOD_COUNT '=' NUMBER ';'
2980 adx 30 {
2981 michael 5489 ConfigChannel.default_join_flood_count = yylval.number;
2982 adx 30 };
2983    
2984 michael 5489 channel_default_join_flood_time: DEFAULT_JOIN_FLOOD_TIME '=' timespec ';'
2985 adx 30 {
2986 michael 5489 ConfigChannel.default_join_flood_time = $3;
2987 adx 30 };
2988    
2989     /***************************************************************************
2990     * section serverhide
2991     ***************************************************************************/
2992     serverhide_entry: SERVERHIDE
2993     '{' serverhide_items '}' ';';
2994    
2995     serverhide_items: serverhide_items serverhide_item | serverhide_item;
2996 michael 3439 serverhide_item: serverhide_flatten_links |
2997 michael 6597 serverhide_flatten_links_delay |
2998 michael 6599 serverhide_flatten_links_file |
2999 michael 3439 serverhide_disable_remote_commands |
3000 michael 2196 serverhide_hide_servers |
3001 michael 3439 serverhide_hide_services |
3002     serverhide_hidden |
3003     serverhide_hidden_name |
3004     serverhide_hide_server_ips |
3005 adx 30 error;
3006    
3007     serverhide_flatten_links: FLATTEN_LINKS '=' TBOOL ';'
3008     {
3009 michael 967 if (conf_parser_ctx.pass == 2)
3010 adx 30 ConfigServerHide.flatten_links = yylval.number;
3011     };
3012    
3013 michael 6636 serverhide_flatten_links_delay: FLATTEN_LINKS_DELAY '=' timespec ';'
3014     {
3015     if (conf_parser_ctx.pass == 2)
3016     {
3017     if ($3 > 0)
3018     {
3019     event_write_links_file.when = $3;
3020     event_add(&event_write_links_file, NULL);
3021     }
3022     else
3023     event_delete(&event_write_links_file);
3024    
3025     ConfigServerHide.flatten_links_delay = $3;
3026     }
3027     };
3028    
3029     serverhide_flatten_links_file: FLATTEN_LINKS_FILE '=' QSTRING ';'
3030     {
3031     if (conf_parser_ctx.pass == 2)
3032     {
3033     MyFree(ConfigServerHide.flatten_links_file);
3034     ConfigServerHide.flatten_links_file = xstrdup(yylval.string);
3035     }
3036     };
3037    
3038 michael 2196 serverhide_disable_remote_commands: DISABLE_REMOTE_COMMANDS '=' TBOOL ';'
3039     {
3040     if (conf_parser_ctx.pass == 2)
3041     ConfigServerHide.disable_remote_commands = yylval.number;
3042     };
3043    
3044 adx 30 serverhide_hide_servers: HIDE_SERVERS '=' TBOOL ';'
3045     {
3046 michael 967 if (conf_parser_ctx.pass == 2)
3047 adx 30 ConfigServerHide.hide_servers = yylval.number;
3048     };
3049    
3050 michael 1851 serverhide_hide_services: HIDE_SERVICES '=' TBOOL ';'
3051     {
3052     if (conf_parser_ctx.pass == 2)
3053     ConfigServerHide.hide_services = yylval.number;
3054     };
3055    
3056 adx 30 serverhide_hidden_name: HIDDEN_NAME '=' QSTRING ';'
3057     {
3058 michael 967 if (conf_parser_ctx.pass == 2)
3059 adx 30 {
3060     MyFree(ConfigServerHide.hidden_name);
3061 michael 1646 ConfigServerHide.hidden_name = xstrdup(yylval.string);
3062 adx 30 }
3063     };
3064    
3065     serverhide_hidden: HIDDEN '=' TBOOL ';'
3066     {
3067 michael 967 if (conf_parser_ctx.pass == 2)
3068 adx 30 ConfigServerHide.hidden = yylval.number;
3069     };
3070    
3071     serverhide_hide_server_ips: HIDE_SERVER_IPS '=' TBOOL ';'
3072     {
3073 michael 967 if (conf_parser_ctx.pass == 2)
3074 adx 30 ConfigServerHide.hide_server_ips = yylval.number;
3075     };

Properties

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