1: /* $NetBSD: cfparse.y,v 1.42 2011/03/14 15:50:36 vanhu Exp $ */
2:
3: /* Id: cfparse.y,v 1.66 2006/08/22 18:17:17 manubsd Exp */
4:
5: %{
6: /*
7: * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 and 2003 WIDE Project.
8: * All rights reserved.
9: *
10: * Redistribution and use in source and binary forms, with or without
11: * modification, are permitted provided that the following conditions
12: * are met:
13: * 1. Redistributions of source code must retain the above copyright
14: * notice, this list of conditions and the following disclaimer.
15: * 2. Redistributions in binary form must reproduce the above copyright
16: * notice, this list of conditions and the following disclaimer in the
17: * documentation and/or other materials provided with the distribution.
18: * 3. Neither the name of the project nor the names of its contributors
19: * may be used to endorse or promote products derived from this software
20: * without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32: * SUCH DAMAGE.
33: */
34:
35: #include "config.h"
36:
37: #include <sys/types.h>
38: #include <sys/param.h>
39: #include <sys/queue.h>
40: #include <sys/socket.h>
41:
42: #include <netinet/in.h>
43: #include PATH_IPSEC_H
44:
45: #ifdef ENABLE_HYBRID
46: #include <arpa/inet.h>
47: #endif
48:
49: #include <stdlib.h>
50: #include <stdio.h>
51: #include <string.h>
52: #include <errno.h>
53: #include <netdb.h>
54: #include <pwd.h>
55: #include <grp.h>
56:
57: #include "var.h"
58: #include "misc.h"
59: #include "vmbuf.h"
60: #include "plog.h"
61: #include "sockmisc.h"
62: #include "str2val.h"
63: #include "genlist.h"
64: #include "debug.h"
65:
66: #include "admin.h"
67: #include "privsep.h"
68: #include "cfparse_proto.h"
69: #include "cftoken_proto.h"
70: #include "algorithm.h"
71: #include "localconf.h"
72: #include "policy.h"
73: #include "sainfo.h"
74: #include "oakley.h"
75: #include "pfkey.h"
76: #include "remoteconf.h"
77: #include "grabmyaddr.h"
78: #include "isakmp_var.h"
79: #include "handler.h"
80: #include "isakmp.h"
81: #include "nattraversal.h"
82: #include "isakmp_frag.h"
83: #ifdef ENABLE_HYBRID
84: #include "resolv.h"
85: #include "isakmp_unity.h"
86: #include "isakmp_xauth.h"
87: #include "isakmp_cfg.h"
88: #endif
89: #include "ipsec_doi.h"
90: #include "strnames.h"
91: #include "gcmalloc.h"
92: #ifdef HAVE_GSSAPI
93: #include "gssapi.h"
94: #endif
95: #include "vendorid.h"
96: #include "rsalist.h"
97: #include "crypto_openssl.h"
98:
99: struct secprotospec {
100: int prop_no;
101: int trns_no;
102: int strength; /* for isakmp/ipsec */
103: int encklen; /* for isakmp/ipsec */
104: time_t lifetime; /* for isakmp */
105: int lifebyte; /* for isakmp */
106: int proto_id; /* for ipsec (isakmp?) */
107: int ipsec_level; /* for ipsec */
108: int encmode; /* for ipsec */
109: int vendorid; /* for isakmp */
110: char *gssid;
111: struct sockaddr *remote;
112: int algclass[MAXALGCLASS];
113:
114: struct secprotospec *next; /* the tail is the most prefiered. */
115: struct secprotospec *prev;
116: };
117:
118: static int num2dhgroup[] = {
119: 0,
120: OAKLEY_ATTR_GRP_DESC_MODP768,
121: OAKLEY_ATTR_GRP_DESC_MODP1024,
122: OAKLEY_ATTR_GRP_DESC_EC2N155,
123: OAKLEY_ATTR_GRP_DESC_EC2N185,
124: OAKLEY_ATTR_GRP_DESC_MODP1536,
125: 0,
126: 0,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: OAKLEY_ATTR_GRP_DESC_MODP2048,
134: OAKLEY_ATTR_GRP_DESC_MODP3072,
135: OAKLEY_ATTR_GRP_DESC_MODP4096,
136: OAKLEY_ATTR_GRP_DESC_MODP6144,
137: OAKLEY_ATTR_GRP_DESC_MODP8192
138: };
139:
140: static struct remoteconf *cur_rmconf;
141: static int tmpalgtype[MAXALGCLASS];
142: static struct sainfo *cur_sainfo;
143: static int cur_algclass;
144: static int oldloglevel = LLV_BASE;
145:
146: static struct secprotospec *newspspec __P((void));
147: static void insspspec __P((struct remoteconf *, struct secprotospec *));
148: void dupspspec_list __P((struct remoteconf *dst, struct remoteconf *src));
149: void flushspspec __P((struct remoteconf *));
150: static void adminsock_conf __P((vchar_t *, vchar_t *, vchar_t *, int));
151:
152: static int set_isakmp_proposal __P((struct remoteconf *));
153: static void clean_tmpalgtype __P((void));
154: static int expand_isakmpspec __P((int, int, int *,
155: int, int, time_t, int, int, int, char *, struct remoteconf *));
156:
157: void freeetypes (struct etypes **etypes);
158:
159: static int load_x509(const char *file, char **filenameptr,
160: vchar_t **certptr)
161: {
162: char path[PATH_MAX];
163:
164: getpathname(path, sizeof(path), LC_PATHTYPE_CERT, file);
165: *certptr = eay_get_x509cert(path);
166: if (*certptr == NULL)
167: return -1;
168:
169: *filenameptr = racoon_strdup(file);
170: STRDUP_FATAL(*filenameptr);
171:
172: return 0;
173: }
174:
175: %}
176:
177: %union {
178: unsigned long num;
179: vchar_t *val;
180: struct remoteconf *rmconf;
181: struct sockaddr *saddr;
182: struct sainfoalg *alg;
183: }
184:
185: /* privsep */
186: %token PRIVSEP USER GROUP CHROOT
187: /* path */
188: %token PATH PATHTYPE
189: /* include */
190: %token INCLUDE
191: /* PFKEY_BUFFER */
192: %token PFKEY_BUFFER
193: /* logging */
194: %token LOGGING LOGLEV
195: /* padding */
196: %token PADDING PAD_RANDOMIZE PAD_RANDOMIZELEN PAD_MAXLEN PAD_STRICT PAD_EXCLTAIL
197: /* listen */
198: %token LISTEN X_ISAKMP X_ISAKMP_NATT X_ADMIN STRICT_ADDRESS ADMINSOCK DISABLED
199: /* ldap config */
200: %token LDAPCFG LDAP_HOST LDAP_PORT LDAP_PVER LDAP_BASE LDAP_BIND_DN LDAP_BIND_PW LDAP_SUBTREE
201: %token LDAP_ATTR_USER LDAP_ATTR_ADDR LDAP_ATTR_MASK LDAP_ATTR_GROUP LDAP_ATTR_MEMBER
202: /* radius config */
203: %token RADCFG RAD_AUTH RAD_ACCT RAD_TIMEOUT RAD_RETRIES
204: /* modecfg */
205: %token MODECFG CFG_NET4 CFG_MASK4 CFG_DNS4 CFG_NBNS4 CFG_DEFAULT_DOMAIN
206: %token CFG_AUTH_SOURCE CFG_AUTH_GROUPS CFG_SYSTEM CFG_RADIUS CFG_PAM CFG_LDAP CFG_LOCAL CFG_NONE
207: %token CFG_GROUP_SOURCE CFG_ACCOUNTING CFG_CONF_SOURCE CFG_MOTD CFG_POOL_SIZE CFG_AUTH_THROTTLE
208: %token CFG_SPLIT_NETWORK CFG_SPLIT_LOCAL CFG_SPLIT_INCLUDE CFG_SPLIT_DNS
209: %token CFG_PFS_GROUP CFG_SAVE_PASSWD
210:
211: /* timer */
212: %token RETRY RETRY_COUNTER RETRY_INTERVAL RETRY_PERSEND
213: %token RETRY_PHASE1 RETRY_PHASE2 NATT_KA
214: /* algorithm */
215: %token ALGORITHM_CLASS ALGORITHMTYPE STRENGTHTYPE
216: /* sainfo */
217: %token SAINFO FROM
218: /* remote */
219: %token REMOTE ANONYMOUS CLIENTADDR INHERIT REMOTE_ADDRESS
220: %token EXCHANGE_MODE EXCHANGETYPE DOI DOITYPE SITUATION SITUATIONTYPE
221: %token CERTIFICATE_TYPE CERTTYPE PEERS_CERTFILE CA_TYPE
222: %token VERIFY_CERT SEND_CERT SEND_CR MATCH_EMPTY_CR
223: %token IDENTIFIERTYPE IDENTIFIERQUAL MY_IDENTIFIER
224: %token PEERS_IDENTIFIER VERIFY_IDENTIFIER
225: %token DNSSEC CERT_X509 CERT_PLAINRSA
226: %token NONCE_SIZE DH_GROUP KEEPALIVE PASSIVE INITIAL_CONTACT
227: %token NAT_TRAVERSAL REMOTE_FORCE_LEVEL
228: %token PROPOSAL_CHECK PROPOSAL_CHECK_LEVEL
229: %token GENERATE_POLICY GENERATE_LEVEL SUPPORT_PROXY
230: %token PROPOSAL
231: %token EXEC_PATH EXEC_COMMAND EXEC_SUCCESS EXEC_FAILURE
232: %token GSS_ID GSS_ID_ENC GSS_ID_ENCTYPE
233: %token COMPLEX_BUNDLE
234: %token DPD DPD_DELAY DPD_RETRY DPD_MAXFAIL
235: %token PH1ID
236: %token XAUTH_LOGIN WEAK_PHASE1_CHECK
237: %token REKEY
238:
239: %token PREFIX PORT PORTANY UL_PROTO ANY IKE_FRAG ESP_FRAG MODE_CFG
240: %token PFS_GROUP LIFETIME LIFETYPE_TIME LIFETYPE_BYTE STRENGTH REMOTEID
241:
242: %token SCRIPT PHASE1_UP PHASE1_DOWN PHASE1_DEAD
243:
244: %token NUMBER SWITCH BOOLEAN
245: %token HEXSTRING QUOTEDSTRING ADDRSTRING ADDRRANGE
246: %token UNITTYPE_BYTE UNITTYPE_KBYTES UNITTYPE_MBYTES UNITTYPE_TBYTES
247: %token UNITTYPE_SEC UNITTYPE_MIN UNITTYPE_HOUR
248: %token EOS BOC EOC COMMA
249:
250: %type <num> NUMBER BOOLEAN SWITCH keylength
251: %type <num> PATHTYPE IDENTIFIERTYPE IDENTIFIERQUAL LOGLEV GSS_ID_ENCTYPE
252: %type <num> ALGORITHM_CLASS dh_group_num
253: %type <num> ALGORITHMTYPE STRENGTHTYPE
254: %type <num> PREFIX prefix PORT port ike_port
255: %type <num> ul_proto UL_PROTO
256: %type <num> EXCHANGETYPE DOITYPE SITUATIONTYPE
257: %type <num> CERTTYPE CERT_X509 CERT_PLAINRSA PROPOSAL_CHECK_LEVEL REMOTE_FORCE_LEVEL GENERATE_LEVEL
258: %type <num> unittype_time unittype_byte
259: %type <val> QUOTEDSTRING HEXSTRING ADDRSTRING ADDRRANGE sainfo_id
260: %type <val> identifierstring
261: %type <saddr> remote_index ike_addrinfo_port
262: %type <alg> algorithm
263:
264: %%
265:
266: statements
267: : /* nothing */
268: | statements statement
269: ;
270: statement
271: : privsep_statement
272: | path_statement
273: | include_statement
274: | pfkey_statement
275: | gssenc_statement
276: | logging_statement
277: | padding_statement
278: | listen_statement
279: | ldapcfg_statement
280: | radcfg_statement
281: | modecfg_statement
282: | timer_statement
283: | sainfo_statement
284: | remote_statement
285: | special_statement
286: ;
287:
288: /* privsep */
289: privsep_statement
290: : PRIVSEP BOC privsep_stmts EOC
291: ;
292: privsep_stmts
293: : /* nothing */
294: | privsep_stmts privsep_stmt
295: ;
296: privsep_stmt
297: : USER QUOTEDSTRING
298: {
299: struct passwd *pw;
300:
301: if ((pw = getpwnam($2->v)) == NULL) {
302: yyerror("unknown user \"%s\"", $2->v);
303: return -1;
304: }
305: lcconf->uid = pw->pw_uid;
306: }
307: EOS
308: | USER NUMBER { lcconf->uid = $2; } EOS
309: | GROUP QUOTEDSTRING
310: {
311: struct group *gr;
312:
313: if ((gr = getgrnam($2->v)) == NULL) {
314: yyerror("unknown group \"%s\"", $2->v);
315: return -1;
316: }
317: lcconf->gid = gr->gr_gid;
318: }
319: EOS
320: | GROUP NUMBER { lcconf->gid = $2; } EOS
321: | CHROOT QUOTEDSTRING { lcconf->chroot = $2->v; } EOS
322: ;
323:
324: /* path */
325: path_statement
326: : PATH PATHTYPE QUOTEDSTRING
327: {
328: if ($2 >= LC_PATHTYPE_MAX) {
329: yyerror("invalid path type %d", $2);
330: return -1;
331: }
332:
333: /* free old pathinfo */
334: if (lcconf->pathinfo[$2])
335: racoon_free(lcconf->pathinfo[$2]);
336:
337: /* set new pathinfo */
338: lcconf->pathinfo[$2] = racoon_strdup($3->v);
339: STRDUP_FATAL(lcconf->pathinfo[$2]);
340: vfree($3);
341: }
342: EOS
343: ;
344:
345: /* special */
346: special_statement
347: : COMPLEX_BUNDLE SWITCH { lcconf->complex_bundle = $2; } EOS
348: ;
349:
350: /* include */
351: include_statement
352: : INCLUDE QUOTEDSTRING EOS
353: {
354: char path[MAXPATHLEN];
355:
356: getpathname(path, sizeof(path),
357: LC_PATHTYPE_INCLUDE, $2->v);
358: vfree($2);
359: if (yycf_switch_buffer(path) != 0)
360: return -1;
361: }
362: ;
363:
364: /* pfkey_buffer */
365: pfkey_statement
366: : PFKEY_BUFFER NUMBER EOS
367: {
368: lcconf->pfkey_buffer_size = $2;
369: }
370: ;
371: /* gss_id_enc */
372: gssenc_statement
373: : GSS_ID_ENC GSS_ID_ENCTYPE EOS
374: {
375: if ($2 >= LC_GSSENC_MAX) {
376: yyerror("invalid GSS ID encoding %d", $2);
377: return -1;
378: }
379: lcconf->gss_id_enc = $2;
380: }
381: ;
382:
383: /* logging */
384: logging_statement
385: : LOGGING log_level EOS
386: ;
387: log_level
388: : LOGLEV
389: {
390: /*
391: * set the loglevel to the value specified
392: * in the configuration file plus the number
393: * of -d options specified on the command line
394: */
395: loglevel += $1 - oldloglevel;
396: oldloglevel = $1;
397: }
398: ;
399:
400: /* padding */
401: padding_statement
402: : PADDING BOC padding_stmts EOC
403: ;
404: padding_stmts
405: : /* nothing */
406: | padding_stmts padding_stmt
407: ;
408: padding_stmt
409: : PAD_RANDOMIZE SWITCH { lcconf->pad_random = $2; } EOS
410: | PAD_RANDOMIZELEN SWITCH { lcconf->pad_randomlen = $2; } EOS
411: | PAD_MAXLEN NUMBER { lcconf->pad_maxsize = $2; } EOS
412: | PAD_STRICT SWITCH { lcconf->pad_strict = $2; } EOS
413: | PAD_EXCLTAIL SWITCH { lcconf->pad_excltail = $2; } EOS
414: ;
415:
416: /* listen */
417: listen_statement
418: : LISTEN BOC listen_stmts EOC
419: ;
420: listen_stmts
421: : /* nothing */
422: | listen_stmts listen_stmt
423: ;
424: listen_stmt
425: : X_ISAKMP ike_addrinfo_port
426: {
427: myaddr_listen($2, FALSE);
428: racoon_free($2);
429: }
430: EOS
431: | X_ISAKMP_NATT ike_addrinfo_port
432: {
433: #ifdef ENABLE_NATT
434: myaddr_listen($2, TRUE);
435: racoon_free($2);
436: #else
437: racoon_free($2);
438: yyerror("NAT-T support not compiled in.");
439: #endif
440: }
441: EOS
442: | ADMINSOCK QUOTEDSTRING QUOTEDSTRING QUOTEDSTRING NUMBER
443: {
444: #ifdef ENABLE_ADMINPORT
445: adminsock_conf($2, $3, $4, $5);
446: #else
447: yywarn("admin port support not compiled in");
448: #endif
449: }
450: EOS
451: | ADMINSOCK QUOTEDSTRING
452: {
453: #ifdef ENABLE_ADMINPORT
454: adminsock_conf($2, NULL, NULL, -1);
455: #else
456: yywarn("admin port support not compiled in");
457: #endif
458: }
459: EOS
460: | ADMINSOCK DISABLED
461: {
462: #ifdef ENABLE_ADMINPORT
463: adminsock_path = NULL;
464: #else
465: yywarn("admin port support not compiled in");
466: #endif
467: }
468: EOS
469: | STRICT_ADDRESS { lcconf->strict_address = TRUE; } EOS
470: ;
471: ike_addrinfo_port
472: : ADDRSTRING ike_port
473: {
474: char portbuf[10];
475:
476: snprintf(portbuf, sizeof(portbuf), "%ld", $2);
477: $$ = str2saddr($1->v, portbuf);
478: vfree($1);
479: if (!$$)
480: return -1;
481: }
482: ;
483: ike_port
484: : /* nothing */ { $$ = PORT_ISAKMP; }
485: | PORT { $$ = $1; }
486: ;
487:
488: /* radius configuration */
489: radcfg_statement
490: : RADCFG {
491: #ifndef ENABLE_HYBRID
492: yyerror("racoon not configured with --enable-hybrid");
493: return -1;
494: #endif
495: #ifndef HAVE_LIBRADIUS
496: yyerror("racoon not configured with --with-libradius");
497: return -1;
498: #endif
499: #ifdef ENABLE_HYBRID
500: #ifdef HAVE_LIBRADIUS
501: xauth_rad_config.timeout = 3;
502: xauth_rad_config.retries = 3;
503: #endif
504: #endif
505: } BOC radcfg_stmts EOC
506: ;
507: radcfg_stmts
508: : /* nothing */
509: | radcfg_stmts radcfg_stmt
510: ;
511: radcfg_stmt
512: : RAD_AUTH QUOTEDSTRING QUOTEDSTRING
513: {
514: #ifdef ENABLE_HYBRID
515: #ifdef HAVE_LIBRADIUS
516: int i = xauth_rad_config.auth_server_count;
517: if (i == RADIUS_MAX_SERVERS) {
518: yyerror("maximum radius auth servers exceeded");
519: return -1;
520: }
521:
522: xauth_rad_config.auth_server_list[i].host = vdup($2);
523: xauth_rad_config.auth_server_list[i].secret = vdup($3);
524: xauth_rad_config.auth_server_list[i].port = 0; // default port
525: xauth_rad_config.auth_server_count++;
526: #endif
527: #endif
528: }
529: EOS
530: | RAD_AUTH QUOTEDSTRING NUMBER QUOTEDSTRING
531: {
532: #ifdef ENABLE_HYBRID
533: #ifdef HAVE_LIBRADIUS
534: int i = xauth_rad_config.auth_server_count;
535: if (i == RADIUS_MAX_SERVERS) {
536: yyerror("maximum radius auth servers exceeded");
537: return -1;
538: }
539:
540: xauth_rad_config.auth_server_list[i].host = vdup($2);
541: xauth_rad_config.auth_server_list[i].secret = vdup($4);
542: xauth_rad_config.auth_server_list[i].port = $3;
543: xauth_rad_config.auth_server_count++;
544: #endif
545: #endif
546: }
547: EOS
548: | RAD_ACCT QUOTEDSTRING QUOTEDSTRING
549: {
550: #ifdef ENABLE_HYBRID
551: #ifdef HAVE_LIBRADIUS
552: int i = xauth_rad_config.acct_server_count;
553: if (i == RADIUS_MAX_SERVERS) {
554: yyerror("maximum radius account servers exceeded");
555: return -1;
556: }
557:
558: xauth_rad_config.acct_server_list[i].host = vdup($2);
559: xauth_rad_config.acct_server_list[i].secret = vdup($3);
560: xauth_rad_config.acct_server_list[i].port = 0; // default port
561: xauth_rad_config.acct_server_count++;
562: #endif
563: #endif
564: }
565: EOS
566: | RAD_ACCT QUOTEDSTRING NUMBER QUOTEDSTRING
567: {
568: #ifdef ENABLE_HYBRID
569: #ifdef HAVE_LIBRADIUS
570: int i = xauth_rad_config.acct_server_count;
571: if (i == RADIUS_MAX_SERVERS) {
572: yyerror("maximum radius account servers exceeded");
573: return -1;
574: }
575:
576: xauth_rad_config.acct_server_list[i].host = vdup($2);
577: xauth_rad_config.acct_server_list[i].secret = vdup($4);
578: xauth_rad_config.acct_server_list[i].port = $3;
579: xauth_rad_config.acct_server_count++;
580: #endif
581: #endif
582: }
583: EOS
584: | RAD_TIMEOUT NUMBER
585: {
586: #ifdef ENABLE_HYBRID
587: #ifdef HAVE_LIBRADIUS
588: xauth_rad_config.timeout = $2;
589: #endif
590: #endif
591: }
592: EOS
593: | RAD_RETRIES NUMBER
594: {
595: #ifdef ENABLE_HYBRID
596: #ifdef HAVE_LIBRADIUS
597: xauth_rad_config.retries = $2;
598: #endif
599: #endif
600: }
601: EOS
602: ;
603:
604: /* ldap configuration */
605: ldapcfg_statement
606: : LDAPCFG {
607: #ifndef ENABLE_HYBRID
608: yyerror("racoon not configured with --enable-hybrid");
609: return -1;
610: #endif
611: #ifndef HAVE_LIBLDAP
612: yyerror("racoon not configured with --with-libldap");
613: return -1;
614: #endif
615: } BOC ldapcfg_stmts EOC
616: ;
617: ldapcfg_stmts
618: : /* nothing */
619: | ldapcfg_stmts ldapcfg_stmt
620: ;
621: ldapcfg_stmt
622: : LDAP_PVER NUMBER
623: {
624: #ifdef ENABLE_HYBRID
625: #ifdef HAVE_LIBLDAP
626: if (($2<2)||($2>3))
627: yyerror("invalid ldap protocol version (2|3)");
628: xauth_ldap_config.pver = $2;
629: #endif
630: #endif
631: }
632: EOS
633: | LDAP_HOST QUOTEDSTRING
634: {
635: #ifdef ENABLE_HYBRID
636: #ifdef HAVE_LIBLDAP
637: if (xauth_ldap_config.host != NULL)
638: vfree(xauth_ldap_config.host);
639: xauth_ldap_config.host = vdup($2);
640: #endif
641: #endif
642: }
643: EOS
644: | LDAP_PORT NUMBER
645: {
646: #ifdef ENABLE_HYBRID
647: #ifdef HAVE_LIBLDAP
648: xauth_ldap_config.port = $2;
649: #endif
650: #endif
651: }
652: EOS
653: | LDAP_BASE QUOTEDSTRING
654: {
655: #ifdef ENABLE_HYBRID
656: #ifdef HAVE_LIBLDAP
657: if (xauth_ldap_config.base != NULL)
658: vfree(xauth_ldap_config.base);
659: xauth_ldap_config.base = vdup($2);
660: #endif
661: #endif
662: }
663: EOS
664: | LDAP_SUBTREE SWITCH
665: {
666: #ifdef ENABLE_HYBRID
667: #ifdef HAVE_LIBLDAP
668: xauth_ldap_config.subtree = $2;
669: #endif
670: #endif
671: }
672: EOS
673: | LDAP_BIND_DN QUOTEDSTRING
674: {
675: #ifdef ENABLE_HYBRID
676: #ifdef HAVE_LIBLDAP
677: if (xauth_ldap_config.bind_dn != NULL)
678: vfree(xauth_ldap_config.bind_dn);
679: xauth_ldap_config.bind_dn = vdup($2);
680: #endif
681: #endif
682: }
683: EOS
684: | LDAP_BIND_PW QUOTEDSTRING
685: {
686: #ifdef ENABLE_HYBRID
687: #ifdef HAVE_LIBLDAP
688: if (xauth_ldap_config.bind_pw != NULL)
689: vfree(xauth_ldap_config.bind_pw);
690: xauth_ldap_config.bind_pw = vdup($2);
691: #endif
692: #endif
693: }
694: EOS
695: | LDAP_ATTR_USER QUOTEDSTRING
696: {
697: #ifdef ENABLE_HYBRID
698: #ifdef HAVE_LIBLDAP
699: if (xauth_ldap_config.attr_user != NULL)
700: vfree(xauth_ldap_config.attr_user);
701: xauth_ldap_config.attr_user = vdup($2);
702: #endif
703: #endif
704: }
705: EOS
706: | LDAP_ATTR_ADDR QUOTEDSTRING
707: {
708: #ifdef ENABLE_HYBRID
709: #ifdef HAVE_LIBLDAP
710: if (xauth_ldap_config.attr_addr != NULL)
711: vfree(xauth_ldap_config.attr_addr);
712: xauth_ldap_config.attr_addr = vdup($2);
713: #endif
714: #endif
715: }
716: EOS
717: | LDAP_ATTR_MASK QUOTEDSTRING
718: {
719: #ifdef ENABLE_HYBRID
720: #ifdef HAVE_LIBLDAP
721: if (xauth_ldap_config.attr_mask != NULL)
722: vfree(xauth_ldap_config.attr_mask);
723: xauth_ldap_config.attr_mask = vdup($2);
724: #endif
725: #endif
726: }
727: EOS
728: | LDAP_ATTR_GROUP QUOTEDSTRING
729: {
730: #ifdef ENABLE_HYBRID
731: #ifdef HAVE_LIBLDAP
732: if (xauth_ldap_config.attr_group != NULL)
733: vfree(xauth_ldap_config.attr_group);
734: xauth_ldap_config.attr_group = vdup($2);
735: #endif
736: #endif
737: }
738: EOS
739: | LDAP_ATTR_MEMBER QUOTEDSTRING
740: {
741: #ifdef ENABLE_HYBRID
742: #ifdef HAVE_LIBLDAP
743: if (xauth_ldap_config.attr_member != NULL)
744: vfree(xauth_ldap_config.attr_member);
745: xauth_ldap_config.attr_member = vdup($2);
746: #endif
747: #endif
748: }
749: EOS
750: ;
751:
752: /* modecfg */
753: modecfg_statement
754: : MODECFG BOC modecfg_stmts EOC
755: ;
756: modecfg_stmts
757: : /* nothing */
758: | modecfg_stmts modecfg_stmt
759: ;
760: modecfg_stmt
761: : CFG_NET4 ADDRSTRING
762: {
763: #ifdef ENABLE_HYBRID
764: if (inet_pton(AF_INET, $2->v,
765: &isakmp_cfg_config.network4) != 1)
766: yyerror("bad IPv4 network address.");
767: #else
768: yyerror("racoon not configured with --enable-hybrid");
769: #endif
770: }
771: EOS
772: | CFG_MASK4 ADDRSTRING
773: {
774: #ifdef ENABLE_HYBRID
775: if (inet_pton(AF_INET, $2->v,
776: &isakmp_cfg_config.netmask4) != 1)
777: yyerror("bad IPv4 netmask address.");
778: #else
779: yyerror("racoon not configured with --enable-hybrid");
780: #endif
781: }
782: EOS
783: | CFG_DNS4 addrdnslist
784: EOS
785: | CFG_NBNS4 addrwinslist
786: EOS
787: | CFG_SPLIT_NETWORK CFG_SPLIT_LOCAL splitnetlist
788: {
789: #ifdef ENABLE_HYBRID
790: isakmp_cfg_config.splitnet_type = UNITY_LOCAL_LAN;
791: #else
792: yyerror("racoon not configured with --enable-hybrid");
793: #endif
794: }
795: EOS
796: | CFG_SPLIT_NETWORK CFG_SPLIT_INCLUDE splitnetlist
797: {
798: #ifdef ENABLE_HYBRID
799: isakmp_cfg_config.splitnet_type = UNITY_SPLIT_INCLUDE;
800: #else
801: yyerror("racoon not configured with --enable-hybrid");
802: #endif
803: }
804: EOS
805: | CFG_SPLIT_DNS splitdnslist
806: {
807: #ifndef ENABLE_HYBRID
808: yyerror("racoon not configured with --enable-hybrid");
809: #endif
810: }
811: EOS
812: | CFG_DEFAULT_DOMAIN QUOTEDSTRING
813: {
814: #ifdef ENABLE_HYBRID
815: strncpy(&isakmp_cfg_config.default_domain[0],
816: $2->v, MAXPATHLEN);
817: isakmp_cfg_config.default_domain[MAXPATHLEN] = '\0';
818: vfree($2);
819: #else
820: yyerror("racoon not configured with --enable-hybrid");
821: #endif
822: }
823: EOS
824: | CFG_AUTH_SOURCE CFG_SYSTEM
825: {
826: #ifdef ENABLE_HYBRID
827: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_SYSTEM;
828: #else
829: yyerror("racoon not configured with --enable-hybrid");
830: #endif
831: }
832: EOS
833: | CFG_AUTH_SOURCE CFG_RADIUS
834: {
835: #ifdef ENABLE_HYBRID
836: #ifdef HAVE_LIBRADIUS
837: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_RADIUS;
838: #else /* HAVE_LIBRADIUS */
839: yyerror("racoon not configured with --with-libradius");
840: #endif /* HAVE_LIBRADIUS */
841: #else /* ENABLE_HYBRID */
842: yyerror("racoon not configured with --enable-hybrid");
843: #endif /* ENABLE_HYBRID */
844: }
845: EOS
846: | CFG_AUTH_SOURCE CFG_PAM
847: {
848: #ifdef ENABLE_HYBRID
849: #ifdef HAVE_LIBPAM
850: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_PAM;
851: #else /* HAVE_LIBPAM */
852: yyerror("racoon not configured with --with-libpam");
853: #endif /* HAVE_LIBPAM */
854: #else /* ENABLE_HYBRID */
855: yyerror("racoon not configured with --enable-hybrid");
856: #endif /* ENABLE_HYBRID */
857: }
858: EOS
859: | CFG_AUTH_SOURCE CFG_LDAP
860: {
861: #ifdef ENABLE_HYBRID
862: #ifdef HAVE_LIBLDAP
863: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_LDAP;
864: #else /* HAVE_LIBLDAP */
865: yyerror("racoon not configured with --with-libldap");
866: #endif /* HAVE_LIBLDAP */
867: #else /* ENABLE_HYBRID */
868: yyerror("racoon not configured with --enable-hybrid");
869: #endif /* ENABLE_HYBRID */
870: }
871: EOS
872: | CFG_AUTH_GROUPS authgrouplist
873: {
874: #ifndef ENABLE_HYBRID
875: yyerror("racoon not configured with --enable-hybrid");
876: #endif
877: }
878: EOS
879: | CFG_GROUP_SOURCE CFG_SYSTEM
880: {
881: #ifdef ENABLE_HYBRID
882: isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_SYSTEM;
883: #else
884: yyerror("racoon not configured with --enable-hybrid");
885: #endif
886: }
887: EOS
888: | CFG_GROUP_SOURCE CFG_LDAP
889: {
890: #ifdef ENABLE_HYBRID
891: #ifdef HAVE_LIBLDAP
892: isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_LDAP;
893: #else /* HAVE_LIBLDAP */
894: yyerror("racoon not configured with --with-libldap");
895: #endif /* HAVE_LIBLDAP */
896: #else /* ENABLE_HYBRID */
897: yyerror("racoon not configured with --enable-hybrid");
898: #endif /* ENABLE_HYBRID */
899: }
900: EOS
901: | CFG_ACCOUNTING CFG_NONE
902: {
903: #ifdef ENABLE_HYBRID
904: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_NONE;
905: #else
906: yyerror("racoon not configured with --enable-hybrid");
907: #endif
908: }
909: EOS
910: | CFG_ACCOUNTING CFG_SYSTEM
911: {
912: #ifdef ENABLE_HYBRID
913: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_SYSTEM;
914: #else
915: yyerror("racoon not configured with --enable-hybrid");
916: #endif
917: }
918: EOS
919: | CFG_ACCOUNTING CFG_RADIUS
920: {
921: #ifdef ENABLE_HYBRID
922: #ifdef HAVE_LIBRADIUS
923: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_RADIUS;
924: #else /* HAVE_LIBRADIUS */
925: yyerror("racoon not configured with --with-libradius");
926: #endif /* HAVE_LIBRADIUS */
927: #else /* ENABLE_HYBRID */
928: yyerror("racoon not configured with --enable-hybrid");
929: #endif /* ENABLE_HYBRID */
930: }
931: EOS
932: | CFG_ACCOUNTING CFG_PAM
933: {
934: #ifdef ENABLE_HYBRID
935: #ifdef HAVE_LIBPAM
936: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_PAM;
937: #else /* HAVE_LIBPAM */
938: yyerror("racoon not configured with --with-libpam");
939: #endif /* HAVE_LIBPAM */
940: #else /* ENABLE_HYBRID */
941: yyerror("racoon not configured with --enable-hybrid");
942: #endif /* ENABLE_HYBRID */
943: }
944: EOS
945: | CFG_POOL_SIZE NUMBER
946: {
947: #ifdef ENABLE_HYBRID
948: if (isakmp_cfg_resize_pool($2) != 0)
949: yyerror("cannot allocate memory for pool");
950: #else /* ENABLE_HYBRID */
951: yyerror("racoon not configured with --enable-hybrid");
952: #endif /* ENABLE_HYBRID */
953: }
954: EOS
955: | CFG_PFS_GROUP NUMBER
956: {
957: #ifdef ENABLE_HYBRID
958: isakmp_cfg_config.pfs_group = $2;
959: #else /* ENABLE_HYBRID */
960: yyerror("racoon not configured with --enable-hybrid");
961: #endif /* ENABLE_HYBRID */
962: }
963: EOS
964: | CFG_SAVE_PASSWD SWITCH
965: {
966: #ifdef ENABLE_HYBRID
967: isakmp_cfg_config.save_passwd = $2;
968: #else /* ENABLE_HYBRID */
969: yyerror("racoon not configured with --enable-hybrid");
970: #endif /* ENABLE_HYBRID */
971: }
972: EOS
973: | CFG_AUTH_THROTTLE NUMBER
974: {
975: #ifdef ENABLE_HYBRID
976: isakmp_cfg_config.auth_throttle = $2;
977: #else /* ENABLE_HYBRID */
978: yyerror("racoon not configured with --enable-hybrid");
979: #endif /* ENABLE_HYBRID */
980: }
981: EOS
982: | CFG_CONF_SOURCE CFG_LOCAL
983: {
984: #ifdef ENABLE_HYBRID
985: isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LOCAL;
986: #else /* ENABLE_HYBRID */
987: yyerror("racoon not configured with --enable-hybrid");
988: #endif /* ENABLE_HYBRID */
989: }
990: EOS
991: | CFG_CONF_SOURCE CFG_RADIUS
992: {
993: #ifdef ENABLE_HYBRID
994: #ifdef HAVE_LIBRADIUS
995: isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_RADIUS;
996: #else /* HAVE_LIBRADIUS */
997: yyerror("racoon not configured with --with-libradius");
998: #endif /* HAVE_LIBRADIUS */
999: #else /* ENABLE_HYBRID */
1000: yyerror("racoon not configured with --enable-hybrid");
1001: #endif /* ENABLE_HYBRID */
1002: }
1003: EOS
1004: | CFG_CONF_SOURCE CFG_LDAP
1005: {
1006: #ifdef ENABLE_HYBRID
1007: #ifdef HAVE_LIBLDAP
1008: isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LDAP;
1009: #else /* HAVE_LIBLDAP */
1010: yyerror("racoon not configured with --with-libldap");
1011: #endif /* HAVE_LIBLDAP */
1012: #else /* ENABLE_HYBRID */
1013: yyerror("racoon not configured with --enable-hybrid");
1014: #endif /* ENABLE_HYBRID */
1015: }
1016: EOS
1017: | CFG_MOTD QUOTEDSTRING
1018: {
1019: #ifdef ENABLE_HYBRID
1020: strncpy(&isakmp_cfg_config.motd[0], $2->v, MAXPATHLEN);
1021: isakmp_cfg_config.motd[MAXPATHLEN] = '\0';
1022: vfree($2);
1023: #else
1024: yyerror("racoon not configured with --enable-hybrid");
1025: #endif
1026: }
1027: EOS
1028: ;
1029:
1030: addrdnslist
1031: : addrdns
1032: | addrdns COMMA addrdnslist
1033: ;
1034: addrdns
1035: : ADDRSTRING
1036: {
1037: #ifdef ENABLE_HYBRID
1038: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
1039:
1040: if (icc->dns4_index > MAXNS)
1041: yyerror("No more than %d DNS", MAXNS);
1042: if (inet_pton(AF_INET, $1->v,
1043: &icc->dns4[icc->dns4_index++]) != 1)
1044: yyerror("bad IPv4 DNS address.");
1045: #else
1046: yyerror("racoon not configured with --enable-hybrid");
1047: #endif
1048: }
1049: ;
1050:
1051: addrwinslist
1052: : addrwins
1053: | addrwins COMMA addrwinslist
1054: ;
1055: addrwins
1056: : ADDRSTRING
1057: {
1058: #ifdef ENABLE_HYBRID
1059: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
1060:
1061: if (icc->nbns4_index > MAXWINS)
1062: yyerror("No more than %d WINS", MAXWINS);
1063: if (inet_pton(AF_INET, $1->v,
1064: &icc->nbns4[icc->nbns4_index++]) != 1)
1065: yyerror("bad IPv4 WINS address.");
1066: #else
1067: yyerror("racoon not configured with --enable-hybrid");
1068: #endif
1069: }
1070: ;
1071:
1072: splitnetlist
1073: : splitnet
1074: | splitnetlist COMMA splitnet
1075: ;
1076: splitnet
1077: : ADDRSTRING PREFIX
1078: {
1079: #ifdef ENABLE_HYBRID
1080: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
1081: struct unity_network network;
1082: memset(&network,0,sizeof(network));
1083:
1084: if (inet_pton(AF_INET, $1->v, &network.addr4) != 1)
1085: yyerror("bad IPv4 SPLIT address.");
1086:
1087: /* Turn $2 (the prefix) into a subnet mask */
1088: network.mask4.s_addr = ($2) ? htonl(~((1 << (32 - $2)) - 1)) : 0;
1089:
1090: /* add the network to our list */
1091: if (splitnet_list_add(&icc->splitnet_list, &network,&icc->splitnet_count))
1092: yyerror("Unable to allocate split network");
1093: #else
1094: yyerror("racoon not configured with --enable-hybrid");
1095: #endif
1096: }
1097: ;
1098:
1099: authgrouplist
1100: : authgroup
1101: | authgroup COMMA authgrouplist
1102: ;
1103: authgroup
1104: : QUOTEDSTRING
1105: {
1106: #ifdef ENABLE_HYBRID
1107: char * groupname = NULL;
1108: char ** grouplist = NULL;
1109: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
1110:
1111: grouplist = racoon_realloc(icc->grouplist,
1112: sizeof(char**)*(icc->groupcount+1));
1113: if (grouplist == NULL) {
1114: yyerror("unable to allocate auth group list");
1115: return -1;
1116: }
1117:
1118: groupname = racoon_malloc($1->l+1);
1119: if (groupname == NULL) {
1120: yyerror("unable to allocate auth group name");
1121: return -1;
1122: }
1123:
1124: memcpy(groupname,$1->v,$1->l);
1125: groupname[$1->l]=0;
1126: grouplist[icc->groupcount]=groupname;
1127: icc->grouplist = grouplist;
1128: icc->groupcount++;
1129:
1130: vfree($1);
1131: #else
1132: yyerror("racoon not configured with --enable-hybrid");
1133: #endif
1134: }
1135: ;
1136:
1137: splitdnslist
1138: : splitdns
1139: | splitdns COMMA splitdnslist
1140: ;
1141: splitdns
1142: : QUOTEDSTRING
1143: {
1144: #ifdef ENABLE_HYBRID
1145: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
1146:
1147: if (!icc->splitdns_len)
1148: {
1149: icc->splitdns_list = racoon_malloc($1->l);
1150: if(icc->splitdns_list == NULL) {
1151: yyerror("error allocating splitdns list buffer");
1152: return -1;
1153: }
1154: memcpy(icc->splitdns_list,$1->v,$1->l);
1155: icc->splitdns_len = $1->l;
1156: }
1157: else
1158: {
1159: int len = icc->splitdns_len + $1->l + 1;
1160: icc->splitdns_list = racoon_realloc(icc->splitdns_list,len);
1161: if(icc->splitdns_list == NULL) {
1162: yyerror("error allocating splitdns list buffer");
1163: return -1;
1164: }
1165: icc->splitdns_list[icc->splitdns_len] = ',';
1166: memcpy(icc->splitdns_list + icc->splitdns_len + 1, $1->v, $1->l);
1167: icc->splitdns_len = len;
1168: }
1169: vfree($1);
1170: #else
1171: yyerror("racoon not configured with --enable-hybrid");
1172: #endif
1173: }
1174: ;
1175:
1176:
1177: /* timer */
1178: timer_statement
1179: : RETRY BOC timer_stmts EOC
1180: ;
1181: timer_stmts
1182: : /* nothing */
1183: | timer_stmts timer_stmt
1184: ;
1185: timer_stmt
1186: : RETRY_COUNTER NUMBER
1187: {
1188: lcconf->retry_counter = $2;
1189: }
1190: EOS
1191: | RETRY_INTERVAL NUMBER unittype_time
1192: {
1193: lcconf->retry_interval = $2 * $3;
1194: }
1195: EOS
1196: | RETRY_PERSEND NUMBER
1197: {
1198: lcconf->count_persend = $2;
1199: }
1200: EOS
1201: | RETRY_PHASE1 NUMBER unittype_time
1202: {
1203: lcconf->retry_checkph1 = $2 * $3;
1204: }
1205: EOS
1206: | RETRY_PHASE2 NUMBER unittype_time
1207: {
1208: lcconf->wait_ph2complete = $2 * $3;
1209: }
1210: EOS
1211: | NATT_KA NUMBER unittype_time
1212: {
1213: #ifdef ENABLE_NATT
1214: if (libipsec_opt & LIBIPSEC_OPT_NATT)
1215: lcconf->natt_ka_interval = $2 * $3;
1216: else
1217: yyerror("libipsec lacks NAT-T support");
1218: #else
1219: yyerror("NAT-T support not compiled in.");
1220: #endif
1221: }
1222: EOS
1223: ;
1224:
1225: /* sainfo */
1226: sainfo_statement
1227: : SAINFO
1228: {
1229: cur_sainfo = newsainfo();
1230: if (cur_sainfo == NULL) {
1231: yyerror("failed to allocate sainfo");
1232: return -1;
1233: }
1234: }
1235: sainfo_name sainfo_param BOC sainfo_specs
1236: {
1237: struct sainfo *check;
1238:
1239: /* default */
1240: if (cur_sainfo->algs[algclass_ipsec_enc] == 0) {
1241: yyerror("no encryption algorithm at %s",
1242: sainfo2str(cur_sainfo));
1243: return -1;
1244: }
1245: if (cur_sainfo->algs[algclass_ipsec_auth] == 0) {
1246: yyerror("no authentication algorithm at %s",
1247: sainfo2str(cur_sainfo));
1248: return -1;
1249: }
1250: if (cur_sainfo->algs[algclass_ipsec_comp] == 0) {
1251: yyerror("no compression algorithm at %s",
1252: sainfo2str(cur_sainfo));
1253: return -1;
1254: }
1255:
1256: /* duplicate check */
1257: check = getsainfo(cur_sainfo->idsrc,
1258: cur_sainfo->iddst,
1259: cur_sainfo->id_i,
1260: NULL,
1261: cur_sainfo->remoteid);
1262:
1263: if (check && ((check->idsrc != SAINFO_ANONYMOUS) &&
1264: (cur_sainfo->idsrc != SAINFO_ANONYMOUS))) {
1265: yyerror("duplicated sainfo: %s",
1266: sainfo2str(cur_sainfo));
1267: return -1;
1268: }
1269:
1270: inssainfo(cur_sainfo);
1271: }
1272: EOC
1273: ;
1274: sainfo_name
1275: : ANONYMOUS
1276: {
1277: cur_sainfo->idsrc = SAINFO_ANONYMOUS;
1278: cur_sainfo->iddst = SAINFO_ANONYMOUS;
1279: }
1280: | ANONYMOUS CLIENTADDR
1281: {
1282: cur_sainfo->idsrc = SAINFO_ANONYMOUS;
1283: cur_sainfo->iddst = SAINFO_CLIENTADDR;
1284: }
1285: | ANONYMOUS sainfo_id
1286: {
1287: cur_sainfo->idsrc = SAINFO_ANONYMOUS;
1288: cur_sainfo->iddst = $2;
1289: }
1290: | sainfo_id ANONYMOUS
1291: {
1292: cur_sainfo->idsrc = $1;
1293: cur_sainfo->iddst = SAINFO_ANONYMOUS;
1294: }
1295: | sainfo_id CLIENTADDR
1296: {
1297: cur_sainfo->idsrc = $1;
1298: cur_sainfo->iddst = SAINFO_CLIENTADDR;
1299: }
1300: | sainfo_id sainfo_id
1301: {
1302: cur_sainfo->idsrc = $1;
1303: cur_sainfo->iddst = $2;
1304: }
1305: ;
1306: sainfo_id
1307: : IDENTIFIERTYPE ADDRSTRING prefix port ul_proto
1308: {
1309: char portbuf[10];
1310: struct sockaddr *saddr;
1311:
1312: if (($5 == IPPROTO_ICMP || $5 == IPPROTO_ICMPV6)
1313: && ($4 != IPSEC_PORT_ANY || $4 != IPSEC_PORT_ANY)) {
1314: yyerror("port number must be \"any\".");
1315: return -1;
1316: }
1317:
1318: snprintf(portbuf, sizeof(portbuf), "%lu", $4);
1319: saddr = str2saddr($2->v, portbuf);
1320: vfree($2);
1321: if (saddr == NULL)
1322: return -1;
1323:
1324: switch (saddr->sa_family) {
1325: case AF_INET:
1326: if ($5 == IPPROTO_ICMPV6) {
1327: yyerror("upper layer protocol mismatched.\n");
1328: racoon_free(saddr);
1329: return -1;
1330: }
1331: $$ = ipsecdoi_sockaddr2id(saddr,
1332: $3 == ~0 ? (sizeof(struct in_addr) << 3): $3,
1333: $5);
1334: break;
1335: #ifdef INET6
1336: case AF_INET6:
1337: if ($5 == IPPROTO_ICMP) {
1338: yyerror("upper layer protocol mismatched.\n");
1339: racoon_free(saddr);
1340: return -1;
1341: }
1342: $$ = ipsecdoi_sockaddr2id(saddr,
1343: $3 == ~0 ? (sizeof(struct in6_addr) << 3): $3,
1344: $5);
1345: break;
1346: #endif
1347: default:
1348: yyerror("invalid family: %d", saddr->sa_family);
1349: $$ = NULL;
1350: break;
1351: }
1352: racoon_free(saddr);
1353: if ($$ == NULL)
1354: return -1;
1355: }
1356: | IDENTIFIERTYPE ADDRSTRING ADDRRANGE prefix port ul_proto
1357: {
1358: char portbuf[10];
1359: struct sockaddr *laddr = NULL, *haddr = NULL;
1360: char *cur = NULL;
1361:
1362: if (($6 == IPPROTO_ICMP || $6 == IPPROTO_ICMPV6)
1363: && ($5 != IPSEC_PORT_ANY || $5 != IPSEC_PORT_ANY)) {
1364: yyerror("port number must be \"any\".");
1365: return -1;
1366: }
1367:
1368: snprintf(portbuf, sizeof(portbuf), "%lu", $5);
1369:
1370: laddr = str2saddr($2->v, portbuf);
1371: if (laddr == NULL) {
1372: return -1;
1373: }
1374: vfree($2);
1375: haddr = str2saddr($3->v, portbuf);
1376: if (haddr == NULL) {
1377: racoon_free(laddr);
1378: return -1;
1379: }
1380: vfree($3);
1381:
1382: switch (laddr->sa_family) {
1383: case AF_INET:
1384: if ($6 == IPPROTO_ICMPV6) {
1385: yyerror("upper layer protocol mismatched.\n");
1386: if (laddr)
1387: racoon_free(laddr);
1388: if (haddr)
1389: racoon_free(haddr);
1390: return -1;
1391: }
1392: $$ = ipsecdoi_sockrange2id(laddr, haddr,
1393: $6);
1394: break;
1395: #ifdef INET6
1396: case AF_INET6:
1397: if ($6 == IPPROTO_ICMP) {
1398: yyerror("upper layer protocol mismatched.\n");
1399: if (laddr)
1400: racoon_free(laddr);
1401: if (haddr)
1402: racoon_free(haddr);
1403: return -1;
1404: }
1405: $$ = ipsecdoi_sockrange2id(laddr, haddr,
1406: $6);
1407: break;
1408: #endif
1409: default:
1410: yyerror("invalid family: %d", laddr->sa_family);
1411: $$ = NULL;
1412: break;
1413: }
1414: if (laddr)
1415: racoon_free(laddr);
1416: if (haddr)
1417: racoon_free(haddr);
1418: if ($$ == NULL)
1419: return -1;
1420: }
1421: | IDENTIFIERTYPE QUOTEDSTRING
1422: {
1423: struct ipsecdoi_id_b *id_b;
1424:
1425: if ($1 == IDTYPE_ASN1DN) {
1426: yyerror("id type forbidden: %d", $1);
1427: $$ = NULL;
1428: return -1;
1429: }
1430:
1431: $2->l--;
1432:
1433: $$ = vmalloc(sizeof(*id_b) + $2->l);
1434: if ($$ == NULL) {
1435: yyerror("failed to allocate identifier");
1436: return -1;
1437: }
1438:
1439: id_b = (struct ipsecdoi_id_b *)$$->v;
1440: id_b->type = idtype2doi($1);
1441:
1442: id_b->proto_id = 0;
1443: id_b->port = 0;
1444:
1445: memcpy($$->v + sizeof(*id_b), $2->v, $2->l);
1446: }
1447: ;
1448: sainfo_param
1449: : /* nothing */
1450: {
1451: cur_sainfo->id_i = NULL;
1452: }
1453: | FROM IDENTIFIERTYPE identifierstring
1454: {
1455: struct ipsecdoi_id_b *id_b;
1456: vchar_t *idv;
1457:
1458: if (set_identifier(&idv, $2, $3) != 0) {
1459: yyerror("failed to set identifer.\n");
1460: return -1;
1461: }
1462: cur_sainfo->id_i = vmalloc(sizeof(*id_b) + idv->l);
1463: if (cur_sainfo->id_i == NULL) {
1464: yyerror("failed to allocate identifier");
1465: return -1;
1466: }
1467:
1468: id_b = (struct ipsecdoi_id_b *)cur_sainfo->id_i->v;
1469: id_b->type = idtype2doi($2);
1470:
1471: id_b->proto_id = 0;
1472: id_b->port = 0;
1473:
1474: memcpy(cur_sainfo->id_i->v + sizeof(*id_b),
1475: idv->v, idv->l);
1476: vfree(idv);
1477: }
1478: | GROUP QUOTEDSTRING
1479: {
1480: #ifdef ENABLE_HYBRID
1481: if ((cur_sainfo->group = vdup($2)) == NULL) {
1482: yyerror("failed to set sainfo xauth group.\n");
1483: return -1;
1484: }
1485: #else
1486: yyerror("racoon not configured with --enable-hybrid");
1487: return -1;
1488: #endif
1489: }
1490: ;
1491: sainfo_specs
1492: : /* nothing */
1493: | sainfo_specs sainfo_spec
1494: ;
1495: sainfo_spec
1496: : PFS_GROUP dh_group_num
1497: {
1498: cur_sainfo->pfs_group = $2;
1499: }
1500: EOS
1501: | REMOTEID NUMBER
1502: {
1503: cur_sainfo->remoteid = $2;
1504: }
1505: EOS
1506: | LIFETIME LIFETYPE_TIME NUMBER unittype_time
1507: {
1508: cur_sainfo->lifetime = $3 * $4;
1509: }
1510: EOS
1511: | LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
1512: {
1513: #if 1
1514: yyerror("byte lifetime support is deprecated");
1515: return -1;
1516: #else
1517: cur_sainfo->lifebyte = fix_lifebyte($3 * $4);
1518: if (cur_sainfo->lifebyte == 0)
1519: return -1;
1520: #endif
1521: }
1522: EOS
1523: | ALGORITHM_CLASS {
1524: cur_algclass = $1;
1525: }
1526: algorithms EOS
1527: ;
1528:
1529: algorithms
1530: : algorithm
1531: {
1532: inssainfoalg(&cur_sainfo->algs[cur_algclass], $1);
1533: }
1534: | algorithm
1535: {
1536: inssainfoalg(&cur_sainfo->algs[cur_algclass], $1);
1537: }
1538: COMMA algorithms
1539: ;
1540: algorithm
1541: : ALGORITHMTYPE keylength
1542: {
1543: int defklen;
1544:
1545: $$ = newsainfoalg();
1546: if ($$ == NULL) {
1547: yyerror("failed to get algorithm allocation");
1548: return -1;
1549: }
1550:
1551: $$->alg = algtype2doi(cur_algclass, $1);
1552: if ($$->alg == -1) {
1553: yyerror("algorithm mismatched");
1554: racoon_free($$);
1555: $$ = NULL;
1556: return -1;
1557: }
1558:
1559: defklen = default_keylen(cur_algclass, $1);
1560: if (defklen == 0) {
1561: if ($2) {
1562: yyerror("keylen not allowed");
1563: racoon_free($$);
1564: $$ = NULL;
1565: return -1;
1566: }
1567: } else {
1568: if ($2 && check_keylen(cur_algclass, $1, $2) < 0) {
1569: yyerror("invalid keylen %d", $2);
1570: racoon_free($$);
1571: $$ = NULL;
1572: return -1;
1573: }
1574: }
1575:
1576: if ($2)
1577: $$->encklen = $2;
1578: else
1579: $$->encklen = defklen;
1580:
1581: /* check if it's supported algorithm by kernel */
1582: if (!(cur_algclass == algclass_ipsec_auth && $1 == algtype_non_auth)
1583: && pk_checkalg(cur_algclass, $1, $$->encklen)) {
1584: int a = algclass2doi(cur_algclass);
1585: int b = algtype2doi(cur_algclass, $1);
1586: if (a == IPSECDOI_ATTR_AUTH)
1587: a = IPSECDOI_PROTO_IPSEC_AH;
1588: yyerror("algorithm %s not supported by the kernel (missing module?)",
1589: s_ipsecdoi_trns(a, b));
1590: racoon_free($$);
1591: $$ = NULL;
1592: return -1;
1593: }
1594: }
1595: ;
1596: prefix
1597: : /* nothing */ { $$ = ~0; }
1598: | PREFIX { $$ = $1; }
1599: ;
1600: port
1601: : /* nothing */ { $$ = IPSEC_PORT_ANY; }
1602: | PORT { $$ = $1; }
1603: | PORTANY { $$ = IPSEC_PORT_ANY; }
1604: ;
1605: ul_proto
1606: : NUMBER { $$ = $1; }
1607: | UL_PROTO { $$ = $1; }
1608: | ANY { $$ = IPSEC_ULPROTO_ANY; }
1609: ;
1610: keylength
1611: : /* nothing */ { $$ = 0; }
1612: | NUMBER { $$ = $1; }
1613: ;
1614:
1615: /* remote */
1616: remote_statement
1617: : REMOTE QUOTEDSTRING INHERIT QUOTEDSTRING
1618: {
1619: struct remoteconf *from, *new;
1620:
1621: if (getrmconf_by_name($2->v) != NULL) {
1622: yyerror("named remoteconf \"%s\" already exists.");
1623: return -1;
1624: }
1625:
1626: from = getrmconf_by_name($4->v);
1627: if (from == NULL) {
1628: yyerror("named parent remoteconf \"%s\" does not exist.",
1629: $4->v);
1630: return -1;
1631: }
1632:
1633: new = duprmconf_shallow(from);
1634: if (new == NULL) {
1635: yyerror("failed to duplicate remoteconf from \"%s\".",
1636: $4->v);
1637: return -1;
1638: }
1639:
1640: new->name = racoon_strdup($2->v);
1641: cur_rmconf = new;
1642:
1643: vfree($2);
1644: vfree($4);
1645: }
1646: remote_specs_block
1647: | REMOTE QUOTEDSTRING
1648: {
1649: struct remoteconf *new;
1650:
1651: if (getrmconf_by_name($2->v) != NULL) {
1652: yyerror("Named remoteconf \"%s\" already exists.");
1653: return -1;
1654: }
1655:
1656: new = newrmconf();
1657: if (new == NULL) {
1658: yyerror("failed to get new remoteconf.");
1659: return -1;
1660: }
1661: new->name = racoon_strdup($2->v);
1662: cur_rmconf = new;
1663:
1664: vfree($2);
1665: }
1666: remote_specs_block
1667: | REMOTE remote_index INHERIT remote_index
1668: {
1669: struct remoteconf *from, *new;
1670:
1671: from = getrmconf($4, GETRMCONF_F_NO_ANONYMOUS);
1672: if (from == NULL) {
1673: yyerror("failed to get remoteconf for %s.",
1674: saddr2str($4));
1675: return -1;
1676: }
1677:
1678: new = duprmconf_shallow(from);
1679: if (new == NULL) {
1680: yyerror("failed to duplicate remoteconf from %s.",
1681: saddr2str($4));
1682: return -1;
1683: }
1684:
1685: racoon_free($4);
1686: new->remote = $2;
1687: cur_rmconf = new;
1688: }
1689: remote_specs_block
1690: | REMOTE remote_index
1691: {
1692: struct remoteconf *new;
1693:
1694: new = newrmconf();
1695: if (new == NULL) {
1696: yyerror("failed to get new remoteconf.");
1697: return -1;
1698: }
1699:
1700: new->remote = $2;
1701: cur_rmconf = new;
1702: }
1703: remote_specs_block
1704: ;
1705:
1706: remote_specs_block
1707: : BOC remote_specs EOC
1708: {
1709: /* check a exchange mode */
1710: if (cur_rmconf->etypes == NULL) {
1711: yyerror("no exchange mode specified.\n");
1712: return -1;
1713: }
1714:
1715: if (cur_rmconf->idvtype == IDTYPE_UNDEFINED)
1716: cur_rmconf->idvtype = IDTYPE_ADDRESS;
1717:
1718: if (cur_rmconf->idvtype == IDTYPE_ASN1DN) {
1719: if (cur_rmconf->mycertfile) {
1720: if (cur_rmconf->idv)
1721: yywarn("Both CERT and ASN1 ID "
1722: "are set. Hope this is OK.\n");
1723: /* TODO: Preparse the DN here */
1724: } else if (cur_rmconf->idv) {
1725: /* OK, using asn1dn without X.509. */
1726: } else {
1727: yyerror("ASN1 ID not specified "
1728: "and no CERT defined!\n");
1729: return -1;
1730: }
1731: }
1732:
1733: if (duprmconf_finish(cur_rmconf))
1734: return -1;
1735:
1736: #if 0
1737: /* this pointer copy will never happen, because duprmconf_shallow
1738: * already copied all pointers.
1739: */
1740: if (cur_rmconf->spspec == NULL &&
1741: cur_rmconf->inherited_from != NULL) {
1742: cur_rmconf->spspec = cur_rmconf->inherited_from->spspec;
1743: }
1744: #endif
1745: if (set_isakmp_proposal(cur_rmconf) != 0)
1746: return -1;
1747:
1748: /* DH group settting if aggressive mode is there. */
1749: if (check_etypeok(cur_rmconf, (void*) ISAKMP_ETYPE_AGG)) {
1750: struct isakmpsa *p;
1751: int b = 0;
1752:
1753: /* DH group */
1754: for (p = cur_rmconf->proposal; p; p = p->next) {
1755: if (b == 0 || (b && b == p->dh_group)) {
1756: b = p->dh_group;
1757: continue;
1758: }
1759: yyerror("DH group must be equal "
1760: "in all proposals "
1761: "when aggressive mode is "
1762: "used.\n");
1763: return -1;
1764: }
1765: cur_rmconf->dh_group = b;
1766:
1767: if (cur_rmconf->dh_group == 0) {
1768: yyerror("DH group must be set in the proposal.\n");
1769: return -1;
1770: }
1771:
1772: /* DH group settting if PFS is required. */
1773: if (oakley_setdhgroup(cur_rmconf->dh_group,
1774: &cur_rmconf->dhgrp) < 0) {
1775: yyerror("failed to set DH value.\n");
1776: return -1;
1777: }
1778: }
1779:
1780: insrmconf(cur_rmconf);
1781: }
1782: ;
1783: remote_index
1784: : ANONYMOUS ike_port
1785: {
1786: $$ = newsaddr(sizeof(struct sockaddr));
1787: $$->sa_family = AF_UNSPEC;
1788: ((struct sockaddr_in *)$$)->sin_port = htons($2);
1789: }
1790: | ike_addrinfo_port
1791: {
1792: $$ = $1;
1793: if ($$ == NULL) {
1794: yyerror("failed to allocate sockaddr");
1795: return -1;
1796: }
1797: }
1798: ;
1799: remote_specs
1800: : /* nothing */
1801: | remote_specs remote_spec
1802: ;
1803: remote_spec
1804: : REMOTE_ADDRESS ike_addrinfo_port
1805: {
1806: if (cur_rmconf->remote != NULL) {
1807: yyerror("remote_address already specified");
1808: return -1;
1809: }
1810: cur_rmconf->remote = $2;
1811: }
1812: EOS
1813: | EXCHANGE_MODE
1814: {
1815: cur_rmconf->etypes = NULL;
1816: }
1817: exchange_types EOS
1818: | DOI DOITYPE { cur_rmconf->doitype = $2; } EOS
1819: | SITUATION SITUATIONTYPE { cur_rmconf->sittype = $2; } EOS
1820: | CERTIFICATE_TYPE cert_spec
1821: | PEERS_CERTFILE QUOTEDSTRING
1822: {
1823: yywarn("This directive without certtype will be removed!\n");
1824: yywarn("Please use 'peers_certfile x509 \"%s\";' instead\n", $2->v);
1825:
1826: if (cur_rmconf->peerscert != NULL) {
1827: yyerror("peers_certfile already defined\n");
1828: return -1;
1829: }
1830:
1831: if (load_x509($2->v, &cur_rmconf->peerscertfile,
1832: &cur_rmconf->peerscert)) {
1833: yyerror("failed to load certificate \"%s\"\n",
1834: $2->v);
1835: return -1;
1836: }
1837:
1838: vfree($2);
1839: }
1840: EOS
1841: | PEERS_CERTFILE CERT_X509 QUOTEDSTRING
1842: {
1843: if (cur_rmconf->peerscert != NULL) {
1844: yyerror("peers_certfile already defined\n");
1845: return -1;
1846: }
1847:
1848: if (load_x509($3->v, &cur_rmconf->peerscertfile,
1849: &cur_rmconf->peerscert)) {
1850: yyerror("failed to load certificate \"%s\"\n",
1851: $3->v);
1852: return -1;
1853: }
1854:
1855: vfree($3);
1856: }
1857: EOS
1858: | PEERS_CERTFILE CERT_PLAINRSA QUOTEDSTRING
1859: {
1860: char path[MAXPATHLEN];
1861: int ret = 0;
1862:
1863: if (cur_rmconf->peerscert != NULL) {
1864: yyerror("peers_certfile already defined\n");
1865: return -1;
1866: }
1867:
1868: cur_rmconf->peerscert = vmalloc(1);
1869: if (cur_rmconf->peerscert == NULL) {
1870: yyerror("failed to allocate peerscert");
1871: return -1;
1872: }
1873: cur_rmconf->peerscert->v[0] = ISAKMP_CERT_PLAINRSA;
1874:
1875: getpathname(path, sizeof(path),
1876: LC_PATHTYPE_CERT, $3->v);
1877: if (rsa_parse_file(cur_rmconf->rsa_public, path,
1878: RSA_TYPE_PUBLIC)) {
1879: yyerror("Couldn't parse keyfile.\n", path);
1880: return -1;
1881: }
1882: plog(LLV_DEBUG, LOCATION, NULL,
1883: "Public PlainRSA keyfile parsed: %s\n", path);
1884:
1885: vfree($3);
1886: }
1887: EOS
1888: | PEERS_CERTFILE DNSSEC
1889: {
1890: if (cur_rmconf->peerscert != NULL) {
1891: yyerror("peers_certfile already defined\n");
1892: return -1;
1893: }
1894: cur_rmconf->peerscert = vmalloc(1);
1895: if (cur_rmconf->peerscert == NULL) {
1896: yyerror("failed to allocate peerscert");
1897: return -1;
1898: }
1899: cur_rmconf->peerscert->v[0] = ISAKMP_CERT_DNS;
1900: }
1901: EOS
1902: | CA_TYPE CERT_X509 QUOTEDSTRING
1903: {
1904: if (cur_rmconf->cacert != NULL) {
1905: yyerror("ca_type already defined\n");
1906: return -1;
1907: }
1908:
1909: if (load_x509($3->v, &cur_rmconf->cacertfile,
1910: &cur_rmconf->cacert)) {
1911: yyerror("failed to load certificate \"%s\"\n",
1912: $3->v);
1913: return -1;
1914: }
1915:
1916: vfree($3);
1917: }
1918: EOS
1919: | VERIFY_CERT SWITCH { cur_rmconf->verify_cert = $2; } EOS
1920: | SEND_CERT SWITCH { cur_rmconf->send_cert = $2; } EOS
1921: | SEND_CR SWITCH { cur_rmconf->send_cr = $2; } EOS
1922: | MATCH_EMPTY_CR SWITCH { cur_rmconf->match_empty_cr = $2; } EOS
1923: | MY_IDENTIFIER IDENTIFIERTYPE identifierstring
1924: {
1925: if (set_identifier(&cur_rmconf->idv, $2, $3) != 0) {
1926: yyerror("failed to set identifer.\n");
1927: return -1;
1928: }
1929: cur_rmconf->idvtype = $2;
1930: }
1931: EOS
1932: | MY_IDENTIFIER IDENTIFIERTYPE IDENTIFIERQUAL identifierstring
1933: {
1934: if (set_identifier_qual(&cur_rmconf->idv, $2, $4, $3) != 0) {
1935: yyerror("failed to set identifer.\n");
1936: return -1;
1937: }
1938: cur_rmconf->idvtype = $2;
1939: }
1940: EOS
1941: | XAUTH_LOGIN identifierstring
1942: {
1943: #ifdef ENABLE_HYBRID
1944: /* formerly identifier type login */
1945: if (xauth_rmconf_used(&cur_rmconf->xauth) == -1) {
1946: yyerror("failed to allocate xauth state\n");
1947: return -1;
1948: }
1949: if ((cur_rmconf->xauth->login = vdup($2)) == NULL) {
1950: yyerror("failed to set identifer.\n");
1951: return -1;
1952: }
1953: #else
1954: yyerror("racoon not configured with --enable-hybrid");
1955: #endif
1956: }
1957: EOS
1958: | PEERS_IDENTIFIER IDENTIFIERTYPE identifierstring
1959: {
1960: struct idspec *id;
1961: id = newidspec();
1962: if (id == NULL) {
1963: yyerror("failed to allocate idspec");
1964: return -1;
1965: }
1966: if (set_identifier(&id->id, $2, $3) != 0) {
1967: yyerror("failed to set identifer.\n");
1968: racoon_free(id);
1969: return -1;
1970: }
1971: id->idtype = $2;
1972: genlist_append (cur_rmconf->idvl_p, id);
1973: }
1974: EOS
1975: | PEERS_IDENTIFIER IDENTIFIERTYPE IDENTIFIERQUAL identifierstring
1976: {
1977: struct idspec *id;
1978: id = newidspec();
1979: if (id == NULL) {
1980: yyerror("failed to allocate idspec");
1981: return -1;
1982: }
1983: if (set_identifier_qual(&id->id, $2, $4, $3) != 0) {
1984: yyerror("failed to set identifer.\n");
1985: racoon_free(id);
1986: return -1;
1987: }
1988: id->idtype = $2;
1989: genlist_append (cur_rmconf->idvl_p, id);
1990: }
1991: EOS
1992: | VERIFY_IDENTIFIER SWITCH { cur_rmconf->verify_identifier = $2; } EOS
1993: | NONCE_SIZE NUMBER { cur_rmconf->nonce_size = $2; } EOS
1994: | DH_GROUP
1995: {
1996: yyerror("dh_group cannot be defined here.");
1997: return -1;
1998: }
1999: dh_group_num EOS
2000: | PASSIVE SWITCH { cur_rmconf->passive = $2; } EOS
2001: | IKE_FRAG SWITCH { cur_rmconf->ike_frag = $2; } EOS
2002: | IKE_FRAG REMOTE_FORCE_LEVEL { cur_rmconf->ike_frag = ISAKMP_FRAG_FORCE; } EOS
2003: | ESP_FRAG NUMBER {
2004: #ifdef SADB_X_EXT_NAT_T_FRAG
2005: if (libipsec_opt & LIBIPSEC_OPT_FRAG)
2006: cur_rmconf->esp_frag = $2;
2007: else
2008: yywarn("libipsec lacks IKE frag support");
2009: #else
2010: yywarn("Your kernel does not support esp_frag");
2011: #endif
2012: } EOS
2013: | SCRIPT QUOTEDSTRING PHASE1_UP {
2014: if (cur_rmconf->script[SCRIPT_PHASE1_UP] != NULL)
2015: vfree(cur_rmconf->script[SCRIPT_PHASE1_UP]);
2016:
2017: cur_rmconf->script[SCRIPT_PHASE1_UP] =
2018: script_path_add(vdup($2));
2019: } EOS
2020: | SCRIPT QUOTEDSTRING PHASE1_DOWN {
2021: if (cur_rmconf->script[SCRIPT_PHASE1_DOWN] != NULL)
2022: vfree(cur_rmconf->script[SCRIPT_PHASE1_DOWN]);
2023:
2024: cur_rmconf->script[SCRIPT_PHASE1_DOWN] =
2025: script_path_add(vdup($2));
2026: } EOS
2027: | SCRIPT QUOTEDSTRING PHASE1_DEAD {
2028: if (cur_rmconf->script[SCRIPT_PHASE1_DEAD] != NULL)
2029: vfree(cur_rmconf->script[SCRIPT_PHASE1_DEAD]);
2030:
2031: cur_rmconf->script[SCRIPT_PHASE1_DEAD] =
2032: script_path_add(vdup($2));
2033: } EOS
2034: | MODE_CFG SWITCH { cur_rmconf->mode_cfg = $2; } EOS
2035: | WEAK_PHASE1_CHECK SWITCH {
2036: cur_rmconf->weak_phase1_check = $2;
2037: } EOS
2038: | GENERATE_POLICY SWITCH { cur_rmconf->gen_policy = $2; } EOS
2039: | GENERATE_POLICY GENERATE_LEVEL { cur_rmconf->gen_policy = $2; } EOS
2040: | SUPPORT_PROXY SWITCH { cur_rmconf->support_proxy = $2; } EOS
2041: | INITIAL_CONTACT SWITCH { cur_rmconf->ini_contact = $2; } EOS
2042: | NAT_TRAVERSAL SWITCH
2043: {
2044: #ifdef ENABLE_NATT
2045: if (libipsec_opt & LIBIPSEC_OPT_NATT)
2046: cur_rmconf->nat_traversal = $2;
2047: else
2048: yyerror("libipsec lacks NAT-T support");
2049: #else
2050: yyerror("NAT-T support not compiled in.");
2051: #endif
2052: } EOS
2053: | NAT_TRAVERSAL REMOTE_FORCE_LEVEL
2054: {
2055: #ifdef ENABLE_NATT
2056: if (libipsec_opt & LIBIPSEC_OPT_NATT)
2057: cur_rmconf->nat_traversal = NATT_FORCE;
2058: else
2059: yyerror("libipsec lacks NAT-T support");
2060: #else
2061: yyerror("NAT-T support not compiled in.");
2062: #endif
2063: } EOS
2064: | DPD SWITCH
2065: {
2066: #ifdef ENABLE_DPD
2067: cur_rmconf->dpd = $2;
2068: #else
2069: yyerror("DPD support not compiled in.");
2070: #endif
2071: } EOS
2072: | DPD_DELAY NUMBER
2073: {
2074: #ifdef ENABLE_DPD
2075: cur_rmconf->dpd_interval = $2;
2076: #else
2077: yyerror("DPD support not compiled in.");
2078: #endif
2079: }
2080: EOS
2081: | DPD_RETRY NUMBER
2082: {
2083: #ifdef ENABLE_DPD
2084: cur_rmconf->dpd_retry = $2;
2085: #else
2086: yyerror("DPD support not compiled in.");
2087: #endif
2088: }
2089: EOS
2090: | DPD_MAXFAIL NUMBER
2091: {
2092: #ifdef ENABLE_DPD
2093: cur_rmconf->dpd_maxfails = $2;
2094: #else
2095: yyerror("DPD support not compiled in.");
2096: #endif
2097: }
2098: EOS
2099: | REKEY SWITCH { cur_rmconf->rekey = $2; } EOS
2100: | REKEY REMOTE_FORCE_LEVEL { cur_rmconf->rekey = REKEY_FORCE; } EOS
2101: | PH1ID NUMBER
2102: {
2103: cur_rmconf->ph1id = $2;
2104: }
2105: EOS
2106: | LIFETIME LIFETYPE_TIME NUMBER unittype_time
2107: {
2108: cur_rmconf->lifetime = $3 * $4;
2109: }
2110: EOS
2111: | PROPOSAL_CHECK PROPOSAL_CHECK_LEVEL { cur_rmconf->pcheck_level = $2; } EOS
2112: | LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
2113: {
2114: #if 1
2115: yyerror("byte lifetime support is deprecated in Phase1");
2116: return -1;
2117: #else
2118: yywarn("the lifetime of bytes in phase 1 "
2119: "will be ignored at the moment.");
2120: cur_rmconf->lifebyte = fix_lifebyte($3 * $4);
2121: if (cur_rmconf->lifebyte == 0)
2122: return -1;
2123: #endif
2124: }
2125: EOS
2126: | PROPOSAL
2127: {
2128: struct secprotospec *spspec;
2129:
2130: spspec = newspspec();
2131: if (spspec == NULL)
2132: return -1;
2133: insspspec(cur_rmconf, spspec);
2134: }
2135: BOC isakmpproposal_specs EOC
2136: ;
2137: exchange_types
2138: : /* nothing */
2139: | exchange_types EXCHANGETYPE
2140: {
2141: struct etypes *new;
2142: new = racoon_malloc(sizeof(struct etypes));
2143: if (new == NULL) {
2144: yyerror("failed to allocate etypes");
2145: return -1;
2146: }
2147: new->type = $2;
2148: new->next = NULL;
2149: if (cur_rmconf->etypes == NULL)
2150: cur_rmconf->etypes = new;
2151: else {
2152: struct etypes *p;
2153: for (p = cur_rmconf->etypes;
2154: p->next != NULL;
2155: p = p->next)
2156: ;
2157: p->next = new;
2158: }
2159: }
2160: ;
2161: cert_spec
2162: : CERT_X509 QUOTEDSTRING QUOTEDSTRING
2163: {
2164: if (cur_rmconf->mycert != NULL) {
2165: yyerror("certificate_type already defined\n");
2166: return -1;
2167: }
2168:
2169: if (load_x509($2->v, &cur_rmconf->mycertfile,
2170: &cur_rmconf->mycert)) {
2171: yyerror("failed to load certificate \"%s\"\n",
2172: $2->v);
2173: return -1;
2174: }
2175:
2176: cur_rmconf->myprivfile = racoon_strdup($3->v);
2177: STRDUP_FATAL(cur_rmconf->myprivfile);
2178:
2179: vfree($2);
2180: vfree($3);
2181: }
2182: EOS
2183: | CERT_PLAINRSA QUOTEDSTRING
2184: {
2185: char path[MAXPATHLEN];
2186: int ret = 0;
2187:
2188: if (cur_rmconf->mycert != NULL) {
2189: yyerror("certificate_type already defined\n");
2190: return -1;
2191: }
2192:
2193: cur_rmconf->mycert = vmalloc(1);
2194: if (cur_rmconf->mycert == NULL) {
2195: yyerror("failed to allocate mycert");
2196: return -1;
2197: }
2198: cur_rmconf->mycert->v[0] = ISAKMP_CERT_PLAINRSA;
2199:
2200: getpathname(path, sizeof(path),
2201: LC_PATHTYPE_CERT, $2->v);
2202: cur_rmconf->send_cr = FALSE;
2203: cur_rmconf->send_cert = FALSE;
2204: cur_rmconf->verify_cert = FALSE;
2205: if (rsa_parse_file(cur_rmconf->rsa_private, path,
2206: RSA_TYPE_PRIVATE)) {
2207: yyerror("Couldn't parse keyfile.\n", path);
2208: return -1;
2209: }
2210: plog(LLV_DEBUG, LOCATION, NULL,
2211: "Private PlainRSA keyfile parsed: %s\n", path);
2212: vfree($2);
2213: }
2214: EOS
2215: ;
2216: dh_group_num
2217: : ALGORITHMTYPE
2218: {
2219: $$ = algtype2doi(algclass_isakmp_dh, $1);
2220: if ($$ == -1) {
2221: yyerror("must be DH group");
2222: return -1;
2223: }
2224: }
2225: | NUMBER
2226: {
2227: if (ARRAYLEN(num2dhgroup) > $1 && num2dhgroup[$1] != 0) {
2228: $$ = num2dhgroup[$1];
2229: } else {
2230: yyerror("must be DH group");
2231: $$ = 0;
2232: return -1;
2233: }
2234: }
2235: ;
2236: identifierstring
2237: : /* nothing */ { $$ = NULL; }
2238: | ADDRSTRING { $$ = $1; }
2239: | QUOTEDSTRING { $$ = $1; }
2240: ;
2241: isakmpproposal_specs
2242: : /* nothing */
2243: | isakmpproposal_specs isakmpproposal_spec
2244: ;
2245: isakmpproposal_spec
2246: : LIFETIME LIFETYPE_TIME NUMBER unittype_time
2247: {
2248: cur_rmconf->spspec->lifetime = $3 * $4;
2249: }
2250: EOS
2251: | LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
2252: {
2253: #if 1
2254: yyerror("byte lifetime support is deprecated");
2255: return -1;
2256: #else
2257: cur_rmconf->spspec->lifebyte = fix_lifebyte($3 * $4);
2258: if (cur_rmconf->spspec->lifebyte == 0)
2259: return -1;
2260: #endif
2261: }
2262: EOS
2263: | DH_GROUP dh_group_num
2264: {
2265: cur_rmconf->spspec->algclass[algclass_isakmp_dh] = $2;
2266: }
2267: EOS
2268: | GSS_ID QUOTEDSTRING
2269: {
2270: if (cur_rmconf->spspec->vendorid != VENDORID_GSSAPI) {
2271: yyerror("wrong Vendor ID for gssapi_id");
2272: return -1;
2273: }
2274: if (cur_rmconf->spspec->gssid != NULL)
2275: racoon_free(cur_rmconf->spspec->gssid);
2276: cur_rmconf->spspec->gssid =
2277: racoon_strdup($2->v);
2278: STRDUP_FATAL(cur_rmconf->spspec->gssid);
2279: }
2280: EOS
2281: | ALGORITHM_CLASS ALGORITHMTYPE keylength
2282: {
2283: int doi;
2284: int defklen;
2285:
2286: doi = algtype2doi($1, $2);
2287: if (doi == -1) {
2288: yyerror("algorithm mismatched 1");
2289: return -1;
2290: }
2291:
2292: switch ($1) {
2293: case algclass_isakmp_enc:
2294: /* reject suppressed algorithms */
2295: #ifndef HAVE_OPENSSL_RC5_H
2296: if ($2 == algtype_rc5) {
2297: yyerror("algorithm %s not supported",
2298: s_attr_isakmp_enc(doi));
2299: return -1;
2300: }
2301: #endif
2302: #ifndef HAVE_OPENSSL_IDEA_H
2303: if ($2 == algtype_idea) {
2304: yyerror("algorithm %s not supported",
2305: s_attr_isakmp_enc(doi));
2306: return -1;
2307: }
2308: #endif
2309:
2310: cur_rmconf->spspec->algclass[algclass_isakmp_enc] = doi;
2311: defklen = default_keylen($1, $2);
2312: if (defklen == 0) {
2313: if ($3) {
2314: yyerror("keylen not allowed");
2315: return -1;
2316: }
2317: } else {
2318: if ($3 && check_keylen($1, $2, $3) < 0) {
2319: yyerror("invalid keylen %d", $3);
2320: return -1;
2321: }
2322: }
2323: if ($3)
2324: cur_rmconf->spspec->encklen = $3;
2325: else
2326: cur_rmconf->spspec->encklen = defklen;
2327: break;
2328: case algclass_isakmp_hash:
2329: cur_rmconf->spspec->algclass[algclass_isakmp_hash] = doi;
2330: break;
2331: case algclass_isakmp_ameth:
2332: cur_rmconf->spspec->algclass[algclass_isakmp_ameth] = doi;
2333: /*
2334: * We may have to set the Vendor ID for the
2335: * authentication method we're using.
2336: */
2337: switch ($2) {
2338: case algtype_gssapikrb:
2339: if (cur_rmconf->spspec->vendorid !=
2340: VENDORID_UNKNOWN) {
2341: yyerror("Vendor ID mismatch "
2342: "for auth method");
2343: return -1;
2344: }
2345: /*
2346: * For interoperability with Win2k,
2347: * we set the Vendor ID to "GSSAPI".
2348: */
2349: cur_rmconf->spspec->vendorid =
2350: VENDORID_GSSAPI;
2351: break;
2352: case algtype_rsasig:
2353: if (oakley_get_certtype(cur_rmconf->peerscert) == ISAKMP_CERT_PLAINRSA) {
2354: if (rsa_list_count(cur_rmconf->rsa_private) == 0) {
2355: yyerror ("Private PlainRSA key not set. "
2356: "Use directive 'certificate_type plainrsa ...'\n");
2357: return -1;
2358: }
2359: if (rsa_list_count(cur_rmconf->rsa_public) == 0) {
2360: yyerror ("Public PlainRSA keys not set. "
2361: "Use directive 'peers_certfile plainrsa ...'\n");
2362: return -1;
2363: }
2364: }
2365: break;
2366: default:
2367: break;
2368: }
2369: break;
2370: default:
2371: yyerror("algorithm mismatched 2");
2372: return -1;
2373: }
2374: }
2375: EOS
2376: ;
2377:
2378: unittype_time
2379: : UNITTYPE_SEC { $$ = 1; }
2380: | UNITTYPE_MIN { $$ = 60; }
2381: | UNITTYPE_HOUR { $$ = (60 * 60); }
2382: ;
2383: unittype_byte
2384: : UNITTYPE_BYTE { $$ = 1; }
2385: | UNITTYPE_KBYTES { $$ = 1024; }
2386: | UNITTYPE_MBYTES { $$ = (1024 * 1024); }
2387: | UNITTYPE_TBYTES { $$ = (1024 * 1024 * 1024); }
2388: ;
2389: %%
2390:
2391: static struct secprotospec *
2392: newspspec()
2393: {
2394: struct secprotospec *new;
2395:
2396: new = racoon_calloc(1, sizeof(*new));
2397: if (new == NULL) {
2398: yyerror("failed to allocate spproto");
2399: return NULL;
2400: }
2401:
2402: new->encklen = 0; /*XXX*/
2403:
2404: /*
2405: * Default to "uknown" vendor -- we will override this
2406: * as necessary. When we send a Vendor ID payload, an
2407: * "unknown" will be translated to a KAME/racoon ID.
2408: */
2409: new->vendorid = VENDORID_UNKNOWN;
2410:
2411: return new;
2412: }
2413:
2414: /*
2415: * insert into head of list.
2416: */
2417: static void
2418: insspspec(rmconf, spspec)
2419: struct remoteconf *rmconf;
2420: struct secprotospec *spspec;
2421: {
2422: if (rmconf->spspec != NULL)
2423: rmconf->spspec->prev = spspec;
2424: spspec->next = rmconf->spspec;
2425: rmconf->spspec = spspec;
2426: }
2427:
2428: static struct secprotospec *
2429: dupspspec(spspec)
2430: struct secprotospec *spspec;
2431: {
2432: struct secprotospec *new;
2433:
2434: new = newspspec();
2435: if (new == NULL) {
2436: plog(LLV_ERROR, LOCATION, NULL,
2437: "dupspspec: malloc failed\n");
2438: return NULL;
2439: }
2440: memcpy(new, spspec, sizeof(*new));
2441:
2442: if (spspec->gssid) {
2443: new->gssid = racoon_strdup(spspec->gssid);
2444: STRDUP_FATAL(new->gssid);
2445: }
2446: if (spspec->remote) {
2447: new->remote = racoon_malloc(sizeof(*new->remote));
2448: if (new->remote == NULL) {
2449: plog(LLV_ERROR, LOCATION, NULL,
2450: "dupspspec: malloc failed (remote)\n");
2451: return NULL;
2452: }
2453: memcpy(new->remote, spspec->remote, sizeof(*new->remote));
2454: }
2455:
2456: return new;
2457: }
2458:
2459: /*
2460: * copy the whole list
2461: */
2462: void
2463: dupspspec_list(dst, src)
2464: struct remoteconf *dst, *src;
2465: {
2466: struct secprotospec *p, *new, *last;
2467:
2468: for(p = src->spspec, last = NULL; p; p = p->next, last = new) {
2469: new = dupspspec(p);
2470: if (new == NULL)
2471: exit(1);
2472:
2473: new->prev = last;
2474: new->next = NULL; /* not necessary but clean */
2475:
2476: if (last)
2477: last->next = new;
2478: else /* first element */
2479: dst->spspec = new;
2480:
2481: }
2482: }
2483:
2484: /*
2485: * delete the whole list
2486: */
2487: void
2488: flushspspec(rmconf)
2489: struct remoteconf *rmconf;
2490: {
2491: struct secprotospec *p;
2492:
2493: while(rmconf->spspec != NULL) {
2494: p = rmconf->spspec;
2495: rmconf->spspec = p->next;
2496: if (p->next != NULL)
2497: p->next->prev = NULL; /* not necessary but clean */
2498:
2499: if (p->gssid)
2500: racoon_free(p->gssid);
2501: if (p->remote)
2502: racoon_free(p->remote);
2503: racoon_free(p);
2504: }
2505: rmconf->spspec = NULL;
2506: }
2507:
2508: /* set final acceptable proposal */
2509: static int
2510: set_isakmp_proposal(rmconf)
2511: struct remoteconf *rmconf;
2512: {
2513: struct secprotospec *s;
2514: int prop_no = 1;
2515: int trns_no = 1;
2516: int32_t types[MAXALGCLASS];
2517:
2518: /* mandatory check */
2519: if (rmconf->spspec == NULL) {
2520: yyerror("no remote specification found: %s.\n",
2521: saddr2str(rmconf->remote));
2522: return -1;
2523: }
2524: for (s = rmconf->spspec; s != NULL; s = s->next) {
2525: /* XXX need more to check */
2526: if (s->algclass[algclass_isakmp_enc] == 0) {
2527: yyerror("encryption algorithm required.");
2528: return -1;
2529: }
2530: if (s->algclass[algclass_isakmp_hash] == 0) {
2531: yyerror("hash algorithm required.");
2532: return -1;
2533: }
2534: if (s->algclass[algclass_isakmp_dh] == 0) {
2535: yyerror("DH group required.");
2536: return -1;
2537: }
2538: if (s->algclass[algclass_isakmp_ameth] == 0) {
2539: yyerror("authentication method required.");
2540: return -1;
2541: }
2542: }
2543:
2544: /* skip to last part */
2545: for (s = rmconf->spspec; s->next != NULL; s = s->next)
2546: ;
2547:
2548: while (s != NULL) {
2549: plog(LLV_DEBUG2, LOCATION, NULL,
2550: "lifetime = %ld\n", (long)
2551: (s->lifetime ? s->lifetime : rmconf->lifetime));
2552: plog(LLV_DEBUG2, LOCATION, NULL,
2553: "lifebyte = %d\n",
2554: s->lifebyte ? s->lifebyte : rmconf->lifebyte);
2555: plog(LLV_DEBUG2, LOCATION, NULL,
2556: "encklen=%d\n", s->encklen);
2557:
2558: memset(types, 0, ARRAYLEN(types));
2559: types[algclass_isakmp_enc] = s->algclass[algclass_isakmp_enc];
2560: types[algclass_isakmp_hash] = s->algclass[algclass_isakmp_hash];
2561: types[algclass_isakmp_dh] = s->algclass[algclass_isakmp_dh];
2562: types[algclass_isakmp_ameth] =
2563: s->algclass[algclass_isakmp_ameth];
2564:
2565: /* expanding spspec */
2566: clean_tmpalgtype();
2567: trns_no = expand_isakmpspec(prop_no, trns_no, types,
2568: algclass_isakmp_enc, algclass_isakmp_ameth + 1,
2569: s->lifetime ? s->lifetime : rmconf->lifetime,
2570: s->lifebyte ? s->lifebyte : rmconf->lifebyte,
2571: s->encklen, s->vendorid, s->gssid,
2572: rmconf);
2573: if (trns_no == -1) {
2574: plog(LLV_ERROR, LOCATION, NULL,
2575: "failed to expand isakmp proposal.\n");
2576: return -1;
2577: }
2578:
2579: s = s->prev;
2580: }
2581:
2582: if (rmconf->proposal == NULL) {
2583: plog(LLV_ERROR, LOCATION, NULL,
2584: "no proposal found.\n");
2585: return -1;
2586: }
2587:
2588: return 0;
2589: }
2590:
2591: static void
2592: clean_tmpalgtype()
2593: {
2594: int i;
2595: for (i = 0; i < MAXALGCLASS; i++)
2596: tmpalgtype[i] = 0; /* means algorithm undefined. */
2597: }
2598:
2599: static int
2600: expand_isakmpspec(prop_no, trns_no, types,
2601: class, last, lifetime, lifebyte, encklen, vendorid, gssid,
2602: rmconf)
2603: int prop_no, trns_no;
2604: int *types, class, last;
2605: time_t lifetime;
2606: int lifebyte;
2607: int encklen;
2608: int vendorid;
2609: char *gssid;
2610: struct remoteconf *rmconf;
2611: {
2612: struct isakmpsa *new;
2613:
2614: /* debugging */
2615: {
2616: int j;
2617: char tb[10];
2618: plog(LLV_DEBUG2, LOCATION, NULL,
2619: "p:%d t:%d\n", prop_no, trns_no);
2620: for (j = class; j < MAXALGCLASS; j++) {
2621: snprintf(tb, sizeof(tb), "%d", types[j]);
2622: plog(LLV_DEBUG2, LOCATION, NULL,
2623: "%s%s%s%s\n",
2624: s_algtype(j, types[j]),
2625: types[j] ? "(" : "",
2626: tb[0] == '0' ? "" : tb,
2627: types[j] ? ")" : "");
2628: }
2629: plog(LLV_DEBUG2, LOCATION, NULL, "\n");
2630: }
2631:
2632: #define TMPALGTYPE2STR(n) \
2633: s_algtype(algclass_isakmp_##n, types[algclass_isakmp_##n])
2634: /* check mandatory values */
2635: if (types[algclass_isakmp_enc] == 0
2636: || types[algclass_isakmp_ameth] == 0
2637: || types[algclass_isakmp_hash] == 0
2638: || types[algclass_isakmp_dh] == 0) {
2639: yyerror("few definition of algorithm "
2640: "enc=%s ameth=%s hash=%s dhgroup=%s.\n",
2641: TMPALGTYPE2STR(enc),
2642: TMPALGTYPE2STR(ameth),
2643: TMPALGTYPE2STR(hash),
2644: TMPALGTYPE2STR(dh));
2645: return -1;
2646: }
2647: #undef TMPALGTYPE2STR
2648:
2649: /* set new sa */
2650: new = newisakmpsa();
2651: if (new == NULL) {
2652: yyerror("failed to allocate isakmp sa");
2653: return -1;
2654: }
2655: new->prop_no = prop_no;
2656: new->trns_no = trns_no++;
2657: new->lifetime = lifetime;
2658: new->lifebyte = lifebyte;
2659: new->enctype = types[algclass_isakmp_enc];
2660: new->encklen = encklen;
2661: new->authmethod = types[algclass_isakmp_ameth];
2662: new->hashtype = types[algclass_isakmp_hash];
2663: new->dh_group = types[algclass_isakmp_dh];
2664: new->vendorid = vendorid;
2665: #ifdef HAVE_GSSAPI
2666: if (new->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
2667: if (gssid != NULL) {
2668: if ((new->gssid = vmalloc(strlen(gssid))) == NULL) {
2669: racoon_free(new);
2670: yyerror("failed to allocate gssid");
2671: return -1;
2672: }
2673: memcpy(new->gssid->v, gssid, new->gssid->l);
2674: racoon_free(gssid);
2675: } else {
2676: /*
2677: * Allocate the default ID so that it gets put
2678: * into a GSS ID attribute during the Phase 1
2679: * exchange.
2680: */
2681: new->gssid = gssapi_get_default_gss_id();
2682: }
2683: }
2684: #endif
2685: insisakmpsa(new, rmconf);
2686:
2687: return trns_no;
2688: }
2689:
2690: #if 0
2691: /*
2692: * fix lifebyte.
2693: * Must be more than 1024B because its unit is kilobytes.
2694: * That is defined RFC2407.
2695: */
2696: static int
2697: fix_lifebyte(t)
2698: unsigned long t;
2699: {
2700: if (t < 1024) {
2701: yyerror("byte size should be more than 1024B.");
2702: return 0;
2703: }
2704:
2705: return(t / 1024);
2706: }
2707: #endif
2708:
2709: int
2710: cfparse()
2711: {
2712: int error;
2713:
2714: yyerrorcount = 0;
2715: yycf_init_buffer();
2716:
2717: if (yycf_switch_buffer(lcconf->racoon_conf) != 0) {
2718: plog(LLV_ERROR, LOCATION, NULL,
2719: "could not read configuration file \"%s\"\n",
2720: lcconf->racoon_conf);
2721: return -1;
2722: }
2723:
2724: error = yyparse();
2725: if (error != 0) {
2726: if (yyerrorcount) {
2727: plog(LLV_ERROR, LOCATION, NULL,
2728: "fatal parse failure (%d errors)\n",
2729: yyerrorcount);
2730: } else {
2731: plog(LLV_ERROR, LOCATION, NULL,
2732: "fatal parse failure.\n");
2733: }
2734: return -1;
2735: }
2736:
2737: if (error == 0 && yyerrorcount) {
2738: plog(LLV_ERROR, LOCATION, NULL,
2739: "parse error is nothing, but yyerrorcount is %d.\n",
2740: yyerrorcount);
2741: exit(1);
2742: }
2743:
2744: yycf_clean_buffer();
2745:
2746: plog(LLV_DEBUG2, LOCATION, NULL, "parse successed.\n");
2747:
2748: return 0;
2749: }
2750:
2751: int
2752: cfreparse()
2753: {
2754: flushph2();
2755: flushph1();
2756: flushrmconf();
2757: flushsainfo();
2758: clean_tmpalgtype();
2759: return(cfparse());
2760: }
2761:
2762: #ifdef ENABLE_ADMINPORT
2763: static void
2764: adminsock_conf(path, owner, group, mode_dec)
2765: vchar_t *path;
2766: vchar_t *owner;
2767: vchar_t *group;
2768: int mode_dec;
2769: {
2770: struct passwd *pw = NULL;
2771: struct group *gr = NULL;
2772: mode_t mode = 0;
2773: uid_t uid;
2774: gid_t gid;
2775: int isnum;
2776:
2777: adminsock_path = path->v;
2778:
2779: if (owner == NULL)
2780: return;
2781:
2782: errno = 0;
2783: uid = atoi(owner->v);
2784: isnum = !errno;
2785: if (((pw = getpwnam(owner->v)) == NULL) && !isnum)
2786: yyerror("User \"%s\" does not exist", owner->v);
2787:
2788: if (pw)
2789: adminsock_owner = pw->pw_uid;
2790: else
2791: adminsock_owner = uid;
2792:
2793: if (group == NULL)
2794: return;
2795:
2796: errno = 0;
2797: gid = atoi(group->v);
2798: isnum = !errno;
2799: if (((gr = getgrnam(group->v)) == NULL) && !isnum)
2800: yyerror("Group \"%s\" does not exist", group->v);
2801:
2802: if (gr)
2803: adminsock_group = gr->gr_gid;
2804: else
2805: adminsock_group = gid;
2806:
2807: if (mode_dec == -1)
2808: return;
2809:
2810: if (mode_dec > 777)
2811: yyerror("Mode 0%03o is invalid", mode_dec);
2812: if (mode_dec >= 400) { mode += 0400; mode_dec -= 400; }
2813: if (mode_dec >= 200) { mode += 0200; mode_dec -= 200; }
2814: if (mode_dec >= 100) { mode += 0200; mode_dec -= 100; }
2815:
2816: if (mode_dec > 77)
2817: yyerror("Mode 0%03o is invalid", mode_dec);
2818: if (mode_dec >= 40) { mode += 040; mode_dec -= 40; }
2819: if (mode_dec >= 20) { mode += 020; mode_dec -= 20; }
2820: if (mode_dec >= 10) { mode += 020; mode_dec -= 10; }
2821:
2822: if (mode_dec > 7)
2823: yyerror("Mode 0%03o is invalid", mode_dec);
2824: if (mode_dec >= 4) { mode += 04; mode_dec -= 4; }
2825: if (mode_dec >= 2) { mode += 02; mode_dec -= 2; }
2826: if (mode_dec >= 1) { mode += 02; mode_dec -= 1; }
2827:
2828: adminsock_mode = mode;
2829:
2830: return;
2831: }
2832: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>