changeset 28418:e2e615821ef5

also use environment varaibles for network proxy settings (bug #54334) * update_network_settings: add environment varaibles as possible settings for the proxy * resourse-manager.cc (update_network_settings): add the possibility to read the proxy settings from envrionment variables and also set related evironment variables when a proxy is manually configures in the preferences
author Torsten Lilge <ttl-octave@mailbox.org>
date Sun, 07 Jun 2020 10:28:17 +0200
parents 9cf726d43735
children 7987bad47033
files libgui/src/gui-preferences-global.h libgui/src/resource-manager.cc
diffstat 2 files changed, 97 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/gui-preferences-global.h	Sun Jun 07 10:35:49 2020 +0200
+++ b/libgui/src/gui-preferences-global.h	Sun Jun 07 10:28:17 2020 +0200
@@ -128,9 +128,9 @@
 
 const QStringList
 global_proxy_all_types (QStringList ()
-             << QT_TRANSLATE_NOOP ("octave::settings_dialog", "HttpProxy")
-             << QT_TRANSLATE_NOOP ("octave::settings_dialog", "Socks5Proxy")
-//             << QT_TRANSLATE_NOOP ("octave::settings_dialog", "Environment Varaibles")
+             << "HttpProxy"
+             << "Socks5Proxy"
+             << QT_TRANSLATE_NOOP ("octave::settings_dialog", "Environment Variables")
 );
 const QList<int>
 global_proxy_manual_types (QList<int> () << 0 << 1);
--- a/libgui/src/resource-manager.cc	Sun Jun 07 10:35:49 2020 +0200
+++ b/libgui/src/resource-manager.cc	Sun Jun 07 10:28:17 2020 +0200
@@ -336,39 +336,108 @@
 
   void resource_manager::update_network_settings (void)
   {
-    if (m_settings)
+    if (! m_settings)
+      return;
+
+    QNetworkProxy proxy;
+
+    // Assume no proxy and empty proxy data
+    QNetworkProxy::ProxyType proxy_type = QNetworkProxy::NoProxy;
+    QString scheme;
+    QString host;
+    int port = 0;
+    QString user;
+    QString pass;
+    QUrl proxy_url = QUrl ();
+
+    if (m_settings->value (global_use_proxy.key, global_use_proxy.def).toBool ())
       {
-        QNetworkProxy::ProxyType proxyType = QNetworkProxy::NoProxy;
+        // Use a proxy, collect all required information
+
+        QString proxy_type_string
+            = m_settings->value (global_proxy_type.key, global_proxy_type.def).toString ();
 
-        if (m_settings->value (global_use_proxy.key, global_use_proxy.def).toBool ())
+        // The proxy type for the Qt proxy settings
+        if (proxy_type_string == "Socks5Proxy")
+          proxy_type = QNetworkProxy::Socks5Proxy;
+        else if (proxy_type_string == "HttpProxy")
+          proxy_type = QNetworkProxy::HttpProxy;
+
+        // The proxy data from the settings
+        if (proxy_type_string == "HttpProxy"
+            || proxy_type_string == "Socks5Proxy")
           {
-            QString proxyTypeString
-              = m_settings->value (global_proxy_type.key, global_proxy_type.def).toString ();
+            host = m_settings->value (global_proxy_host.key,
+                                      global_proxy_host.def).toString ();
+            port = m_settings->value (global_proxy_port.key,
+                                      global_proxy_port.def).toInt ();
+            user = m_settings->value (global_proxy_user.key,
+                                      global_proxy_user.def).toString ();
+            pass = m_settings->value (global_proxy_pass.key,
+                                      global_proxy_pass.def).toString ();
+            if (proxy_type_string == "HttpProxy")
+              scheme = "http";
+            else if (proxy_type_string == "Socks5Proxy")
+              scheme = "socks5";
 
-            if (proxyTypeString == "Socks5Proxy")
-              proxyType = QNetworkProxy::Socks5Proxy;
-            else if (proxyTypeString == "HttpProxy")
-              proxyType = QNetworkProxy::HttpProxy;
+            QUrl env_var_url = QUrl ();
+            proxy_url.setScheme (scheme);
+            proxy_url.setHost (host);
+            proxy_url.setPort (port);
+            if (! user.isEmpty ())
+              proxy_url.setUserName (user);
+            if (! pass.isEmpty ())
+              proxy_url.setPassword (pass);
           }
 
-        QNetworkProxy proxy;
+        // The proxy data from the Environment variables
+        if (proxy_type_string == global_proxy_all_types.at (2))
+          {
+            const int nr_of_env_vars = 6;
+            char env_vars[nr_of_env_vars][20]
+              = { "ALL_PROXY", "all_proxy",
+                  "HTTP_PROXY", "http_proxy",
+                  "HTTPS_PROXY", "https_proxy"};
+
+            int count = 0;
+            while ((! proxy_url.isValid ()) && (count < nr_of_env_vars))
+              {
+                proxy_url = QUrl (QString (getenv (env_vars[count])));
+                count++;
+              }
+
+            if (proxy_url.isValid ())
+              {
+                // Found an entry, get the data from the string
+                scheme = proxy_url.scheme ();
 
-        proxy.setType (proxyType);
-        proxy.setHostName (m_settings->value (global_proxy_host.key,
-                                              global_proxy_host.def).toString ());
-        proxy.setPort (m_settings->value (global_proxy_port.key,
-                                          global_proxy_port.def).toInt ());
-        proxy.setUser (m_settings->value (global_proxy_user.key,
-                                          global_proxy_user.def).toString ());
-        proxy.setPassword (m_settings->value (global_proxy_pass.key,
-                                              global_proxy_pass.def).toString ());
+                if (scheme.contains ("socks", Qt::CaseInsensitive))
+                  proxy_type = QNetworkProxy::Socks5Proxy;
+                else
+                  proxy_type = QNetworkProxy::HttpProxy;
+
+                host = proxy_url.host ();
+                port = proxy_url.port ();
+                user = proxy_url.userName ();
+                pass = proxy_url.password ();
+              }
+          }
+      }
 
-        QNetworkProxy::setApplicationProxy (proxy);
-      }
-    else
-      {
-        // FIXME: Is this an error?  If so, what should we do?
-      }
+      // Set proxy for Qt framework
+      proxy.setType (proxy_type);
+      proxy.setHostName (host);
+      proxy.setPort (port);
+      proxy.setUser (user);
+      proxy.setPassword (pass);
+
+      QNetworkProxy::setApplicationProxy (proxy);
+
+      // Set proxy for curl library if not based on environment variables
+      setenv ("http_proxy", proxy_url.toString ().toLocal8Bit ().data (), 1);
+      setenv ("HTTP_PROXY", proxy_url.toString ().toLocal8Bit ().data (), 1);
+      setenv ("https_proxy", proxy_url.toString ().toLocal8Bit ().data (), 1);
+      setenv ("HTTPS_PROXY", proxy_url.toString ().toLocal8Bit ().data (), 1);
   }
 
   QIcon resource_manager::icon (const QString& icon_name, bool fallback)