ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 5489
Committed: Sun Feb 8 14:52:23 2015 UTC (11 years, 7 months ago) by michael
File size: 79838 byte(s)
Log Message:
- Fixed bug where "/rehash" would always reset the "MAX", "JFLOODTIME", and "JFLOODCOUNT" values that
  have been changed from within IRC via the "/set" command
- Renamed the following ircd.conf configuration directives to be more descriptive:

  max_clients -> default_max_clients
  join_flood_count -> default_join_flood_count
  join_flood_time -> default_join_flood_time

- Updated related ircd.conf documentation accordingly

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

Properties

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