03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License, Version 1.0 only
03831d35f7499c87d51205817c93e9a8d42c4baestevel * (the "License"). You may not use this file except in compliance
03831d35f7499c87d51205817c93e9a8d42c4baestevel * with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or http://www.opensolaris.org/os/licensing.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#pragma ident "%Z%%M% %I% %E% SMI"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * user.c: support for the scadm useradd, userdel, usershow, userpassword,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * userperm options (administration of service processor users)
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <libintl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <signal.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <stdio.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <string.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <termios.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <time.h> /* required by librsc.h */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "librsc.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "adm.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void ADM_Get_Password(char *password);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void ADM_Destroy_Password(char *password);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void max_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void malformed_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void wrong_response();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void no_user();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void no_info();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void show_header();
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void cleanup();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Globals so that exit routine can clean up echo */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int echoOff = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct termios oldOpts;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef union {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char DataBuffer[DP_MAX_MSGLEN];
03831d35f7499c87d51205817c93e9a8d42c4baestevel void *DataBuffer_p;
03831d35f7499c87d51205817c93e9a8d42c4baestevel} data_buffer_t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelADM_Process_useradd(int argc, char *argv[])
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static data_buffer_t dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel rscp_msg_t Message;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct timespec Timeout;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_t *admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_r_t *admResponse;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *userName;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (argc != 3) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("USAGE: scadm useradd <username>"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Start();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel max_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage = (dp_user_adm_t *)&dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->command = DP_USER_CMD_ADD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(userName, argv[2]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.type = DP_USER_ADM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.len = sizeof (dp_user_adm_t) + strlen(userName) + 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.data = admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Send(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_nsec = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_sec = ADM_SEPROM_TIMEOUT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admResponse = (dp_user_adm_r_t *)Message.data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->command != DP_USER_CMD_ADD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrong_response();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->status == DP_ERR_USER_FULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: all user slots are full"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_THERE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: user already exists"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_WARNING) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: username did not start with letter\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " or did not contain lower case letter\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_BAD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel malformed_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: couldn't add user"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelADM_Process_userdel(int argc, char *argv[])
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static data_buffer_t dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel rscp_msg_t Message;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct timespec Timeout;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_t *admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_r_t *admResponse;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *userName;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (argc != 3) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("USAGE: scadm userdel <username>"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Start();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel max_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage = (dp_user_adm_t *)&dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->command = DP_USER_CMD_DEL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(userName, argv[2]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.type = DP_USER_ADM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.len = sizeof (dp_user_adm_t) + strlen(userName) + 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.data = admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Send(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_nsec = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_sec = ADM_SEPROM_TIMEOUT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admResponse = (dp_user_adm_r_t *)Message.data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->command != DP_USER_CMD_DEL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrong_response();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->status == DP_ERR_USER_NONE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_user();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_BAD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel malformed_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: couldn't delete user"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelADM_Process_usershow(int argc, char *argv[])
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static data_buffer_t dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel rscp_msg_t Message;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct timespec Timeout;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_t *admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_r_t *admResponse;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *userName;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *permissions;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *passwd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int index;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((argc != 2) && (argc != 3)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("USAGE: scadm usershow [username]"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Start();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (argc == 3) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage = (dp_user_adm_t *)&dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->command = DP_USER_CMD_SHOW;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.type = DP_USER_ADM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.data = admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel max_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName = (char *)(&((char *)admMessage)[
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (dp_user_adm_t)]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(userName, argv[2]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->parm = DP_USER_SHOW_USERNAME;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.len = sizeof (dp_user_adm_t) + strlen(userName) + 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Send(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_nsec = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_sec = ADM_SEPROM_TIMEOUT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Recv(&Message, &Timeout,
03831d35f7499c87d51205817c93e9a8d42c4baestevel DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admResponse = (dp_user_adm_r_t *)Message.data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->command != DP_USER_CMD_SHOW) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrong_response();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->status == DP_ERR_USER_NONE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_user();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_BAD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel malformed_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_info();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName = &(((char *)admResponse)[
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (dp_user_adm_r_t)]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = &userName[strlen(userName)+1];
03831d35f7499c87d51205817c93e9a8d42c4baestevel passwd = &permissions[strlen(permissions)+1];
03831d35f7499c87d51205817c93e9a8d42c4baestevel show_header();
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf(" %-16s %-15s ", userName, permissions);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strncmp(passwd, "Assigned", 12) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s\n\n", gettext("Assigned"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strncmp(passwd, "None", 12) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s\n\n", gettext("None"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%-12s\n\n", passwd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel show_header();
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (index = 1; index <= DP_USER_MAX; index++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage = (dp_user_adm_t *)&dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->command = DP_USER_CMD_SHOW;
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->parm = index;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.type = DP_USER_ADM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.data = admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.len = sizeof (dp_user_adm_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Send(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_nsec = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_sec = ADM_SEPROM_TIMEOUT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Recv(&Message, &Timeout,
03831d35f7499c87d51205817c93e9a8d42c4baestevel DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admResponse = (dp_user_adm_r_t *)Message.data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->command != DP_USER_CMD_SHOW) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrong_response();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->status == DP_ERR_USER_NONE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_BAD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel malformed_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_info();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName = &(((char *)admResponse)[
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (dp_user_adm_r_t)]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = &userName[strlen(userName)+1];
03831d35f7499c87d51205817c93e9a8d42c4baestevel passwd = &permissions[strlen(permissions)+1];
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf(" %-16s %-15s ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName, permissions);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strncmp(passwd, "Assigned", 12) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s\n", gettext("Assigned"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (strncmp(passwd, "None", 12) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s\n", gettext("None"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%-12s\n", passwd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelADM_Process_userpassword(int argc, char *argv[])
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static data_buffer_t dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel rscp_msg_t Message;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct timespec Timeout;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_t *admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_r_t *admResponse;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *userName;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *password;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int passTry;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Try to set password up to 3 times on Malformed password */
03831d35f7499c87d51205817c93e9a8d42c4baestevel passTry = 3;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (argc != 3) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("USAGE: scadm userpassword <username>"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Start();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel max_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage = (dp_user_adm_t *)&dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->command = DP_USER_CMD_PASSWORD;
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName = (&((char *)admMessage)[sizeof (dp_user_adm_t)]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(userName, argv[2]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel password = (&((char *)admMessage)[sizeof (dp_user_adm_t) +
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlen(userName) + 1]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (;;) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Get_Password(password);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.type = DP_USER_ADM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.len = sizeof (dp_user_adm_t) + strlen(userName) +
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlen(password) + 2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.data = admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Send(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Destroy_Password(password);
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_nsec = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_sec = ADM_SEPROM_TIMEOUT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Recv(&Message, &Timeout,
03831d35f7499c87d51205817c93e9a8d42c4baestevel DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admResponse = (dp_user_adm_r_t *)Message.data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->command != DP_USER_CMD_PASSWORD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrong_response();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->status == DP_ERR_USER_NONE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_user();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_BAD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel malformed_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_PASSWD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: malformed password\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " A valid password is between 6 and 8 "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "characters,\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " has at least two alphabetic characters, "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "and at\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " least one numeric or special character. "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "The\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " password must differ from the user's "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "login name\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " and any reverse or circular shift of that "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "login\n"
03831d35f7499c87d51205817c93e9a8d42c4baestevel " name.\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel passTry--;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (passTry > 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: couldn't change password"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* password was changed successfully, get out of while */
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelADM_Process_userperm(int argc, char *argv[])
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static data_buffer_t dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel rscp_msg_t Message;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct timespec Timeout;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_t *admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dp_user_adm_r_t *admResponse;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *userName;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int permissions;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int index;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((argc != 3) && (argc != 4)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (argc == 3) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((strlen(argv[3]) > 4) || (strlen(argv[3]) < 1)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (index = 0; index < strlen(argv[3]); index++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((argv[3][index] != 'c') &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] != 'C') &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] != 'u') &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] != 'U') &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] != 'a') &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] != 'A') &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] != 'r') &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] != 'R')) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((argv[3][index] == 'c') ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] == 'C')) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* See if this field was entered twice */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((permissions & DP_USER_PERM_C) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = permissions | DP_USER_PERM_C;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((argv[3][index] == 'u') ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] == 'U')) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* See if this field was enetered twice */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((permissions & DP_USER_PERM_U) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = permissions | DP_USER_PERM_U;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((argv[3][index] == 'a') ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] == 'A')) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* See if this field was enetered twice */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((permissions & DP_USER_PERM_A) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = permissions | DP_USER_PERM_A;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((argv[3][index] == 'r') ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (argv[3][index] == 'R')) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* See if this field was enetered twice */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((permissions & DP_USER_PERM_R) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel userperm_usage();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel permissions = permissions | DP_USER_PERM_R;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Start();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strlen(argv[2]) > DP_USER_NAME_SIZE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel max_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage = (dp_user_adm_t *)&dataBuffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->command = DP_USER_CMD_PERM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel admMessage->parm = permissions;
03831d35f7499c87d51205817c93e9a8d42c4baestevel userName = (char *)(&((char *)admMessage)[sizeof (dp_user_adm_t)]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(userName, argv[2]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.type = DP_USER_ADM;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.len = sizeof (dp_user_adm_t) + strlen(userName) + 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Message.data = admMessage;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Send(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_nsec = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel Timeout.tv_sec = ADM_SEPROM_TIMEOUT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Recv(&Message, &Timeout, DP_USER_ADM_R, sizeof (dp_user_adm_r_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel admResponse = (dp_user_adm_r_t *)Message.data;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->command != DP_USER_CMD_PERM) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel wrong_response();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (admResponse->status == DP_ERR_USER_NONE) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel no_user();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status == DP_ERR_USER_BAD) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel malformed_username();
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if (admResponse->status != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: couldn't change permissions"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Free(&Message);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelADM_Get_Password(char *password)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static char pass1[64];
03831d35f7499c87d51205817c93e9a8d42c4baestevel static char pass2[64];
03831d35f7499c87d51205817c93e9a8d42c4baestevel static struct termios newOpts;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int passTry;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int validPass;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel validPass = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel passTry = 3;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (signal(SIGINT, cleanup) == SIG_ERR) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: cleanup() registration failed"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel echoOff = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) tcgetattr(0, &oldOpts);
03831d35f7499c87d51205817c93e9a8d42c4baestevel newOpts = oldOpts;
03831d35f7499c87d51205817c93e9a8d42c4baestevel newOpts.c_lflag &= ~ECHO;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) tcsetattr(0, TCSANOW, &newOpts);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while ((passTry > 0) && (validPass == 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel passTry = passTry - 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s", gettext("Password: "));
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) scanf("%s", pass1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fflush(stdin);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s", gettext("Re-enter Password: "));
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) scanf("%s", pass2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Truncate at 8 characters */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pass1[8] = pass2[8] = '\0';
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((strcmp(pass1, pass2) != 0) && (passTry > 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Destroy_Password(pass1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Destroy_Password(pass2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("Passwords didn't match, try again"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else if ((strcmp(pass1, pass2) != 0) && (passTry <= 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Destroy_Password(pass1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Destroy_Password(pass2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: ERROR, passwords didn't match"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) tcsetattr(0, TCSANOW, &oldOpts);
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel validPass = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) tcsetattr(0, TCSANOW, &oldOpts);
03831d35f7499c87d51205817c93e9a8d42c4baestevel echoOff = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(password, pass1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Destroy_Password(pass1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ADM_Destroy_Password(pass2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelcleanup()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (echoOff)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) tcsetattr(0, TCSANOW, &oldOpts);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel exit(-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelADM_Destroy_Password(char *password)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int index;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (index = 0; index < strlen(password); index++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel password[index] = 0x1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelmax_username()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr,
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("\nscadm: maximum username length is %d\n\n"),
03831d35f7499c87d51205817c93e9a8d42c4baestevel DP_USER_NAME_SIZE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelmalformed_username()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "\n%s\n\n", gettext("scadm: malformed username"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelwrong_response()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: SC returned wrong response"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelno_user()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "\n%s\n\n", gettext("scadm: username does not exist"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelno_info()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("scadm: couldn't get information on user"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baesteveluserperm_usage()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) fprintf(stderr, "\n%s\n\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gettext("USAGE: scadm userperm <username> [cuar]"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelshow_header()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int usernLen = strlen(gettext("username"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel int permLen = strlen(gettext("permissions"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel int pwdLen = strlen(gettext("password"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar(' ');
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s", gettext("username"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < (20 - usernLen); i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar(' ');
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s", gettext("permissions"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < (19 - permLen); i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar(' ');
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("%s\n", gettext("password"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar(' ');
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < usernLen; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar('-');
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (; i < 20; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar(' ');
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < permLen; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar('-');
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (; i < 19; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar(' ');
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < pwdLen; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) putchar('-');
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) printf("\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel}