summaryrefslogtreecommitdiff
path: root/protocols/MSN/src/msn_ssl.cpp
blob: bdf32d5647aebabddce429ecb30ce6e14aedf150 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
Plugin of Miranda IM for communicating with users of the MSN Messenger protocol.

Copyright (c) 2012-2019 Miranda NG team
Copyright (c) 2006-2012 Boris Krasnovskiy.
Copyright (c) 2003-2005 George Hazan.
Copyright (c) 2002-2003 Richard Hughes (original version).

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "stdafx.h"
#include "msn_proto.h"

char* CMsnProto::getSslResult(char** parUrl, const char* parAuthInfo, const char* hdrs, unsigned& status)
{
	mHttpsTS = clock();

	char* result = nullptr;
	NETLIBHTTPREQUEST nlhr = { 0 };

	// initialize the netlib request
	nlhr.cbSize = sizeof(nlhr);
	nlhr.requestType = REQUEST_POST;
	nlhr.flags = NLHRF_HTTP11 | NLHRF_DUMPASTEXT | NLHRF_PERSISTENT | NLHRF_REDIRECT;
	nlhr.szUrl = *parUrl;
	nlhr.dataLength = (int)mir_strlen(parAuthInfo);
	nlhr.pData = (char*)parAuthInfo;
	nlhr.nlc = hHttpsConnection;

#ifndef _DEBUG
	if (strstr(*parUrl, "login")) nlhr.flags |= NLHRF_NODUMPSEND;
#endif

	nlhr.headersCount = 4;
	nlhr.headers = (NETLIBHTTPHEADER*)alloca(sizeof(NETLIBHTTPHEADER) * (nlhr.headersCount + 5));
	nlhr.headers[0].szName = "User-Agent";
	nlhr.headers[0].szValue = (char*)MSN_USER_AGENT;
	nlhr.headers[1].szName = "Accept";
	nlhr.headers[1].szValue = "text/*";
	nlhr.headers[2].szName = "Content-Type";
	nlhr.headers[2].szValue = "text/xml; charset=utf-8";
	nlhr.headers[3].szName = "Cache-Control";
	nlhr.headers[3].szValue = "no-cache";

	if (hdrs) {
		unsigned count = 0;
		char* hdrprs = NEWSTR_ALLOCA(hdrs);
		for (;;) {
			char* fnd = strchr(hdrprs, ':');
			if (fnd == nullptr) break;
			*fnd = 0;
			fnd += 2;

			nlhr.headers[nlhr.headersCount].szName = hdrprs;
			nlhr.headers[nlhr.headersCount].szValue = fnd;

			fnd = strchr(fnd, '\r');
			if (fnd == nullptr) break;
			*fnd = 0;
			hdrprs = fnd + 2;
			++nlhr.headersCount;
			if (++count >= 5) break;
		}
	}

	// download the page
	NLHR_PTR nlhrReply(Netlib_HttpTransaction(m_hNetlibUser, &nlhr));
	if (nlhrReply) {
		hHttpsConnection = nlhrReply->nlc;
		status = nlhrReply->resultCode;

		if (nlhrReply->szUrl) {
			mir_free(*parUrl);
			*parUrl = nlhrReply->szUrl;
			nlhrReply->szUrl = nullptr;
		}

		result = nlhrReply->pData;

		nlhrReply->dataLength = 0;
		nlhrReply->pData = nullptr;
	}
	else hHttpsConnection = nullptr;

	mHttpsTS = clock();

	return result;
}

bool CMsnProto::getMyAvatarFile(char *url, wchar_t *fname)
{
	// initialize the netlib request
	NETLIBHTTPREQUEST nlhr = {};
	nlhr.cbSize = sizeof(nlhr);
	nlhr.requestType = REQUEST_GET;
	nlhr.flags = NLHRF_HTTP11 | NLHRF_REDIRECT;
	nlhr.szUrl = url;
	nlhr.headersCount = 1;
	nlhr.headers = (NETLIBHTTPHEADER*)alloca(sizeof(NETLIBHTTPHEADER) * nlhr.headersCount);
	nlhr.headers[0].szName = "User-Agent";
	nlhr.headers[0].szValue = (char*)MSN_USER_AGENT;

	// download the page
	NLHR_PTR nlhrReply(Netlib_HttpTransaction(m_hNetlibUser, &nlhr));
	if (nlhrReply) {
		if (nlhrReply->resultCode == 200 && nlhrReply->dataLength) {
			MSN_SetMyAvatar(fname, nlhrReply->pData, nlhrReply->dataLength);
			return true;
		}
	}
	return false;
}