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