1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * Helper functions for standalone functionality
29  */
30 
31 #include <assert.h>
32 #include <libintl.h>
33 #include <strings.h>
34 #include "ns_sldap.h"
35 #include "ns_internal.h"
36 
37 ns_standalone_conf_t standaloneDefaults =
38 	    { {NULL,		/* A directory server's IP/name. No default. */
39 	    0,			/* A directory server's port. No default. */
40 	    NULL,		/* A domain name. */
41 				/* libsldap uses its own default. */
42 	    "default",		/* A DUAProfile's name. */
43 	    NULL,		/* Authentication information used. */
44 				/* If not specified by the user, */
45 				/* libsldap will use its own data */
46 	    NULL,		/* A credential level to be used */
47 				/* along with the authentication info. */
48 				/* See the previous comment. */
49 	    NSLDAPDIRECTORY,	/* The default path to */
50 				/* the certificate database. */
51 	    NULL,		/* A bind DN to be used during */
52 				/* subsequent LDAP Bind requests */
53 	    NULL},		/* A bind password to be used during */
54 				/* subsequent LDAP Bind requests */
55 	    NS_CACHEMGR};	/* If the -H option is not given, libsldap */
56 				/* will obtain all the configuration */
57 				/* information from ldap_cachemgr. */
58 
59 int
separatePort(char * peer,char ** name,uint16_t * port)60 separatePort(char *peer, char **name, uint16_t *port)
61 {
62 	char	*chr, *portStr = NULL;
63 
64 	chr = strchr(peer, '[');
65 	if (chr != NULL) {
66 		/* An IPv6 address */
67 		*name = chr + 1;
68 
69 		chr = strchr(peer, ']');
70 		if (chr == NULL) {
71 			(void) fprintf(stderr,
72 			    gettext("Server address is wrong: "
73 			    "unbalanced [\n"));
74 			return (1);
75 		}
76 
77 		*chr++ = '\0';
78 
79 		chr = strchr(chr, ':');
80 		if (chr != NULL && *(chr + 1) != '\0') {
81 			portStr = chr + 1;
82 		}
83 	} else {
84 		/* An IPv4 address */
85 		chr = strchr(peer, ']');
86 		if (chr != NULL) {
87 			(void) fprintf(stderr,
88 			    gettext("Server address is wrong: "
89 			    "unbalanced ]\n"));
90 			return (1);
91 		}
92 
93 		chr = strchr(peer, ':');
94 		if (chr != NULL && *(chr + 1) != '\0') {
95 			*chr++ = '\0';
96 			portStr = chr;
97 		}
98 
99 		*name = peer;
100 	}
101 
102 	if ((*name)[0] == '\0') {
103 		(void) fprintf(stderr,
104 		    gettext("Server address or name must be"
105 		    " specified.\n"));
106 		return (1);
107 	}
108 
109 	if (portStr && sscanf(portStr, "%hu", port) != 1) {
110 		(void) fprintf(stderr,
111 		    gettext("Server port is wrong. "
112 		    "The default port 389/636 "
113 		    "will be used.\n"));
114 	}
115 	return (0);
116 }
117 
118 char *
readPwd(char * pwd_file)119 readPwd(char *pwd_file)
120 {
121 	FILE	*f;
122 	char	*pwd;
123 	char	passwdBuf[BUFSIZE];
124 
125 	if ((f = fopen(pwd_file, "r")) == NULL) {
126 		(void) fprintf(stderr,
127 		    gettext("Unable to open '%s' file\n"), pwd_file);
128 		return (NULL);
129 	}
130 	if (fgets(passwdBuf, BUFSIZE, f) == NULL) {
131 		(void) fprintf(stderr,
132 		    gettext("Unable to read '%s' file\n"), pwd_file);
133 		(void) fclose(f);
134 		return (NULL);
135 	}
136 
137 	(void) fclose(f);
138 
139 	if (passwdBuf[strlen(passwdBuf) - 1] == '\n') {
140 		passwdBuf[strlen(passwdBuf) - 1] = '\0';
141 	}
142 	if ((pwd = strdup(passwdBuf)) == NULL) {
143 		(void) fprintf(stderr,
144 		    gettext("Memory allocation error\n"));
145 		return (NULL);
146 	}
147 
148 	return (pwd);
149 }
150