void fill_session_url(CMStringA &buf, CMStringA &token, CMStringA &secret, time_t &hosttime, const char *password, bool encryption) { /* AIM_SESSION_URL?query_string?sig_sha256=signature */ CMStringA query_string; query_string.Format("a=%s&distId=%s&f=xml&k=%s&ts=%llu&useTLS=%d", token, AIM_DEFAULT_DISTID, AIM_DEFAULT_CLIENT_KEY, hosttime, (int)encryption); BYTE session_key[MIR_SHA256_HASH_SIZE], signature[MIR_SHA256_HASH_SIZE]; mir_hmac_sha256(session_key, (BYTE*)password, mir_strlen(password), (BYTE*)secret.GetString(), secret.GetLength()); ptrA szKey(mir_base64_encode(session_key, sizeof(session_key))); generate_signature(signature, "GET", AIM_SESSION_URL, query_string, szKey); ptrA szEncoded(mir_base64_encode(signature, sizeof(signature))); buf.Format("%s?%s&sig_sha256=%s", AIM_SESSION_URL, query_string, (char*)szEncoded); }
/** * Parses XML PERCo response from 'staff' request. * * Parameters: * >pResponse * XML response. * * Returns: * Identifiers map. */ perco_exchange::ids_t perco_exchange::parseStaffResponse(_In_ IXMLDOMDocument2* pResponse) { ids_t ids; ATL::CComVariant value(TEXT("XPath")); if (SUCCEEDED(pResponse->setProperty(TEXT("SelectionLanguage"), value))) { ATL::CComPtr<IXMLDOMElement> documentRequest; if (SUCCEEDED(pResponse->get_documentElement(&documentRequest))) { ATL::CComPtr<IXMLDOMNodeList> staffNodes; if (SUCCEEDED(documentRequest->selectNodes(TEXT("staff/staffnode"), &staffNodes))) { ATL::CComPtr<IXMLDOMNode> staffNode; ATL::CComPtr<IXMLDOMNode> identifierNode; ATL::CComPtr<IXMLDOMNamedNodeMap> attributeMap; while (SUCCEEDED(staffNodes->nextNode(&staffNode)) && staffNode) { if (SUCCEEDED(staffNode->selectSingleNode( TEXT("identifiers/identifier/@identifier"), &identifierNode)) && identifierNode && SUCCEEDED(identifierNode->get_nodeValue(&value)) && (VT_BSTR == value.vt)) { attributeMap.Release(); if (SUCCEEDED(staffNode->get_attributes(&attributeMap))) { ids_t::key_type szKey(value.bstrVal, SysStringLen(value.bstrVal)); ids_t::mapped_type data(std::make_unique<data_t>()); staffNode.Release(); if (SUCCEEDED(attributeMap->getNamedItem(TEXT("last_name"), &staffNode)) && SUCCEEDED(staffNode->get_nodeValue(&value)) && (VT_BSTR == value.vt)) { data->szLastName = std::make_unique<STLADD string_type>(value.bstrVal, SysStringLen(value.bstrVal)); } staffNode.Release(); if (SUCCEEDED(attributeMap->getNamedItem(TEXT("first_name"), &staffNode)) && SUCCEEDED(staffNode->get_nodeValue(&value)) && (VT_BSTR == value.vt)) { data->szFirstName = std::make_unique<STLADD string_type>(value.bstrVal, SysStringLen(value.bstrVal)); } staffNode.Release(); if (SUCCEEDED(attributeMap->getNamedItem(TEXT("middle_name"), &staffNode)) && SUCCEEDED(staffNode->get_nodeValue(&value)) && (VT_BSTR == value.vt)) { data->szMiddleName = std::make_unique<STLADD string_type>(value.bstrVal, SysStringLen(value.bstrVal)); } staffNode.Release(); if (SUCCEEDED(attributeMap->getNamedItem(TEXT("id_internal"), &staffNode)) && SUCCEEDED(staffNode->get_nodeValue(&value)) && (VT_BSTR == value.vt)) { data->szPERCoId = std::make_unique<STLADD string_type>(value.bstrVal, SysStringLen(value.bstrVal)); } staffNode.Release(); if (SUCCEEDED(attributeMap->getNamedItem(TEXT("tabel_id"), &staffNode)) && SUCCEEDED(staffNode->get_nodeValue(&value)) && (VT_BSTR == value.vt)) { const STLADD regex_type regex(TEXT("[[:blank:]]*([[:graph:]]+)[[:blank:]]*")); STLADD cmatch_results match; if (std::regex_search( static_cast<const wchar_t*> (value.bstrVal), static_cast<const wchar_t*> (value.bstrVal + SysStringLen(value.bstrVal)), match, regex)) { data->szClockNumber = std::make_unique<STLADD string_type>(match[1].first, match[1].second); } else { data->szClockNumber = std::make_unique<STLADD string_type>(0, TEXT('\x00')); } } ids.insert(std::make_pair(szKey, std::move(data))); } identifierNode.Release(); } staffNode.Release(); } } } } return ids; }