ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_parser.y
(Generate patch)

Comparing ircd-hybrid/trunk/src/conf_parser.y (file contents):
Revision 2012 by michael, Sun May 12 14:47:26 2013 UTC vs.
Revision 2185 by michael, Tue Jun 4 12:29:18 2013 UTC

# Line 47 | Line 47
47   #include "resv.h"
48   #include "numeric.h"
49   #include "s_user.h"
50 + #include "motd.h"
51  
52   #ifdef HAVE_LIBCRYPTO
53   #include <openssl/rsa.h>
# Line 150 | Line 151 | reset_block_state(void)
151   %token  CALLER_ID_WAIT
152   %token  CAN_FLOOD
153   %token  CHANNEL
154 < %token  CIDR_BITLEN_IPV4
155 < %token  CIDR_BITLEN_IPV6
154 > %token  CIDR_BITLEN_IPV4
155 > %token  CIDR_BITLEN_IPV6
156   %token  CLASS
157   %token  CONNECT
158   %token  CONNECTFREQ
# Line 171 | Line 172 | reset_block_state(void)
172   %token  EXCEED_LIMIT
173   %token  EXEMPT
174   %token  FAILED_OPER_NOTICE
174 %token  IRCD_FLAGS
175   %token  FLATTEN_LINKS
176   %token  GECOS
177   %token  GENERAL
# Line 179 | Line 179 | reset_block_state(void)
179   %token  GLINE_DURATION
180   %token  GLINE_ENABLE
181   %token  GLINE_EXEMPT
182 %token  GLINE_REQUEST_DURATION
182   %token  GLINE_MIN_CIDR
183   %token  GLINE_MIN_CIDR6
184 + %token  GLINE_REQUEST_DURATION
185   %token  GLOBAL_KILL
186 %token  IRCD_AUTH
187 %token  NEED_IDENT
186   %token  HAVENT_READ_CONF
187   %token  HIDDEN
188 < %token  HIDDEN_NAME
188 > %token  HIDDEN_NAME
189 > %token  HIDE_IDLE_FROM_OPERS
190   %token  HIDE_SERVER_IPS
191   %token  HIDE_SERVERS
192   %token  HIDE_SERVICES
193 < %token  HIDE_SPOOF_IPS
193 > %token  HIDE_SPOOF_IPS
194   %token  HOST
195   %token  HUB
196   %token  HUB_MASK
197   %token  IGNORE_BOGUS_TS
198   %token  INVISIBLE_ON_CONNECT
199   %token  IP
200 + %token  IRCD_AUTH
201 + %token  IRCD_FLAGS
202 + %token  IRCD_SID
203 + %token  JOIN_FLOOD_COUNT
204 + %token  JOIN_FLOOD_TIME
205   %token  KILL
206 < %token  KILL_CHASE_TIME_LIMIT
206 > %token  KILL_CHASE_TIME_LIMIT
207   %token  KLINE
208   %token  KLINE_EXEMPT
209   %token  KNOCK_DELAY
# Line 207 | Line 211 | reset_block_state(void)
211   %token  LEAF_MASK
212   %token  LINKS_DELAY
213   %token  LISTEN
210 %token  T_LOG
214   %token  MASK
215   %token  MAX_ACCEPT
216   %token  MAX_BANS
# Line 215 | Line 218 | reset_block_state(void)
218   %token  MAX_CHANS_PER_USER
219   %token  MAX_GLOBAL
220   %token  MAX_IDENT
221 + %token  MAX_IDLE
222   %token  MAX_LOCAL
223   %token  MAX_NICK_CHANGES
224   %token  MAX_NICK_LENGTH
# Line 223 | Line 227 | reset_block_state(void)
227   %token  MAX_TARGETS
228   %token  MAX_TOPIC_LENGTH
229   %token  MAX_WATCH
230 + %token  MIN_IDLE
231   %token  MIN_NONWILDCARD
232   %token  MIN_NONWILDCARD_SIMPLE
228 %token  MIN_IDLE
229 %token  MAX_IDLE
230 %token  RANDOM_IDLE
231 %token  HIDE_IDLE_FROM_OPERS
233   %token  MODULE
234   %token  MODULES
235 + %token  MOTD
236   %token  NAME
237 + %token  NEED_IDENT
238   %token  NEED_PASSWORD
239   %token  NETWORK_DESC
240   %token  NETWORK_NAME
# Line 243 | Line 246 | reset_block_state(void)
246   %token  NUMBER
247   %token  NUMBER_PER_CIDR
248   %token  NUMBER_PER_IP
246 %token  OPERATOR
247 %token  OPERS_BYPASS_CALLERID
249   %token  OPER_ONLY_UMODES
250   %token  OPER_PASS_RESV
251   %token  OPER_UMODES
252 < %token  JOIN_FLOOD_COUNT
253 < %token  JOIN_FLOOD_TIME
252 > %token  OPERATOR
253 > %token  OPERS_BYPASS_CALLERID
254   %token  PACE_WAIT
255   %token  PACE_WAIT_SIMPLE
256   %token  PASSWORD
# Line 258 | Line 259 | reset_block_state(void)
259   %token  PING_TIME
260   %token  PORT
261   %token  QSTRING
262 + %token  RANDOM_IDLE
263   %token  REASON
264   %token  REDIRPORT
265   %token  REDIRSERV
266   %token  REHASH
267   %token  REMOTE
268   %token  REMOTEBAN
267 %token  RSA_PRIVATE_KEY_FILE
268 %token  RSA_PUBLIC_KEY_FILE
269 %token  SSL_CERTIFICATE_FILE
270 %token  SSL_DH_PARAM_FILE
271 %token  T_SSL_CLIENT_METHOD
272 %token  T_SSL_SERVER_METHOD
273 %token  T_SSLV3
274 %token  T_TLSV1
269   %token  RESV
270   %token  RESV_EXEMPT
271 + %token  RSA_PRIVATE_KEY_FILE
272 + %token  RSA_PUBLIC_KEY_FILE
273   %token  SECONDS MINUTES HOURS DAYS WEEKS MONTHS YEARS
278 %token  SENDQ
274   %token  SEND_PASSWORD
275 + %token  SENDQ
276   %token  SERVERHIDE
277   %token  SERVERINFO
282 %token  SQUIT
283 %token  IRCD_SID
284 %token  TKLINE_EXPIRE_NOTICES
285 %token  T_SHARED
286 %token  T_CLUSTER
287 %token  TYPE
278   %token  SHORT_MOTD
279   %token  SPOOF
280   %token  SPOOF_NOTICE
281 + %token  SQUIT
282 + %token  SSL_CERTIFICATE_FILE
283 + %token  SSL_DH_PARAM_FILE
284   %token  STATS_E_DISABLED
285   %token  STATS_I_OPER_ONLY
286   %token  STATS_K_OPER_ONLY
287   %token  STATS_O_OPER_ONLY
288   %token  STATS_P_OPER_ONLY
296 %token  TBOOL
297 %token  TMASKED
298 %token  TS_MAX_DELTA
299 %token  TS_WARN_DELTA
300 %token  TWODOTS
289   %token  T_ALL
290   %token  T_BOTS
303 %token  T_SOFTCALLERID
291   %token  T_CALLERID
292   %token  T_CCONN
293 < %token  T_CCONN_FULL
307 < %token  T_SSL_CIPHER_LIST
293 > %token  T_CLUSTER
294   %token  T_DEAF
295   %token  T_DEBUG
296   %token  T_DLINE
297   %token  T_EXTERNAL
298   %token  T_FARCONNECT
299 + %token  T_FILE
300   %token  T_FULL
301 + %token  T_GLOBOPS
302   %token  T_INVISIBLE
303   %token  T_IPV4
304   %token  T_IPV6
305   %token  T_LOCOPS
306 + %token  T_LOG
307   %token  T_MAX_CLIENTS
308   %token  T_NCHANGE
309   %token  T_NONONREG
310   %token  T_OPERWALL
311   %token  T_RECVQ
312   %token  T_REJ
313 + %token  T_RESTART
314   %token  T_SERVER
315 + %token  T_SERVICE
316 + %token  T_SERVICES_NAME
317   %token  T_SERVNOTICE
318   %token  T_SET
319 + %token  T_SHARED
320 + %token  T_SIZE
321   %token  T_SKILL
322 + %token  T_SOFTCALLERID
323   %token  T_SPY
324   %token  T_SSL
325 + %token  T_SSL_CIPHER_LIST
326 + %token  T_SSL_CLIENT_METHOD
327 + %token  T_SSL_SERVER_METHOD
328 + %token  T_SSLV3
329 + %token  T_TLSV1
330   %token  T_UMODES
331   %token  T_UNAUTH
332   %token  T_UNDLINE
333   %token  T_UNLIMITED
334   %token  T_UNRESV
335   %token  T_UNXLINE
336 %token  T_GLOBOPS
336   %token  T_WALLOP
337 + %token  T_WALLOPS
338   %token  T_WEBIRC
339 < %token  T_RESTART
340 < %token  T_SERVICE
341 < %token  T_SERVICES_NAME
339 > %token  TBOOL
340   %token  THROTTLE_TIME
341 + %token  TKLINE_EXPIRE_NOTICES
342 + %token  TMASKED
343   %token  TRUE_NO_OPER_FLOOD
344 + %token  TS_MAX_DELTA
345 + %token  TS_WARN_DELTA
346 + %token  TWODOTS
347 + %token  TYPE
348   %token  UNKLINE
345 %token  USER
349   %token  USE_EGD
350   %token  USE_LOGGING
351 + %token  USER
352   %token  VHOST
353   %token  VHOST6
350 %token  XLINE
354   %token  WARN_NO_NLINE
355 < %token  T_SIZE
353 < %token  T_FILE
355 > %token  XLINE
356  
357 < %type <string> QSTRING
358 < %type <number> NUMBER
359 < %type <number> timespec
360 < %type <number> timespec_
361 < %type <number> sizespec
362 < %type <number> sizespec_
357 > %type  <string> QSTRING
358 > %type  <number> NUMBER
359 > %type  <number> timespec
360 > %type  <number> timespec_
361 > %type  <number> sizespec
362 > %type  <number> sizespec_
363  
364   %%
365   conf:  
# Line 384 | Line 386 | conf_item:        admin_entry
386                  | general_entry
387                  | gecos_entry
388                  | modules_entry
389 +                | motd_entry
390                  | error ';'
391                  | error '}'
392          ;
# Line 547 | Line 550 | serverinfo_ssl_certificate_file: SSL_CER
550   serverinfo_rsa_private_key_file: RSA_PRIVATE_KEY_FILE '=' QSTRING ';'
551   {
552   #ifdef HAVE_LIBCRYPTO
553 <  if (conf_parser_ctx.pass == 1)
551 <  {
552 <    BIO *file;
553 >  BIO *file = NULL;
554  
555 <    if (ServerInfo.rsa_private_key)
556 <    {
556 <      RSA_free(ServerInfo.rsa_private_key);
557 <      ServerInfo.rsa_private_key = NULL;
558 <    }
555 >  if (conf_parser_ctx.pass != 1)
556 >    break;
557  
558 <    if (ServerInfo.rsa_private_key_file)
559 <    {
560 <      MyFree(ServerInfo.rsa_private_key_file);
561 <      ServerInfo.rsa_private_key_file = NULL;
562 <    }
558 >  if (ServerInfo.rsa_private_key)
559 >  {
560 >    RSA_free(ServerInfo.rsa_private_key);
561 >    ServerInfo.rsa_private_key = NULL;
562 >  }
563  
564 <    ServerInfo.rsa_private_key_file = xstrdup(yylval.string);
564 >  if (ServerInfo.rsa_private_key_file)
565 >  {
566 >    MyFree(ServerInfo.rsa_private_key_file);
567 >    ServerInfo.rsa_private_key_file = NULL;
568 >  }
569  
570 <    if ((file = BIO_new_file(yylval.string, "r")) == NULL)
569 <    {
570 <      conf_error_report("File open failed, ignoring");
571 <      break;
572 <    }
570 >  ServerInfo.rsa_private_key_file = xstrdup(yylval.string);
571  
572 <    ServerInfo.rsa_private_key = PEM_read_bio_RSAPrivateKey(file, NULL, 0, NULL);
572 >  if ((file = BIO_new_file(yylval.string, "r")) == NULL)
573 >  {
574 >    conf_error_report("File open failed, ignoring");
575 >    break;
576 >  }
577  
578 <    BIO_set_close(file, BIO_CLOSE);
577 <    BIO_free(file);
578 >  ServerInfo.rsa_private_key = PEM_read_bio_RSAPrivateKey(file, NULL, 0, NULL);
579  
580 <    if (ServerInfo.rsa_private_key == NULL)
581 <    {
581 <      conf_error_report("Couldn't extract key, ignoring");
582 <      break;
583 <    }
580 >  BIO_set_close(file, BIO_CLOSE);
581 >  BIO_free(file);
582  
583 <    if (!RSA_check_key(ServerInfo.rsa_private_key))
584 <    {
585 <      RSA_free(ServerInfo.rsa_private_key);
586 <      ServerInfo.rsa_private_key = NULL;
583 >  if (ServerInfo.rsa_private_key == NULL)
584 >  {
585 >    conf_error_report("Couldn't extract key, ignoring");
586 >    break;
587 >  }
588  
589 <      conf_error_report("Invalid key, ignoring");
590 <      break;
591 <    }
589 >  if (!RSA_check_key(ServerInfo.rsa_private_key))
590 >  {
591 >    RSA_free(ServerInfo.rsa_private_key);
592 >    ServerInfo.rsa_private_key = NULL;
593  
594 <    /* require 2048 bit (256 byte) key */
595 <    if (RSA_size(ServerInfo.rsa_private_key) != 256)
596 <    {
597 <      RSA_free(ServerInfo.rsa_private_key);
598 <      ServerInfo.rsa_private_key = NULL;
594 >    conf_error_report("Invalid key, ignoring");
595 >    break;
596 >  }
597  
598 <      conf_error_report("Not a 2048 bit key, ignoring");
599 <    }
598 >  /* require 2048 bit (256 byte) key */
599 >  if (RSA_size(ServerInfo.rsa_private_key) != 256)
600 >  {
601 >    RSA_free(ServerInfo.rsa_private_key);
602 >    ServerInfo.rsa_private_key = NULL;
603 >
604 >    conf_error_report("Not a 2048 bit key, ignoring");
605    }
606   #endif
607   };
# Line 694 | Line 697 | serverinfo_network_name: NETWORK_NAME '=
697  
698   serverinfo_network_desc: NETWORK_DESC '=' QSTRING ';'
699   {
700 <  if (conf_parser_ctx.pass == 2)
701 <  {
702 <    MyFree(ServerInfo.network_desc);
703 <    ServerInfo.network_desc = xstrdup(yylval.string);
704 <  }
700 >  if (conf_parser_ctx.pass != 2)
701 >    break;
702 >
703 >  MyFree(ServerInfo.network_desc);
704 >  ServerInfo.network_desc = xstrdup(yylval.string);
705   };
706  
707   serverinfo_vhost: VHOST '=' QSTRING ';'
# Line 845 | Line 848 | admin_item:  admin_name | admin_descript
848  
849   admin_name: NAME '=' QSTRING ';'
850   {
851 <  if (conf_parser_ctx.pass == 2)
852 <  {
853 <    MyFree(AdminInfo.name);
854 <    AdminInfo.name = xstrdup(yylval.string);
855 <  }
851 >  if (conf_parser_ctx.pass != 2)
852 >    break;
853 >
854 >  MyFree(AdminInfo.name);
855 >  AdminInfo.name = xstrdup(yylval.string);
856   };
857  
858   admin_email: EMAIL '=' QSTRING ';'
859   {
860 <  if (conf_parser_ctx.pass == 2)
861 <  {
862 <    MyFree(AdminInfo.email);
863 <    AdminInfo.email = xstrdup(yylval.string);
864 <  }
860 >  if (conf_parser_ctx.pass != 2)
861 >    break;
862 >
863 >  MyFree(AdminInfo.email);
864 >  AdminInfo.email = xstrdup(yylval.string);
865   };
866  
867   admin_description: DESCRIPTION '=' QSTRING ';'
868   {
869 +  if (conf_parser_ctx.pass != 2)
870 +    break;
871 +
872 +  MyFree(AdminInfo.description);
873 +  AdminInfo.description = xstrdup(yylval.string);
874 + };
875 +
876 + /***************************************************************************
877 + * motd section
878 + ***************************************************************************/
879 + motd_entry: MOTD
880 + {
881    if (conf_parser_ctx.pass == 2)
882 <  {
883 <    MyFree(AdminInfo.description);
884 <    AdminInfo.description = xstrdup(yylval.string);
885 <  }
882 >    reset_block_state();
883 > } '{' motd_items '}' ';'
884 > {
885 >  dlink_node *ptr = NULL;
886 >
887 >  if (conf_parser_ctx.pass != 2)
888 >    break;
889 >
890 >  if (!block_state.file.buf[0])
891 >    break;
892 >
893 >  DLINK_FOREACH(ptr, block_state.mask.list.head)
894 >    motd_add(ptr->data, block_state.file.buf);
895 > };
896 >
897 > motd_items: motd_items motd_item | motd_item;
898 > motd_item:  motd_mask | motd_file | error ';' ;
899 >
900 > motd_mask: MASK '=' QSTRING ';'
901 > {
902 >  if (conf_parser_ctx.pass == 2)
903 >    dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list);
904 > };
905 >
906 > motd_file: T_FILE '=' QSTRING ';'
907 > {
908 >  if (conf_parser_ctx.pass == 2)
909 >    strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf));
910   };
911  
912   /***************************************************************************
# Line 979 | Line 1018 | oper_entry: OPERATOR
1018    if (!block_state.name.buf[0])
1019      break;
1020   #ifdef HAVE_LIBCRYPTO
1021 <  if (!(block_state.file.buf[0] ||
1022 <        block_state.rpass.buf[0]))
1021 >  if (!block_state.file.buf[0] &&
1022 >      !block_state.rpass.buf[0])
1023      break;
1024   #else
1025    if (!block_state.rpass.buf[0])
# Line 1064 | Line 1103 | oper_password: PASSWORD '=' QSTRING ';'
1103  
1104   oper_encrypted: ENCRYPTED '=' TBOOL ';'
1105   {
1106 <  if (conf_parser_ctx.pass == 2)
1107 <  {
1108 <    if (yylval.number)
1109 <      block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1110 <    else
1111 <      block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1112 <  }
1106 >  if (conf_parser_ctx.pass != 2)
1107 >    break;
1108 >
1109 >  if (yylval.number)
1110 >    block_state.flags.value |= CONF_FLAGS_ENCRYPTED;
1111 >  else
1112 >    block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED;
1113   };
1114  
1115   oper_rsa_public_key_file: RSA_PUBLIC_KEY_FILE '=' QSTRING ';'
# Line 1100 | Line 1139 | oper_umodes_item:  T_BOTS
1139   {
1140    if (conf_parser_ctx.pass == 2)
1141      block_state.modes.value |= UMODE_CCONN;
1103 } | T_CCONN_FULL
1104 {
1105  if (conf_parser_ctx.pass == 2)
1106    block_state.modes.value |= UMODE_CCONN_FULL;
1142   } | T_DEAF
1143   {
1144    if (conf_parser_ctx.pass == 2)
# Line 1261 | Line 1296 | oper_flags_item: KILL ':' REMOTE
1296   {
1297    if (conf_parser_ctx.pass == 2)
1298      block_state.port.value |= OPER_FLAG_GLOBOPS;
1299 + } | T_WALLOPS
1300 + {
1301 +  if (conf_parser_ctx.pass == 2)
1302 +    block_state.port.value |= OPER_FLAG_WALLOPS;
1303 + } | T_LOCOPS
1304 + {
1305 +  if (conf_parser_ctx.pass == 2)
1306 +    block_state.port.value |= OPER_FLAG_LOCOPS;
1307   } | REMOTEBAN
1308   {
1309    if (conf_parser_ctx.pass == 2)
# Line 1583 | Line 1626 | auth_entry: IRCD_AUTH
1626      split_nuh(&nuh);
1627  
1628      conf        = conf_make(CONF_CLIENT);
1629 <    conf->user  = xstrdup(collapse(block_state.user.buf));
1630 <    conf->host  = xstrdup(collapse(block_state.host.buf));
1629 >    conf->user  = xstrdup(block_state.user.buf);
1630 >    conf->host  = xstrdup(block_state.host.buf);
1631  
1632      if (block_state.rpass.buf[0])
1633        conf->passwd = xstrdup(block_state.rpass.buf);
# Line 1636 | Line 1679 | auth_encrypted: ENCRYPTED '=' TBOOL ';'
1679   auth_flags: IRCD_FLAGS
1680   {
1681    if (conf_parser_ctx.pass == 2)
1682 <    block_state.flags.value &= CONF_FLAGS_ENCRYPTED;
1682 >    block_state.flags.value &= (CONF_FLAGS_ENCRYPTED | CONF_FLAGS_SPOOF_IP);
1683   } '='  auth_flags_items ';';
1684  
1685   auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item;
# Line 1765 | Line 1808 | service_item:      service_name | error;
1808  
1809   service_name: NAME '=' QSTRING ';'
1810   {
1811 <  if (conf_parser_ctx.pass == 2)
1811 >  if (conf_parser_ctx.pass != 2)
1812 >    break;
1813 >
1814 >  if (valid_servname(yylval.string))
1815    {
1816 <    if (valid_servname(yylval.string))
1817 <    {
1772 <      struct MaskItem *conf = conf_make(CONF_SERVICE);
1773 <      conf->name = xstrdup(yylval.string);
1774 <    }
1816 >    struct MaskItem *conf = conf_make(CONF_SERVICE);
1817 >    conf->name = xstrdup(yylval.string);
1818    }
1819   };
1820  
# Line 1985 | Line 2028 | connect_entry: CONNECT
2028        !block_state.host.buf[0])
2029      break;
2030  
2031 <  if (!(block_state.rpass.buf[0] ||
2032 <        block_state.spass.buf[0]))
2031 >  if (!block_state.rpass.buf[0] ||
2032 >      !block_state.spass.buf[0])
2033      break;
2034  
2035    if (has_wildcards(block_state.name.buf) ||
# Line 2613 | Line 2656 | umode_oitem:     T_BOTS
2656   } | T_CCONN
2657   {
2658    ConfigFileEntry.oper_umodes |= UMODE_CCONN;
2616 } | T_CCONN_FULL
2617 {
2618  ConfigFileEntry.oper_umodes |= UMODE_CCONN_FULL;
2659   } | T_DEAF
2660   {
2661    ConfigFileEntry.oper_umodes |= UMODE_DEAF;
# Line 2687 | Line 2727 | umode_item:    T_BOTS
2727   } | T_CCONN
2728   {
2729    ConfigFileEntry.oper_only_umodes |= UMODE_CCONN;
2690 } | T_CCONN_FULL
2691 {
2692  ConfigFileEntry.oper_only_umodes |= UMODE_CCONN_FULL;
2730   } | T_DEAF
2731   {
2732    ConfigFileEntry.oper_only_umodes |= UMODE_DEAF;

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)