1*03831d35Sstevel /*
2*03831d35Sstevel  * CDDL HEADER START
3*03831d35Sstevel  *
4*03831d35Sstevel  * The contents of this file are subject to the terms of the
5*03831d35Sstevel  * Common Development and Distribution License, Version 1.0 only
6*03831d35Sstevel  * (the "License").  You may not use this file except in compliance
7*03831d35Sstevel  * with the License.
8*03831d35Sstevel  *
9*03831d35Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*03831d35Sstevel  * or http://www.opensolaris.org/os/licensing.
11*03831d35Sstevel  * See the License for the specific language governing permissions
12*03831d35Sstevel  * and limitations under the License.
13*03831d35Sstevel  *
14*03831d35Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
15*03831d35Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*03831d35Sstevel  * If applicable, add the following below this CDDL HEADER, with the
17*03831d35Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
18*03831d35Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
19*03831d35Sstevel  *
20*03831d35Sstevel  * CDDL HEADER END
21*03831d35Sstevel  */
22*03831d35Sstevel /*
23*03831d35Sstevel  * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
24*03831d35Sstevel  * Use is subject to license terms.
25*03831d35Sstevel  */
26*03831d35Sstevel 
27*03831d35Sstevel /*
28*03831d35Sstevel  * user.c: support for the scadm useradd, userdel, usershow, userpassword,
29*03831d35Sstevel  * userperm options (administration of service processor users)
30*03831d35Sstevel  */
31*03831d35Sstevel 
32*03831d35Sstevel #include <libintl.h>
33*03831d35Sstevel #include <signal.h>
34*03831d35Sstevel #include <stdio.h>
35*03831d35Sstevel #include <string.h>
36*03831d35Sstevel #include <termios.h>
37*03831d35Sstevel #include <time.h>  /* required by librsc.h */
38*03831d35Sstevel 
39*03831d35Sstevel #include "librsc.h"
40*03831d35Sstevel #include "adm.h"
41*03831d35Sstevel 
42*03831d35Sstevel 
43*03831d35Sstevel static void ADM_Get_Password(char  *password);
44*03831d35Sstevel static void ADM_Destroy_Password(char  *password);
45*03831d35Sstevel static void max_username();
46*03831d35Sstevel static void malformed_username();
47*03831d35Sstevel static void wrong_response();
48*03831d35Sstevel static void no_user();
49*03831d35Sstevel static void no_info();
50*03831d35Sstevel static void userperm_usage();
51*03831d35Sstevel static void show_header();
52*03831d35Sstevel static void cleanup();
53*03831d35Sstevel 
54*03831d35Sstevel 
55*03831d35Sstevel /* Globals so that exit routine can clean up echo */
56*03831d35Sstevel static int		echoOff = 0;
57*03831d35Sstevel static struct termios	oldOpts;
58*03831d35Sstevel 
59*03831d35Sstevel typedef union {
60*03831d35Sstevel 	char	DataBuffer[DP_MAX_MSGLEN];
61*03831d35Sstevel 	void	*DataBuffer_p;
62*03831d35Sstevel } data_buffer_t;
63*03831d35Sstevel 
64*03831d35Sstevel 
65*03831d35Sstevel void
ADM_Process_useradd(int argc,char * argv[])66*03831d35Sstevel ADM_Process_useradd(int argc, char *argv[])
67*03831d35Sstevel {
68*03831d35Sstevel 	static data_buffer_t	dataBuffer;
69*03831d35Sstevel 	rscp_msg_t		Message;
70*03831d35Sstevel 	struct timespec		Timeout;
71*03831d35Sstevel 	dp_user_adm_t		*admMessage;
72*03831d35Sstevel 	dp_user_adm_r_t		*admResponse;
73*03831d35Sstevel 	char			*userName;
74*03831d35Sstevel 
75*03831d35Sstevel 
76*03831d35Sstevel 	if (argc != 3) {
77*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
78*03831d35Sstevel 		    gettext("USAGE: scadm useradd <username>"));
79*03831d35Sstevel 		exit(-1);
80*03831d35Sstevel 	}
81*03831d35Sstevel 
82*03831d35Sstevel 	ADM_Start();
83*03831d35Sstevel 
84*03831d35Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
85*03831d35Sstevel 		max_username();
86*03831d35Sstevel 		exit(-1);
87*03831d35Sstevel 	}
88*03831d35Sstevel 
89*03831d35Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
90*03831d35Sstevel 	userName   = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
91*03831d35Sstevel 	admMessage->command = DP_USER_CMD_ADD;
92*03831d35Sstevel 	(void) strcpy(userName, argv[2]);
93*03831d35Sstevel 
94*03831d35Sstevel 	Message.type = DP_USER_ADM;
95*03831d35Sstevel 	Message.len  = sizeof (dp_user_adm_t) + strlen(userName) + 1;
96*03831d35Sstevel 	Message.data = admMessage;
97*03831d35Sstevel 	ADM_Send(&Message);
98*03831d35Sstevel 
99*03831d35Sstevel 	Timeout.tv_nsec = 0;
100*03831d35Sstevel 	Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
101*03831d35Sstevel 	ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
102*03831d35Sstevel 
103*03831d35Sstevel 	admResponse = (dp_user_adm_r_t *)Message.data;
104*03831d35Sstevel 	if (admResponse->command != DP_USER_CMD_ADD) {
105*03831d35Sstevel 		wrong_response();
106*03831d35Sstevel 		exit(-1);
107*03831d35Sstevel 	}
108*03831d35Sstevel 
109*03831d35Sstevel 	if (admResponse->status == DP_ERR_USER_FULL) {
110*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
111*03831d35Sstevel 		    gettext("scadm: all user slots are full"));
112*03831d35Sstevel 		exit(-1);
113*03831d35Sstevel 	} else if (admResponse->status == DP_ERR_USER_THERE) {
114*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
115*03831d35Sstevel 		    gettext("scadm: user already exists"));
116*03831d35Sstevel 		exit(-1);
117*03831d35Sstevel 	} else if (admResponse->status == DP_ERR_USER_WARNING) {
118*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
119*03831d35Sstevel 		    gettext("scadm: username did not start with letter\n"
120*03831d35Sstevel 		    "        or did not contain lower case letter\n"));
121*03831d35Sstevel 		exit(-1);
122*03831d35Sstevel 	} else if (admResponse->status == DP_ERR_USER_BAD) {
123*03831d35Sstevel 		malformed_username();
124*03831d35Sstevel 		exit(-1);
125*03831d35Sstevel 	} else if (admResponse->status != 0) {
126*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
127*03831d35Sstevel 		    gettext("scadm: couldn't add user"));
128*03831d35Sstevel 		exit(-1);
129*03831d35Sstevel 	}
130*03831d35Sstevel 
131*03831d35Sstevel 	ADM_Free(&Message);
132*03831d35Sstevel }
133*03831d35Sstevel 
134*03831d35Sstevel 
135*03831d35Sstevel void
ADM_Process_userdel(int argc,char * argv[])136*03831d35Sstevel ADM_Process_userdel(int argc, char *argv[])
137*03831d35Sstevel {
138*03831d35Sstevel 	static data_buffer_t	dataBuffer;
139*03831d35Sstevel 	rscp_msg_t		Message;
140*03831d35Sstevel 	struct timespec		Timeout;
141*03831d35Sstevel 	dp_user_adm_t		*admMessage;
142*03831d35Sstevel 	dp_user_adm_r_t		*admResponse;
143*03831d35Sstevel 	char			*userName;
144*03831d35Sstevel 
145*03831d35Sstevel 
146*03831d35Sstevel 	if (argc != 3) {
147*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
148*03831d35Sstevel 		    gettext("USAGE: scadm userdel <username>"));
149*03831d35Sstevel 		exit(-1);
150*03831d35Sstevel 	}
151*03831d35Sstevel 
152*03831d35Sstevel 	ADM_Start();
153*03831d35Sstevel 
154*03831d35Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
155*03831d35Sstevel 		max_username();
156*03831d35Sstevel 		exit(-1);
157*03831d35Sstevel 	}
158*03831d35Sstevel 
159*03831d35Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
160*03831d35Sstevel 	userName   = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
161*03831d35Sstevel 	admMessage->command = DP_USER_CMD_DEL;
162*03831d35Sstevel 	(void) strcpy(userName, argv[2]);
163*03831d35Sstevel 
164*03831d35Sstevel 	Message.type = DP_USER_ADM;
165*03831d35Sstevel 	Message.len  = sizeof (dp_user_adm_t) + strlen(userName) + 1;
166*03831d35Sstevel 	Message.data = admMessage;
167*03831d35Sstevel 	ADM_Send(&Message);
168*03831d35Sstevel 
169*03831d35Sstevel 	Timeout.tv_nsec = 0;
170*03831d35Sstevel 	Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
171*03831d35Sstevel 	ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
172*03831d35Sstevel 
173*03831d35Sstevel 	admResponse = (dp_user_adm_r_t *)Message.data;
174*03831d35Sstevel 	if (admResponse->command != DP_USER_CMD_DEL) {
175*03831d35Sstevel 		wrong_response();
176*03831d35Sstevel 		exit(-1);
177*03831d35Sstevel 	}
178*03831d35Sstevel 
179*03831d35Sstevel 	if (admResponse->status == DP_ERR_USER_NONE) {
180*03831d35Sstevel 		no_user();
181*03831d35Sstevel 		exit(-1);
182*03831d35Sstevel 	} else if (admResponse->status == DP_ERR_USER_BAD) {
183*03831d35Sstevel 		malformed_username();
184*03831d35Sstevel 		exit(-1);
185*03831d35Sstevel 	} else if (admResponse->status != 0) {
186*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
187*03831d35Sstevel 		    gettext("scadm: couldn't delete user"));
188*03831d35Sstevel 		exit(-1);
189*03831d35Sstevel 	}
190*03831d35Sstevel 
191*03831d35Sstevel 	ADM_Free(&Message);
192*03831d35Sstevel }
193*03831d35Sstevel 
194*03831d35Sstevel 
195*03831d35Sstevel void
ADM_Process_usershow(int argc,char * argv[])196*03831d35Sstevel ADM_Process_usershow(int argc, char *argv[])
197*03831d35Sstevel {
198*03831d35Sstevel 	static data_buffer_t	dataBuffer;
199*03831d35Sstevel 	rscp_msg_t		Message;
200*03831d35Sstevel 	struct timespec		Timeout;
201*03831d35Sstevel 	dp_user_adm_t		*admMessage;
202*03831d35Sstevel 	dp_user_adm_r_t		*admResponse;
203*03831d35Sstevel 	char			*userName;
204*03831d35Sstevel 	char			*permissions;
205*03831d35Sstevel 	char			*passwd;
206*03831d35Sstevel 	int			index;
207*03831d35Sstevel 
208*03831d35Sstevel 
209*03831d35Sstevel 
210*03831d35Sstevel 	if ((argc != 2) && (argc != 3)) {
211*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
212*03831d35Sstevel 		    gettext("USAGE: scadm usershow [username]"));
213*03831d35Sstevel 		exit(-1);
214*03831d35Sstevel 	}
215*03831d35Sstevel 
216*03831d35Sstevel 	ADM_Start();
217*03831d35Sstevel 
218*03831d35Sstevel 	if (argc == 3) {
219*03831d35Sstevel 		admMessage = (dp_user_adm_t *)&dataBuffer;
220*03831d35Sstevel 		admMessage->command = DP_USER_CMD_SHOW;
221*03831d35Sstevel 		Message.type = DP_USER_ADM;
222*03831d35Sstevel 		Message.data = admMessage;
223*03831d35Sstevel 
224*03831d35Sstevel 		if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
225*03831d35Sstevel 			max_username();
226*03831d35Sstevel 			exit(-1);
227*03831d35Sstevel 		}
228*03831d35Sstevel 		userName = (char *)(&((char *)admMessage)[
229*03831d35Sstevel 		    sizeof (dp_user_adm_t)]);
230*03831d35Sstevel 		(void) strcpy(userName, argv[2]);
231*03831d35Sstevel 		admMessage->parm = DP_USER_SHOW_USERNAME;
232*03831d35Sstevel 		Message.len = sizeof (dp_user_adm_t) + strlen(userName) + 1;
233*03831d35Sstevel 		ADM_Send(&Message);
234*03831d35Sstevel 
235*03831d35Sstevel 		Timeout.tv_nsec = 0;
236*03831d35Sstevel 		Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
237*03831d35Sstevel 		ADM_Recv(&Message, &Timeout,
238*03831d35Sstevel 		    DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
239*03831d35Sstevel 
240*03831d35Sstevel 		admResponse = (dp_user_adm_r_t *)Message.data;
241*03831d35Sstevel 		if (admResponse->command != DP_USER_CMD_SHOW) {
242*03831d35Sstevel 			wrong_response();
243*03831d35Sstevel 			exit(-1);
244*03831d35Sstevel 		}
245*03831d35Sstevel 
246*03831d35Sstevel 		if (admResponse->status == DP_ERR_USER_NONE) {
247*03831d35Sstevel 			no_user();
248*03831d35Sstevel 			exit(-1);
249*03831d35Sstevel 		} else if (admResponse->status == DP_ERR_USER_BAD) {
250*03831d35Sstevel 			malformed_username();
251*03831d35Sstevel 			exit(-1);
252*03831d35Sstevel 		} else if (admResponse->status != 0) {
253*03831d35Sstevel 			no_info();
254*03831d35Sstevel 			exit(-1);
255*03831d35Sstevel 		}
256*03831d35Sstevel 
257*03831d35Sstevel 		userName = &(((char *)admResponse)[
258*03831d35Sstevel 		    sizeof (dp_user_adm_r_t)]);
259*03831d35Sstevel 		permissions = &userName[strlen(userName)+1];
260*03831d35Sstevel 		passwd = &permissions[strlen(permissions)+1];
261*03831d35Sstevel 		show_header();
262*03831d35Sstevel 		(void) printf(" %-16s    %-15s    ", userName, permissions);
263*03831d35Sstevel 		if (strncmp(passwd, "Assigned", 12) == 0) {
264*03831d35Sstevel 			(void) printf("%s\n\n", gettext("Assigned"));
265*03831d35Sstevel 		} else if (strncmp(passwd, "None", 12) == 0) {
266*03831d35Sstevel 			(void) printf("%s\n\n", gettext("None"));
267*03831d35Sstevel 		} else {
268*03831d35Sstevel 			(void) printf("%-12s\n\n", passwd);
269*03831d35Sstevel 		}
270*03831d35Sstevel 		ADM_Free(&Message);
271*03831d35Sstevel 	} else {
272*03831d35Sstevel 		show_header();
273*03831d35Sstevel 		for (index = 1; index <= DP_USER_MAX; index++) {
274*03831d35Sstevel 			admMessage = (dp_user_adm_t *)&dataBuffer;
275*03831d35Sstevel 			admMessage->command = DP_USER_CMD_SHOW;
276*03831d35Sstevel 			admMessage->parm    = index;
277*03831d35Sstevel 
278*03831d35Sstevel 			Message.type = DP_USER_ADM;
279*03831d35Sstevel 			Message.data = admMessage;
280*03831d35Sstevel 			Message.len  = sizeof (dp_user_adm_t);
281*03831d35Sstevel 			ADM_Send(&Message);
282*03831d35Sstevel 
283*03831d35Sstevel 			Timeout.tv_nsec = 0;
284*03831d35Sstevel 			Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
285*03831d35Sstevel 			ADM_Recv(&Message, &Timeout,
286*03831d35Sstevel 			    DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
287*03831d35Sstevel 
288*03831d35Sstevel 			admResponse = (dp_user_adm_r_t *)Message.data;
289*03831d35Sstevel 			if (admResponse->command != DP_USER_CMD_SHOW) {
290*03831d35Sstevel 				wrong_response();
291*03831d35Sstevel 				exit(-1);
292*03831d35Sstevel 			}
293*03831d35Sstevel 
294*03831d35Sstevel 			if (admResponse->status == DP_ERR_USER_NONE) {
295*03831d35Sstevel 				ADM_Free(&Message);
296*03831d35Sstevel 				continue;
297*03831d35Sstevel 			} else if (admResponse->status == DP_ERR_USER_BAD) {
298*03831d35Sstevel 				malformed_username();
299*03831d35Sstevel 				exit(-1);
300*03831d35Sstevel 			} else if (admResponse->status != 0) {
301*03831d35Sstevel 				no_info();
302*03831d35Sstevel 				exit(-1);
303*03831d35Sstevel 			}
304*03831d35Sstevel 
305*03831d35Sstevel 			userName = &(((char *)admResponse)[
306*03831d35Sstevel 			    sizeof (dp_user_adm_r_t)]);
307*03831d35Sstevel 			permissions = &userName[strlen(userName)+1];
308*03831d35Sstevel 			passwd = &permissions[strlen(permissions)+1];
309*03831d35Sstevel 			(void) printf(" %-16s    %-15s    ",
310*03831d35Sstevel 			    userName, permissions);
311*03831d35Sstevel 			if (strncmp(passwd, "Assigned", 12) == 0) {
312*03831d35Sstevel 				(void) printf("%s\n", gettext("Assigned"));
313*03831d35Sstevel 			} else if (strncmp(passwd, "None", 12) == 0) {
314*03831d35Sstevel 				(void) printf("%s\n", gettext("None"));
315*03831d35Sstevel 			} else {
316*03831d35Sstevel 				(void) printf("%-12s\n", passwd);
317*03831d35Sstevel 			}
318*03831d35Sstevel 
319*03831d35Sstevel 			ADM_Free(&Message);
320*03831d35Sstevel 		}
321*03831d35Sstevel 		(void) printf("\n");
322*03831d35Sstevel 	}
323*03831d35Sstevel }
324*03831d35Sstevel 
325*03831d35Sstevel 
326*03831d35Sstevel void
ADM_Process_userpassword(int argc,char * argv[])327*03831d35Sstevel ADM_Process_userpassword(int argc, char *argv[])
328*03831d35Sstevel {
329*03831d35Sstevel 	static data_buffer_t	dataBuffer;
330*03831d35Sstevel 	rscp_msg_t		Message;
331*03831d35Sstevel 	struct timespec		Timeout;
332*03831d35Sstevel 	dp_user_adm_t		*admMessage;
333*03831d35Sstevel 	dp_user_adm_r_t		*admResponse;
334*03831d35Sstevel 	char			*userName;
335*03831d35Sstevel 	char			*password;
336*03831d35Sstevel 	int			passTry;
337*03831d35Sstevel 
338*03831d35Sstevel 
339*03831d35Sstevel 	/* Try to set password up to 3 times on Malformed password */
340*03831d35Sstevel 	passTry = 3;
341*03831d35Sstevel 
342*03831d35Sstevel 	if (argc != 3) {
343*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
344*03831d35Sstevel 		    gettext("USAGE: scadm userpassword <username>"));
345*03831d35Sstevel 		exit(-1);
346*03831d35Sstevel 	}
347*03831d35Sstevel 
348*03831d35Sstevel 	ADM_Start();
349*03831d35Sstevel 
350*03831d35Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
351*03831d35Sstevel 		max_username();
352*03831d35Sstevel 		exit(-1);
353*03831d35Sstevel 	}
354*03831d35Sstevel 
355*03831d35Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
356*03831d35Sstevel 	admMessage->command = DP_USER_CMD_PASSWORD;
357*03831d35Sstevel 	userName = (&((char *)admMessage)[sizeof (dp_user_adm_t)]);
358*03831d35Sstevel 	(void) strcpy(userName, argv[2]);
359*03831d35Sstevel 	password = (&((char *)admMessage)[sizeof (dp_user_adm_t) +
360*03831d35Sstevel 	    strlen(userName) + 1]);
361*03831d35Sstevel 
362*03831d35Sstevel 	for (;;) {
363*03831d35Sstevel 		ADM_Get_Password(password);
364*03831d35Sstevel 
365*03831d35Sstevel 		Message.type = DP_USER_ADM;
366*03831d35Sstevel 		Message.len  = sizeof (dp_user_adm_t) + strlen(userName) +
367*03831d35Sstevel 		    strlen(password) + 2;
368*03831d35Sstevel 		Message.data = admMessage;
369*03831d35Sstevel 		ADM_Send(&Message);
370*03831d35Sstevel 
371*03831d35Sstevel 		ADM_Destroy_Password(password);
372*03831d35Sstevel 		Timeout.tv_nsec = 0;
373*03831d35Sstevel 		Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
374*03831d35Sstevel 		ADM_Recv(&Message, &Timeout,
375*03831d35Sstevel 		    DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
376*03831d35Sstevel 
377*03831d35Sstevel 		admResponse = (dp_user_adm_r_t *)Message.data;
378*03831d35Sstevel 		if (admResponse->command != DP_USER_CMD_PASSWORD) {
379*03831d35Sstevel 			wrong_response();
380*03831d35Sstevel 			exit(-1);
381*03831d35Sstevel 		}
382*03831d35Sstevel 
383*03831d35Sstevel 		if (admResponse->status == DP_ERR_USER_NONE) {
384*03831d35Sstevel 			no_user();
385*03831d35Sstevel 			exit(-1);
386*03831d35Sstevel 		} else if (admResponse->status == DP_ERR_USER_BAD) {
387*03831d35Sstevel 			malformed_username();
388*03831d35Sstevel 			exit(-1);
389*03831d35Sstevel 		} else if (admResponse->status == DP_ERR_USER_PASSWD) {
390*03831d35Sstevel 			(void) fprintf(stderr, "\n%s\n\n",
391*03831d35Sstevel 			    gettext("scadm: malformed password\n"
392*03831d35Sstevel 			    "        A valid password is between 6 and 8 "
393*03831d35Sstevel 			    "characters,\n"
394*03831d35Sstevel 			    "        has at least two alphabetic characters, "
395*03831d35Sstevel 			    "and at\n"
396*03831d35Sstevel 			    "        least one numeric or special character. "
397*03831d35Sstevel 			    "The\n"
398*03831d35Sstevel 			    "        password must differ from the user's "
399*03831d35Sstevel 			    "login name\n"
400*03831d35Sstevel 			    "        and any reverse or circular shift of that "
401*03831d35Sstevel 			    "login\n"
402*03831d35Sstevel 			    "        name.\n"));
403*03831d35Sstevel 			passTry--;
404*03831d35Sstevel 			if (passTry > 0) {
405*03831d35Sstevel 				ADM_Free(&Message);
406*03831d35Sstevel 				continue;
407*03831d35Sstevel 			} else
408*03831d35Sstevel 				exit(-1);
409*03831d35Sstevel 		} else if (admResponse->status != 0) {
410*03831d35Sstevel 			(void) fprintf(stderr, "\n%s\n\n",
411*03831d35Sstevel 			    gettext("scadm: couldn't change password"));
412*03831d35Sstevel 			exit(-1);
413*03831d35Sstevel 		}
414*03831d35Sstevel 
415*03831d35Sstevel 		/* password was changed successfully, get out of while */
416*03831d35Sstevel 		break;
417*03831d35Sstevel 	}
418*03831d35Sstevel 
419*03831d35Sstevel 	ADM_Free(&Message);
420*03831d35Sstevel }
421*03831d35Sstevel 
422*03831d35Sstevel 
423*03831d35Sstevel void
ADM_Process_userperm(int argc,char * argv[])424*03831d35Sstevel ADM_Process_userperm(int argc, char *argv[])
425*03831d35Sstevel {
426*03831d35Sstevel 	static data_buffer_t	dataBuffer;
427*03831d35Sstevel 	rscp_msg_t		Message;
428*03831d35Sstevel 	struct timespec		Timeout;
429*03831d35Sstevel 	dp_user_adm_t		*admMessage;
430*03831d35Sstevel 	dp_user_adm_r_t		*admResponse;
431*03831d35Sstevel 	char			*userName;
432*03831d35Sstevel 	int			permissions;
433*03831d35Sstevel 	int			index;
434*03831d35Sstevel 
435*03831d35Sstevel 
436*03831d35Sstevel 	if ((argc != 3) && (argc != 4)) {
437*03831d35Sstevel 		userperm_usage();
438*03831d35Sstevel 		exit(-1);
439*03831d35Sstevel 	}
440*03831d35Sstevel 
441*03831d35Sstevel 	if (argc == 3) {
442*03831d35Sstevel 		permissions = 0;
443*03831d35Sstevel 	} else {
444*03831d35Sstevel 		if ((strlen(argv[3]) > 4) || (strlen(argv[3]) < 1)) {
445*03831d35Sstevel 			userperm_usage();
446*03831d35Sstevel 			exit(-1);
447*03831d35Sstevel 		}
448*03831d35Sstevel 
449*03831d35Sstevel 		permissions = 0;
450*03831d35Sstevel 		for (index = 0; index < strlen(argv[3]); index++) {
451*03831d35Sstevel 			if ((argv[3][index] != 'c') &&
452*03831d35Sstevel 			    (argv[3][index] != 'C') &&
453*03831d35Sstevel 			    (argv[3][index] != 'u') &&
454*03831d35Sstevel 			    (argv[3][index] != 'U') &&
455*03831d35Sstevel 			    (argv[3][index] != 'a') &&
456*03831d35Sstevel 			    (argv[3][index] != 'A') &&
457*03831d35Sstevel 			    (argv[3][index] != 'r') &&
458*03831d35Sstevel 			    (argv[3][index] != 'R')) {
459*03831d35Sstevel 				userperm_usage();
460*03831d35Sstevel 				exit(-1);
461*03831d35Sstevel 			}
462*03831d35Sstevel 
463*03831d35Sstevel 			if ((argv[3][index] == 'c') ||
464*03831d35Sstevel 			    (argv[3][index] == 'C')) {
465*03831d35Sstevel 				/* See if this field was entered twice */
466*03831d35Sstevel 				if ((permissions & DP_USER_PERM_C) != 0) {
467*03831d35Sstevel 					userperm_usage();
468*03831d35Sstevel 					exit(-1);
469*03831d35Sstevel 				}
470*03831d35Sstevel 				permissions = permissions | DP_USER_PERM_C;
471*03831d35Sstevel 			}
472*03831d35Sstevel 
473*03831d35Sstevel 			if ((argv[3][index] == 'u') ||
474*03831d35Sstevel 			    (argv[3][index] == 'U')) {
475*03831d35Sstevel 				/* See if this field was enetered twice */
476*03831d35Sstevel 				if ((permissions & DP_USER_PERM_U) != 0) {
477*03831d35Sstevel 					userperm_usage();
478*03831d35Sstevel 					exit(-1);
479*03831d35Sstevel 				}
480*03831d35Sstevel 				permissions = permissions | DP_USER_PERM_U;
481*03831d35Sstevel 			}
482*03831d35Sstevel 
483*03831d35Sstevel 			if ((argv[3][index] == 'a') ||
484*03831d35Sstevel 			    (argv[3][index] == 'A')) {
485*03831d35Sstevel 				/* See if this field was enetered twice */
486*03831d35Sstevel 				if ((permissions & DP_USER_PERM_A) != 0) {
487*03831d35Sstevel 					userperm_usage();
488*03831d35Sstevel 					exit(-1);
489*03831d35Sstevel 				}
490*03831d35Sstevel 				permissions = permissions | DP_USER_PERM_A;
491*03831d35Sstevel 			}
492*03831d35Sstevel 
493*03831d35Sstevel 			if ((argv[3][index] == 'r') ||
494*03831d35Sstevel 			    (argv[3][index] == 'R')) {
495*03831d35Sstevel 				/* See if this field was enetered twice */
496*03831d35Sstevel 				if ((permissions & DP_USER_PERM_R) != 0) {
497*03831d35Sstevel 					userperm_usage();
498*03831d35Sstevel 					exit(-1);
499*03831d35Sstevel 				}
500*03831d35Sstevel 				permissions = permissions | DP_USER_PERM_R;
501*03831d35Sstevel 			}
502*03831d35Sstevel 		}
503*03831d35Sstevel 	}
504*03831d35Sstevel 
505*03831d35Sstevel 	ADM_Start();
506*03831d35Sstevel 
507*03831d35Sstevel 	if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
508*03831d35Sstevel 		max_username();
509*03831d35Sstevel 		exit(-1);
510*03831d35Sstevel 	}
511*03831d35Sstevel 
512*03831d35Sstevel 	admMessage = (dp_user_adm_t *)&dataBuffer;
513*03831d35Sstevel 	admMessage->command = DP_USER_CMD_PERM;
514*03831d35Sstevel 	admMessage->parm    = permissions;
515*03831d35Sstevel 	userName   = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
516*03831d35Sstevel 	(void) strcpy(userName, argv[2]);
517*03831d35Sstevel 
518*03831d35Sstevel 	Message.type = DP_USER_ADM;
519*03831d35Sstevel 	Message.len  = sizeof (dp_user_adm_t) + strlen(userName) + 1;
520*03831d35Sstevel 	Message.data = admMessage;
521*03831d35Sstevel 	ADM_Send(&Message);
522*03831d35Sstevel 
523*03831d35Sstevel 	Timeout.tv_nsec = 0;
524*03831d35Sstevel 	Timeout.tv_sec  = ADM_SEPROM_TIMEOUT;
525*03831d35Sstevel 	ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
526*03831d35Sstevel 
527*03831d35Sstevel 	admResponse = (dp_user_adm_r_t *)Message.data;
528*03831d35Sstevel 	if (admResponse->command != DP_USER_CMD_PERM) {
529*03831d35Sstevel 		wrong_response();
530*03831d35Sstevel 		exit(-1);
531*03831d35Sstevel 	}
532*03831d35Sstevel 
533*03831d35Sstevel 	if (admResponse->status == DP_ERR_USER_NONE) {
534*03831d35Sstevel 		no_user();
535*03831d35Sstevel 		exit(-1);
536*03831d35Sstevel 	} else if (admResponse->status == DP_ERR_USER_BAD) {
537*03831d35Sstevel 		malformed_username();
538*03831d35Sstevel 		exit(-1);
539*03831d35Sstevel 	} else if (admResponse->status != 0) {
540*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
541*03831d35Sstevel 		    gettext("scadm: couldn't change permissions"));
542*03831d35Sstevel 		exit(-1);
543*03831d35Sstevel 	}
544*03831d35Sstevel 
545*03831d35Sstevel 	ADM_Free(&Message);
546*03831d35Sstevel }
547*03831d35Sstevel 
548*03831d35Sstevel 
549*03831d35Sstevel static void
ADM_Get_Password(char * password)550*03831d35Sstevel ADM_Get_Password(char *password)
551*03831d35Sstevel {
552*03831d35Sstevel 	static char		pass1[64];
553*03831d35Sstevel 	static char		pass2[64];
554*03831d35Sstevel 	static struct termios	newOpts;
555*03831d35Sstevel 	int			passTry;
556*03831d35Sstevel 	int			validPass;
557*03831d35Sstevel 
558*03831d35Sstevel 
559*03831d35Sstevel 	validPass = 0;
560*03831d35Sstevel 	passTry   = 3;
561*03831d35Sstevel 
562*03831d35Sstevel 	if (signal(SIGINT, cleanup) == SIG_ERR) {
563*03831d35Sstevel 		(void) fprintf(stderr, "\n%s\n\n",
564*03831d35Sstevel 		    gettext("scadm: cleanup() registration failed"));
565*03831d35Sstevel 		exit(-1);
566*03831d35Sstevel 	}
567*03831d35Sstevel 
568*03831d35Sstevel 	echoOff = 1;
569*03831d35Sstevel 	(void) tcgetattr(0, &oldOpts);
570*03831d35Sstevel 	newOpts = oldOpts;
571*03831d35Sstevel 	newOpts.c_lflag &= ~ECHO;
572*03831d35Sstevel 	(void) tcsetattr(0, TCSANOW, &newOpts);
573*03831d35Sstevel 
574*03831d35Sstevel 	while ((passTry > 0) && (validPass == 0)) {
575*03831d35Sstevel 		passTry = passTry - 1;
576*03831d35Sstevel 		(void) printf("%s", gettext("Password: "));
577*03831d35Sstevel 		(void) scanf("%s", pass1);
578*03831d35Sstevel 		(void) printf("\n");
579*03831d35Sstevel 		(void) fflush(stdin);
580*03831d35Sstevel 		(void) printf("%s", gettext("Re-enter Password: "));
581*03831d35Sstevel 		(void) scanf("%s", pass2);
582*03831d35Sstevel 		(void) printf("\n");
583*03831d35Sstevel 
584*03831d35Sstevel 		/* Truncate at 8 characters  */
585*03831d35Sstevel 		pass1[8] = pass2[8] = '\0';
586*03831d35Sstevel 
587*03831d35Sstevel 		if ((strcmp(pass1, pass2) != 0) && (passTry > 0)) {
588*03831d35Sstevel 			ADM_Destroy_Password(pass1);
589*03831d35Sstevel 			ADM_Destroy_Password(pass2);
590*03831d35Sstevel 			(void) fprintf(stderr, "%s\n\n",
591*03831d35Sstevel 			    gettext("Passwords didn't match, try again"));
592*03831d35Sstevel 		} else if ((strcmp(pass1, pass2) != 0) && (passTry <= 0)) {
593*03831d35Sstevel 			ADM_Destroy_Password(pass1);
594*03831d35Sstevel 			ADM_Destroy_Password(pass2);
595*03831d35Sstevel 			(void) fprintf(stderr, "\n%s\n\n",
596*03831d35Sstevel 			    gettext("scadm: ERROR, passwords didn't match"));
597*03831d35Sstevel 			(void) tcsetattr(0, TCSANOW, &oldOpts);
598*03831d35Sstevel 			exit(-1);
599*03831d35Sstevel 		} else {
600*03831d35Sstevel 			validPass = 1;
601*03831d35Sstevel 		}
602*03831d35Sstevel 	}
603*03831d35Sstevel 
604*03831d35Sstevel 	(void) tcsetattr(0, TCSANOW, &oldOpts);
605*03831d35Sstevel 	echoOff = 0;
606*03831d35Sstevel 	(void) strcpy(password, pass1);
607*03831d35Sstevel 	ADM_Destroy_Password(pass1);
608*03831d35Sstevel 	ADM_Destroy_Password(pass2);
609*03831d35Sstevel }
610*03831d35Sstevel 
611*03831d35Sstevel 
612*03831d35Sstevel static void
cleanup()613*03831d35Sstevel cleanup()
614*03831d35Sstevel {
615*03831d35Sstevel 	if (echoOff)
616*03831d35Sstevel 		(void) tcsetattr(0, TCSANOW, &oldOpts);
617*03831d35Sstevel 
618*03831d35Sstevel 	exit(-1);
619*03831d35Sstevel }
620*03831d35Sstevel 
621*03831d35Sstevel 
622*03831d35Sstevel static void
ADM_Destroy_Password(char * password)623*03831d35Sstevel ADM_Destroy_Password(char *password)
624*03831d35Sstevel {
625*03831d35Sstevel 	int index;
626*03831d35Sstevel 
627*03831d35Sstevel 	for (index = 0; index < strlen(password); index++)
628*03831d35Sstevel 		password[index] = 0x1;
629*03831d35Sstevel }
630*03831d35Sstevel 
631*03831d35Sstevel 
632*03831d35Sstevel static void
max_username()633*03831d35Sstevel max_username()
634*03831d35Sstevel {
635*03831d35Sstevel 	(void) fprintf(stderr,
636*03831d35Sstevel 	    gettext("\nscadm: maximum username length is %d\n\n"),
637*03831d35Sstevel 	    DP_USER_NAME_SIZE);
638*03831d35Sstevel }
639*03831d35Sstevel 
640*03831d35Sstevel 
641*03831d35Sstevel static void
malformed_username()642*03831d35Sstevel malformed_username()
643*03831d35Sstevel {
644*03831d35Sstevel 	(void) fprintf(stderr,
645*03831d35Sstevel 	    "\n%s\n\n", gettext("scadm: malformed username"));
646*03831d35Sstevel }
647*03831d35Sstevel 
648*03831d35Sstevel 
649*03831d35Sstevel static void
wrong_response()650*03831d35Sstevel wrong_response()
651*03831d35Sstevel {
652*03831d35Sstevel 	(void) fprintf(stderr, "\n%s\n\n",
653*03831d35Sstevel 	    gettext("scadm: SC returned wrong response"));
654*03831d35Sstevel }
655*03831d35Sstevel 
656*03831d35Sstevel 
657*03831d35Sstevel static void
no_user()658*03831d35Sstevel no_user()
659*03831d35Sstevel {
660*03831d35Sstevel 	(void) fprintf(stderr,
661*03831d35Sstevel 	    "\n%s\n\n", gettext("scadm: username does not exist"));
662*03831d35Sstevel }
663*03831d35Sstevel 
664*03831d35Sstevel 
665*03831d35Sstevel static void
no_info()666*03831d35Sstevel no_info()
667*03831d35Sstevel {
668*03831d35Sstevel 	(void) fprintf(stderr, "\n%s\n\n",
669*03831d35Sstevel 	    gettext("scadm: couldn't get information on user"));
670*03831d35Sstevel }
671*03831d35Sstevel 
672*03831d35Sstevel 
673*03831d35Sstevel static void
userperm_usage()674*03831d35Sstevel userperm_usage()
675*03831d35Sstevel {
676*03831d35Sstevel 	(void) fprintf(stderr, "\n%s\n\n",
677*03831d35Sstevel 	    gettext("USAGE: scadm userperm <username> [cuar]"));
678*03831d35Sstevel }
679*03831d35Sstevel 
680*03831d35Sstevel 
681*03831d35Sstevel static void
show_header()682*03831d35Sstevel show_header()
683*03831d35Sstevel {
684*03831d35Sstevel 	int i;
685*03831d35Sstevel 	int usernLen = strlen(gettext("username"));
686*03831d35Sstevel 	int permLen = strlen(gettext("permissions"));
687*03831d35Sstevel 	int pwdLen = strlen(gettext("password"));
688*03831d35Sstevel 
689*03831d35Sstevel 	(void) printf("\n");
690*03831d35Sstevel 	(void) putchar(' ');
691*03831d35Sstevel 	(void) printf("%s", gettext("username"));
692*03831d35Sstevel 	for (i = 0; i < (20 - usernLen); i++)
693*03831d35Sstevel 		(void) putchar(' ');
694*03831d35Sstevel 
695*03831d35Sstevel 	(void) printf("%s", gettext("permissions"));
696*03831d35Sstevel 	for (i = 0; i < (19 - permLen); i++)
697*03831d35Sstevel 		(void) putchar(' ');
698*03831d35Sstevel 
699*03831d35Sstevel 	(void) printf("%s\n", gettext("password"));
700*03831d35Sstevel 
701*03831d35Sstevel 	(void) putchar(' ');
702*03831d35Sstevel 	for (i = 0; i < usernLen; i++)
703*03831d35Sstevel 		(void) putchar('-');
704*03831d35Sstevel 	for (; i < 20; i++)
705*03831d35Sstevel 		(void) putchar(' ');
706*03831d35Sstevel 
707*03831d35Sstevel 	for (i = 0; i < permLen; i++)
708*03831d35Sstevel 		(void) putchar('-');
709*03831d35Sstevel 	for (; i < 19; i++)
710*03831d35Sstevel 		(void) putchar(' ');
711*03831d35Sstevel 
712*03831d35Sstevel 	for (i = 0; i < pwdLen; i++)
713*03831d35Sstevel 		(void) putchar('-');
714*03831d35Sstevel 	(void) printf("\n");
715*03831d35Sstevel }
716