суббота, 26 июля 2008 г.

Blizzard downloader with fedora 9

В настоящий момент в репозитории fedora 9 находится релиз wine версии 1.0.0. Это немного устаревшая версия с некоторыми улучшениями от комьюнити fedora. Одним из неоспоримых преимуществ использования данного пакета - начилие поддержки pulseaudio встроенного в пакет wine-1.0.0. Благодоря этому все приложения под wine\linux могут проигрывать аудио поток одновременно.

Но всю радужную картину омрачает одна ошибка. К сожалению в репозиторий 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)

Для тех кому интересно поиграться с системой сборки я приведу более подробную инструкцию:

  1. установите  sudo yum install rpmdevtools yum-utils
  2. выполните rpmdev-setuptree
  3. далее в папку ~/rpmbuild скачайте исходный код wine командой yumdownloader --source wine
  4. установите исходники rpm -i wine-*.src.rpm (эта команда выполняется без прав супер пользователя)
  5. далее зайдите в папку ~/rpmbuild/SPECS и примините пач для файла спецификации.
  6. далее создайте файл ~/rpmbuild/SOURCE/wininet_insert_cookies_later.diff из примера приведенного вначале статьи.
  7. после чего можно выполнить команду rpmbuild -ba wine.spec


Ссылки по теме:

0 коммент.:

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