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 <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 /**
26  * @enum Channel Id
27  */
28 enum class EChannelID : uint8_t
29 {
30     chanLan1 = 0x01
31 };
32 
33 static constexpr uint8_t invalidUserId = 0xFF;
34 static constexpr uint8_t reservedUserId = 0x0;
35 static constexpr uint8_t ipmiMaxUserName = 16;
36 static constexpr uint8_t ipmiMaxUsers = 15;
37 static constexpr uint8_t ipmiMaxChannels = 16;
38 
39 /** @struct PrivAccess
40  *
41  *  User privilege related access data as per IPMI specification.(refer spec
42  * sec 22.26)
43  */
44 struct PrivAccess
45 {
46 #if BYTE_ORDER == LITTLE_ENDIAN
47     uint8_t privilege : 4;
48     uint8_t ipmiEnabled : 1;
49     uint8_t linkAuthEnabled : 1;
50     uint8_t accessCallback : 1;
51     uint8_t reserved : 1;
52 #endif
53 #if BYTE_ORDER == BIG_ENDIAN
54     uint8_t reserved : 1;
55     uint8_t accessCallback : 1;
56     uint8_t linkAuthEnabled : 1;
57     uint8_t ipmiEnabled : 1;
58     uint8_t privilege : 4;
59 #endif
60 } __attribute__((packed));
61 
62 /** @brief initializes user management
63  *
64  *  @return IPMI_CC_OK for success, others for failure.
65  */
66 ipmi_ret_t ipmiUserInit();
67 
68 /** @brief The ipmi get user password layer call
69  *
70  *  @param[in] userName - user name
71  *
72  *  @return password or empty string
73  */
74 std::string ipmiUserGetPassword(const std::string& userName);
75 
76 /** @brief The IPMI call to clear password entry associated with specified
77  * username
78  *
79  *  @param[in] userName - user name to be removed
80  *
81  *  @return 0 on success, non-zero otherwise.
82  */
83 ipmi_ret_t ipmiClearUserEntryPassword(const std::string& userName);
84 
85 /** @brief The IPMI call to reuse password entry for the renamed user
86  *  to another one
87  *
88  *  @param[in] userName - user name which has to be renamed
89  *  @param[in] newUserName - new user name
90  *
91  *  @return 0 on success, non-zero otherwise.
92  */
93 ipmi_ret_t ipmiRenameUserEntryPassword(const std::string& userName,
94                                        const std::string& newUserName);
95 
96 /** @brief determines valid userId
97  *
98  *  @param[in] userId - user id
99  *
100  *  @return true if valid, false otherwise
101  */
102 bool ipmiUserIsValidUserId(const uint8_t userId);
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, const uint8_t chNum,
176                                       PrivAccess& privAccess);
177 
178 /** @brief sets user privilege access data
179  *
180  *  @param[in] userId - user id
181  *  @param[in] chNum - channel number
182  *  @param[in] privAccess - privilege access data
183  *  @param[in] otherPrivUpdate - flags to indicate other fields update
184  *
185  *  @return IPMI_CC_OK for success, others for failure.
186  */
187 ipmi_ret_t ipmiUserSetPrivilegeAccess(const uint8_t userId, const uint8_t chNum,
188                                       const PrivAccess& privAccess,
189                                       const bool& otherPrivUpdate);
190 
191 } // namespace ipmi
192