Но всю радужную картину омрачает одна ошибка. К сожалению в репозиторий fedora до сих пор не попало исправление отвечающее за правильный порядок Cooke в заголовке http запроса в связи с чем запуск такой необходимой программы как Blizzard digital downloader приводит к получению сообщения об ошибки "There was a problem authenticating your download. Please go to http://www.blizzard.com/account/ to start a new download."
Для устранения данного недостатка необходимо применить пач:
wininet_insert_cookies_later.diff
--- dlls/wininet/http.c.orig
+++ dlls/wininet/http.c
@@ -1883,13 +1886,8 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
{
LPWININETAPPINFOW hIC = NULL;
LPWININETHTTPREQW lpwhr;
- LPWSTR lpszCookies;
- LPWSTR lpszUrl = NULL;
- DWORD nCookieSize;
HINTERNET handle = NULL;
- static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s',0};
DWORD len;
- LPHTTPHEADERW Host;
TRACE("-->\n");
@@ -2009,32 +2004,6 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
if (NULL != hIC->lpszProxy && hIC->lpszProxy[0] != 0)
HTTP_DealWithProxy( hIC, lpwhs, lpwhr );
- Host = HTTP_GetHeader(lpwhr,szHost);
-
- len = lstrlenW(Host->lpszValue) + strlenW(szUrlForm);
- lpszUrl = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
- sprintfW( lpszUrl, szUrlForm, Host->lpszValue );
-
- if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_COOKIES) &&
- InternetGetCookieW(lpszUrl, NULL, NULL, &nCookieSize))
- {
- int cnt = 0;
- static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0};
- static const WCHAR szcrlf[] = {'\r','\n',0};
-
- lpszCookies = HeapAlloc(GetProcessHeap(), 0, (nCookieSize + 1 + 8)*sizeof(WCHAR));
-
- cnt += sprintfW(lpszCookies, szCookie);
- InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize);
- strcatW(lpszCookies, szcrlf);
-
- HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies),
- HTTP_ADDREQ_FLAG_ADD);
- HeapFree(GetProcessHeap(), 0, lpszCookies);
- }
- HeapFree(GetProcessHeap(), 0, lpszUrl);
-
-
INTERNET_SendCallback(&lpwhs->hdr, dwContext,
INTERNET_STATUS_HANDLE_CREATED, &handle,
sizeof(handle));
@@ -3152,6 +3121,36 @@ static BOOL HTTP_SecureProxyConnect(LPWININETHTTPREQW lpwhr)
return TRUE;
}
+static void HTTP_InsertCookies(LPWININETHTTPREQW lpwhr)
+{
+ static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s',0};
+ LPWSTR lpszCookies, lpszUrl = NULL;
+ DWORD nCookieSize, len;
+ LPHTTPHEADERW Host = HTTP_GetHeader(lpwhr,szHost);
+
+ len = lstrlenW(Host->lpszValue) + strlenW(szUrlForm);
+ lpszUrl = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+ sprintfW( lpszUrl, szUrlForm, Host->lpszValue );
+
+ if (InternetGetCookieW(lpszUrl, NULL, NULL, &nCookieSize))
+ {
+ int cnt = 0;
+ static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0};
+ static const WCHAR szcrlf[] = {'\r','\n',0};
+
+ lpszCookies = HeapAlloc(GetProcessHeap(), 0, (nCookieSize + 1 + 8)*sizeof(WCHAR));
+
+ cnt += sprintfW(lpszCookies, szCookie);
+ InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize);
+ strcatW(lpszCookies, szcrlf);
+
+ HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies),
+ HTTP_ADDREQ_FLAG_ADD);
+ HeapFree(GetProcessHeap(), 0, lpszCookies);
+ }
+ HeapFree(GetProcessHeap(), 0, lpszUrl);
+}
+
/***********************************************************************
* HTTP_HttpSendRequestW (internal)
*
@@ -3241,6 +3240,9 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
HTTP_InsertAuthorization(lpwhr, lpwhr->pAuthInfo, szAuthorization);
HTTP_InsertAuthorization(lpwhr, lpwhr->pProxyAuthInfo, szProxy_Authorization);
+ if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_COOKIES))
+ HTTP_InsertCookies(lpwhr);
+
/* add the headers the caller supplied */
if( lpszHeaders && dwHeaderLength )
{Так же для сборки необходимо изменить файл спецификации rpm.
--- wine.spec 2008-06-17 23:11:55.000000000 +0400
+++ wine.spec 2008-07-26 13:40:58.000000000 +0400
@@ -1,6 +1,6 @@
Name: wine
Version: 1.0
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A Windows 16/32/64 bit emulator
Group: Applications/Emulators
@@ -52,6 +52,7 @@
Patch1: wine-rpath.patch
# fix #448338
Patch2: wine-desktop-mime.patch
+Patch3: wininet_insert_cookies_later.diff
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
ExclusiveArch: i386
@@ -225,6 +226,7 @@
%patch0
%patch1
%patch2
+%patch3
%patch400
%patch402 -p1
@@ -834,6 +836,10 @@
%{_libdir}/wine/*.def
%changelog
+* Wed Jul 16 2008 Alexey Kuznetsov
+- 1.0-2
+- patch for cooke, winebug #14339
+
* Tue Jun 17 2008 Andreas Bierfert
- 1.0-1
- version upgrade (#446311,#417161) Для тех кому интересно поиграться с системой сборки я приведу более подробную инструкцию:
- установите sudo yum install rpmdevtools yum-utils
- выполните rpmdev-setuptree
- далее в папку ~/rpmbuild скачайте исходный код wine командой yumdownloader --source wine
- установите исходники rpm -i wine-*.src.rpm (эта команда выполняется без прав супер пользователя)
- далее зайдите в папку ~/rpmbuild/SPECS и примините пач для файла спецификации.
- далее создайте файл ~/rpmbuild/SOURCE/wininet_insert_cookies_later.diff из примера приведенного вначале статьи.
- после чего можно выполнить команду rpmbuild -ba wine.spec
Ссылки по теме:


0 коммент.:
Отправить комментарий