ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
Revision: 7032
Committed: Sun Jan 3 14:34:39 2016 UTC (10 years, 9 months ago) by michael
File size: 77679 byte(s)
Log Message:
- Renamed MyCalloc to xcalloc

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

Properties

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