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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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