diff --git a/src/Mod/AddonManager/AddonManager.py b/src/Mod/AddonManager/AddonManager.py index 08342febc6..3bd5f36d47 100644 --- a/src/Mod/AddonManager/AddonManager.py +++ b/src/Mod/AddonManager/AddonManager.py @@ -589,6 +589,10 @@ class CommandAddonManager: pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") self.config.checkUpdates.setChecked(pref.GetBool("AutoCheck",False)) self.config.customRepositories.setPlainText(pref.GetString("CustomRepositories","")) + self.config.radioButtonNoProxy.setChecked(pref.GetBool("NoProxyCheck",True)) + self.config.radioButtonSystemProxy.setChecked(pref.GetBool("SystemProxyCheck",False)) + self.config.radioButtonUserProxy.setChecked(pref.GetBool("UserProxyCheck",False)) + self.config.userProxy.setPlainText(pref.GetString("ProxyUrl","")) # center the dialog over the Addon Manager self.config.move(self.dialog.frameGeometry().topLeft() + self.dialog.rect().center() - self.config.rect().center()) @@ -599,6 +603,10 @@ class CommandAddonManager: # OK button has been pressed pref.SetBool("AutoCheck",self.config.checkUpdates.isChecked()) pref.SetString("CustomRepositories",self.config.customRepositories.toPlainText()) + pref.SetBool("NoProxyCheck",self.config.radioButtonNoProxy.isChecked()) + pref.SetBool("SystemProxyCheck",self.config.radioButtonSystemProxy.isChecked()) + pref.SetBool("UserProxyCheck",self.config.radioButtonUserProxy.isChecked()) + pref.SetString("ProxyUrl",self.config.userProxy.toPlainText()) def check_updates(addon_name,callback): diff --git a/src/Mod/AddonManager/AddonManagerOptions.ui b/src/Mod/AddonManager/AddonManagerOptions.ui index cb88650cd6..709e222fc4 100644 --- a/src/Mod/AddonManager/AddonManagerOptions.ui +++ b/src/Mod/AddonManager/AddonManagerOptions.ui @@ -7,7 +7,7 @@ 0 0 390 - 183 + 247 @@ -24,6 +24,9 @@ installed addons will be checked for available updates Automatically check for updates at start (requires GitPython) + + false + @@ -41,6 +44,47 @@ sto be scanned for available addons + + + + Qt::Horizontal + + + + + + + Proxy + + + + + + + No proxy + + + + + + + User system proxy + + + + + + + User defined proxy : + + + true + + + + + + @@ -62,12 +106,12 @@ sto be scanned for available addons accept() - 248 - 254 + 257 + 237 157 - 274 + 246 @@ -78,12 +122,12 @@ sto be scanned for available addons reject() - 316 - 260 + 325 + 237 286 - 274 + 246 diff --git a/src/Mod/AddonManager/addonmanager_macro.py b/src/Mod/AddonManager/addonmanager_macro.py index c23e5e5319..e7039ff500 100644 --- a/src/Mod/AddonManager/addonmanager_macro.py +++ b/src/Mod/AddonManager/addonmanager_macro.py @@ -103,6 +103,9 @@ class Macro(object): except: print("AddonManager: Debug: unable to open URL",url) return + if u is None : + print("AddonManager: Debug: connection is lost (proxy setting changed?)",url) + return p = u.read() if sys.version_info.major >= 3 and isinstance(p, bytes): p = p.decode('utf-8') diff --git a/src/Mod/AddonManager/addonmanager_utilities.py b/src/Mod/AddonManager/addonmanager_utilities.py index 037e22124b..d428478f11 100644 --- a/src/Mod/AddonManager/addonmanager_utilities.py +++ b/src/Mod/AddonManager/addonmanager_utilities.py @@ -40,12 +40,12 @@ except ImportError: pass else: try: - ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) + ssl_ctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) except AttributeError: pass + - - + def translate(context, text, disambig=None): "Main translation function" @@ -90,21 +90,38 @@ def urlopen(url): timeout = 5 if sys.version_info.major < 3: - import urllib2 + import urllib2 else: import urllib.request as urllib2 + + # Proxy an ssl configuration + pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") + if pref.GetBool("NoProxyCheck",True): + proxies = {} + else: + if pref.GetBool("SystemProxyCheck",False): + proxy = urllib2.getproxies() + proxies = {"http": proxy.get('http'),"https": proxy.get('http')} + elif pref.GetBool("UserProxyCheck",False): + proxy = pref.GetString("ProxyUrl","") + proxies = {"http": proxy, "https": proxy} + if ssl_ctx: + handler = urllib2.HTTPSHandler(context=ssl_ctx) + else: + handler = {} + proxy_support = urllib2.ProxyHandler(proxies) + opener = urllib2.build_opener(proxy_support, handler) + urllib2.install_opener(opener) + + # Url opening try: - if ssl_ctx: - u = urllib2.urlopen(url, context=ssl_ctx, timeout=timeout) - else: - u = urllib2.urlopen(url, timeout=timeout) + u = urllib2.urlopen(url, timeout=timeout) except: return None else: return u - def getserver(url): """returns the server part of an url"""