Added fix for proxy settings mozbz#682832
This commit is contained in:
parent
86b0cb0fd8
commit
77b7e90b8d
358
mozilla-682832-proxy.patch
Normal file
358
mozilla-682832-proxy.patch
Normal 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)]
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user