blob: 5c09bfc06459d7ff7601775e99c6a47b85ea6e0b [file] [log] [blame]
#pragma once
#include <cstdint>
#include <sstream>
#include <string>
/**
* @brief parse session input payload.
*
* This function retrives the session id and session handle from the session
* object path.
* A valid object path will be in the form
* "/xyz/openbmc_project/ipmi/session/channel/sessionId_sessionHandle"
*
* Ex: "/xyz/openbmc_project/ipmi/session/eth0/12a4567d_8a"
* SessionId : 0X12a4567d
* SessionHandle: 0X8a
* @param[in] objectPath - session object path
* @param[in] sessionId - retrived session id will be asigned.
* @param[in] sessionHandle - retrived session handle will be asigned.
*
* @return true if session id and session handle are retrived else returns
* false.
*/
bool parseCloseSessionInputPayload(const std::string& objectPath,
uint32_t& sessionId, uint8_t& sessionHandle)
{
if (objectPath.empty())
{
return false;
}
// getting the position of session id and session handle string from
// object path.
std::size_t ptrPosition = objectPath.rfind("/");
uint16_t tempSessionHandle = 0;
if (ptrPosition != std::string::npos)
{
// get the sessionid & session handle string from the session object
// path Ex: sessionIdString: "12a4567d_8a"
std::string sessionIdString = objectPath.substr(ptrPosition + 1);
std::size_t pos = sessionIdString.rfind("_");
if (pos != std::string::npos)
{
// extracting the session handle
std::string sessionHandleString = sessionIdString.substr(pos + 1);
// extracting the session id
sessionIdString = sessionIdString.substr(0, pos);
// converting session id string and session handle string to
// hexadecimal.
std::stringstream handle(sessionHandleString);
handle >> std::hex >> tempSessionHandle;
sessionHandle = tempSessionHandle & 0xFF;
std::stringstream idString(sessionIdString);
idString >> std::hex >> sessionId;
return true;
}
}
return false;
}
/**
* @brief is session object matched.
*
* This function checks whether the objectPath contains reqSessionId and
* reqSessionHandle, e.g., "/xyz/openbmc_project/ipmi/session/eth0/12a4567d_8a"
* matches sessionId 0x12a4567d and sessionHandle 0x8a.
*
* @param[in] objectPath - session object path
* @param[in] reqSessionId - request session id
* @param[in] reqSessionHandle - request session handle
*
* @return true if the object is matched else return false
**/
bool isSessionObjectMatched(const std::string objectPath,
const uint32_t reqSessionId,
const uint8_t reqSessionHandle)
{
uint32_t sessionId = 0;
uint8_t sessionHandle = 0;
if (parseCloseSessionInputPayload(objectPath, sessionId, sessionHandle))
{
return (reqSessionId == sessionId) ||
(reqSessionHandle == sessionHandle);
}
return false;
}