Added fix for proxy settings mozbz#682832

This commit is contained in:
Jan Horak 2012-02-23 08:26:30 +01:00
parent 86b0cb0fd8
commit 77b7e90b8d
2 changed files with 364 additions and 1 deletions

358
mozilla-682832-proxy.patch Normal file
View File

@ -0,0 +1,358 @@
diff -up xulrunner-10.0/mozilla-beta/toolkit/system/gnome/nsGSettingsService.cpp.682832 xulrunner-10.0/mozilla-beta/toolkit/system/gnome/nsGSettingsService.cpp
--- xulrunner-10.0/mozilla-beta/toolkit/system/gnome/nsGSettingsService.cpp.682832 2012-01-18 17:25:24.000000000 +0100
+++ xulrunner-10.0/mozilla-beta/toolkit/system/gnome/nsGSettingsService.cpp 2012-01-23 15:40:14.803170842 +0100
@@ -44,6 +44,8 @@
#include "nsMemory.h"
#include "prlink.h"
#include "nsComponentManagerUtils.h"
+#include "nsIMutableArray.h"
+#include "nsISupportsPrimitives.h"
#include <glib.h>
#include <glib-object.h>
@@ -60,6 +62,7 @@ typedef struct _GVariant GVariant;
# define G_VARIANT_TYPE_STRING ((const GVariantType *) "s")
# define G_VARIANT_TYPE_OBJECT_PATH ((const GVariantType *) "o")
# define G_VARIANT_TYPE_SIGNATURE ((const GVariantType *) "g")
+# define G_VARIANT_TYPE_STRING_ARRAY ((const GVariantType *) "as")
#endif
#define GSETTINGS_FUNCTIONS \
@@ -72,6 +75,7 @@ typedef struct _GVariant GVariant;
FUNC(g_variant_get_int32, gint32, (GVariant* variant)) \
FUNC(g_variant_get_boolean, gboolean, (GVariant* variant)) \
FUNC(g_variant_get_string, const char *, (GVariant* value, gsize* length)) \
+ FUNC(g_variant_get_strv, const char **, (GVariant* value, gsize* length)) \
FUNC(g_variant_is_of_type, gboolean, (GVariant* value, const GVariantType* type)) \
FUNC(g_variant_new_int32, GVariant *, (gint32 value)) \
FUNC(g_variant_new_boolean, GVariant *, (gboolean value)) \
@@ -95,6 +99,7 @@ GSETTINGS_FUNCTIONS
#define g_variant_get_int32 _g_variant_get_int32
#define g_variant_get_boolean _g_variant_get_boolean
#define g_variant_get_string _g_variant_get_string
+#define g_variant_get_strv _g_variant_get_strv
#define g_variant_is_of_type _g_variant_is_of_type
#define g_variant_new_int32 _g_variant_new_int32
#define g_variant_new_boolean _g_variant_new_boolean
@@ -267,6 +272,49 @@ nsGSettingsCollection::GetInt(const nsAC
return NS_OK;
}
+NS_IMETHODIMP
+nsGSettingsCollection::GetStringList(const nsACString& aKey, nsIArray** aResult)
+{
+ if (!KeyExists(aKey))
+ return NS_ERROR_INVALID_ARG;
+
+ nsCOMPtr<nsIMutableArray> items(do_CreateInstance(NS_ARRAY_CONTRACTID));
+ if (!items) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
+ GVariant *value = g_settings_get_value(mSettings,
+ PromiseFlatCString(aKey).get());
+
+ if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY)) {
+ g_variant_unref(value);
+ return NS_ERROR_FAILURE;
+ }
+
+ const gchar ** gs_strings = g_variant_get_strv(value, NULL);
+ if (!gs_strings) {
+ // empty array
+ NS_ADDREF(*aResult = items);
+ g_variant_unref(value);
+ return NS_OK;
+ }
+
+ const gchar** p_gs_strings = gs_strings;
+ while (*p_gs_strings != NULL)
+ {
+ nsCOMPtr<nsISupportsCString> obj(do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID));
+ if (obj) {
+ obj->SetData(nsDependentCString(*p_gs_strings));
+ items->AppendElement(obj, false);
+ }
+ p_gs_strings++;
+ }
+ g_free(gs_strings);
+ NS_ADDREF(*aResult = items);
+ g_variant_unref(value);
+ return NS_OK;
+}
+
// These types are local to nsGSettingsService::Init, but ISO C++98 doesn't
// allow a template (ArrayLength) to be instantiated based on a local type.
// Boo-urns!
diff -up xulrunner-10.0/mozilla-beta/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.682832 xulrunner-10.0/mozilla-beta/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
--- xulrunner-10.0/mozilla-beta/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.682832 2012-01-18 17:25:24.000000000 +0100
+++ xulrunner-10.0/mozilla-beta/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp 2012-01-23 15:39:23.083172529 +0100
@@ -49,6 +49,7 @@
#include "nsPrintfCString.h"
#include "nsNetUtil.h"
#include "nsISupportsPrimitives.h"
+#include "nsIGSettingsService.h"
class nsUnixSystemProxySettings : public nsISystemProxySettings {
public:
@@ -62,9 +63,12 @@ private:
~nsUnixSystemProxySettings() {}
nsCOMPtr<nsIGConfService> mGConf;
+ nsCOMPtr<nsIGSettingsService> mGSettings;
bool IsProxyMode(const char* aMode);
nsresult SetProxyResultFromGConf(const char* aKeyBase, const char* aType, nsACString& aResult);
nsresult GetProxyFromGConf(const nsACString& aScheme, const nsACString& aHost, PRInt32 aPort, nsACString& aResult);
+ nsresult GetProxyFromGSettings(const nsACString& aScheme, const nsACString& aHost, PRInt32 aPort, nsACString& aResult);
+ nsresult SetProxyResultFromGSettings(const char* aKeyBase, const char* aType, nsACString& aResult);
};
NS_IMPL_ISUPPORTS1(nsUnixSystemProxySettings, nsISystemProxySettings)
@@ -73,6 +77,7 @@ nsresult
nsUnixSystemProxySettings::Init()
{
mGConf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
+ mGSettings = do_GetService(NS_GSETTINGSSERVICE_CONTRACTID);
return NS_OK;
}
@@ -87,14 +92,31 @@ nsUnixSystemProxySettings::IsProxyMode(c
nsresult
nsUnixSystemProxySettings::GetPACURI(nsACString& aResult)
{
- if (!mGConf || !IsProxyMode("auto")) {
- // Return an empty string in this case
- aResult.Truncate();
- return NS_OK;
+ if (mGSettings) {
+ nsCOMPtr<nsIGSettingsCollection> proxy_settings;
+ mGSettings->GetCollectionForSchema(NS_LITERAL_CSTRING("org.gnome.system.proxy"),
+ getter_AddRefs(proxy_settings));
+ if (proxy_settings) {
+ nsCString proxyMode;
+ // Check if mode is auto
+ nsresult rv = proxy_settings->GetString(NS_LITERAL_CSTRING("mode"), proxyMode);
+ if (rv == NS_OK && proxyMode.Equals("auto")) {
+ return proxy_settings->GetString(NS_LITERAL_CSTRING("autoconfig-url"), aResult);
+ }
+ /* The org.gnome.system.proxy schema has been found, but auto mode is not set.
+ * Don't try the GConf and return empty string. */
+ aResult.Truncate();
+ return NS_OK;
+ }
}
- return mGConf->GetString(NS_LITERAL_CSTRING("/system/proxy/autoconfig_url"),
- aResult);
+ if (mGConf && IsProxyMode("auto")) {
+ return mGConf->GetString(NS_LITERAL_CSTRING("/system/proxy/autoconfig_url"),
+ aResult);
+ }
+ // Return an empty string when auto mode is not set.
+ aResult.Truncate();
+ return NS_OK;
}
static bool
@@ -231,7 +253,38 @@ nsUnixSystemProxySettings::SetProxyResul
PRInt32 port;
rv = mGConf->GetInt(portKey, &port);
NS_ENSURE_SUCCESS(rv, rv);
+
+ /* When port is 0, proxy is not considered as enabled even if host is set. */
+ if (port == 0)
+ return NS_ERROR_FAILURE;
+
+ SetProxyResult(aType, host, port, aResult);
+ return NS_OK;
+}
+
+nsresult
+nsUnixSystemProxySettings::SetProxyResultFromGSettings(const char* aKeyBase, const char* aType,
+ nsACString& aResult)
+{
+ nsCOMPtr<nsIGSettingsCollection> proxy_settings;
+ nsresult rv = mGSettings->GetCollectionForSchema(nsDependentCString(aKeyBase),
+ getter_AddRefs(proxy_settings));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCAutoString host;
+ rv = proxy_settings->GetString(NS_LITERAL_CSTRING("host"), host);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (host.IsEmpty())
+ return NS_ERROR_FAILURE;
+
+ PRInt32 port;
+ rv = proxy_settings->GetInt(NS_LITERAL_CSTRING("port"), &port);
+ NS_ENSURE_SUCCESS(rv, rv);
+ /* When port is 0, proxy is not considered as enabled even if host is set. */
+ if (port == 0)
+ return NS_ERROR_FAILURE;
+
SetProxyResult(aType, host, port, aResult);
return NS_OK;
}
@@ -271,17 +324,17 @@ static bool ConvertToIPV6Addr(const nsAC
PRIPv6Addr* aAddr)
{
PRNetAddr addr;
+ // try to convert hostname to IP
if (PR_StringToNetAddr(PromiseFlatCString(aName).get(), &addr) != PR_SUCCESS)
return false;
- PRIPv6Addr ipv6;
// convert parsed address to IPv6
if (addr.raw.family == PR_AF_INET) {
// convert to IPv4-mapped address
- PR_ConvertIPv4AddrToIPv6(addr.inet.ip, &ipv6);
+ PR_ConvertIPv4AddrToIPv6(addr.inet.ip, aAddr);
} else if (addr.raw.family == PR_AF_INET6) {
// copy the address
- memcpy(&ipv6, &addr.ipv6.ip, sizeof(PRIPv6Addr));
+ memcpy(aAddr, &addr.ipv6.ip, sizeof(PRIPv6Addr));
} else {
return false;
}
@@ -289,8 +342,8 @@ static bool ConvertToIPV6Addr(const nsAC
return true;
}
-static bool GConfIgnoreHost(const nsACString& aIgnore,
- const nsACString& aHost)
+static bool HostIgnoredByProxy(const nsACString& aIgnore,
+ const nsACString& aHost)
{
if (aIgnore.Equals(aHost, nsCaseInsensitiveCStringComparator()))
return true;
@@ -321,8 +374,9 @@ static bool GConfIgnoreHost(const nsACSt
slash = end;
}
+ nsDependentCSubstring ignoreStripped(start, slash);
PRIPv6Addr ignoreAddr, hostAddr;
- if (!ConvertToIPV6Addr(aIgnore, &ignoreAddr) ||
+ if (!ConvertToIPV6Addr(ignoreStripped, &ignoreAddr) ||
!ConvertToIPV6Addr(aHost, &hostAddr))
return false;
@@ -355,7 +409,7 @@ nsUnixSystemProxySettings::GetProxyFromG
if (str) {
nsAutoString s;
if (NS_SUCCEEDED(str->GetData(s)) && !s.IsEmpty()) {
- if (GConfIgnoreHost(NS_ConvertUTF16toUTF8(s), aHost)) {
+ if (HostIgnoredByProxy(NS_ConvertUTF16toUTF8(s), aHost)) {
aResult.AppendLiteral("DIRECT");
return NS_OK;
}
@@ -392,6 +446,71 @@ nsUnixSystemProxySettings::GetProxyFromG
}
nsresult
+nsUnixSystemProxySettings::GetProxyFromGSettings(const nsACString& aScheme,
+ const nsACString& aHost,
+ PRInt32 aPort,
+ nsACString& aResult)
+{
+ nsCOMPtr<nsIGSettingsCollection> proxy_settings;
+ nsresult rv;
+
+ rv = mGSettings->GetCollectionForSchema(NS_LITERAL_CSTRING("org.gnome.system.proxy"),
+ getter_AddRefs(proxy_settings));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCString proxyMode;
+ rv = proxy_settings->GetString(NS_LITERAL_CSTRING("mode"), proxyMode);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (!proxyMode.Equals("manual")) {
+ aResult.AppendLiteral("DIRECT");
+ return NS_OK;
+ }
+
+ nsCOMPtr<nsIArray> ignoreList;
+ if (NS_SUCCEEDED(proxy_settings->GetStringList(NS_LITERAL_CSTRING("ignore-hosts"),
+ getter_AddRefs(ignoreList))) && ignoreList) {
+ PRUint32 len = 0;
+ ignoreList->GetLength(&len);
+ for (PRUint32 i = 0; i < len; ++i) {
+ nsCOMPtr<nsISupportsCString> str = do_QueryElementAt(ignoreList, i);
+ if (str) {
+ nsCString s;
+ if (NS_SUCCEEDED(str->GetData(s)) && !s.IsEmpty()) {
+ if (HostIgnoredByProxy(s, aHost)) {
+ aResult.AppendLiteral("DIRECT");
+ return NS_OK;
+ }
+ }
+ }
+ }
+ }
+
+ if (aScheme.LowerCaseEqualsLiteral("http")) {
+ rv = SetProxyResultFromGSettings("org.gnome.system.proxy.http", "PROXY", aResult);
+ } else if (aScheme.LowerCaseEqualsLiteral("https")) {
+ rv = SetProxyResultFromGSettings("org.gnome.system.proxy.https", "PROXY", aResult);
+ /* Try to use HTTP proxy when HTTPS proxy is not explicitly defined */
+ if (rv != NS_OK)
+ rv = SetProxyResultFromGSettings("org.gnome.system.proxy.http", "PROXY", aResult);
+ } else if (aScheme.LowerCaseEqualsLiteral("ftp")) {
+ rv = SetProxyResultFromGSettings("org.gnome.system.proxy.ftp", "PROXY", aResult);
+ } else {
+ rv = NS_ERROR_FAILURE;
+ }
+ if (rv != NS_OK) {
+ /* If proxy for scheme is not specified, use SOCKS proxy for all schemes */
+ rv = SetProxyResultFromGSettings("org.gnome.system.proxy.socks", "SOCKS", aResult);
+ }
+
+ if (NS_FAILED(rv)) {
+ aResult.AppendLiteral("DIRECT");
+ }
+
+ return NS_OK;
+}
+
+nsresult
nsUnixSystemProxySettings::GetProxyForURI(nsIURI* aURI, nsACString& aResult)
{
nsCAutoString scheme;
@@ -406,10 +525,15 @@ nsUnixSystemProxySettings::GetProxyForUR
rv = aURI->GetPort(&port);
NS_ENSURE_SUCCESS(rv, rv);
- if (!mGConf)
- return GetProxyFromEnvironment(scheme, host, port, aResult);
+ if (mGSettings) {
+ rv = GetProxyFromGSettings(scheme, host, port, aResult);
+ if (rv == NS_OK)
+ return rv;
+ }
+ if (mGConf)
+ return GetProxyFromGConf(scheme, host, port, aResult);
- return GetProxyFromGConf(scheme, host, port, aResult);
+ return GetProxyFromEnvironment(scheme, host, port, aResult);
}
#define NS_UNIXSYSTEMPROXYSERVICE_CID /* 0fa3158c-d5a7-43de-9181-a285e74cf1d4 */\
diff -up xulrunner-10.0/mozilla-beta/xpcom/system/nsIGSettingsService.idl.682832 xulrunner-10.0/mozilla-beta/xpcom/system/nsIGSettingsService.idl
--- xulrunner-10.0/mozilla-beta/xpcom/system/nsIGSettingsService.idl.682832 2012-01-18 17:25:28.000000000 +0100
+++ xulrunner-10.0/mozilla-beta/xpcom/system/nsIGSettingsService.idl 2012-01-23 15:32:29.890186340 +0100
@@ -39,7 +39,7 @@
#include "nsISupports.idl"
#include "nsIArray.idl"
-[scriptable, uuid(09637d3c-3c07-40b4-aff9-1d2a0f046f3c)]
+[scriptable, uuid(16d5b0ed-e756-4f1b-a8ce-9132e869acd8)]
interface nsIGSettingsCollection : nsISupports
{
void setString(in AUTF8String key, in AUTF8String value);
@@ -48,6 +48,7 @@ interface nsIGSettingsCollection : nsISu
AUTF8String getString(in AUTF8String key);
boolean getBoolean(in AUTF8String key);
long getInt(in AUTF8String key);
+ nsIArray getStringList(in AUTF8String key);
};
[scriptable, uuid(849c088b-57d1-4f24-b7b2-3dc4acb04c0a)]

View File

@ -33,7 +33,7 @@
Summary: Mozilla Thunderbird mail/newsgroup client
Name: thunderbird
Version: 10.0.1
Release: 2%{?dist}
Release: 3%{?dist}
URL: http://www.mozilla.org/projects/thunderbird/
License: MPLv1.1 or GPLv2+ or LGPLv2+
Group: Applications/Internet
@ -61,6 +61,7 @@ Patch8: xulrunner-10.0-secondary-ipc.patch
# # cherry-picked from 13afcd4c097c
Patch13: xulrunner-9.0-secondary-build-fix.patch
Patch14: mozilla-727401.patch
Patch15: mozilla-682832-proxy.patch
# Build patches
Patch100: xulrunner-10.0-gcc47.patch
@ -151,6 +152,7 @@ cd mozilla
%patch8 -p3 -b .secondary-ipc
%patch13 -p2 -b .secondary-build
%patch14 -p1 -b .727401
%patch15 -p2 -b .682832
%if 0%{?fedora} >= 17
%patch100 -p1 -b .gcc47
%endif
@ -372,6 +374,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
#===============================================================================
%changelog
* Thu Feb 23 2012 Jan Horak <jhorak@redhat.com> - 10.0.1-3
- Added fix for proxy settings mozbz#682832
* Thu Feb 16 2012 Martin Stransky <stransky@redhat.com> - 10.0.1-2
- Added fix for mozbz#727401