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-2020 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;
}
|