blob: 5c09bfc06459d7ff7601775e99c6a47b85ea6e0b [file] [log] [blame]
Willy Tu11d68892022-01-20 10:37:34 -08001#pragma once
2
Patrick Williams69c945e2023-05-26 14:59:07 -05003#include <cstdint>
Rajashekar Gade Reddye7023922019-07-10 16:54:55 +00004#include <sstream>
5#include <string>
6
7/**
8 * @brief parse session input payload.
9 *
10 * This function retrives the session id and session handle from the session
11 * object path.
12 * A valid object path will be in the form
13 * "/xyz/openbmc_project/ipmi/session/channel/sessionId_sessionHandle"
14 *
15 * Ex: "/xyz/openbmc_project/ipmi/session/eth0/12a4567d_8a"
16 * SessionId : 0X12a4567d
17 * SessionHandle: 0X8a
18
19 * @param[in] objectPath - session object path
20 * @param[in] sessionId - retrived session id will be asigned.
21 * @param[in] sessionHandle - retrived session handle will be asigned.
22 *
23 * @return true if session id and session handle are retrived else returns
24 * false.
25 */
26bool parseCloseSessionInputPayload(const std::string& objectPath,
27 uint32_t& sessionId, uint8_t& sessionHandle)
28{
29 if (objectPath.empty())
30 {
31 return false;
32 }
33 // getting the position of session id and session handle string from
34 // object path.
35 std::size_t ptrPosition = objectPath.rfind("/");
36 uint16_t tempSessionHandle = 0;
37
38 if (ptrPosition != std::string::npos)
39 {
40 // get the sessionid & session handle string from the session object
41 // path Ex: sessionIdString: "12a4567d_8a"
42 std::string sessionIdString = objectPath.substr(ptrPosition + 1);
43 std::size_t pos = sessionIdString.rfind("_");
44
45 if (pos != std::string::npos)
46 {
47 // extracting the session handle
48 std::string sessionHandleString = sessionIdString.substr(pos + 1);
49 // extracting the session id
50 sessionIdString = sessionIdString.substr(0, pos);
51 // converting session id string and session handle string to
52 // hexadecimal.
53 std::stringstream handle(sessionHandleString);
54 handle >> std::hex >> tempSessionHandle;
55 sessionHandle = tempSessionHandle & 0xFF;
56 std::stringstream idString(sessionIdString);
57 idString >> std::hex >> sessionId;
58 return true;
59 }
60 }
61 return false;
62}
63
64/**
65 * @brief is session object matched.
66 *
67 * This function checks whether the objectPath contains reqSessionId and
68 * reqSessionHandle, e.g., "/xyz/openbmc_project/ipmi/session/eth0/12a4567d_8a"
69 * matches sessionId 0x12a4567d and sessionHandle 0x8a.
70 *
71 * @param[in] objectPath - session object path
72 * @param[in] reqSessionId - request session id
73 * @param[in] reqSessionHandle - request session handle
74 *
75 * @return true if the object is matched else return false
76 **/
77bool isSessionObjectMatched(const std::string objectPath,
78 const uint32_t reqSessionId,
79 const uint8_t reqSessionHandle)
80{
81 uint32_t sessionId = 0;
82 uint8_t sessionHandle = 0;
83
84 if (parseCloseSessionInputPayload(objectPath, sessionId, sessionHandle))
85 {
86 return (reqSessionId == sessionId) ||
87 (reqSessionHandle == sessionHandle);
88 }
89
90 return false;
91}