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