// Первый параметр что ищем, второй параметр где ищем, третий - индекс, начиная с какого ищем.
function PosEx(Find_s: String; FullString: String; Find_Value: integer): Integer;
var
TempFullString : String;
begin
if Find_Value = 1 then result := Pos(Find_s, FullString);
if Find_Value > 1 then
begin
TempFullString := Copy(FullString, Find_Value, Length(FullString) - Find_Value + 1);
result := Find_Value + Pos(Find_s, TempFullString);
end;
end;
function InternetSetCookieEx(lpszUrl: String; lpszCookieName: String; lpszCookieData: String; dwFlags: DWORD; dwReserved: DWORD): DWORD;
external 'InternetSetCookieEx{#A}@Wininet.dll stdcall';
function IESetProtectedModeCookie(lpszUrl: String; lpszCookieName: String; lpszCookieData: String; dwFlags: DWORD): DWORD;
external 'IESetProtectedModeCookie@Ieframe.dll stdcall';
function InternetGetCookie(lpszUrl: String; lpszCookieName: String; lpszCookieData: array of char; var lpdwSize: DWORD): Boolean;
external 'InternetGetCookie{#A}@Wininet.dll stdcall';
function InternetSetCookie(lpszUrl: String; lpszCookieName: String; lpszCookieData: String): Boolean;
external 'InternetSetCookie{#A}@Wininet.dll stdcall';
function InternetClearAllPerSiteCookieDecisions(): Boolean;
external 'InternetClearAllPerSiteCookieDecisions@Wininet.dll stdcall';
const
INTERNET_COOKIE_HTTPONLY = $00002000;
INTERNET_FLAG_RESTRICTED_ZONE = $00020000;
INTERNET_COOKIE_THIRD_PARTY =$10;
ERROR_INSUFFICIENT_BUFFER = $8007007a;
INTERNET_COOKIE_EVALUATE_P3P = $00000040;
COOKIE_STATE_REJECT = 4;
HTTPREQUEST_PROXYSETTING_PRECONFIG = 0;
UNINITIALIZED = 0;
LOADING = 1;
LOADED = 2;
INTERACTIVE = 3;
COMPLETED = 4;
procedure InstallCryptoPro();
var
WinHttpReq: Variant;
Cookie, s_Cookie : String;
s_responseText : String;
SendRequest: String;
FindID, FindVal1, FindVal2: Integer;
I : integer;
URlCookieGet : array of char;
URlCookieGetString : string;
Cookie_buff : DWORD;
GetStatus : longint;
Msg: TMsg;
begin
try
WinHttpReq := CreateOleObject('Msxml2.XMLHTTP.6.0'); // Используемый объект - поддерживает прокси ИЕ по умолчанию.
except
Log('Ошибка создания объекта Msxml2.XMLHTTP.6.0');
exit;
end;
try
Cookie := 'Old cookie; Expires=Fri, 30-Oct-1998 14:19:41 GMT';
login := Edit.Text;
password := Edit1.Text;
LicenseTextCSP := '';
URlsiteCookie := 'https://www.cryptopro.ru/';
URlNameCookie := ''//'SESSf6648e605a04182cadbeb592605c858e';
URlCookie := '';
Cookie_buff := 0;
ProgressPage.ProgressBar.Style := npbstNormal;
ProgressPage.Show;
ProgressPage.ProgressBar.Show;
ProgressPage.SetProgress(0, 100);
try
ProgressPage.SetProgress(1, 100);
ProgressPage.Msg1Label.Caption := 'Подготовка...';
ProgressPage.Msg2Label.Caption := 'Пожалуйста подождите...';
ExecAsOriginalUser('RunDLL32.exe', 'inetcpl.cpl,ClearMyTracksByProcess 2', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode); // Чистка куки, без нее, после первой же успешной авторизации, скачивание будет работать с любым л и п, пока не удаляться перзистент куки.
//InternetGetCookie(URlsiteCookie, URlNameCookie, URlCookie, 255);
//MsgBox(URlCookie, mbInformation, MB_OK)
//InternetGetCookieEx(URlsiteCookie, URlNameCookie, URlCookieGet, Cookie_buff);
//MsgBox('Cookie_buff ' + inttostr(Cookie_buff), mbInformation, MB_OK);
//SetArrayLength(URlCookieGet, 255);
InternetClearAllPerSiteCookieDecisions();
if InternetGetCookie(URlsiteCookie, URlNameCookie, URlCookieGet, Cookie_buff) then
begin
SetArrayLength(URlCookieGet, Cookie_buff);
InternetGetCookie(URlsiteCookie, URlNameCookie, URlCookieGet, Cookie_buff);
end;
for i := 0 to GetArrayLength(URlCookieGet)-1 do
URlCookieGetString := URlCookieGetString + URlCookieGet[i];
URlNameCookie := Copy(URlCookieGetString, 1, Pos('=', URlCookieGetString)-1);
URlCookie := 'Old cookie; Expires=Fri, 30-Oct-1998 14:19:41 GMT';
ProgressPage.Msg1Label.Caption := 'Установка соединения с сайтом...';
ProgressPage.Msg2Label.Caption := 'Пожалуйста подождите...';
ProgressPage.SetProgress(6, 100);
// открытие страницы
WinHttpReq.Open('GET', 'https://www.cryptopro.ru/', true);
WinHttpReq.SetRequestHeader('Cookie', Cookie);
WinHttpReq.setRequestHeader('Set-Cookie', Cookie);
WinHttpReq.SetRequestHeader('Accept', 'text/html, application/xhtml+xml, */*');
WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
WinHttpReq.SetRequestHeader('Accept-Language', 'ru-RU');
WinHttpReq.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko');
//WinHttpReq.SetRequestHeader('Accept-Encoding', 'gzip, deflate');
WinHttpReq.SetRequestHeader('Cookie', Cookie);
WinHttpReq.SetRequestHeader('Connection', 'Keep-Alive');
WinHttpReq.SetRequestHeader('Host', 'www.cryptopro.ru');
WinHttpReq.SetRequestHeader('Cache-Control', 'no-cache');
ProgressPage.SetProgress(7, 100);
WinHttpReq.Send('');
i := 8;
GetStatus := UNINITIALIZED;
while GetStatus <> COMPLETED do
begin
sleep(20);
if i < 30 then ProgressPage.SetProgress(I, 100);
if i = 700 then
begin
WinHttpReq.abort();
MessageBox(hWnd, 'Ошибка соединения! Пожалуйста, проверьте состояние подключения к интернету и повторите попытку.', 'Ошибка', MB_OK or MB_ICONINFORMATION);
exit;
end;
i := i + 1;
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
GetStatus := WinHttpReq.readyState();
end;
if WinHttpReq.status = 200 then
begin
if WinHttpReq.getResponseHeader('Set-Cookie') <> '' then
Cookie := WinHttpReq.getResponseHeader('Set-Cookie');
s_Cookie := Cookie;
ProgressPage.SetProgress(31, 100);
s_responseText := WinHttpReq.responseText;
FindID := Pos('form_build_id', s_responseText); //19
//MsgBox(inttostr(FindID), mbInformation, MB_OK);
FindVal1 := PosEx('value', s_responseText, FindID);
//MsgBox(inttostr(FindVal1), mbInformation, MB_OK);
FindVal2 := PosEx('/>', s_responseText, FindID);
//MsgBox(inttostr(FindVal2), mbInformation, MB_OK);
SendRequest := 'name=' + login;
SendRequest := SendRequest + '&pass=' + password;
SendRequest := SendRequest + '&op=%D0%92%D1%85%D0%BE%D0%B4';
SendRequest := SendRequest + '&form_build_id=' + RemoveQuotes(Copy(s_responseText, FindVal1 + 6,FindVal2 - FindVal1 - 9));
SendRequest := SendRequest + '&form_id=user_login_block';
//MsgBox(SendRequest, mbInformation, MB_OK);
ProgressPage.SetProgress(32, 100);
ProgressPage.Msg1Label.Caption := 'Авторизация на сайте...';
ProgressPage.Msg2Label.Caption := 'Пожалуйста подождите...';
// Отправка ПОСТ запроса для авторизации.. Сам запрос формируется в переменной SendRequest.
WinHttpReq.Open('POST', 'https://www.cryptopro.ru/main?destination=node%2F258', true);
WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
WinHttpReq.SetRequestHeader('Accept', 'text/html, application/xhtml+xml, */*');
WinHttpReq.SetRequestHeader('Cache-Control', 'no-cache');
WinHttpReq.SetRequestHeader('Accept-Language', 'ru-RU');
WinHttpReq.SetRequestHeader('Host', 'www.cryptopro.ru');
WinHttpReq.SetRequestHeader('Referer', 'https://www.cryptopro.ru/');
WinHttpReq.SetRequestHeader('Accept-Encoding', 'gzip, deflate');
WinHttpReq.SetRequestHeader('Content-Length', Length(SendRequest));
WinHttpReq.SetRequestHeader('Cookie', Cookie);
ProgressPage.SetProgress(33, 100);
WinHttpReq.Send(SendRequest);
i := 34
GetStatus := UNINITIALIZED;
while GetStatus <> COMPLETED do
begin
sleep(20);
if i < 40 then ProgressPage.SetProgress(I, 100);
if i = 730 then
begin
WinHttpReq.abort();
MessageBox(hWnd, 'Ошибка соединения! Пожалуйста, проверьте состояние подключения к интернету и повторите попытку.', 'Ошибка', MB_OK or MB_ICONERROR);
exit;
end;
i := i + 1;
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
GetStatus := WinHttpReq.readyState();
end;
if WinHttpReq.status = 200 then
if WinHttpReq.status = 200 then
begin // Проверка логина и пароля.
if Pos('это имя пользователя или пароль неверны', WinHttpReq.responseText) <> 0 then
begin
MessageBox(hWnd, 'Неверный Логин или Пароль. Вводите Логин и Пароль, указанные вами при регистрации на сайте КРИПТОПРО!', 'Ошибка', MB_OK or MB_ICONERROR);
//CheckButton_InstallCSP := true;
IESetProtectedModeCookie(URlsiteCookie, URlNameCookie, URlCookie, INTERNET_FLAG_RESTRICTED_ZONE);
IESetProtectedModeCookie(URlsiteCookie, URlNameCookie, URlCookie, INTERNET_COOKIE_THIRD_PARTY);
InternetSetCookie(URlsiteCookie, URlNameCookie, URlCookie);
CoFreeUnusedLibraries();
//WizardForm.BackButton.OnClick(WizardForm.BackButton);
LicenseTextCSP := '';
Exit;
end;
// Получение лицензионного соглашения
WinHttpReq.Open('GET', 'https://www.cryptopro.ru/download?pid=1417', true);
WinHttpReq.SetRequestHeader('Accept', 'text/html, application/xhtml+xml, */*');
WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
WinHttpReq.SetRequestHeader('Accept-Language', 'ru-RU');
WinHttpReq.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko');
//WinHttpReq.SetRequestHeader('Accept-Encoding', 'gzip, deflate');
WinHttpReq.SetRequestHeader('Connection', 'Keep-Alive');
WinHttpReq.SetRequestHeader('Host', 'www.cryptopro.ru');
WinHttpReq.SetRequestHeader('Cache-Control', 'no-cache');
WinHttpReq.SetRequestHeader('Cookie', Cookie);
WinHttpReq.Send('');
i := 41
GetStatus := UNINITIALIZED;
while GetStatus <> COMPLETED do
begin
sleep(20);
if i < 52 then ProgressPage.SetProgress(I, 100);
if i = 740 then
begin
WinHttpReq.abort();
MessageBox(hWnd, 'Ошибка соединения! Пожалуйста, проверьте состояние подключения к интернету и повторите попытку.', 'Ошибка', MB_OK or MB_ICONERROR);
exit;
end;
i := i + 1;
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
GetStatus := WinHttpReq.readyState();
end;
if WinHttpReq.status = 200 then
begin
FindID := Pos('"edit-license-text-wrapper"', WinHttpReq.responseText);
if FindID <> 0 then
begin
FindVal1 := PosEx('ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ', WinHttpReq.responseText, FindID);
FindVal2 := PosEx('</textarea>', WinHttpReq.responseText, FindVal1);
LicenseTextCSP := Copy(WinHttpReq.responseText, FindVal1 - 1, FindVal2 - FindVal1 - 1);
CheckButton_InstallCSP := true;
CoFreeUnusedLibraries();
//MsgBox(LicenseTextCSP, mbInformation, MB_OK);
exit;
end else
MessageBox(hWnd, 'Ошибка получения визуальной формы сайта https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
end else MessageBox(hWnd, 'Ошибка получения визуальной формы сайта https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
end else MessageBox(hWnd, 'Ошибка авторизации на сайте https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
end else MessageBox(hWnd, 'Ошибка авторизации на сайте https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
except
Log('Ошибка функции InstallCryptoPro');
exit;
end;
finally
ProgressPage.Hide;
ProgressPage.ProgressBar.Style := npbstMarquee;
DeleteUrlCacheEntry('https://www.cryptopro.ru/');
CoFreeUnusedLibraries();
//WizardForm.BackButton.OnClick(WizardForm.BackButton);
end;
end;