1c18ec02fSPetter Reinholdtsen /* 2c18ec02fSPetter Reinholdtsen * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. 3c18ec02fSPetter Reinholdtsen * 4c18ec02fSPetter Reinholdtsen * Redistribution and use in source and binary forms, with or without 5c18ec02fSPetter Reinholdtsen * modification, are permitted provided that the following conditions 6c18ec02fSPetter Reinholdtsen * are met: 7c18ec02fSPetter Reinholdtsen * 8c18ec02fSPetter Reinholdtsen * Redistribution of source code must retain the above copyright 9c18ec02fSPetter Reinholdtsen * notice, this list of conditions and the following disclaimer. 10c18ec02fSPetter Reinholdtsen * 11c18ec02fSPetter Reinholdtsen * Redistribution in binary form must reproduce the above copyright 12c18ec02fSPetter Reinholdtsen * notice, this list of conditions and the following disclaimer in the 13c18ec02fSPetter Reinholdtsen * documentation and/or other materials provided with the distribution. 14c18ec02fSPetter Reinholdtsen * 15c18ec02fSPetter Reinholdtsen * Neither the name of Sun Microsystems, Inc. or the names of 16c18ec02fSPetter Reinholdtsen * contributors may be used to endorse or promote products derived 17c18ec02fSPetter Reinholdtsen * from this software without specific prior written permission. 18c18ec02fSPetter Reinholdtsen * 19c18ec02fSPetter Reinholdtsen * This software is provided "AS IS," without a warranty of any kind. 20c18ec02fSPetter Reinholdtsen * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, 21c18ec02fSPetter Reinholdtsen * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A 22c18ec02fSPetter Reinholdtsen * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. 23c18ec02fSPetter Reinholdtsen * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE 24c18ec02fSPetter Reinholdtsen * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING 25c18ec02fSPetter Reinholdtsen * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL 26c18ec02fSPetter Reinholdtsen * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, 27c18ec02fSPetter Reinholdtsen * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR 28c18ec02fSPetter Reinholdtsen * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF 29c18ec02fSPetter Reinholdtsen * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 30c18ec02fSPetter Reinholdtsen * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 31c18ec02fSPetter Reinholdtsen */ 32c18ec02fSPetter Reinholdtsen 33c18ec02fSPetter Reinholdtsen #include <stdlib.h> 34c18ec02fSPetter Reinholdtsen #include <string.h> 35c18ec02fSPetter Reinholdtsen #include <stdio.h> 36c18ec02fSPetter Reinholdtsen #include <sys/types.h> 37c18ec02fSPetter Reinholdtsen #include <sys/select.h> 38c18ec02fSPetter Reinholdtsen #include <sys/time.h> 39c18ec02fSPetter Reinholdtsen #include <signal.h> 40c18ec02fSPetter Reinholdtsen #include <unistd.h> 41c18ec02fSPetter Reinholdtsen 42c18ec02fSPetter Reinholdtsen #include <ipmitool/helper.h> 43c18ec02fSPetter Reinholdtsen #include <ipmitool/log.h> 44c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi.h> 45c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_intf.h> 46c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_user.h> 47c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_constants.h> 48c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_strings.h> 49c18ec02fSPetter Reinholdtsen #include <ipmitool/bswap.h> 50c18ec02fSPetter Reinholdtsen 51c18ec02fSPetter Reinholdtsen 52c18ec02fSPetter Reinholdtsen extern int verbose; 53c18ec02fSPetter Reinholdtsen extern int csv_output; 54c18ec02fSPetter Reinholdtsen 55c18ec02fSPetter Reinholdtsen 56c18ec02fSPetter Reinholdtsen #define IPMI_PASSWORD_DISABLE_USER 0x00 57c18ec02fSPetter Reinholdtsen #define IPMI_PASSWORD_ENABLE_USER 0x01 58c18ec02fSPetter Reinholdtsen #define IPMI_PASSWORD_SET_PASSWORD 0x02 59c18ec02fSPetter Reinholdtsen #define IPMI_PASSWORD_TEST_PASSWORD 0x03 60c18ec02fSPetter Reinholdtsen 6131f9d4c6SZdenek Styblik /* _ipmi_get_user_access - Get User Access for given channel. Results are stored 6231f9d4c6SZdenek Styblik * into passed struct. 6331f9d4c6SZdenek Styblik * 6431f9d4c6SZdenek Styblik * @intf - IPMI interface 6531f9d4c6SZdenek Styblik * @user_access_rsp - ptr to user_access_t with UID and Channel set 6631f9d4c6SZdenek Styblik * 6731f9d4c6SZdenek Styblik * returns - negative number means error, positive is a ccode 6831f9d4c6SZdenek Styblik */ 6931f9d4c6SZdenek Styblik int 7031f9d4c6SZdenek Styblik _ipmi_get_user_access(struct ipmi_intf *intf, 7131f9d4c6SZdenek Styblik struct user_access_t *user_access_rsp) 7231f9d4c6SZdenek Styblik { 7331f9d4c6SZdenek Styblik struct ipmi_rq req = {0}; 7431f9d4c6SZdenek Styblik struct ipmi_rs *rsp; 7531f9d4c6SZdenek Styblik uint8_t data[2]; 7631f9d4c6SZdenek Styblik if (user_access_rsp == NULL) { 7731f9d4c6SZdenek Styblik return (-3); 7831f9d4c6SZdenek Styblik } 7931f9d4c6SZdenek Styblik data[0] = user_access_rsp->channel & 0x0F; 8031f9d4c6SZdenek Styblik data[1] = user_access_rsp->user_id & 0x3F; 8131f9d4c6SZdenek Styblik req.msg.netfn = IPMI_NETFN_APP; 8231f9d4c6SZdenek Styblik req.msg.cmd = IPMI_GET_USER_ACCESS; 8331f9d4c6SZdenek Styblik req.msg.data = data; 8431f9d4c6SZdenek Styblik req.msg.data_len = 2; 8531f9d4c6SZdenek Styblik rsp = intf->sendrecv(intf, &req); 8631f9d4c6SZdenek Styblik if (rsp == NULL) { 8731f9d4c6SZdenek Styblik return (-1); 8831f9d4c6SZdenek Styblik } else if (rsp->ccode != 0) { 8931f9d4c6SZdenek Styblik return rsp->ccode; 9031f9d4c6SZdenek Styblik } else if (rsp->data_len != 4) { 9131f9d4c6SZdenek Styblik return (-2); 9231f9d4c6SZdenek Styblik } 9331f9d4c6SZdenek Styblik user_access_rsp->max_user_ids = rsp->data[0] & 0x3F; 9431f9d4c6SZdenek Styblik user_access_rsp->enable_status = rsp->data[1] & 0xC0; 9531f9d4c6SZdenek Styblik user_access_rsp->enabled_user_ids = rsp->data[1] & 0x3F; 9631f9d4c6SZdenek Styblik user_access_rsp->fixed_user_ids = rsp->data[2] & 0x3F; 9731f9d4c6SZdenek Styblik user_access_rsp->callin_callback = rsp->data[3] & 0x40; 9831f9d4c6SZdenek Styblik user_access_rsp->link_auth = rsp->data[3] & 0x20; 9931f9d4c6SZdenek Styblik user_access_rsp->ipmi_messaging = rsp->data[3] & 0x10; 10031f9d4c6SZdenek Styblik user_access_rsp->privilege_limit = rsp->data[3] & 0x0F; 10131f9d4c6SZdenek Styblik return rsp->ccode; 10231f9d4c6SZdenek Styblik } 10331f9d4c6SZdenek Styblik 1046d1afbf3SZdenek Styblik /* _ipmi_get_user_name - Fetch User Name for given User ID. User Name is stored 1056d1afbf3SZdenek Styblik * into passed structure. 1066d1afbf3SZdenek Styblik * 1076d1afbf3SZdenek Styblik * @intf - ipmi interface 1086d1afbf3SZdenek Styblik * @user_name - user_name_t struct with UID set 1096d1afbf3SZdenek Styblik * 1106d1afbf3SZdenek Styblik * returns - negative number means error, positive is a ccode 1116d1afbf3SZdenek Styblik */ 1126d1afbf3SZdenek Styblik int 1136d1afbf3SZdenek Styblik _ipmi_get_user_name(struct ipmi_intf *intf, struct user_name_t *user_name_ptr) 1146d1afbf3SZdenek Styblik { 1156d1afbf3SZdenek Styblik struct ipmi_rq req = {0}; 1166d1afbf3SZdenek Styblik struct ipmi_rs *rsp; 1176d1afbf3SZdenek Styblik uint8_t data[1]; 1186d1afbf3SZdenek Styblik if (user_name_ptr == NULL) { 1196d1afbf3SZdenek Styblik return (-3); 1206d1afbf3SZdenek Styblik } 1216d1afbf3SZdenek Styblik data[0] = user_name_ptr->user_id & 0x3F; 1226d1afbf3SZdenek Styblik req.msg.netfn = IPMI_NETFN_APP; 1236d1afbf3SZdenek Styblik req.msg.cmd = IPMI_GET_USER_NAME; 1246d1afbf3SZdenek Styblik req.msg.data = data; 1256d1afbf3SZdenek Styblik req.msg.data_len = 1; 1266d1afbf3SZdenek Styblik rsp = intf->sendrecv(intf, &req); 1276d1afbf3SZdenek Styblik if (rsp == NULL) { 1286d1afbf3SZdenek Styblik return (-1); 1296d1afbf3SZdenek Styblik } else if (rsp->ccode > 0) { 1306d1afbf3SZdenek Styblik return rsp->ccode; 1316d1afbf3SZdenek Styblik } else if (rsp->data_len != 17) { 1326d1afbf3SZdenek Styblik return (-2); 1336d1afbf3SZdenek Styblik } 1346d1afbf3SZdenek Styblik memset(user_name_ptr->user_name, '\0', 17); 1356d1afbf3SZdenek Styblik memcpy(user_name_ptr->user_name, rsp->data, 16); 1366d1afbf3SZdenek Styblik return rsp->ccode; 1376d1afbf3SZdenek Styblik } 1386d1afbf3SZdenek Styblik 13931f9d4c6SZdenek Styblik /* _ipmi_set_user_access - Set User Access for given channel. 14031f9d4c6SZdenek Styblik * 14131f9d4c6SZdenek Styblik * @intf - IPMI interface 14231f9d4c6SZdenek Styblik * @user_access_req - ptr to user_access_t with desired User Access. 143708be8bcSZdenek Styblik * @change_priv_limit_only - change User's privilege limit only 14431f9d4c6SZdenek Styblik * 14531f9d4c6SZdenek Styblik * returns - negative number means error, positive is a ccode 14631f9d4c6SZdenek Styblik */ 14731f9d4c6SZdenek Styblik int 14831f9d4c6SZdenek Styblik _ipmi_set_user_access(struct ipmi_intf *intf, 149708be8bcSZdenek Styblik struct user_access_t *user_access_req, 150708be8bcSZdenek Styblik uint8_t change_priv_limit_only) 15131f9d4c6SZdenek Styblik { 15231f9d4c6SZdenek Styblik uint8_t data[4]; 15331f9d4c6SZdenek Styblik struct ipmi_rq req = {0}; 15431f9d4c6SZdenek Styblik struct ipmi_rs *rsp; 15531f9d4c6SZdenek Styblik if (user_access_req == NULL) { 15631f9d4c6SZdenek Styblik return (-3); 15731f9d4c6SZdenek Styblik } 158708be8bcSZdenek Styblik data[0] = change_priv_limit_only ? 0x00 : 0x80; 15931f9d4c6SZdenek Styblik if (user_access_req->callin_callback) { 16031f9d4c6SZdenek Styblik data[0] |= 0x40; 16131f9d4c6SZdenek Styblik } 16231f9d4c6SZdenek Styblik if (user_access_req->link_auth) { 16331f9d4c6SZdenek Styblik data[0] |= 0x20; 16431f9d4c6SZdenek Styblik } 16531f9d4c6SZdenek Styblik if (user_access_req->ipmi_messaging) { 16631f9d4c6SZdenek Styblik data[0] |= 0x10; 16731f9d4c6SZdenek Styblik } 16831f9d4c6SZdenek Styblik data[0] |= (user_access_req->channel & 0x0F); 16931f9d4c6SZdenek Styblik data[1] = user_access_req->user_id & 0x3F; 17031f9d4c6SZdenek Styblik data[2] = user_access_req->privilege_limit & 0x0F; 17131f9d4c6SZdenek Styblik data[3] = user_access_req->session_limit & 0x0F; 17231f9d4c6SZdenek Styblik req.msg.netfn = IPMI_NETFN_APP; 17331f9d4c6SZdenek Styblik req.msg.cmd = IPMI_SET_USER_ACCESS; 174d099dca9SZdenek Styblik req.msg.data = data; 17531f9d4c6SZdenek Styblik req.msg.data_len = 4; 17631f9d4c6SZdenek Styblik rsp = intf->sendrecv(intf, &req); 17731f9d4c6SZdenek Styblik if (rsp == NULL) { 17831f9d4c6SZdenek Styblik return (-1); 17931f9d4c6SZdenek Styblik } else { 18031f9d4c6SZdenek Styblik return rsp->ccode; 18131f9d4c6SZdenek Styblik } 18231f9d4c6SZdenek Styblik } 18331f9d4c6SZdenek Styblik 184c18ec02fSPetter Reinholdtsen static void 185d6deeb26SZdenek Styblik dump_user_access(const char *user_name, 186d6deeb26SZdenek Styblik struct user_access_t *user_access) 187c18ec02fSPetter Reinholdtsen { 188c18ec02fSPetter Reinholdtsen static int printed_header = 0; 189d6deeb26SZdenek Styblik if (!printed_header) { 190c18ec02fSPetter Reinholdtsen printf("ID Name Callin Link Auth IPMI Msg " 191c18ec02fSPetter Reinholdtsen "Channel Priv Limit\n"); 192c18ec02fSPetter Reinholdtsen printed_header = 1; 193c18ec02fSPetter Reinholdtsen } 194c18ec02fSPetter Reinholdtsen printf("%-4d%-17s%-8s%-11s%-11s%-s\n", 195d6deeb26SZdenek Styblik user_access->user_id, 196c18ec02fSPetter Reinholdtsen user_name, 197d6deeb26SZdenek Styblik user_access->callin_callback? "false": "true ", 198d6deeb26SZdenek Styblik user_access->link_auth? "true ": "false", 199d6deeb26SZdenek Styblik user_access->ipmi_messaging? "true ": "false", 200d6deeb26SZdenek Styblik val2str(user_access->privilege_limit, 201c18ec02fSPetter Reinholdtsen ipmi_privlvl_vals)); 202c18ec02fSPetter Reinholdtsen } 203c18ec02fSPetter Reinholdtsen 204c18ec02fSPetter Reinholdtsen 205c18ec02fSPetter Reinholdtsen 206c18ec02fSPetter Reinholdtsen static void 207d6deeb26SZdenek Styblik dump_user_access_csv(const char *user_name, 208d6deeb26SZdenek Styblik struct user_access_t *user_access) 209c18ec02fSPetter Reinholdtsen { 210c18ec02fSPetter Reinholdtsen printf("%d,%s,%s,%s,%s,%s\n", 211d6deeb26SZdenek Styblik user_access->user_id, 212c18ec02fSPetter Reinholdtsen user_name, 213d6deeb26SZdenek Styblik user_access->callin_callback? "false": "true", 214d6deeb26SZdenek Styblik user_access->link_auth? "true": "false", 215d6deeb26SZdenek Styblik user_access->ipmi_messaging? "true": "false", 216d6deeb26SZdenek Styblik val2str(user_access->privilege_limit, 217c18ec02fSPetter Reinholdtsen ipmi_privlvl_vals)); 218c18ec02fSPetter Reinholdtsen } 219c18ec02fSPetter Reinholdtsen 220d6deeb26SZdenek Styblik /* ipmi_print_user_list - List IPMI Users and their ACLs for given channel. 221d6deeb26SZdenek Styblik * 222d6deeb26SZdenek Styblik * @intf - IPMI interface 223d6deeb26SZdenek Styblik * @channel_number - IPMI channel 224d6deeb26SZdenek Styblik * 225d6deeb26SZdenek Styblik * returns - 0 on success, (-1) on error 226d6deeb26SZdenek Styblik */ 227c18ec02fSPetter Reinholdtsen static int 228d6deeb26SZdenek Styblik ipmi_print_user_list(struct ipmi_intf *intf, uint8_t channel_number) 229c18ec02fSPetter Reinholdtsen { 230d6deeb26SZdenek Styblik struct user_access_t user_access = {0}; 231d6deeb26SZdenek Styblik struct user_name_t user_name = {0}; 232d6deeb26SZdenek Styblik int ccode = 0; 233c18ec02fSPetter Reinholdtsen uint8_t current_user_id = 1; 234d6deeb26SZdenek Styblik do { 235d6deeb26SZdenek Styblik memset(&user_access, 0, sizeof(user_access)); 236d6deeb26SZdenek Styblik user_access.user_id = current_user_id; 237d6deeb26SZdenek Styblik user_access.channel = channel_number; 238d6deeb26SZdenek Styblik ccode = _ipmi_get_user_access(intf, &user_access); 239d6deeb26SZdenek Styblik if (eval_ccode(ccode) != 0) { 240d6deeb26SZdenek Styblik return (-1); 241d6deeb26SZdenek Styblik } 242d6deeb26SZdenek Styblik memset(&user_name, 0, sizeof(user_name)); 243d6deeb26SZdenek Styblik user_name.user_id = current_user_id; 244d6deeb26SZdenek Styblik ccode = _ipmi_get_user_name(intf, &user_name); 245d6deeb26SZdenek Styblik if (eval_ccode(ccode) != 0) { 246d6deeb26SZdenek Styblik return (-1); 247d6deeb26SZdenek Styblik } 248d6deeb26SZdenek Styblik if ((current_user_id == 0) 249d6deeb26SZdenek Styblik || user_access.link_auth 250d6deeb26SZdenek Styblik || user_access.ipmi_messaging 251d6deeb26SZdenek Styblik || strcmp("", (char *)user_name.user_name)) { 252d6deeb26SZdenek Styblik if (csv_output) { 253d6deeb26SZdenek Styblik dump_user_access_csv((char *)user_name.user_name, 254d6deeb26SZdenek Styblik &user_access); 255d6deeb26SZdenek Styblik } else { 256d6deeb26SZdenek Styblik dump_user_access((char *)user_name.user_name, 257c18ec02fSPetter Reinholdtsen &user_access); 258c18ec02fSPetter Reinholdtsen } 259d6deeb26SZdenek Styblik } 260c18ec02fSPetter Reinholdtsen ++current_user_id; 261d6deeb26SZdenek Styblik } while ((current_user_id <= user_access.max_user_ids) 262d6deeb26SZdenek Styblik && (current_user_id <= IPMI_UID_MAX)); 263c18ec02fSPetter Reinholdtsen return 0; 264c18ec02fSPetter Reinholdtsen } 265c18ec02fSPetter Reinholdtsen 266fb36c693SZdenek Styblik /* ipmi_print_user_summary - print User statistics for given channel 267fb36c693SZdenek Styblik * 268fb36c693SZdenek Styblik * @intf - IPMI interface 269fb36c693SZdenek Styblik * @channel_number - channel number 270fb36c693SZdenek Styblik * 271fb36c693SZdenek Styblik * returns - 0 on success, (-1) on error 272fb36c693SZdenek Styblik */ 273c18ec02fSPetter Reinholdtsen static int 274fb36c693SZdenek Styblik ipmi_print_user_summary(struct ipmi_intf *intf, uint8_t channel_number) 275c18ec02fSPetter Reinholdtsen { 276fb36c693SZdenek Styblik struct user_access_t user_access = {0}; 277fb36c693SZdenek Styblik int ccode = 0; 278fb36c693SZdenek Styblik user_access.channel = channel_number; 279fb36c693SZdenek Styblik user_access.user_id = 1; 280fb36c693SZdenek Styblik ccode = _ipmi_get_user_access(intf, &user_access); 281fb36c693SZdenek Styblik if (eval_ccode(ccode) != 0) { 282fb36c693SZdenek Styblik return (-1); 283c18ec02fSPetter Reinholdtsen } 284fb36c693SZdenek Styblik if (csv_output) { 285fb36c693SZdenek Styblik printf("%" PRIu8 ",%" PRIu8 ",%" PRIu8 "\n", 286fb36c693SZdenek Styblik user_access.max_user_ids, 287fb36c693SZdenek Styblik user_access.enabled_user_ids, 288fb36c693SZdenek Styblik user_access.fixed_user_ids); 289fb36c693SZdenek Styblik } else { 290fb36c693SZdenek Styblik printf("Maximum IDs : %" PRIu8 "\n", 291fb36c693SZdenek Styblik user_access.max_user_ids); 292fb36c693SZdenek Styblik printf("Enabled User Count : %" PRIu8 "\n", 293fb36c693SZdenek Styblik user_access.enabled_user_ids); 294fb36c693SZdenek Styblik printf("Fixed Name Count : %" PRIu8 "\n", 295fb36c693SZdenek Styblik user_access.fixed_user_ids); 296c18ec02fSPetter Reinholdtsen } 297c18ec02fSPetter Reinholdtsen return 0; 298c18ec02fSPetter Reinholdtsen } 299c18ec02fSPetter Reinholdtsen 300c18ec02fSPetter Reinholdtsen /* 301c18ec02fSPetter Reinholdtsen * ipmi_user_set_username 302c18ec02fSPetter Reinholdtsen */ 303c18ec02fSPetter Reinholdtsen static int 304c18ec02fSPetter Reinholdtsen ipmi_user_set_username( 305c18ec02fSPetter Reinholdtsen struct ipmi_intf *intf, 306c18ec02fSPetter Reinholdtsen uint8_t user_id, 307c18ec02fSPetter Reinholdtsen const char *name) 308c18ec02fSPetter Reinholdtsen { 309c18ec02fSPetter Reinholdtsen struct ipmi_rs * rsp; 310c18ec02fSPetter Reinholdtsen struct ipmi_rq req; 311c18ec02fSPetter Reinholdtsen uint8_t msg_data[17]; 312c18ec02fSPetter Reinholdtsen 313c18ec02fSPetter Reinholdtsen /* 314c18ec02fSPetter Reinholdtsen * Ensure there is space for the name in the request message buffer 315c18ec02fSPetter Reinholdtsen */ 316c18ec02fSPetter Reinholdtsen if (strlen(name) >= sizeof(msg_data)) { 317c18ec02fSPetter Reinholdtsen return -1; 318c18ec02fSPetter Reinholdtsen } 319c18ec02fSPetter Reinholdtsen 320c18ec02fSPetter Reinholdtsen memset(&req, 0, sizeof(req)); 321c18ec02fSPetter Reinholdtsen req.msg.netfn = IPMI_NETFN_APP; /* 0x06 */ 322c18ec02fSPetter Reinholdtsen req.msg.cmd = IPMI_SET_USER_NAME; /* 0x45 */ 323c18ec02fSPetter Reinholdtsen req.msg.data = msg_data; 324c18ec02fSPetter Reinholdtsen req.msg.data_len = sizeof(msg_data); 325c18ec02fSPetter Reinholdtsen memset(msg_data, 0, sizeof(msg_data)); 326c18ec02fSPetter Reinholdtsen 327c18ec02fSPetter Reinholdtsen /* The channel number will remain constant throughout this function */ 328c18ec02fSPetter Reinholdtsen msg_data[0] = user_id; 329c18ec02fSPetter Reinholdtsen strncpy((char *)(msg_data + 1), name, strlen(name)); 330c18ec02fSPetter Reinholdtsen 331c18ec02fSPetter Reinholdtsen rsp = intf->sendrecv(intf, &req); 332c18ec02fSPetter Reinholdtsen 333c18ec02fSPetter Reinholdtsen if (rsp == NULL) { 334c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Name command failed (user %d, name %s)", 335c18ec02fSPetter Reinholdtsen user_id, name); 336c18ec02fSPetter Reinholdtsen return -1; 337c18ec02fSPetter Reinholdtsen } 338c18ec02fSPetter Reinholdtsen if (rsp->ccode > 0) { 339c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Name command failed (user %d, name %s): %s", 340c18ec02fSPetter Reinholdtsen user_id, name, val2str(rsp->ccode, completion_code_vals)); 341c18ec02fSPetter Reinholdtsen return -1; 342c18ec02fSPetter Reinholdtsen } 343c18ec02fSPetter Reinholdtsen 344c18ec02fSPetter Reinholdtsen return 0; 345c18ec02fSPetter Reinholdtsen } 346c18ec02fSPetter Reinholdtsen 347c18ec02fSPetter Reinholdtsen /* 348c18ec02fSPetter Reinholdtsen * ipmi_user_set_password 349c18ec02fSPetter Reinholdtsen * 350c18ec02fSPetter Reinholdtsen * This function is responsible for 4 things 351c18ec02fSPetter Reinholdtsen * Enabling/Disabling users 352c18ec02fSPetter Reinholdtsen * Setting/Testing passwords 353c18ec02fSPetter Reinholdtsen */ 354c18ec02fSPetter Reinholdtsen static int 355c18ec02fSPetter Reinholdtsen ipmi_user_set_password( 356c18ec02fSPetter Reinholdtsen struct ipmi_intf * intf, 357c18ec02fSPetter Reinholdtsen uint8_t user_id, 358c18ec02fSPetter Reinholdtsen uint8_t operation, 359c18ec02fSPetter Reinholdtsen const char *password, 360c18ec02fSPetter Reinholdtsen int is_twenty_byte_password) 361c18ec02fSPetter Reinholdtsen { 362c18ec02fSPetter Reinholdtsen struct ipmi_rs * rsp; 363c18ec02fSPetter Reinholdtsen struct ipmi_rq req; 364c18ec02fSPetter Reinholdtsen uint8_t msg_data[22]; 365c18ec02fSPetter Reinholdtsen 366c18ec02fSPetter Reinholdtsen int password_length = (is_twenty_byte_password? 20 : 16); 367c18ec02fSPetter Reinholdtsen 368c18ec02fSPetter Reinholdtsen memset(&req, 0, sizeof(req)); 369c18ec02fSPetter Reinholdtsen req.msg.netfn = IPMI_NETFN_APP; /* 0x06 */ 370c18ec02fSPetter Reinholdtsen req.msg.cmd = IPMI_SET_USER_PASSWORD; /* 0x47 */ 371c18ec02fSPetter Reinholdtsen req.msg.data = msg_data; 372c18ec02fSPetter Reinholdtsen req.msg.data_len = password_length + 2; 373c18ec02fSPetter Reinholdtsen 374c18ec02fSPetter Reinholdtsen 375c18ec02fSPetter Reinholdtsen /* The channel number will remain constant throughout this function */ 376c18ec02fSPetter Reinholdtsen msg_data[0] = user_id; 377c18ec02fSPetter Reinholdtsen 378c18ec02fSPetter Reinholdtsen if (is_twenty_byte_password) 379c18ec02fSPetter Reinholdtsen msg_data[0] |= 0x80; 380c18ec02fSPetter Reinholdtsen 381c18ec02fSPetter Reinholdtsen msg_data[1] = operation; 382c18ec02fSPetter Reinholdtsen 383c18ec02fSPetter Reinholdtsen memset(msg_data + 2, 0, password_length); 384c18ec02fSPetter Reinholdtsen 385c18ec02fSPetter Reinholdtsen if (password != NULL) 386c18ec02fSPetter Reinholdtsen strncpy((char *)(msg_data + 2), password, password_length); 387c18ec02fSPetter Reinholdtsen 388c18ec02fSPetter Reinholdtsen rsp = intf->sendrecv(intf, &req); 389c18ec02fSPetter Reinholdtsen 390c18ec02fSPetter Reinholdtsen if (rsp == NULL) { 391c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Password command failed (user %d)", 392c18ec02fSPetter Reinholdtsen user_id); 393c18ec02fSPetter Reinholdtsen return -1; 394c18ec02fSPetter Reinholdtsen } 395c18ec02fSPetter Reinholdtsen if (rsp->ccode > 0) { 396c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Password command failed (user %d): %s", 397c18ec02fSPetter Reinholdtsen user_id, val2str(rsp->ccode, completion_code_vals)); 398c18ec02fSPetter Reinholdtsen return rsp->ccode; 399c18ec02fSPetter Reinholdtsen } 400c18ec02fSPetter Reinholdtsen 401c18ec02fSPetter Reinholdtsen return 0; 402c18ec02fSPetter Reinholdtsen } 403c18ec02fSPetter Reinholdtsen 404c18ec02fSPetter Reinholdtsen /* 405c18ec02fSPetter Reinholdtsen * ipmi_user_test_password 406c18ec02fSPetter Reinholdtsen * 407c18ec02fSPetter Reinholdtsen * Call ipmi_user_set_password, and interpret the result 408c18ec02fSPetter Reinholdtsen */ 409c18ec02fSPetter Reinholdtsen static int 410c18ec02fSPetter Reinholdtsen ipmi_user_test_password( 411c18ec02fSPetter Reinholdtsen struct ipmi_intf * intf, 412c18ec02fSPetter Reinholdtsen uint8_t user_id, 413c18ec02fSPetter Reinholdtsen const char * password, 414c18ec02fSPetter Reinholdtsen int is_twenty_byte_password) 415c18ec02fSPetter Reinholdtsen { 416c18ec02fSPetter Reinholdtsen int ret; 417c18ec02fSPetter Reinholdtsen 418c18ec02fSPetter Reinholdtsen ret = ipmi_user_set_password(intf, 419c18ec02fSPetter Reinholdtsen user_id, 420c18ec02fSPetter Reinholdtsen IPMI_PASSWORD_TEST_PASSWORD, 421c18ec02fSPetter Reinholdtsen password, 422c18ec02fSPetter Reinholdtsen is_twenty_byte_password); 423c18ec02fSPetter Reinholdtsen 424c18ec02fSPetter Reinholdtsen switch (ret) { 425c18ec02fSPetter Reinholdtsen case 0: 426c18ec02fSPetter Reinholdtsen printf("Success\n"); 427c18ec02fSPetter Reinholdtsen break; 428c18ec02fSPetter Reinholdtsen case 0x80: 429c18ec02fSPetter Reinholdtsen printf("Failure: password incorrect\n"); 430c18ec02fSPetter Reinholdtsen break; 431c18ec02fSPetter Reinholdtsen case 0x81: 432c18ec02fSPetter Reinholdtsen printf("Failure: wrong password size\n"); 433c18ec02fSPetter Reinholdtsen break; 434c18ec02fSPetter Reinholdtsen default: 435c18ec02fSPetter Reinholdtsen printf("Unknown error\n"); 436c18ec02fSPetter Reinholdtsen } 437c18ec02fSPetter Reinholdtsen 438c18ec02fSPetter Reinholdtsen return ((ret == 0) ? 0 : -1); 439c18ec02fSPetter Reinholdtsen } 440c18ec02fSPetter Reinholdtsen 441c18ec02fSPetter Reinholdtsen 442c18ec02fSPetter Reinholdtsen /* 443c18ec02fSPetter Reinholdtsen * print_user_usage 444c18ec02fSPetter Reinholdtsen */ 445c18ec02fSPetter Reinholdtsen static void 446c18ec02fSPetter Reinholdtsen print_user_usage(void) 447c18ec02fSPetter Reinholdtsen { 4481d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4491d1ce49bSZdenek Styblik "User Commands:"); 4501d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4511d1ce49bSZdenek Styblik " summary [<channel number>]"); 4521d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4531d1ce49bSZdenek Styblik " list [<channel number>]"); 4541d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4551d1ce49bSZdenek Styblik " set name <user id> <username>"); 4561d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 457ad77da20SZdenek Styblik " set password <user id> [<password> <16|20>]"); 4581d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4591d1ce49bSZdenek Styblik " disable <user id>"); 4601d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4611d1ce49bSZdenek Styblik " enable <user id>"); 462c18ec02fSPetter Reinholdtsen lprintf(LOG_NOTICE, 463c18ec02fSPetter Reinholdtsen " priv <user id> <privilege level> [<channel number>]"); 4641d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4651d1ce49bSZdenek Styblik " Privilege levels:"); 4661d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4671d1ce49bSZdenek Styblik " * 0x1 - Callback"); 4681d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4691d1ce49bSZdenek Styblik " * 0x2 - User"); 4701d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4711d1ce49bSZdenek Styblik " * 0x3 - Operator"); 4721d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4731d1ce49bSZdenek Styblik " * 0x4 - Administrator"); 4741d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4751d1ce49bSZdenek Styblik " * 0x5 - OEM Proprietary"); 4761d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4771d1ce49bSZdenek Styblik " * 0xF - No Access"); 4781d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, ""); 4791d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4801d1ce49bSZdenek Styblik " test <user id> <16|20> [<password]>"); 4811d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, ""); 482c18ec02fSPetter Reinholdtsen } 483c18ec02fSPetter Reinholdtsen 484c18ec02fSPetter Reinholdtsen 485c18ec02fSPetter Reinholdtsen const char * 486c18ec02fSPetter Reinholdtsen ipmi_user_build_password_prompt(uint8_t user_id) 487c18ec02fSPetter Reinholdtsen { 488c18ec02fSPetter Reinholdtsen static char prompt[128]; 489c18ec02fSPetter Reinholdtsen memset(prompt, 0, 128); 490c18ec02fSPetter Reinholdtsen snprintf(prompt, 128, "Password for user %d: ", user_id); 491c18ec02fSPetter Reinholdtsen return prompt; 492c18ec02fSPetter Reinholdtsen } 493c18ec02fSPetter Reinholdtsen 494befb2149SZdenek Styblik /* ask_password - ask user for password 495befb2149SZdenek Styblik * 496befb2149SZdenek Styblik * @user_id: User ID which will be built-in into text 497befb2149SZdenek Styblik * 498befb2149SZdenek Styblik * @returns pointer to char with password 499befb2149SZdenek Styblik */ 500befb2149SZdenek Styblik char * 501befb2149SZdenek Styblik ask_password(uint8_t user_id) 502befb2149SZdenek Styblik { 503befb2149SZdenek Styblik const char *password_prompt = 504befb2149SZdenek Styblik ipmi_user_build_password_prompt(user_id); 505befb2149SZdenek Styblik # ifdef HAVE_GETPASSPHRASE 506befb2149SZdenek Styblik return getpassphrase(password_prompt); 507befb2149SZdenek Styblik # else 508befb2149SZdenek Styblik return (char*)getpass(password_prompt); 509befb2149SZdenek Styblik # endif 510befb2149SZdenek Styblik } 511befb2149SZdenek Styblik 512c18ec02fSPetter Reinholdtsen int 5134d3decc4SZdenek Styblik ipmi_user_summary(struct ipmi_intf *intf, int argc, char **argv) 514c18ec02fSPetter Reinholdtsen { 5153c34aa0eSZdenek Styblik /* Summary*/ 516c18ec02fSPetter Reinholdtsen uint8_t channel; 5173c34aa0eSZdenek Styblik if (argc == 1) { 518c18ec02fSPetter Reinholdtsen channel = 0x0E; /* Ask about the current channel */ 5192aa5d8c9SZdenek Styblik } else if (argc == 2) { 520140add9dSZdenek Styblik if (is_ipmi_channel_num(argv[1], &channel) != 0) { 521c18ec02fSPetter Reinholdtsen return (-1); 522c18ec02fSPetter Reinholdtsen } 5233c34aa0eSZdenek Styblik } else { 524c18ec02fSPetter Reinholdtsen print_user_usage(); 525f8ce85eeSZdenek Styblik return (-1); 526c18ec02fSPetter Reinholdtsen } 5274d3decc4SZdenek Styblik return ipmi_print_user_summary(intf, channel); 5284d3decc4SZdenek Styblik } 5294d3decc4SZdenek Styblik 5304d3decc4SZdenek Styblik int 5314d3decc4SZdenek Styblik ipmi_user_list(struct ipmi_intf *intf, int argc, char **argv) 5324d3decc4SZdenek Styblik { 5333c34aa0eSZdenek Styblik /* List */ 534c18ec02fSPetter Reinholdtsen uint8_t channel; 5353c34aa0eSZdenek Styblik if (argc == 1) { 536c18ec02fSPetter Reinholdtsen channel = 0x0E; /* Ask about the current channel */ 5373c34aa0eSZdenek Styblik } else if (argc == 2) { 538140add9dSZdenek Styblik if (is_ipmi_channel_num(argv[1], &channel) != 0) { 539c18ec02fSPetter Reinholdtsen return (-1); 540c18ec02fSPetter Reinholdtsen } 5413c34aa0eSZdenek Styblik } else { 542c18ec02fSPetter Reinholdtsen print_user_usage(); 543f8ce85eeSZdenek Styblik return (-1); 544c18ec02fSPetter Reinholdtsen } 5454d3decc4SZdenek Styblik return ipmi_print_user_list(intf, channel); 5464d3decc4SZdenek Styblik } 5474d3decc4SZdenek Styblik 5484d3decc4SZdenek Styblik int 5494d3decc4SZdenek Styblik ipmi_user_test(struct ipmi_intf *intf, int argc, char **argv) 5504d3decc4SZdenek Styblik { 5513c34aa0eSZdenek Styblik /* Test */ 552c18ec02fSPetter Reinholdtsen char *password = NULL; 553c18ec02fSPetter Reinholdtsen int password_length = 0; 554c18ec02fSPetter Reinholdtsen uint8_t user_id = 0; 5552aa5d8c9SZdenek Styblik /* a little irritating, isn't it */ 5562aa5d8c9SZdenek Styblik if (argc != 3 && argc != 4) { 5572aa5d8c9SZdenek Styblik print_user_usage(); 558f8ce85eeSZdenek Styblik return (-1); 5592aa5d8c9SZdenek Styblik } 560c18ec02fSPetter Reinholdtsen if (is_ipmi_user_id(argv[1], &user_id)) { 561c18ec02fSPetter Reinholdtsen return (-1); 562c18ec02fSPetter Reinholdtsen } 563c18ec02fSPetter Reinholdtsen if (str2int(argv[2], &password_length) != 0 564c18ec02fSPetter Reinholdtsen || (password_length != 16 && password_length != 20)) { 565c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, 566c18ec02fSPetter Reinholdtsen "Given password length '%s' is invalid.", 567c18ec02fSPetter Reinholdtsen argv[2]); 568c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Expected value is either 16 or 20."); 569c18ec02fSPetter Reinholdtsen return (-1); 570c18ec02fSPetter Reinholdtsen } 5713c34aa0eSZdenek Styblik if (argc == 3) { 572c18ec02fSPetter Reinholdtsen /* We need to prompt for a password */ 573befb2149SZdenek Styblik password = ask_password(user_id); 574c18ec02fSPetter Reinholdtsen if (password == NULL) { 575c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "ipmitool: malloc failure"); 576f8ce85eeSZdenek Styblik return (-1); 577c18ec02fSPetter Reinholdtsen } 5783c34aa0eSZdenek Styblik } else { 579befb2149SZdenek Styblik password = argv[3]; 580c18ec02fSPetter Reinholdtsen } 581befb2149SZdenek Styblik return ipmi_user_test_password(intf, 582c18ec02fSPetter Reinholdtsen user_id, 583c18ec02fSPetter Reinholdtsen password, 584c18ec02fSPetter Reinholdtsen password_length == 20); 5854d3decc4SZdenek Styblik } 5864d3decc4SZdenek Styblik 5874d3decc4SZdenek Styblik int 5884d3decc4SZdenek Styblik ipmi_user_priv(struct ipmi_intf *intf, int argc, char **argv) 5894d3decc4SZdenek Styblik { 590*12b85b3cSZdenek Styblik struct user_access_t user_access = {0}; 591708be8bcSZdenek Styblik int ccode = 0; 5924d3decc4SZdenek Styblik 5934d3decc4SZdenek Styblik if (argc != 3 && argc != 4) { 5944d3decc4SZdenek Styblik print_user_usage(); 5954d3decc4SZdenek Styblik return (-1); 5964d3decc4SZdenek Styblik } 5974d3decc4SZdenek Styblik if (argc == 4) { 598708be8bcSZdenek Styblik if (is_ipmi_channel_num(argv[3], &user_access.channel) != 0) { 5994d3decc4SZdenek Styblik return (-1); 6004d3decc4SZdenek Styblik } 601708be8bcSZdenek Styblik } else { 602708be8bcSZdenek Styblik /* Use channel running on */ 603708be8bcSZdenek Styblik user_access.channel = 0x0E; 6044d3decc4SZdenek Styblik } 605708be8bcSZdenek Styblik if (is_ipmi_user_priv_limit(argv[2], &user_access.privilege_limit) != 0 606708be8bcSZdenek Styblik || is_ipmi_user_id(argv[1], &user_access.user_id) != 0) { 6074d3decc4SZdenek Styblik return (-1); 6084d3decc4SZdenek Styblik } 609708be8bcSZdenek Styblik ccode = _ipmi_set_user_access(intf, &user_access, 1); 610708be8bcSZdenek Styblik if (eval_ccode(ccode) != 0) { 611708be8bcSZdenek Styblik lprintf(LOG_ERR, "Set Privilege Level command failed (user %d)", 612708be8bcSZdenek Styblik user_access.user_id); 613708be8bcSZdenek Styblik return (-1); 614708be8bcSZdenek Styblik } else { 615708be8bcSZdenek Styblik printf("Set Privilege Level command successful (user %d)", 616708be8bcSZdenek Styblik user_access.user_id); 617708be8bcSZdenek Styblik return 0; 618708be8bcSZdenek Styblik } 6194d3decc4SZdenek Styblik } 6204d3decc4SZdenek Styblik 6214d3decc4SZdenek Styblik int 6224d3decc4SZdenek Styblik ipmi_user_mod(struct ipmi_intf *intf, int argc, char **argv) 6234d3decc4SZdenek Styblik { 6244d3decc4SZdenek Styblik /* Disable / Enable */ 6254d3decc4SZdenek Styblik uint8_t user_id; 6264d3decc4SZdenek Styblik uint8_t operation; 6274d3decc4SZdenek Styblik char null_password[16]; /* Not used, but required */ 6284d3decc4SZdenek Styblik 6294d3decc4SZdenek Styblik if (argc != 2) { 6304d3decc4SZdenek Styblik print_user_usage(); 6314d3decc4SZdenek Styblik return (-1); 6324d3decc4SZdenek Styblik } 6334d3decc4SZdenek Styblik if (is_ipmi_user_id(argv[1], &user_id)) { 6344d3decc4SZdenek Styblik return (-1); 6354d3decc4SZdenek Styblik } 6364d3decc4SZdenek Styblik memset(null_password, 0, sizeof(null_password)); 6374d3decc4SZdenek Styblik operation = (strncmp(argv[0], "disable", 7) == 0) ? 6384d3decc4SZdenek Styblik IPMI_PASSWORD_DISABLE_USER : IPMI_PASSWORD_ENABLE_USER; 6394d3decc4SZdenek Styblik 6404d3decc4SZdenek Styblik /* Last parameter is ignored */ 6414d3decc4SZdenek Styblik return ipmi_user_set_password(intf, user_id, operation, null_password, 0); 6424d3decc4SZdenek Styblik } 6434d3decc4SZdenek Styblik 6444d3decc4SZdenek Styblik int 6454d3decc4SZdenek Styblik ipmi_user_password(struct ipmi_intf *intf, int argc, char **argv) 6464d3decc4SZdenek Styblik { 647c18ec02fSPetter Reinholdtsen char *password = NULL; 648ad77da20SZdenek Styblik uint8_t password_type = 16; 649c18ec02fSPetter Reinholdtsen uint8_t user_id = 0; 650c18ec02fSPetter Reinholdtsen if (is_ipmi_user_id(argv[2], &user_id)) { 651c18ec02fSPetter Reinholdtsen return (-1); 652c18ec02fSPetter Reinholdtsen } 653c18ec02fSPetter Reinholdtsen 6543c34aa0eSZdenek Styblik if (argc == 3) { 655c18ec02fSPetter Reinholdtsen /* We need to prompt for a password */ 656c18ec02fSPetter Reinholdtsen char *tmp; 657befb2149SZdenek Styblik password = ask_password(user_id); 658c18ec02fSPetter Reinholdtsen if (password == NULL) { 659c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "ipmitool: malloc failure"); 660f8ce85eeSZdenek Styblik return (-1); 661c18ec02fSPetter Reinholdtsen } 662befb2149SZdenek Styblik tmp = ask_password(user_id); 663c18ec02fSPetter Reinholdtsen if (tmp == NULL) { 664c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "ipmitool: malloc failure"); 665c18ec02fSPetter Reinholdtsen return (-1); 666c18ec02fSPetter Reinholdtsen } 667c18ec02fSPetter Reinholdtsen if (strlen(password) != strlen(tmp) 668c18ec02fSPetter Reinholdtsen || strncmp(password, tmp, strlen(tmp))) { 669c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Passwords do not match."); 670f8ce85eeSZdenek Styblik return (-1); 671c18ec02fSPetter Reinholdtsen } 672c18ec02fSPetter Reinholdtsen } else { 673befb2149SZdenek Styblik password = argv[3]; 674ad77da20SZdenek Styblik if (argc > 4) { 675ad77da20SZdenek Styblik if ((str2uchar(argv[4], &password_type) != 0) 676ad77da20SZdenek Styblik || (password_type != 16 && password_type != 20)) { 677ad77da20SZdenek Styblik lprintf(LOG_ERR, "Invalid password length '%s'", argv[4]); 678ad77da20SZdenek Styblik return (-1); 679ad77da20SZdenek Styblik } 680ad77da20SZdenek Styblik } else { 681ad77da20SZdenek Styblik password_type = 16; 682ad77da20SZdenek Styblik } 683c18ec02fSPetter Reinholdtsen } 684c18ec02fSPetter Reinholdtsen 685c18ec02fSPetter Reinholdtsen if (password == NULL) { 686c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Unable to parse password argument."); 687f8ce85eeSZdenek Styblik return (-1); 6883c34aa0eSZdenek Styblik } else if (strlen(password) > 20) { 689c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Password is too long (> 20 bytes)"); 690f8ce85eeSZdenek Styblik return (-1); 691c18ec02fSPetter Reinholdtsen } 692c18ec02fSPetter Reinholdtsen 693befb2149SZdenek Styblik return ipmi_user_set_password(intf, 694c18ec02fSPetter Reinholdtsen user_id, 695c18ec02fSPetter Reinholdtsen IPMI_PASSWORD_SET_PASSWORD, 696c18ec02fSPetter Reinholdtsen password, 697ad77da20SZdenek Styblik password_type > 16); 6984d3decc4SZdenek Styblik } 6994d3decc4SZdenek Styblik 7004d3decc4SZdenek Styblik int 7014d3decc4SZdenek Styblik ipmi_user_name(struct ipmi_intf *intf, int argc, char **argv) 7024d3decc4SZdenek Styblik { 7033c34aa0eSZdenek Styblik /* Set Name */ 704c18ec02fSPetter Reinholdtsen uint8_t user_id = 0; 7053c34aa0eSZdenek Styblik if (argc != 4) { 706c18ec02fSPetter Reinholdtsen print_user_usage(); 707f8ce85eeSZdenek Styblik return (-1); 708c18ec02fSPetter Reinholdtsen } 709c18ec02fSPetter Reinholdtsen if (is_ipmi_user_id(argv[2], &user_id)) { 710c18ec02fSPetter Reinholdtsen return (-1); 711c18ec02fSPetter Reinholdtsen } 7123c34aa0eSZdenek Styblik if (strlen(argv[3]) > 16) { 713c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Username is too long (> 16 bytes)"); 714f8ce85eeSZdenek Styblik return (-1); 715c18ec02fSPetter Reinholdtsen } 716c18ec02fSPetter Reinholdtsen 7174d3decc4SZdenek Styblik return ipmi_user_set_username(intf, user_id, argv[3]); 7184d3decc4SZdenek Styblik } 7194d3decc4SZdenek Styblik 7204d3decc4SZdenek Styblik /* 7214d3decc4SZdenek Styblik * ipmi_user_main 7224d3decc4SZdenek Styblik * 7234d3decc4SZdenek Styblik * Upon entry to this function argv should contain our arguments 7244d3decc4SZdenek Styblik * specific to this subcommand 7254d3decc4SZdenek Styblik */ 7264d3decc4SZdenek Styblik int 7274d3decc4SZdenek Styblik ipmi_user_main(struct ipmi_intf *intf, int argc, char **argv) 7284d3decc4SZdenek Styblik { 7294d3decc4SZdenek Styblik if (argc == 0) { 7304d3decc4SZdenek Styblik lprintf(LOG_ERR, "Not enough parameters given."); 7314d3decc4SZdenek Styblik print_user_usage(); 7324d3decc4SZdenek Styblik return (-1); 7334d3decc4SZdenek Styblik } 7344d3decc4SZdenek Styblik if (strncmp(argv[0], "help", 4) == 0) { 7354d3decc4SZdenek Styblik /* Help */ 7364d3decc4SZdenek Styblik print_user_usage(); 7374d3decc4SZdenek Styblik return 0; 7384d3decc4SZdenek Styblik } else if (strncmp(argv[0], "summary", 7) == 0) { 7394d3decc4SZdenek Styblik return ipmi_user_summary(intf, argc, argv); 7404d3decc4SZdenek Styblik } else if (strncmp(argv[0], "list", 4) == 0) { 7414d3decc4SZdenek Styblik return ipmi_user_list(intf, argc, argv); 7424d3decc4SZdenek Styblik } else if (strncmp(argv[0], "test", 4) == 0) { 7434d3decc4SZdenek Styblik return ipmi_user_test(intf, argc, argv); 7444d3decc4SZdenek Styblik } else if (strncmp(argv[0], "set", 3) == 0) { 7454d3decc4SZdenek Styblik /* Set */ 7464d3decc4SZdenek Styblik if ((argc >= 3) 7474d3decc4SZdenek Styblik && (strncmp("password", argv[1], 8) == 0)) { 7484d3decc4SZdenek Styblik return ipmi_user_password(intf, argc, argv); 7494d3decc4SZdenek Styblik } else if ((argc >= 2) 7504d3decc4SZdenek Styblik && (strncmp("name", argv[1], 4) == 0)) { 7514d3decc4SZdenek Styblik return ipmi_user_name(intf, argc, argv); 7523c34aa0eSZdenek Styblik } else { 753c18ec02fSPetter Reinholdtsen print_user_usage(); 754f8ce85eeSZdenek Styblik return (-1); 755c18ec02fSPetter Reinholdtsen } 7563c34aa0eSZdenek Styblik } else if (strncmp(argv[0], "priv", 4) == 0) { 7574d3decc4SZdenek Styblik return ipmi_user_priv(intf, argc, argv); 7583c34aa0eSZdenek Styblik } else if ((strncmp(argv[0], "disable", 7) == 0) 7593c34aa0eSZdenek Styblik || (strncmp(argv[0], "enable", 6) == 0)) { 7604d3decc4SZdenek Styblik return ipmi_user_mod(intf, argc, argv); 7613c34aa0eSZdenek Styblik } else { 762c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Invalid user command: '%s'\n", argv[0]); 763c18ec02fSPetter Reinholdtsen print_user_usage(); 7644d3decc4SZdenek Styblik return (-1); 765c18ec02fSPetter Reinholdtsen } 766c18ec02fSPetter Reinholdtsen } 767