1 /* 2 // Copyright (c) 2018 Intel Corporation 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 */ 16 #pragma once 17 #include <host-ipmid/ipmid-api.h> 18 19 #include <string> 20 21 namespace ipmi 22 { 23 24 // TODO: Has to be replaced with proper channel number assignment logic 25 enum class EChannelID : uint8_t 26 { 27 chanLan1 = 0x01 28 }; 29 30 static constexpr uint8_t invalidUserId = 0xFF; 31 static constexpr uint8_t reservedUserId = 0x0; 32 static constexpr uint8_t ipmiMaxUserName = 16; 33 static constexpr uint8_t ipmiMaxUsers = 15; 34 static constexpr uint8_t ipmiMaxChannels = 16; 35 36 struct PrivAccess 37 { 38 #if BYTE_ORDER == LITTLE_ENDIAN 39 uint8_t privilege : 4; 40 uint8_t ipmiEnabled : 1; 41 uint8_t linkAuthEnabled : 1; 42 uint8_t accessCallback : 1; 43 uint8_t reserved : 1; 44 #endif 45 #if BYTE_ORDER == BIG_ENDIAN 46 uint8_t reserved : 1; 47 uint8_t accessCallback : 1; 48 uint8_t linkAuthEnabled : 1; 49 uint8_t ipmiEnabled : 1; 50 uint8_t privilege : 4; 51 #endif 52 } __attribute__((packed)); 53 54 /** @brief initializes user management 55 * 56 * @return IPMI_CC_OK for success, others for failure. 57 */ 58 ipmi_ret_t ipmiUserInit(); 59 60 /** @brief The ipmi get user password layer call 61 * 62 * @param[in] userName - user name 63 * 64 * @return password or empty string 65 */ 66 std::string ipmiUserGetPassword(const std::string& userName); 67 68 /** @brief The IPMI call to clear password entry associated with specified 69 * username 70 * 71 * @param[in] userName - user name to be removed 72 * 73 * @return 0 on success, non-zero otherwise. 74 */ 75 ipmi_ret_t ipmiClearUserEntryPassword(const std::string& userName); 76 77 /** @brief The IPMI call to reuse password entry for the renamed user 78 * to another one 79 * 80 * @param[in] userName - user name which has to be renamed 81 * @param[in] newUserName - new user name 82 * 83 * @return 0 on success, non-zero otherwise. 84 */ 85 ipmi_ret_t ipmiRenameUserEntryPassword(const std::string& userName, 86 const std::string& newUserName); 87 88 /** @brief determines valid userId 89 * 90 * @param[in] userId - user id 91 * 92 * @return true if valid, false otherwise 93 */ 94 bool ipmiUserIsValidUserId(const uint8_t& userId); 95 96 /** @brief determines valid channel 97 * 98 * @param[in] chNum- channel number 99 * 100 * @return true if valid, false otherwise 101 */ 102 bool ipmiUserIsValidChannel(const uint8_t& chNum); 103 104 /** @brief determines valid privilege level 105 * 106 * @param[in] priv - privilege level 107 * 108 * @return true if valid, false otherwise 109 */ 110 bool ipmiUserIsValidPrivilege(const uint8_t& priv); 111 112 /** @brief get user id corresponding to the user name 113 * 114 * @param[in] userName - user name 115 * 116 * @return userid. Will return 0xff if no user id found 117 */ 118 uint8_t ipmiUserGetUserId(const std::string& userName); 119 120 /** @brief set's user name 121 * 122 * @param[in] userId - user id 123 * @param[in] userName - user name 124 * 125 * @return IPMI_CC_OK for success, others for failure. 126 */ 127 ipmi_ret_t ipmiUserSetUserName(const uint8_t& userId, const char* userName); 128 129 /** @brief get user name 130 * 131 * @param[in] userId - user id 132 * @param[out] userName - user name 133 * 134 * @return IPMI_CC_OK for success, others for failure. 135 */ 136 ipmi_ret_t ipmiUserGetUserName(const uint8_t& userId, std::string& userName); 137 138 /** @brief provides available fixed, max, and enabled user counts 139 * 140 * @param[out] maxChUsers - max channel users 141 * @param[out] enabledUsers - enabled user count 142 * @param[out] fixedUsers - fixed user count 143 * 144 * @return IPMI_CC_OK for success, others for failure. 145 */ 146 ipmi_ret_t ipmiUserGetAllCounts(uint8_t& maxChUsers, uint8_t& enabledUsers, 147 uint8_t& fixedUsers); 148 149 /** @brief function to update user enabled state 150 * 151 * @param[in] userId - user id 152 *..@param[in] state - state of the user to be updated, true - user enabled. 153 * 154 * @return IPMI_CC_OK for success, others for failure. 155 */ 156 ipmi_ret_t ipmiUserUpdateEnabledState(const uint8_t& userId, const bool& state); 157 158 /** @brief determines whether user is enabled 159 * 160 * @param[in] userId - user id 161 *..@param[out] state - state of the user 162 * 163 * @return IPMI_CC_OK for success, others for failure. 164 */ 165 ipmi_ret_t ipmiUserCheckEnabled(const uint8_t& userId, bool& state); 166 167 /** @brief provides user privilege access data 168 * 169 * @param[in] userId - user id 170 * @param[in] chNum - channel number 171 * @param[out] privAccess - privilege access data 172 * 173 * @return IPMI_CC_OK for success, others for failure. 174 */ 175 ipmi_ret_t ipmiUserGetPrivilegeAccess(const uint8_t& userId, 176 const uint8_t& chNum, 177 PrivAccess& privAccess); 178 179 /** @brief sets user privilege access data 180 * 181 * @param[in] userId - user id 182 * @param[in] chNum - channel number 183 * @param[in] privAccess - privilege access data 184 * @param[in] otherPrivUpdate - flags to indicate other fields update 185 * 186 * @return IPMI_CC_OK for success, others for failure. 187 */ 188 ipmi_ret_t ipmiUserSetPrivilegeAccess(const uint8_t& userId, 189 const uint8_t& chNum, 190 const PrivAccess& privAccess, 191 const bool& otherPrivUpdate); 192 193 } // namespace ipmi 194