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