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 61c18ec02fSPetter Reinholdtsen /* 62c18ec02fSPetter Reinholdtsen * ipmi_get_user_access 63c18ec02fSPetter Reinholdtsen * 64c18ec02fSPetter Reinholdtsen * param intf [in] 65c18ec02fSPetter Reinholdtsen * param channel_number [in] 66c18ec02fSPetter Reinholdtsen * param user_id [in] 67c18ec02fSPetter Reinholdtsen * param user_access [out] 68c18ec02fSPetter Reinholdtsen * 69c18ec02fSPetter Reinholdtsen * return 0 on succes 70c18ec02fSPetter Reinholdtsen * 1 on failure 71c18ec02fSPetter Reinholdtsen */ 72c18ec02fSPetter Reinholdtsen static int 73c18ec02fSPetter Reinholdtsen ipmi_get_user_access( 74c18ec02fSPetter Reinholdtsen struct ipmi_intf *intf, 75c18ec02fSPetter Reinholdtsen uint8_t channel_number, 76c18ec02fSPetter Reinholdtsen uint8_t user_id, 77c18ec02fSPetter Reinholdtsen struct user_access_rsp *user_access) 78c18ec02fSPetter Reinholdtsen { 79c18ec02fSPetter Reinholdtsen struct ipmi_rs * rsp; 80c18ec02fSPetter Reinholdtsen struct ipmi_rq req; 81c18ec02fSPetter Reinholdtsen uint8_t msg_data[2]; 82c18ec02fSPetter Reinholdtsen 83c18ec02fSPetter Reinholdtsen memset(&req, 0, sizeof(req)); 84c18ec02fSPetter Reinholdtsen req.msg.netfn = IPMI_NETFN_APP; /* 0x06 */ 85c18ec02fSPetter Reinholdtsen req.msg.cmd = IPMI_GET_USER_ACCESS; /* 0x44 */ 86c18ec02fSPetter Reinholdtsen req.msg.data = msg_data; 87c18ec02fSPetter Reinholdtsen req.msg.data_len = 2; 88c18ec02fSPetter Reinholdtsen 89c18ec02fSPetter Reinholdtsen 90c18ec02fSPetter Reinholdtsen /* The channel number will remain constant throughout this function */ 91c18ec02fSPetter Reinholdtsen msg_data[0] = channel_number; 92c18ec02fSPetter Reinholdtsen msg_data[1] = user_id; 93c18ec02fSPetter Reinholdtsen 94c18ec02fSPetter Reinholdtsen rsp = intf->sendrecv(intf, &req); 95c18ec02fSPetter Reinholdtsen 96c18ec02fSPetter Reinholdtsen if (rsp == NULL) { 97c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Get User Access command failed " 98c18ec02fSPetter Reinholdtsen "(channel %d, user %d)", channel_number, user_id); 99c18ec02fSPetter Reinholdtsen return -1; 100c18ec02fSPetter Reinholdtsen } 101c18ec02fSPetter Reinholdtsen if (rsp->ccode > 0) { 102c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Get User Access command failed " 103c18ec02fSPetter Reinholdtsen "(channel %d, user %d): %s", channel_number, user_id, 104c18ec02fSPetter Reinholdtsen val2str(rsp->ccode, completion_code_vals)); 105c18ec02fSPetter Reinholdtsen return -1; 106c18ec02fSPetter Reinholdtsen } 107c18ec02fSPetter Reinholdtsen 108c18ec02fSPetter Reinholdtsen memcpy(user_access, 109c18ec02fSPetter Reinholdtsen rsp->data, 110c18ec02fSPetter Reinholdtsen sizeof(struct user_access_rsp)); 111c18ec02fSPetter Reinholdtsen 112c18ec02fSPetter Reinholdtsen return 0; 113c18ec02fSPetter Reinholdtsen } 114c18ec02fSPetter Reinholdtsen 115c18ec02fSPetter Reinholdtsen 116c18ec02fSPetter Reinholdtsen 117c18ec02fSPetter Reinholdtsen /* 118c18ec02fSPetter Reinholdtsen * ipmi_get_user_name 119c18ec02fSPetter Reinholdtsen * 120c18ec02fSPetter Reinholdtsen * param intf [in] 121c18ec02fSPetter Reinholdtsen * param channel_number [in] 122c18ec02fSPetter Reinholdtsen * param user_id [in] 123c18ec02fSPetter Reinholdtsen * param user_name [out] 124c18ec02fSPetter Reinholdtsen * 125c18ec02fSPetter Reinholdtsen * return 0 on succes 126c18ec02fSPetter Reinholdtsen * 1 on failure 127c18ec02fSPetter Reinholdtsen */ 128c18ec02fSPetter Reinholdtsen static int 129c18ec02fSPetter Reinholdtsen ipmi_get_user_name( 130c18ec02fSPetter Reinholdtsen struct ipmi_intf *intf, 131c18ec02fSPetter Reinholdtsen uint8_t user_id, 132c18ec02fSPetter Reinholdtsen char *user_name) 133c18ec02fSPetter Reinholdtsen { 134c18ec02fSPetter Reinholdtsen struct ipmi_rs * rsp; 135c18ec02fSPetter Reinholdtsen struct ipmi_rq req; 136c18ec02fSPetter Reinholdtsen uint8_t msg_data[1]; 137c18ec02fSPetter Reinholdtsen 138c18ec02fSPetter Reinholdtsen memset(user_name, 0, 17); 139c18ec02fSPetter Reinholdtsen 140c18ec02fSPetter Reinholdtsen memset(&req, 0, sizeof(req)); 141c18ec02fSPetter Reinholdtsen req.msg.netfn = IPMI_NETFN_APP; /* 0x06 */ 142c18ec02fSPetter Reinholdtsen req.msg.cmd = IPMI_GET_USER_NAME; /* 0x45 */ 143c18ec02fSPetter Reinholdtsen req.msg.data = msg_data; 144c18ec02fSPetter Reinholdtsen req.msg.data_len = 1; 145c18ec02fSPetter Reinholdtsen 146c18ec02fSPetter Reinholdtsen msg_data[0] = user_id; 147c18ec02fSPetter Reinholdtsen 148c18ec02fSPetter Reinholdtsen rsp = intf->sendrecv(intf, &req); 149c18ec02fSPetter Reinholdtsen 150c18ec02fSPetter Reinholdtsen if (rsp == NULL) { 151c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Get User Name command failed (user %d)", 152c18ec02fSPetter Reinholdtsen user_id); 153c18ec02fSPetter Reinholdtsen return -1; 154c18ec02fSPetter Reinholdtsen } 155c18ec02fSPetter Reinholdtsen if (rsp->ccode > 0) { 156c18ec02fSPetter Reinholdtsen if (rsp->ccode == 0xcc) 157c18ec02fSPetter Reinholdtsen return 0; 158c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Get User Name command failed (user %d): %s", 159c18ec02fSPetter Reinholdtsen user_id, val2str(rsp->ccode, completion_code_vals)); 160c18ec02fSPetter Reinholdtsen return -1; 161c18ec02fSPetter Reinholdtsen } 162c18ec02fSPetter Reinholdtsen 163c18ec02fSPetter Reinholdtsen memcpy(user_name, rsp->data, 16); 164c18ec02fSPetter Reinholdtsen 165c18ec02fSPetter Reinholdtsen return 0; 166c18ec02fSPetter Reinholdtsen } 167c18ec02fSPetter Reinholdtsen 168c18ec02fSPetter Reinholdtsen 169c18ec02fSPetter Reinholdtsen 170c18ec02fSPetter Reinholdtsen 171c18ec02fSPetter Reinholdtsen static void 172c18ec02fSPetter Reinholdtsen dump_user_access( 173c18ec02fSPetter Reinholdtsen uint8_t user_id, 174c18ec02fSPetter Reinholdtsen const char * user_name, 175c18ec02fSPetter Reinholdtsen struct user_access_rsp * user_access) 176c18ec02fSPetter Reinholdtsen { 177c18ec02fSPetter Reinholdtsen static int printed_header = 0; 178c18ec02fSPetter Reinholdtsen 179c18ec02fSPetter Reinholdtsen if (! printed_header) 180c18ec02fSPetter Reinholdtsen { 181c18ec02fSPetter Reinholdtsen printf("ID Name Callin Link Auth IPMI Msg " 182c18ec02fSPetter Reinholdtsen "Channel Priv Limit\n"); 183c18ec02fSPetter Reinholdtsen printed_header = 1; 184c18ec02fSPetter Reinholdtsen } 185c18ec02fSPetter Reinholdtsen 186c18ec02fSPetter Reinholdtsen printf("%-4d%-17s%-8s%-11s%-11s%-s\n", 187c18ec02fSPetter Reinholdtsen user_id, 188c18ec02fSPetter Reinholdtsen user_name, 189c18ec02fSPetter Reinholdtsen user_access->no_callin_access? "false": "true ", 190c18ec02fSPetter Reinholdtsen user_access->link_auth_access? "true ": "false", 191c18ec02fSPetter Reinholdtsen user_access->ipmi_messaging_access? "true ": "false", 192c18ec02fSPetter Reinholdtsen val2str(user_access->channel_privilege_limit, 193c18ec02fSPetter Reinholdtsen ipmi_privlvl_vals)); 194c18ec02fSPetter Reinholdtsen } 195c18ec02fSPetter Reinholdtsen 196c18ec02fSPetter Reinholdtsen 197c18ec02fSPetter Reinholdtsen 198c18ec02fSPetter Reinholdtsen static void 199c18ec02fSPetter Reinholdtsen dump_user_access_csv( 200c18ec02fSPetter Reinholdtsen uint8_t user_id, 201c18ec02fSPetter Reinholdtsen const char *user_name, 202c18ec02fSPetter Reinholdtsen struct user_access_rsp *user_access) 203c18ec02fSPetter Reinholdtsen { 204c18ec02fSPetter Reinholdtsen printf("%d,%s,%s,%s,%s,%s\n", 205c18ec02fSPetter Reinholdtsen user_id, 206c18ec02fSPetter Reinholdtsen user_name, 207c18ec02fSPetter Reinholdtsen user_access->no_callin_access? "false": "true", 208c18ec02fSPetter Reinholdtsen user_access->link_auth_access? "true": "false", 209c18ec02fSPetter Reinholdtsen user_access->ipmi_messaging_access? "true": "false", 210c18ec02fSPetter Reinholdtsen val2str(user_access->channel_privilege_limit, 211c18ec02fSPetter Reinholdtsen ipmi_privlvl_vals)); 212c18ec02fSPetter Reinholdtsen } 213c18ec02fSPetter Reinholdtsen 214c18ec02fSPetter Reinholdtsen static int 215c18ec02fSPetter Reinholdtsen ipmi_print_user_list( 216c18ec02fSPetter Reinholdtsen struct ipmi_intf *intf, 217c18ec02fSPetter Reinholdtsen uint8_t channel_number) 218c18ec02fSPetter Reinholdtsen { 219c18ec02fSPetter Reinholdtsen /* This is where you were! */ 220c18ec02fSPetter Reinholdtsen char user_name[17]; 221c18ec02fSPetter Reinholdtsen struct user_access_rsp user_access; 222c18ec02fSPetter Reinholdtsen uint8_t current_user_id = 1; 223c18ec02fSPetter Reinholdtsen 224c18ec02fSPetter Reinholdtsen 225c18ec02fSPetter Reinholdtsen do 226c18ec02fSPetter Reinholdtsen { 227c18ec02fSPetter Reinholdtsen if (ipmi_get_user_access(intf, 228c18ec02fSPetter Reinholdtsen channel_number, 229c18ec02fSPetter Reinholdtsen current_user_id, 230c18ec02fSPetter Reinholdtsen &user_access)) 231c18ec02fSPetter Reinholdtsen return -1; 232c18ec02fSPetter Reinholdtsen 233c18ec02fSPetter Reinholdtsen 234c18ec02fSPetter Reinholdtsen if (ipmi_get_user_name(intf, 235c18ec02fSPetter Reinholdtsen current_user_id, 236c18ec02fSPetter Reinholdtsen user_name)) 237c18ec02fSPetter Reinholdtsen return -1; 238c18ec02fSPetter Reinholdtsen 239c18ec02fSPetter Reinholdtsen if ((current_user_id == 0) || 240c18ec02fSPetter Reinholdtsen user_access.link_auth_access || 241c18ec02fSPetter Reinholdtsen user_access.ipmi_messaging_access || 242c18ec02fSPetter Reinholdtsen strcmp("", user_name)) 243c18ec02fSPetter Reinholdtsen { 244c18ec02fSPetter Reinholdtsen if (csv_output) 245c18ec02fSPetter Reinholdtsen dump_user_access_csv(current_user_id, 246c18ec02fSPetter Reinholdtsen user_name, &user_access); 247c18ec02fSPetter Reinholdtsen else 248c18ec02fSPetter Reinholdtsen dump_user_access(current_user_id, 249c18ec02fSPetter Reinholdtsen user_name, 250c18ec02fSPetter Reinholdtsen &user_access); 251c18ec02fSPetter Reinholdtsen } 252c18ec02fSPetter Reinholdtsen 253c18ec02fSPetter Reinholdtsen 254c18ec02fSPetter Reinholdtsen ++current_user_id; 255c18ec02fSPetter Reinholdtsen } while((current_user_id <= user_access.maximum_ids) && 256c18ec02fSPetter Reinholdtsen (current_user_id <= IPMI_UID_MAX)); /* Absolute maximum allowed by spec */ 257c18ec02fSPetter Reinholdtsen 258c18ec02fSPetter Reinholdtsen 259c18ec02fSPetter Reinholdtsen return 0; 260c18ec02fSPetter Reinholdtsen } 261c18ec02fSPetter Reinholdtsen 262c18ec02fSPetter Reinholdtsen 263c18ec02fSPetter Reinholdtsen 264c18ec02fSPetter Reinholdtsen static int 265c18ec02fSPetter Reinholdtsen ipmi_print_user_summary( 266c18ec02fSPetter Reinholdtsen struct ipmi_intf * intf, 267c18ec02fSPetter Reinholdtsen uint8_t channel_number) 268c18ec02fSPetter Reinholdtsen { 269c18ec02fSPetter Reinholdtsen struct user_access_rsp user_access; 270c18ec02fSPetter Reinholdtsen 271c18ec02fSPetter Reinholdtsen if (ipmi_get_user_access(intf, 272c18ec02fSPetter Reinholdtsen channel_number, 273c18ec02fSPetter Reinholdtsen 1, 274c18ec02fSPetter Reinholdtsen &user_access)) 275c18ec02fSPetter Reinholdtsen return -1; 276c18ec02fSPetter Reinholdtsen 277c18ec02fSPetter Reinholdtsen if (csv_output) 278c18ec02fSPetter Reinholdtsen { 279c18ec02fSPetter Reinholdtsen printf("%d,%d,%d\n", 280c18ec02fSPetter Reinholdtsen user_access.maximum_ids, 281c18ec02fSPetter Reinholdtsen user_access.enabled_user_count, 282c18ec02fSPetter Reinholdtsen user_access.fixed_name_count); 283c18ec02fSPetter Reinholdtsen } 284c18ec02fSPetter Reinholdtsen else 285c18ec02fSPetter Reinholdtsen { 286c18ec02fSPetter Reinholdtsen printf("Maximum IDs : %d\n", 287c18ec02fSPetter Reinholdtsen user_access.maximum_ids); 288c18ec02fSPetter Reinholdtsen printf("Enabled User Count : %d\n", 289c18ec02fSPetter Reinholdtsen user_access.enabled_user_count); 290c18ec02fSPetter Reinholdtsen printf("Fixed Name Count : %d\n", 291c18ec02fSPetter Reinholdtsen user_access.fixed_name_count); 292c18ec02fSPetter Reinholdtsen } 293c18ec02fSPetter Reinholdtsen 294c18ec02fSPetter Reinholdtsen return 0; 295c18ec02fSPetter Reinholdtsen } 296c18ec02fSPetter Reinholdtsen 297c18ec02fSPetter Reinholdtsen 298c18ec02fSPetter Reinholdtsen 299c18ec02fSPetter Reinholdtsen /* 300c18ec02fSPetter Reinholdtsen * ipmi_user_set_username 301c18ec02fSPetter Reinholdtsen */ 302c18ec02fSPetter Reinholdtsen static int 303c18ec02fSPetter Reinholdtsen ipmi_user_set_username( 304c18ec02fSPetter Reinholdtsen struct ipmi_intf *intf, 305c18ec02fSPetter Reinholdtsen uint8_t user_id, 306c18ec02fSPetter Reinholdtsen const char *name) 307c18ec02fSPetter Reinholdtsen { 308c18ec02fSPetter Reinholdtsen struct ipmi_rs * rsp; 309c18ec02fSPetter Reinholdtsen struct ipmi_rq req; 310c18ec02fSPetter Reinholdtsen uint8_t msg_data[17]; 311c18ec02fSPetter Reinholdtsen 312c18ec02fSPetter Reinholdtsen /* 313c18ec02fSPetter Reinholdtsen * Ensure there is space for the name in the request message buffer 314c18ec02fSPetter Reinholdtsen */ 315c18ec02fSPetter Reinholdtsen if (strlen(name) >= sizeof(msg_data)) { 316c18ec02fSPetter Reinholdtsen return -1; 317c18ec02fSPetter Reinholdtsen } 318c18ec02fSPetter Reinholdtsen 319c18ec02fSPetter Reinholdtsen memset(&req, 0, sizeof(req)); 320c18ec02fSPetter Reinholdtsen req.msg.netfn = IPMI_NETFN_APP; /* 0x06 */ 321c18ec02fSPetter Reinholdtsen req.msg.cmd = IPMI_SET_USER_NAME; /* 0x45 */ 322c18ec02fSPetter Reinholdtsen req.msg.data = msg_data; 323c18ec02fSPetter Reinholdtsen req.msg.data_len = sizeof(msg_data); 324c18ec02fSPetter Reinholdtsen memset(msg_data, 0, sizeof(msg_data)); 325c18ec02fSPetter Reinholdtsen 326c18ec02fSPetter Reinholdtsen /* The channel number will remain constant throughout this function */ 327c18ec02fSPetter Reinholdtsen msg_data[0] = user_id; 328c18ec02fSPetter Reinholdtsen strncpy((char *)(msg_data + 1), name, strlen(name)); 329c18ec02fSPetter Reinholdtsen 330c18ec02fSPetter Reinholdtsen rsp = intf->sendrecv(intf, &req); 331c18ec02fSPetter Reinholdtsen 332c18ec02fSPetter Reinholdtsen if (rsp == NULL) { 333c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Name command failed (user %d, name %s)", 334c18ec02fSPetter Reinholdtsen user_id, name); 335c18ec02fSPetter Reinholdtsen return -1; 336c18ec02fSPetter Reinholdtsen } 337c18ec02fSPetter Reinholdtsen if (rsp->ccode > 0) { 338c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Name command failed (user %d, name %s): %s", 339c18ec02fSPetter Reinholdtsen user_id, name, val2str(rsp->ccode, completion_code_vals)); 340c18ec02fSPetter Reinholdtsen return -1; 341c18ec02fSPetter Reinholdtsen } 342c18ec02fSPetter Reinholdtsen 343c18ec02fSPetter Reinholdtsen return 0; 344c18ec02fSPetter Reinholdtsen } 345c18ec02fSPetter Reinholdtsen 346c18ec02fSPetter Reinholdtsen static int 347c18ec02fSPetter Reinholdtsen ipmi_user_set_userpriv( 348c18ec02fSPetter Reinholdtsen struct ipmi_intf *intf, 349c18ec02fSPetter Reinholdtsen uint8_t channel, 350c18ec02fSPetter Reinholdtsen uint8_t user_id, 351c18ec02fSPetter Reinholdtsen const unsigned char privLevel) 352c18ec02fSPetter Reinholdtsen { 353c18ec02fSPetter Reinholdtsen struct ipmi_rs *rsp; 354c18ec02fSPetter Reinholdtsen struct ipmi_rq req; 355c18ec02fSPetter Reinholdtsen uint8_t msg_data[4] = {0, 0, 0, 0}; 356c18ec02fSPetter Reinholdtsen 357c18ec02fSPetter Reinholdtsen memset(&req, 0, sizeof(req)); 358c18ec02fSPetter Reinholdtsen req.msg.netfn = IPMI_NETFN_APP; /* 0x06 */ 359c18ec02fSPetter Reinholdtsen req.msg.cmd = IPMI_SET_USER_ACCESS; /* 0x43 */ 360c18ec02fSPetter Reinholdtsen req.msg.data = msg_data; 361c18ec02fSPetter Reinholdtsen req.msg.data_len = 4; 362c18ec02fSPetter Reinholdtsen 363c18ec02fSPetter Reinholdtsen /* The channel number will remain constant throughout this function */ 364c18ec02fSPetter Reinholdtsen msg_data[0] = (channel & 0x0f); 365c18ec02fSPetter Reinholdtsen msg_data[1] = (user_id & 0x3f); 366c18ec02fSPetter Reinholdtsen msg_data[2] = (privLevel & 0x0f); 367c18ec02fSPetter Reinholdtsen msg_data[3] = 0; 368c18ec02fSPetter Reinholdtsen 369c18ec02fSPetter Reinholdtsen rsp = intf->sendrecv(intf, &req); 370c18ec02fSPetter Reinholdtsen 371c18ec02fSPetter Reinholdtsen if (rsp == NULL) 372c18ec02fSPetter Reinholdtsen { 373c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set Privilege Level command failed (user %d)", 374c18ec02fSPetter Reinholdtsen user_id); 375c18ec02fSPetter Reinholdtsen return -1; 376c18ec02fSPetter Reinholdtsen } 377c18ec02fSPetter Reinholdtsen if (rsp->ccode > 0) 378c18ec02fSPetter Reinholdtsen { 379c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set Privilege Level command failed (user %d): %s", 380c18ec02fSPetter Reinholdtsen user_id, val2str(rsp->ccode, completion_code_vals)); 381c18ec02fSPetter Reinholdtsen return -1; 382c18ec02fSPetter Reinholdtsen } 383c18ec02fSPetter Reinholdtsen 384c18ec02fSPetter Reinholdtsen return 0; 385c18ec02fSPetter Reinholdtsen } 386c18ec02fSPetter Reinholdtsen 387c18ec02fSPetter Reinholdtsen /* 388c18ec02fSPetter Reinholdtsen * ipmi_user_set_password 389c18ec02fSPetter Reinholdtsen * 390c18ec02fSPetter Reinholdtsen * This function is responsible for 4 things 391c18ec02fSPetter Reinholdtsen * Enabling/Disabling users 392c18ec02fSPetter Reinholdtsen * Setting/Testing passwords 393c18ec02fSPetter Reinholdtsen */ 394c18ec02fSPetter Reinholdtsen static int 395c18ec02fSPetter Reinholdtsen ipmi_user_set_password( 396c18ec02fSPetter Reinholdtsen struct ipmi_intf * intf, 397c18ec02fSPetter Reinholdtsen uint8_t user_id, 398c18ec02fSPetter Reinholdtsen uint8_t operation, 399c18ec02fSPetter Reinholdtsen const char *password, 400c18ec02fSPetter Reinholdtsen int is_twenty_byte_password) 401c18ec02fSPetter Reinholdtsen { 402c18ec02fSPetter Reinholdtsen struct ipmi_rs * rsp; 403c18ec02fSPetter Reinholdtsen struct ipmi_rq req; 404c18ec02fSPetter Reinholdtsen uint8_t msg_data[22]; 405c18ec02fSPetter Reinholdtsen 406c18ec02fSPetter Reinholdtsen int password_length = (is_twenty_byte_password? 20 : 16); 407c18ec02fSPetter Reinholdtsen 408c18ec02fSPetter Reinholdtsen memset(&req, 0, sizeof(req)); 409c18ec02fSPetter Reinholdtsen req.msg.netfn = IPMI_NETFN_APP; /* 0x06 */ 410c18ec02fSPetter Reinholdtsen req.msg.cmd = IPMI_SET_USER_PASSWORD; /* 0x47 */ 411c18ec02fSPetter Reinholdtsen req.msg.data = msg_data; 412c18ec02fSPetter Reinholdtsen req.msg.data_len = password_length + 2; 413c18ec02fSPetter Reinholdtsen 414c18ec02fSPetter Reinholdtsen 415c18ec02fSPetter Reinholdtsen /* The channel number will remain constant throughout this function */ 416c18ec02fSPetter Reinholdtsen msg_data[0] = user_id; 417c18ec02fSPetter Reinholdtsen 418c18ec02fSPetter Reinholdtsen if (is_twenty_byte_password) 419c18ec02fSPetter Reinholdtsen msg_data[0] |= 0x80; 420c18ec02fSPetter Reinholdtsen 421c18ec02fSPetter Reinholdtsen msg_data[1] = operation; 422c18ec02fSPetter Reinholdtsen 423c18ec02fSPetter Reinholdtsen memset(msg_data + 2, 0, password_length); 424c18ec02fSPetter Reinholdtsen 425c18ec02fSPetter Reinholdtsen if (password != NULL) 426c18ec02fSPetter Reinholdtsen strncpy((char *)(msg_data + 2), password, password_length); 427c18ec02fSPetter Reinholdtsen 428c18ec02fSPetter Reinholdtsen rsp = intf->sendrecv(intf, &req); 429c18ec02fSPetter Reinholdtsen 430c18ec02fSPetter Reinholdtsen if (rsp == NULL) { 431c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Password command failed (user %d)", 432c18ec02fSPetter Reinholdtsen user_id); 433c18ec02fSPetter Reinholdtsen return -1; 434c18ec02fSPetter Reinholdtsen } 435c18ec02fSPetter Reinholdtsen if (rsp->ccode > 0) { 436c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Set User Password command failed (user %d): %s", 437c18ec02fSPetter Reinholdtsen user_id, val2str(rsp->ccode, completion_code_vals)); 438c18ec02fSPetter Reinholdtsen return rsp->ccode; 439c18ec02fSPetter Reinholdtsen } 440c18ec02fSPetter Reinholdtsen 441c18ec02fSPetter Reinholdtsen return 0; 442c18ec02fSPetter Reinholdtsen } 443c18ec02fSPetter Reinholdtsen 444c18ec02fSPetter Reinholdtsen 445c18ec02fSPetter Reinholdtsen 446c18ec02fSPetter Reinholdtsen /* 447c18ec02fSPetter Reinholdtsen * ipmi_user_test_password 448c18ec02fSPetter Reinholdtsen * 449c18ec02fSPetter Reinholdtsen * Call ipmi_user_set_password, and interpret the result 450c18ec02fSPetter Reinholdtsen */ 451c18ec02fSPetter Reinholdtsen static int 452c18ec02fSPetter Reinholdtsen ipmi_user_test_password( 453c18ec02fSPetter Reinholdtsen struct ipmi_intf * intf, 454c18ec02fSPetter Reinholdtsen uint8_t user_id, 455c18ec02fSPetter Reinholdtsen const char * password, 456c18ec02fSPetter Reinholdtsen int is_twenty_byte_password) 457c18ec02fSPetter Reinholdtsen { 458c18ec02fSPetter Reinholdtsen int ret; 459c18ec02fSPetter Reinholdtsen 460c18ec02fSPetter Reinholdtsen ret = ipmi_user_set_password(intf, 461c18ec02fSPetter Reinholdtsen user_id, 462c18ec02fSPetter Reinholdtsen IPMI_PASSWORD_TEST_PASSWORD, 463c18ec02fSPetter Reinholdtsen password, 464c18ec02fSPetter Reinholdtsen is_twenty_byte_password); 465c18ec02fSPetter Reinholdtsen 466c18ec02fSPetter Reinholdtsen switch (ret) { 467c18ec02fSPetter Reinholdtsen case 0: 468c18ec02fSPetter Reinholdtsen printf("Success\n"); 469c18ec02fSPetter Reinholdtsen break; 470c18ec02fSPetter Reinholdtsen case 0x80: 471c18ec02fSPetter Reinholdtsen printf("Failure: password incorrect\n"); 472c18ec02fSPetter Reinholdtsen break; 473c18ec02fSPetter Reinholdtsen case 0x81: 474c18ec02fSPetter Reinholdtsen printf("Failure: wrong password size\n"); 475c18ec02fSPetter Reinholdtsen break; 476c18ec02fSPetter Reinholdtsen default: 477c18ec02fSPetter Reinholdtsen printf("Unknown error\n"); 478c18ec02fSPetter Reinholdtsen } 479c18ec02fSPetter Reinholdtsen 480c18ec02fSPetter Reinholdtsen return ((ret == 0) ? 0 : -1); 481c18ec02fSPetter Reinholdtsen } 482c18ec02fSPetter Reinholdtsen 483c18ec02fSPetter Reinholdtsen 484c18ec02fSPetter Reinholdtsen /* 485c18ec02fSPetter Reinholdtsen * print_user_usage 486c18ec02fSPetter Reinholdtsen */ 487c18ec02fSPetter Reinholdtsen static void 488c18ec02fSPetter Reinholdtsen print_user_usage(void) 489c18ec02fSPetter Reinholdtsen { 4901d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4911d1ce49bSZdenek Styblik "User Commands:"); 4921d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4931d1ce49bSZdenek Styblik " summary [<channel number>]"); 4941d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4951d1ce49bSZdenek Styblik " list [<channel number>]"); 4961d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4971d1ce49bSZdenek Styblik " set name <user id> <username>"); 4981d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 4991d1ce49bSZdenek Styblik " set password <user id> [<password>]"); 5001d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5011d1ce49bSZdenek Styblik " disable <user id>"); 5021d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5031d1ce49bSZdenek Styblik " enable <user id>"); 504c18ec02fSPetter Reinholdtsen lprintf(LOG_NOTICE, 505c18ec02fSPetter Reinholdtsen " priv <user id> <privilege level> [<channel number>]"); 5061d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5071d1ce49bSZdenek Styblik " Privilege levels:"); 5081d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5091d1ce49bSZdenek Styblik " * 0x1 - Callback"); 5101d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5111d1ce49bSZdenek Styblik " * 0x2 - User"); 5121d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5131d1ce49bSZdenek Styblik " * 0x3 - Operator"); 5141d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5151d1ce49bSZdenek Styblik " * 0x4 - Administrator"); 5161d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5171d1ce49bSZdenek Styblik " * 0x5 - OEM Proprietary"); 5181d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5191d1ce49bSZdenek Styblik " * 0xF - No Access"); 5201d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, ""); 5211d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, 5221d1ce49bSZdenek Styblik " test <user id> <16|20> [<password]>"); 5231d1ce49bSZdenek Styblik lprintf(LOG_NOTICE, ""); 524c18ec02fSPetter Reinholdtsen } 525c18ec02fSPetter Reinholdtsen 526c18ec02fSPetter Reinholdtsen 527c18ec02fSPetter Reinholdtsen const char * 528c18ec02fSPetter Reinholdtsen ipmi_user_build_password_prompt(uint8_t user_id) 529c18ec02fSPetter Reinholdtsen { 530c18ec02fSPetter Reinholdtsen static char prompt[128]; 531c18ec02fSPetter Reinholdtsen memset(prompt, 0, 128); 532c18ec02fSPetter Reinholdtsen snprintf(prompt, 128, "Password for user %d: ", user_id); 533c18ec02fSPetter Reinholdtsen return prompt; 534c18ec02fSPetter Reinholdtsen } 535c18ec02fSPetter Reinholdtsen 536*befb2149SZdenek Styblik /* ask_password - ask user for password 537*befb2149SZdenek Styblik * 538*befb2149SZdenek Styblik * @user_id: User ID which will be built-in into text 539*befb2149SZdenek Styblik * 540*befb2149SZdenek Styblik * @returns pointer to char with password 541*befb2149SZdenek Styblik */ 542*befb2149SZdenek Styblik char * 543*befb2149SZdenek Styblik ask_password(uint8_t user_id) 544*befb2149SZdenek Styblik { 545*befb2149SZdenek Styblik const char *password_prompt = 546*befb2149SZdenek Styblik ipmi_user_build_password_prompt(user_id); 547*befb2149SZdenek Styblik # ifdef HAVE_GETPASSPHRASE 548*befb2149SZdenek Styblik return getpassphrase(password_prompt); 549*befb2149SZdenek Styblik # else 550*befb2149SZdenek Styblik return (char*)getpass(password_prompt); 551*befb2149SZdenek Styblik # endif 552*befb2149SZdenek Styblik } 553*befb2149SZdenek Styblik 554c18ec02fSPetter Reinholdtsen int 5554d3decc4SZdenek Styblik ipmi_user_summary(struct ipmi_intf *intf, int argc, char **argv) 556c18ec02fSPetter Reinholdtsen { 5573c34aa0eSZdenek Styblik /* Summary*/ 558c18ec02fSPetter Reinholdtsen uint8_t channel; 5593c34aa0eSZdenek Styblik if (argc == 1) { 560c18ec02fSPetter Reinholdtsen channel = 0x0E; /* Ask about the current channel */ 5612aa5d8c9SZdenek Styblik } else if (argc == 2) { 5623c34aa0eSZdenek Styblik if (str2uchar(argv[1], &channel) != 0) { 563c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Invalid channel: %s", argv[1]); 564c18ec02fSPetter Reinholdtsen return (-1); 565c18ec02fSPetter Reinholdtsen } 5663c34aa0eSZdenek Styblik } else { 567c18ec02fSPetter Reinholdtsen print_user_usage(); 568f8ce85eeSZdenek Styblik return (-1); 569c18ec02fSPetter Reinholdtsen } 5704d3decc4SZdenek Styblik return ipmi_print_user_summary(intf, channel); 5714d3decc4SZdenek Styblik } 5724d3decc4SZdenek Styblik 5734d3decc4SZdenek Styblik int 5744d3decc4SZdenek Styblik ipmi_user_list(struct ipmi_intf *intf, int argc, char **argv) 5754d3decc4SZdenek Styblik { 5763c34aa0eSZdenek Styblik /* List */ 577c18ec02fSPetter Reinholdtsen uint8_t channel; 5783c34aa0eSZdenek Styblik if (argc == 1) { 579c18ec02fSPetter Reinholdtsen channel = 0x0E; /* Ask about the current channel */ 5803c34aa0eSZdenek Styblik } else if (argc == 2) { 5813c34aa0eSZdenek Styblik if (str2uchar(argv[1], &channel) != 0) { 582c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Invalid channel: %s", argv[1]); 583c18ec02fSPetter Reinholdtsen return (-1); 584c18ec02fSPetter Reinholdtsen } 5853c34aa0eSZdenek Styblik } else { 586c18ec02fSPetter Reinholdtsen print_user_usage(); 587f8ce85eeSZdenek Styblik return (-1); 588c18ec02fSPetter Reinholdtsen } 5894d3decc4SZdenek Styblik return ipmi_print_user_list(intf, channel); 5904d3decc4SZdenek Styblik } 5914d3decc4SZdenek Styblik 5924d3decc4SZdenek Styblik int 5934d3decc4SZdenek Styblik ipmi_user_test(struct ipmi_intf *intf, int argc, char **argv) 5944d3decc4SZdenek Styblik { 5953c34aa0eSZdenek Styblik /* Test */ 596c18ec02fSPetter Reinholdtsen char *password = NULL; 597c18ec02fSPetter Reinholdtsen int password_length = 0; 598c18ec02fSPetter Reinholdtsen uint8_t user_id = 0; 5992aa5d8c9SZdenek Styblik /* a little irritating, isn't it */ 6002aa5d8c9SZdenek Styblik if (argc != 3 && argc != 4) { 6012aa5d8c9SZdenek Styblik print_user_usage(); 602f8ce85eeSZdenek Styblik return (-1); 6032aa5d8c9SZdenek Styblik } 604c18ec02fSPetter Reinholdtsen if (is_ipmi_user_id(argv[1], &user_id)) { 605c18ec02fSPetter Reinholdtsen return (-1); 606c18ec02fSPetter Reinholdtsen } 607c18ec02fSPetter Reinholdtsen if (str2int(argv[2], &password_length) != 0 608c18ec02fSPetter Reinholdtsen || (password_length != 16 && password_length != 20)) { 609c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, 610c18ec02fSPetter Reinholdtsen "Given password length '%s' is invalid.", 611c18ec02fSPetter Reinholdtsen argv[2]); 612c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Expected value is either 16 or 20."); 613c18ec02fSPetter Reinholdtsen return (-1); 614c18ec02fSPetter Reinholdtsen } 6153c34aa0eSZdenek Styblik if (argc == 3) { 616c18ec02fSPetter Reinholdtsen /* We need to prompt for a password */ 617*befb2149SZdenek Styblik password = ask_password(user_id); 618c18ec02fSPetter Reinholdtsen if (password == NULL) { 619c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "ipmitool: malloc failure"); 620f8ce85eeSZdenek Styblik return (-1); 621c18ec02fSPetter Reinholdtsen } 6223c34aa0eSZdenek Styblik } else { 623*befb2149SZdenek Styblik password = argv[3]; 624c18ec02fSPetter Reinholdtsen } 625*befb2149SZdenek Styblik return ipmi_user_test_password(intf, 626c18ec02fSPetter Reinholdtsen user_id, 627c18ec02fSPetter Reinholdtsen password, 628c18ec02fSPetter Reinholdtsen password_length == 20); 6294d3decc4SZdenek Styblik } 6304d3decc4SZdenek Styblik 6314d3decc4SZdenek Styblik int 6324d3decc4SZdenek Styblik ipmi_user_priv(struct ipmi_intf *intf, int argc, char **argv) 6334d3decc4SZdenek Styblik { 6344d3decc4SZdenek Styblik uint8_t user_id; 6354d3decc4SZdenek Styblik uint8_t priv_level; 6364d3decc4SZdenek Styblik uint8_t channel = 0x0e; /* Use channel running on */ 6374d3decc4SZdenek Styblik 6384d3decc4SZdenek Styblik if (argc != 3 && argc != 4) { 6394d3decc4SZdenek Styblik print_user_usage(); 6404d3decc4SZdenek Styblik return (-1); 6414d3decc4SZdenek Styblik } 6424d3decc4SZdenek Styblik if (argc == 4) { 6434d3decc4SZdenek Styblik if (str2uchar(argv[3], &channel) != 0) { 6444d3decc4SZdenek Styblik lprintf(LOG_ERR, "Invalid channel: %s", argv[3]); 6454d3decc4SZdenek Styblik return (-1); 6464d3decc4SZdenek Styblik } 6474d3decc4SZdenek Styblik channel = (channel & 0x0f); 6484d3decc4SZdenek Styblik } 6494d3decc4SZdenek Styblik if (str2uchar(argv[2], &priv_level) != 0) { 6504d3decc4SZdenek Styblik lprintf(LOG_ERR, "Invalid privilege level: %s", argv[2]); 6514d3decc4SZdenek Styblik return (-1); 6524d3decc4SZdenek Styblik } 6534d3decc4SZdenek Styblik if (is_ipmi_user_id(argv[1], &user_id)) { 6544d3decc4SZdenek Styblik return (-1); 6554d3decc4SZdenek Styblik } 6564d3decc4SZdenek Styblik priv_level = (priv_level & 0x0f); 6574d3decc4SZdenek Styblik return ipmi_user_set_userpriv(intf,channel,user_id,priv_level); 6584d3decc4SZdenek Styblik } 6594d3decc4SZdenek Styblik 6604d3decc4SZdenek Styblik int 6614d3decc4SZdenek Styblik ipmi_user_mod(struct ipmi_intf *intf, int argc, char **argv) 6624d3decc4SZdenek Styblik { 6634d3decc4SZdenek Styblik /* Disable / Enable */ 6644d3decc4SZdenek Styblik uint8_t user_id; 6654d3decc4SZdenek Styblik uint8_t operation; 6664d3decc4SZdenek Styblik char null_password[16]; /* Not used, but required */ 6674d3decc4SZdenek Styblik 6684d3decc4SZdenek Styblik if (argc != 2) { 6694d3decc4SZdenek Styblik print_user_usage(); 6704d3decc4SZdenek Styblik return (-1); 6714d3decc4SZdenek Styblik } 6724d3decc4SZdenek Styblik if (is_ipmi_user_id(argv[1], &user_id)) { 6734d3decc4SZdenek Styblik return (-1); 6744d3decc4SZdenek Styblik } 6754d3decc4SZdenek Styblik memset(null_password, 0, sizeof(null_password)); 6764d3decc4SZdenek Styblik operation = (strncmp(argv[0], "disable", 7) == 0) ? 6774d3decc4SZdenek Styblik IPMI_PASSWORD_DISABLE_USER : IPMI_PASSWORD_ENABLE_USER; 6784d3decc4SZdenek Styblik 6794d3decc4SZdenek Styblik /* Last parameter is ignored */ 6804d3decc4SZdenek Styblik return ipmi_user_set_password(intf, user_id, operation, null_password, 0); 6814d3decc4SZdenek Styblik } 6824d3decc4SZdenek Styblik 6834d3decc4SZdenek Styblik int 6844d3decc4SZdenek Styblik ipmi_user_password(struct ipmi_intf *intf, int argc, char **argv) 6854d3decc4SZdenek Styblik { 686c18ec02fSPetter Reinholdtsen char *password = NULL; 687c18ec02fSPetter Reinholdtsen uint8_t user_id = 0; 688c18ec02fSPetter Reinholdtsen if (is_ipmi_user_id(argv[2], &user_id)) { 689c18ec02fSPetter Reinholdtsen return (-1); 690c18ec02fSPetter Reinholdtsen } 691c18ec02fSPetter Reinholdtsen 6923c34aa0eSZdenek Styblik if (argc == 3) { 693c18ec02fSPetter Reinholdtsen /* We need to prompt for a password */ 694c18ec02fSPetter Reinholdtsen char *tmp; 695*befb2149SZdenek Styblik password = ask_password(user_id); 696c18ec02fSPetter Reinholdtsen if (password == NULL) { 697c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "ipmitool: malloc failure"); 698f8ce85eeSZdenek Styblik return (-1); 699c18ec02fSPetter Reinholdtsen } 700*befb2149SZdenek Styblik tmp = ask_password(user_id); 701c18ec02fSPetter Reinholdtsen if (tmp == NULL) { 702c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "ipmitool: malloc failure"); 703c18ec02fSPetter Reinholdtsen return (-1); 704c18ec02fSPetter Reinholdtsen } 705c18ec02fSPetter Reinholdtsen if (strlen(password) != strlen(tmp) 706c18ec02fSPetter Reinholdtsen || strncmp(password, tmp, strlen(tmp))) { 707c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Passwords do not match."); 708f8ce85eeSZdenek Styblik return (-1); 709c18ec02fSPetter Reinholdtsen } 710c18ec02fSPetter Reinholdtsen } else { 711*befb2149SZdenek Styblik password = argv[3]; 712c18ec02fSPetter Reinholdtsen } 713c18ec02fSPetter Reinholdtsen 714c18ec02fSPetter Reinholdtsen if (password == NULL) { 715c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Unable to parse password argument."); 716f8ce85eeSZdenek Styblik return (-1); 7173c34aa0eSZdenek Styblik } else if (strlen(password) > 20) { 718c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Password is too long (> 20 bytes)"); 719f8ce85eeSZdenek Styblik return (-1); 720c18ec02fSPetter Reinholdtsen } 721c18ec02fSPetter Reinholdtsen 722*befb2149SZdenek Styblik return ipmi_user_set_password(intf, 723c18ec02fSPetter Reinholdtsen user_id, 724c18ec02fSPetter Reinholdtsen IPMI_PASSWORD_SET_PASSWORD, 725c18ec02fSPetter Reinholdtsen password, 726c18ec02fSPetter Reinholdtsen strlen(password) > 16); 7274d3decc4SZdenek Styblik } 7284d3decc4SZdenek Styblik 7294d3decc4SZdenek Styblik int 7304d3decc4SZdenek Styblik ipmi_user_name(struct ipmi_intf *intf, int argc, char **argv) 7314d3decc4SZdenek Styblik { 7323c34aa0eSZdenek Styblik /* Set Name */ 733c18ec02fSPetter Reinholdtsen uint8_t user_id = 0; 7343c34aa0eSZdenek Styblik if (argc != 4) { 735c18ec02fSPetter Reinholdtsen print_user_usage(); 736f8ce85eeSZdenek Styblik return (-1); 737c18ec02fSPetter Reinholdtsen } 738c18ec02fSPetter Reinholdtsen if (is_ipmi_user_id(argv[2], &user_id)) { 739c18ec02fSPetter Reinholdtsen return (-1); 740c18ec02fSPetter Reinholdtsen } 7413c34aa0eSZdenek Styblik if (strlen(argv[3]) > 16) { 742c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Username is too long (> 16 bytes)"); 743f8ce85eeSZdenek Styblik return (-1); 744c18ec02fSPetter Reinholdtsen } 745c18ec02fSPetter Reinholdtsen 7464d3decc4SZdenek Styblik return ipmi_user_set_username(intf, user_id, argv[3]); 7474d3decc4SZdenek Styblik } 7484d3decc4SZdenek Styblik 7494d3decc4SZdenek Styblik /* 7504d3decc4SZdenek Styblik * ipmi_user_main 7514d3decc4SZdenek Styblik * 7524d3decc4SZdenek Styblik * Upon entry to this function argv should contain our arguments 7534d3decc4SZdenek Styblik * specific to this subcommand 7544d3decc4SZdenek Styblik */ 7554d3decc4SZdenek Styblik int 7564d3decc4SZdenek Styblik ipmi_user_main(struct ipmi_intf *intf, int argc, char **argv) 7574d3decc4SZdenek Styblik { 7584d3decc4SZdenek Styblik if (argc == 0) { 7594d3decc4SZdenek Styblik lprintf(LOG_ERR, "Not enough parameters given."); 7604d3decc4SZdenek Styblik print_user_usage(); 7614d3decc4SZdenek Styblik return (-1); 7624d3decc4SZdenek Styblik } 7634d3decc4SZdenek Styblik if (strncmp(argv[0], "help", 4) == 0) { 7644d3decc4SZdenek Styblik /* Help */ 7654d3decc4SZdenek Styblik print_user_usage(); 7664d3decc4SZdenek Styblik return 0; 7674d3decc4SZdenek Styblik } else if (strncmp(argv[0], "summary", 7) == 0) { 7684d3decc4SZdenek Styblik return ipmi_user_summary(intf, argc, argv); 7694d3decc4SZdenek Styblik } else if (strncmp(argv[0], "list", 4) == 0) { 7704d3decc4SZdenek Styblik return ipmi_user_list(intf, argc, argv); 7714d3decc4SZdenek Styblik } else if (strncmp(argv[0], "test", 4) == 0) { 7724d3decc4SZdenek Styblik return ipmi_user_test(intf, argc, argv); 7734d3decc4SZdenek Styblik } else if (strncmp(argv[0], "set", 3) == 0) { 7744d3decc4SZdenek Styblik /* Set */ 7754d3decc4SZdenek Styblik if ((argc >= 3) 7764d3decc4SZdenek Styblik && (strncmp("password", argv[1], 8) == 0)) { 7774d3decc4SZdenek Styblik return ipmi_user_password(intf, argc, argv); 7784d3decc4SZdenek Styblik } else if ((argc >= 2) 7794d3decc4SZdenek Styblik && (strncmp("name", argv[1], 4) == 0)) { 7804d3decc4SZdenek Styblik return ipmi_user_name(intf, argc, argv); 7813c34aa0eSZdenek Styblik } else { 782c18ec02fSPetter Reinholdtsen print_user_usage(); 783f8ce85eeSZdenek Styblik return (-1); 784c18ec02fSPetter Reinholdtsen } 7853c34aa0eSZdenek Styblik } else if (strncmp(argv[0], "priv", 4) == 0) { 7864d3decc4SZdenek Styblik return ipmi_user_priv(intf, argc, argv); 7873c34aa0eSZdenek Styblik } else if ((strncmp(argv[0], "disable", 7) == 0) 7883c34aa0eSZdenek Styblik || (strncmp(argv[0], "enable", 6) == 0)) { 7894d3decc4SZdenek Styblik return ipmi_user_mod(intf, argc, argv); 7903c34aa0eSZdenek Styblik } else { 791c18ec02fSPetter Reinholdtsen lprintf(LOG_ERR, "Invalid user command: '%s'\n", argv[0]); 792c18ec02fSPetter Reinholdtsen print_user_usage(); 7934d3decc4SZdenek Styblik return (-1); 794c18ec02fSPetter Reinholdtsen } 795c18ec02fSPetter Reinholdtsen } 796