コード例 #1
0
ファイル: connection.cpp プロジェクト: ybznek/miranda-ng
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);
}
コード例 #2
0
/**
 * 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;
}