ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 4545
Committed: Fri Aug 22 08:46:13 2014 UTC (12 years, 1 month ago) by michael
File size: 79825 byte(s)
Log Message:
- Implemented pseudo {} blocks (service aliases)
- Fixed compile warnings with -Wmissing-field-initializers

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

Properties

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