ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/src/conf_parser.y
Revision: 4988
Committed: Mon Dec 8 20:04:42 2014 UTC (11 years, 7 months ago) by michael
File size: 79410 byte(s)
Log Message:
- The general::true_no_oper_flood configuration option has been deprecated.
  Operators still can have higher 'flood' limits with no_oper_flood = yes;
  hoewever, they are no longer allowed to bypass RecvQ limits.

File Contents

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

Properties

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