ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 4915
Committed: Tue Nov 25 12:37:46 2014 UTC (11 years, 10 months ago) by michael
File size: 79757 byte(s)
Log Message:
- Style corrections; renamed variables

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

Properties

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