ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 5693
Committed: Sat Mar 14 20:40:29 2015 UTC (11 years, 6 months ago) by michael
File size: 79936 byte(s)
Log Message:
- conf_parser.y: removed YY_NO_UNPUT define which was an undocumented feature
  and has been deprecated for many years now. Proper way is to use 'nounput'
  in the scanner options.

File Contents

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

Properties

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