Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gns3-gui for openSUSE:Factory 
checked in at 2021-03-11 20:11:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gns3-gui (Old)
 and      /work/SRC/openSUSE:Factory/.gns3-gui.new.2401 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gns3-gui"

Thu Mar 11 20:11:23 2021 rev:7 rq:878289 version:2.2.19

Changes:
--------
--- /work/SRC/openSUSE:Factory/gns3-gui/gns3-gui.changes        2020-12-11 
20:16:50.968662965 +0100
+++ /work/SRC/openSUSE:Factory/.gns3-gui.new.2401/gns3-gui.changes      
2021-03-11 20:13:00.356733089 +0100
@@ -1,0 +2,18 @@
+Sat Mar  6 12:38:37 UTC 2021 - Martin Hauke <mar...@gmx.de>
+
+- Update to version 2.2.19
+  * No changes
+- Update to version 2.2.18
+  * SSL support.
+  * Remove the useless file "zoom-in (copy).svg".
+  * Use HDD disk image as startup QEMU config disk.
+  * Edit only text mode config files.
+  * Hide config import/export when configFiles attribute is empty.
+  * Qemu disk interfaces must be set to "none" by default.
+  * Do not allow image to be configured on Qemu VM secondary slave
+    disk if create config disk option is enabled.
+  * Add explicit option to automatically create or not the config
+    disk. Off by default.
+  * QEMU config disk support.
+
+-------------------------------------------------------------------

Old:
----
  gns3-gui-2.2.17.tar.gz

New:
----
  gns3-gui-2.2.19.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gns3-gui.spec ++++++
--- /var/tmp/diff_new_pack.z1Yhk6/_old  2021-03-11 20:13:01.000734135 +0100
+++ /var/tmp/diff_new_pack.z1Yhk6/_new  2021-03-11 20:13:01.004734142 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package gns3-gui
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           gns3-gui
-Version:        2.2.17
+Version:        2.2.19
 Release:        0
 Summary:        GNS3 graphical interface for the GNS3 server
 License:        GPL-3.0-or-later

++++++ gns3-gui-2.2.17.tar.gz -> gns3-gui-2.2.19.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/CHANGELOG 
new/gns3-gui-2.2.19/CHANGELOG
--- old/gns3-gui-2.2.17/CHANGELOG       2020-12-04 06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/CHANGELOG       2021-03-05 05:21:03.000000000 +0100
@@ -1,5 +1,21 @@
 # Change Log
 
+## 2.2.19 05/03/2021
+
+* No changes
+
+## 2.2.18 16/02/2021
+
+* SSL support.
+* Remove the useless file "zoom-in (copy).svg". Fixes #3114
+* Use HDD disk image as startup QEMU config disk
+* Edit only text mode config files
+* Hide config import/export when configFiles attribute is empty
+* Qemu disk interfaces must be set to "none" by default. Ref #3035
+* Do not allow image to be configured on Qemu VM secondary slave disk if 
create config disk option is enabled.
+* Add explicit option to automatically create or not the config disk. Off by 
default.
+* QEMU config disk support
+
 ## 2.2.17 04/12/2020
 
 * Remove "-nographic" option by default for Qemu VM. Fixes #3094
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/controller.py 
new/gns3-gui-2.2.19/gns3/controller.py
--- old/gns3-gui-2.2.17/gns3/controller.py      2020-12-04 06:56:56.000000000 
+0100
+++ new/gns3-gui-2.2.19/gns3/controller.py      2021-03-05 05:21:03.000000000 
+0100
@@ -130,7 +130,7 @@
 
         self._connected = False
         self._connecting = True
-        self.get('/version', self._versionGetSlot)
+        self.httpClient().getSynchronous('/version', self._versionGetSlot, 
timeout=60)
 
     def _httpClientDisconnectedSlot(self):
         if self._connected:
@@ -423,6 +423,7 @@
             self._notification_stream = 
self._http_client.connectWebSocket(self._websocket, "/notifications/ws")
             
self._notification_stream.textMessageReceived.connect(self._websocket_event_received)
             self._notification_stream.error.connect(self._websocket_error)
+            self._notification_stream.sslErrors.connect(self._sslErrorsSlot)
 
     def stopListenNotifications(self):
         if self._notification_stream:
@@ -448,6 +449,11 @@
             self._startListenNotifications()
 
     @qslot
+    def _sslErrorsSlot(self, ssl_errors):
+
+        self._http_client.handleSslError(self._notification_stream, ssl_errors)
+
+    @qslot
     def _websocket_event_received(self, event):
         try:
             self._event_received(json.loads(event))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/crash_report.py 
new/gns3-gui-2.2.19/gns3/crash_report.py
--- old/gns3-gui-2.2.17/gns3/crash_report.py    2020-12-04 06:56:56.000000000 
+0100
+++ new/gns3-gui-2.2.19/gns3/crash_report.py    2021-03-05 05:21:03.000000000 
+0100
@@ -51,7 +51,7 @@
     Report crash to a third party service
     """
 
-    DSN = 
"https://32b3e599a2ea4172817ee1800d60bb42:a4e8b89f01124ce0b0508d59fdec6...@o19455.ingest.sentry.io/38506";
+    DSN = 
"https://7ff21b87760a4bae84c753e3774bb950:b061d45015d748faab5a820a36e38...@o19455.ingest.sentry.io/38506";
     _instance = None
 
     def __init__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/dialogs/edit_compute_dialog.py 
new/gns3-gui-2.2.19/gns3/dialogs/edit_compute_dialog.py
--- old/gns3-gui-2.2.17/gns3/dialogs/edit_compute_dialog.py     2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/dialogs/edit_compute_dialog.py     2021-03-05 
05:21:03.000000000 +0100
@@ -41,6 +41,9 @@
             self.uiServerHostLineEdit.setText(self._compute.host())
             self.uiServerPortSpinBox.setValue(self._compute.port())
 
+            index = 
self.uiServerProtocolComboBox.findText(self._compute.protocol().upper())
+            self.uiServerProtocolComboBox.setCurrentIndex(index)
+
             if self._compute.user():
                 self.uiEnableAuthenticationCheckBox.setChecked(True)
                 self.uiServerUserLineEdit.setText(self._compute.user())
@@ -78,7 +81,7 @@
 
         host = self.uiServerHostLineEdit.text().strip()
         name = self.uiServerNameLineEdit.text().strip()
-        protocol = "http"
+        protocol = self.uiServerProtocolComboBox.currentText().lower()
         port = self.uiServerPortSpinBox.value()
         user = self.uiServerUserLineEdit.text().strip()
         password = self.uiServerPasswordLineEdit.text().strip()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/graphics_view.py 
new/gns3-gui-2.2.19/gns3/graphics_view.py
--- old/gns3-gui-2.2.17/gns3/graphics_view.py   2020-12-04 06:56:56.000000000 
+0100
+++ new/gns3-gui-2.2.19/gns3/graphics_view.py   2021-03-05 05:21:03.000000000 
+0100
@@ -861,19 +861,19 @@
             bring_to_front_action.triggered.connect(self.bringToFrontSlot)
             menu.addAction(bring_to_front_action)
 
-        if True in list(map(lambda item: isinstance(item, NodeItem) and 
hasattr(item.node(), "configFiles"), items)):
+        if True in list(map(lambda item: isinstance(item, NodeItem) and 
bool(item.node().configFiles()), items)):
             import_config_action = QtWidgets.QAction("Import config", menu)
             import_config_action.setIcon(get_icon("import.svg"))
             import_config_action.triggered.connect(self.importConfigActionSlot)
             menu.addAction(import_config_action)
 
-        if True in list(map(lambda item: isinstance(item, NodeItem) and 
hasattr(item.node(), "configFiles"), items)):
+        if True in list(map(lambda item: isinstance(item, NodeItem) and 
bool(item.node().configFiles()), items)):
             export_config_action = QtWidgets.QAction("Export config", menu)
             export_config_action.setIcon(get_icon("export.svg"))
             export_config_action.triggered.connect(self.exportConfigActionSlot)
             menu.addAction(export_config_action)
 
-        if True in list(map(lambda item: isinstance(item, NodeItem) and 
hasattr(item.node(), "configFiles"), items)):
+        if True in list(map(lambda item: isinstance(item, NodeItem) and 
bool(item.node().configTextFiles()), items)):
             export_config_action = QtWidgets.QAction("Edit config", menu)
             export_config_action.setIcon(get_icon("edit.svg"))
             export_config_action.triggered.connect(self.editConfigActionSlot)
@@ -1226,7 +1226,7 @@
 
         items = []
         for item in self.scene().selectedItems():
-            if isinstance(item, NodeItem) and hasattr(item.node(), 
"configFiles") and item.node().initialized():
+            if isinstance(item, NodeItem) and item.node().configFiles() and 
item.node().initialized():
                 items.append(item)
 
         if not items:
@@ -1257,17 +1257,17 @@
 
         items = []
         for item in self.scene().selectedItems():
-            if isinstance(item, NodeItem) and hasattr(item.node(), 
"configFiles") and item.node().initialized():
+            if isinstance(item, NodeItem) and item.node().configTextFiles() 
and item.node().initialized():
                 items.append(item)
 
         if not items:
             return
 
         for item in items:
-            if len(item.node().configFiles()) == 1:
-                config_file = item.node().configFiles()[0]
+            if len(item.node().configTextFiles()) == 1:
+                config_file = item.node().configTextFiles()[0]
             else:
-                config_file, ok = QtWidgets.QInputDialog.getItem(self, "Edit 
file", "File to edit?", item.node().configFiles(), 0, False)
+                config_file, ok = QtWidgets.QInputDialog.getItem(self, "Edit 
file", "File to edit?", item.node().configTextFiles(), 0, False)
                 if not ok:
                     continue
             dialog = FileEditorDialog(item.node(), config_file, parent=self)
@@ -1282,7 +1282,7 @@
 
         items = []
         for item in self.scene().selectedItems():
-            if isinstance(item, NodeItem) and hasattr(item.node(), 
"configFiles") and item.node().initialized():
+            if isinstance(item, NodeItem) and item.node().configFiles() and 
item.node().initialized():
                 items.append(item)
 
         if not items:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/http_client.py 
new/gns3-gui-2.2.19/gns3/http_client.py
--- old/gns3-gui-2.2.17/gns3/http_client.py     2020-12-04 06:56:56.000000000 
+0100
+++ new/gns3-gui-2.2.19/gns3/http_client.py     2021-03-05 05:21:03.000000000 
+0100
@@ -18,18 +18,15 @@
 from .qt import sip
 import json
 import copy
-import http
 import uuid
 import pathlib
 import base64
-import datetime
 import ipaddress
 import urllib.request
 import urllib.parse
 
-
 from .version import __version__, __version_info__
-from .qt import QtCore, QtNetwork, qpartial, sip_is_deleted
+from .qt import QtCore, QtNetwork, QtWidgets, qpartial, sip_is_deleted
 from .utils import parse_version
 
 import logging
@@ -79,6 +76,18 @@
         self._shutdown = False  # Shutdown in progress
         self._accept_insecure_certificate = 
settings.get("accept_insecure_certificate", None)
 
+        # Add custom CA
+        # ssl_config = QtNetwork.QSslConfiguration.defaultConfiguration()
+        # if ssl_config.addCaCertificates("/path/to/rootCA.crt"):
+        #     log.debug("CA certificate added")
+        # QtNetwork.QSslConfiguration.setDefaultConfiguration(ssl_config)
+
+        if self._protocol == "https":
+            if not QtNetwork.QSslSocket.supportsSsl():
+                log.error("SSL is not supported")
+            else:
+                log.debug(f"SSL is supported, version: 
{QtNetwork.QSslSocket().sslLibraryBuildVersionString()}")
+
         # In order to detect computer hibernation we detect the date of the 
last
         # query and disconnect if time is too long between two query
         self._last_query_timestamp = None
@@ -93,6 +102,12 @@
         # List of query waiting for the connection
         self._query_waiting_connections = []
 
+        # To catch SSL errors
+        self._network_manager.sslErrors.connect(self._sslErrorsSlot)
+
+        # Store SSL error exceptions
+        self._ssl_exceptions = {}
+
     def setMaxTimeDifferenceBetweenQueries(self, value):
         self._max_time_difference_between_queries = value
 
@@ -470,7 +485,14 @@
         """
         host = self._getHostForQuery()
         request = websocket.request()
-        ws_url = "ws://{host}:{port}{prefix}{path}".format(host=host, 
port=self._port, path=path, prefix=prefix)
+        ws_protocol = "ws"
+        if self._protocol == "https":
+            ws_protocol = "wss"
+        ws_url = 
"{protocol}://{host}:{port}{prefix}{path}".format(protocol=ws_protocol,
+                                                                   host=host,
+                                                                   
port=self._port,
+                                                                   path=path,
+                                                                   
prefix=prefix)
         log.debug("Connecting to WebSocket endpoint: {}".format(ws_url))
         request.setUrl(QtCore.QUrl(ws_url))
         self._addAuth(request)
@@ -776,6 +798,55 @@
                     return status, json_data
         return status, None
 
+    def _sslErrorsSlot(self, response, ssl_errors):
+
+        self.handleSslError(response, ssl_errors)
+
+    def handleSslError(self, response, ssl_errors):
+
+        if self._accept_insecure_certificate:
+            response.ignoreSslErrors()
+            return
+
+        url = response.request().url()
+        host_port_key = f"{url.host()}:{url.port()}"
+
+        # get the certificate digest
+        ssl_config = response.sslConfiguration()
+        peer_cert = ssl_config.peerCertificate()
+        digest = peer_cert.digest()
+
+        if host_port_key in self._ssl_exceptions:
+
+            if self._ssl_exceptions[host_port_key] == digest:
+                response.ignoreSslErrors()
+                return
+
+        from gns3.main_window import MainWindow
+        main_window = MainWindow.instance()
+
+        msgbox = QtWidgets.QMessageBox(main_window)
+        msgbox.setWindowTitle("SSL error detected")
+        msgbox.setText(f"This server could not prove that it is 
{url.host()}:{url.port()}. Please carefully examine the certificate to make 
sure the server can be trusted.")
+        msgbox.setInformativeText(f"{ssl_errors[0].errorString()}")
+        msgbox.setDetailedText(peer_cert.toText())
+        msgbox.setSizePolicy(QtWidgets.QSizePolicy.Expanding, 
QtWidgets.QSizePolicy.Expanding)
+        connect_button = QtWidgets.QPushButton(f"&Connect to 
{url.host()}:{url.port()}", msgbox)
+        msgbox.addButton(connect_button, QtWidgets.QMessageBox.YesRole)
+        abort_button = QtWidgets.QPushButton("&Abort", msgbox)
+        msgbox.addButton(abort_button, QtWidgets.QMessageBox.RejectRole)
+        msgbox.setDefaultButton(abort_button)
+        msgbox.setIcon(QtWidgets.QMessageBox.Critical)
+        msgbox.exec_()
+
+        if msgbox.clickedButton() == connect_button:
+            self._ssl_exceptions[host_port_key] = digest
+            response.ignoreSslErrors()
+        else:
+            for error in ssl_errors:
+                log.error(f"SSL error detected: {error.errorString()}")
+            main_window.close()
+
     @classmethod
     def fromUrl(cls, url, network_manager=None, base_settings=None):
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gns3-gui-2.2.17/gns3/modules/qemu/pages/qemu_vm_configuration_page.py 
new/gns3-gui-2.2.19/gns3/modules/qemu/pages/qemu_vm_configuration_page.py
--- old/gns3-gui-2.2.17/gns3/modules/qemu/pages/qemu_vm_configuration_page.py   
2020-12-04 06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/modules/qemu/pages/qemu_vm_configuration_page.py   
2021-03-05 05:21:03.000000000 +0100
@@ -90,6 +90,7 @@
         
self.uiActivateCPUThrottlingCheckBox.stateChanged.connect(self._cpuThrottlingChangedSlot)
         
self.uiLegacyNetworkingCheckBox.stateChanged.connect(self._legacyNetworkingChangedSlot)
         
self.uiCustomAdaptersConfigurationPushButton.clicked.connect(self._customAdaptersConfigurationSlot)
+        
self.uiCreateConfigDiskCheckBox.stateChanged.connect(self._createConfigDiskChangedSlot)
 
         # add the categories
         for name, category in Node.defaultCategories().items():
@@ -366,6 +367,19 @@
         else:
             self._refreshQemuNetworkDevices()
 
+    def _createConfigDiskChangedSlot(self, state):
+        """
+        Slot to allow or not HDD disk to be configured based on the state of 
the config disk option.
+        """
+
+        _translate = QtCore.QCoreApplication.translate
+        if state:
+            
self.uiHddDiskImageLabel.setText(_translate("QemuVMConfigPageWidget", 
"Startup-cfg:"))
+        else:
+            
self.uiHddDiskImageLabel.setText(_translate("QemuVMConfigPageWidget", "Disk 
image:"))
+        self.uiHddDiskImageCreateToolButton.setEnabled(not state)
+        self.uiHddDiskImageResizeToolButton.setEnabled(not state)
+
     def _customAdaptersConfigurationSlot(self):
         """
         Slot to open the custom adapters configuration dialog
@@ -453,6 +467,7 @@
             
self.uiHdbDiskInterfaceComboBox.setCurrentIndex(self.uiHdbDiskInterfaceComboBox.findText(settings["hdb_disk_interface"]))
             
self.uiHdcDiskInterfaceComboBox.setCurrentIndex(self.uiHdcDiskInterfaceComboBox.findText(settings["hdc_disk_interface"]))
             
self.uiHddDiskInterfaceComboBox.setCurrentIndex(self.uiHddDiskInterfaceComboBox.findText(settings["hdd_disk_interface"]))
+            
self.uiCreateConfigDiskCheckBox.setChecked(settings["create_config_disk"])
             self.uiCdromImageLineEdit.setText(settings["cdrom_image"])
             self.uiBiosImageLineEdit.setText(settings["bios_image"])
             self.uiInitrdLineEdit.setText(settings["initrd"])
@@ -588,6 +603,7 @@
             settings["hdb_disk_interface"] = 
self.uiHdbDiskInterfaceComboBox.currentText()
             settings["hdc_disk_interface"] = 
self.uiHdcDiskInterfaceComboBox.currentText()
             settings["hdd_disk_interface"] = 
self.uiHddDiskInterfaceComboBox.currentText()
+            settings["create_config_disk"] = 
self.uiCreateConfigDiskCheckBox.isChecked()
             settings["cdrom_image"] = self.uiCdromImageLineEdit.text().strip()
             settings["bios_image"] = self.uiBiosImageLineEdit.text().strip()
             settings["initrd"] = self.uiInitrdLineEdit.text().strip()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/modules/qemu/qemu_vm.py 
new/gns3-gui-2.2.19/gns3/modules/qemu/qemu_vm.py
--- old/gns3-gui-2.2.17/gns3/modules/qemu/qemu_vm.py    2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/modules/qemu/qemu_vm.py    2021-03-05 
05:21:03.000000000 +0100
@@ -72,6 +72,7 @@
                             "mac_address": QEMU_VM_SETTINGS["mac_address"],
                             "legacy_networking": 
QEMU_VM_SETTINGS["legacy_networking"],
                             "replicate_network_connection_state": 
QEMU_VM_SETTINGS["replicate_network_connection_state"],
+                            "create_config_disk": 
QEMU_VM_SETTINGS["create_config_disk"],
                             "platform": QEMU_VM_SETTINGS["platform"],
                             "on_close": QEMU_VM_SETTINGS["on_close"],
                             "cpu_throttling": 
QEMU_VM_SETTINGS["cpu_throttling"],
@@ -134,6 +135,24 @@
         usage = "\n" + self._settings.get("usage")
         return info + port_info + usage
 
+    def configFiles(self):
+        """
+        Name of the configuration files
+        """
+
+        if self._settings.get("create_config_disk"):
+            return ["config.zip"]
+        return None
+
+    def configTextFiles(self):
+        """
+        Name of the configuration files, which are plain text files
+
+        :returns: List of configuration files, False if no files
+        """
+
+        return None
+
     def configPage(self):
         """
         Returns the configuration page widget to be used by the node 
properties dialog.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/modules/qemu/settings.py 
new/gns3-gui-2.2.19/gns3/modules/qemu/settings.py
--- old/gns3-gui-2.2.17/gns3/modules/qemu/settings.py   2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/modules/qemu/settings.py   2021-03-05 
05:21:03.000000000 +0100
@@ -41,10 +41,10 @@
     "hdb_disk_image": "",
     "hdc_disk_image": "",
     "hdd_disk_image": "",
-    "hda_disk_interface": "ide",
-    "hdb_disk_interface": "ide",
-    "hdc_disk_interface": "ide",
-    "hdd_disk_interface": "ide",
+    "hda_disk_interface": "none",
+    "hdb_disk_interface": "none",
+    "hdc_disk_interface": "none",
+    "hdd_disk_interface": "none",
     "cdrom_image": "",
     "bios_image": "",
     "boot_priority": "c",
@@ -57,6 +57,7 @@
     "mac_address": "",
     "legacy_networking": False,
     "replicate_network_connection_state": True,
+    "create_config_disk": False,
     "on_close": "power_off",
     "platform": "",
     "cpu_throttling": 0,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gns3-gui-2.2.17/gns3/modules/qemu/ui/qemu_vm_configuration_page.ui 
new/gns3-gui-2.2.19/gns3/modules/qemu/ui/qemu_vm_configuration_page.ui
--- old/gns3-gui-2.2.17/gns3/modules/qemu/ui/qemu_vm_configuration_page.ui      
2020-12-04 06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/modules/qemu/ui/qemu_vm_configuration_page.ui      
2021-03-05 05:21:03.000000000 +0100
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>941</width>
-    <height>877</height>
+    <height>939</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -399,14 +399,21 @@
           <string>HDD (Secondary Slave)</string>
          </property>
          <layout class="QGridLayout" name="gridLayout_9">
-          <item row="0" column="0">
+          <item row="0" column="0" colspan="2">
+           <widget class="QCheckBox" name="uiCreateConfigDiskCheckBox">
+            <property name="text">
+             <string>Automatically create a config disk on HDD</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
            <widget class="QLabel" name="uiHddDiskImageLabel">
             <property name="text">
              <string>Disk image:</string>
             </property>
            </widget>
           </item>
-          <item row="0" column="1" rowspan="2">
+          <item row="1" column="1">
            <layout class="QHBoxLayout" name="horizontalLayout_10">
             <item>
              <widget class="QLineEdit" name="uiHddDiskImageLineEdit"/>
@@ -437,7 +444,7 @@
             </item>
            </layout>
           </item>
-          <item row="1" column="0" rowspan="2">
+          <item row="2" column="0">
            <widget class="QLabel" name="uiHddDiskInterfaceLabel">
             <property name="text">
              <string>Disk interface:</string>
@@ -470,7 +477,16 @@
        <string>CD/DVD</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_4">
-       <property name="margin">
+       <property name="leftMargin">
+        <number>10</number>
+       </property>
+       <property name="topMargin">
+        <number>10</number>
+       </property>
+       <property name="rightMargin">
+        <number>10</number>
+       </property>
+       <property name="bottomMargin">
         <number>10</number>
        </property>
        <item>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gns3-gui-2.2.17/gns3/modules/qemu/ui/qemu_vm_configuration_page_ui.py 
new/gns3-gui-2.2.19/gns3/modules/qemu/ui/qemu_vm_configuration_page_ui.py
--- old/gns3-gui-2.2.17/gns3/modules/qemu/ui/qemu_vm_configuration_page_ui.py   
2020-12-04 06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/modules/qemu/ui/qemu_vm_configuration_page_ui.py   
2021-03-05 05:21:03.000000000 +0100
@@ -13,7 +13,7 @@
 class Ui_QemuVMConfigPageWidget(object):
     def setupUi(self, QemuVMConfigPageWidget):
         QemuVMConfigPageWidget.setObjectName("QemuVMConfigPageWidget")
-        QemuVMConfigPageWidget.resize(941, 877)
+        QemuVMConfigPageWidget.resize(941, 939)
         self.verticalLayout = QtWidgets.QVBoxLayout(QemuVMConfigPageWidget)
         self.verticalLayout.setObjectName("verticalLayout")
         self.uiQemutabWidget = QtWidgets.QTabWidget(QemuVMConfigPageWidget)
@@ -211,9 +211,12 @@
         self.uiHddGroupBox.setObjectName("uiHddGroupBox")
         self.gridLayout_9 = QtWidgets.QGridLayout(self.uiHddGroupBox)
         self.gridLayout_9.setObjectName("gridLayout_9")
+        self.uiCreateConfigDiskCheckBox = 
QtWidgets.QCheckBox(self.uiHddGroupBox)
+        
self.uiCreateConfigDiskCheckBox.setObjectName("uiCreateConfigDiskCheckBox")
+        self.gridLayout_9.addWidget(self.uiCreateConfigDiskCheckBox, 0, 0, 1, 
2)
         self.uiHddDiskImageLabel = QtWidgets.QLabel(self.uiHddGroupBox)
         self.uiHddDiskImageLabel.setObjectName("uiHddDiskImageLabel")
-        self.gridLayout_9.addWidget(self.uiHddDiskImageLabel, 0, 0, 1, 1)
+        self.gridLayout_9.addWidget(self.uiHddDiskImageLabel, 1, 0, 1, 1)
         self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_10.setObjectName("horizontalLayout_10")
         self.uiHddDiskImageLineEdit = QtWidgets.QLineEdit(self.uiHddGroupBox)
@@ -229,10 +232,10 @@
         self.uiHddDiskImageResizeToolButton = 
QtWidgets.QToolButton(self.uiHddGroupBox)
         
self.uiHddDiskImageResizeToolButton.setObjectName("uiHddDiskImageResizeToolButton")
         self.horizontalLayout_10.addWidget(self.uiHddDiskImageResizeToolButton)
-        self.gridLayout_9.addLayout(self.horizontalLayout_10, 0, 1, 2, 1)
+        self.gridLayout_9.addLayout(self.horizontalLayout_10, 1, 1, 1, 1)
         self.uiHddDiskInterfaceLabel = QtWidgets.QLabel(self.uiHddGroupBox)
         self.uiHddDiskInterfaceLabel.setObjectName("uiHddDiskInterfaceLabel")
-        self.gridLayout_9.addWidget(self.uiHddDiskInterfaceLabel, 1, 0, 2, 1)
+        self.gridLayout_9.addWidget(self.uiHddDiskInterfaceLabel, 2, 0, 1, 1)
         self.uiHddDiskInterfaceComboBox = 
QtWidgets.QComboBox(self.uiHddGroupBox)
         
self.uiHddDiskInterfaceComboBox.setObjectName("uiHddDiskInterfaceComboBox")
         self.gridLayout_9.addWidget(self.uiHddDiskInterfaceComboBox, 2, 1, 1, 
1)
@@ -497,6 +500,7 @@
         
self.uiHdcDiskImageResizeToolButton.setText(_translate("QemuVMConfigPageWidget",
 "Resize..."))
         
self.uiHdcDiskInterfaceLabel.setText(_translate("QemuVMConfigPageWidget", "Disk 
interface:"))
         self.uiHddGroupBox.setTitle(_translate("QemuVMConfigPageWidget", "HDD 
(Secondary Slave)"))
+        
self.uiCreateConfigDiskCheckBox.setText(_translate("QemuVMConfigPageWidget", 
"Automatically create a config disk on HDD"))
         self.uiHddDiskImageLabel.setText(_translate("QemuVMConfigPageWidget", 
"Disk image:"))
         
self.uiHddDiskImageToolButton.setText(_translate("QemuVMConfigPageWidget", 
"&Browse..."))
         
self.uiHddDiskImageCreateToolButton.setText(_translate("QemuVMConfigPageWidget",
 "Create..."))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/node.py 
new/gns3-gui-2.2.19/gns3/node.py
--- old/gns3-gui-2.2.17/gns3/node.py    2020-12-04 06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/node.py    2021-03-05 05:21:03.000000000 +0100
@@ -199,6 +199,26 @@
 
         return self._always_on
 
+    def configFiles(self):
+        """
+        Name of the configuration files
+
+        This method should be overridden in derived classes
+
+        :returns: List of configuration files, False if no files
+        """
+
+        return None
+
+    def configTextFiles(self):
+        """
+        Name of the configuration files, which are plain text files
+
+        :returns: List of configuration files, False if no files
+        """
+
+        return self.configFiles()
+
     def get(self, path, *args, **kwargs):
         """
         GET on current server / project
@@ -774,7 +794,7 @@
         :param directory: destination directory path
         """
 
-        if not hasattr(self, "configFiles"):
+        if not self.configFiles():
             return False
         for file in self.configFiles():
             self.get("/files/{file}".format(file=file),
@@ -813,7 +833,7 @@
         :param directory: source directory path
         """
 
-        if not hasattr(self, "configFiles"):
+        if not self.configFiles():
             return
 
         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gns3-gui-2.2.17/gns3/pages/server_preferences_page.py 
new/gns3-gui-2.2.19/gns3/pages/server_preferences_page.py
--- old/gns3-gui-2.2.17/gns3/pages/server_preferences_page.py   2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/pages/server_preferences_page.py   2021-03-05 
05:21:03.000000000 +0100
@@ -191,6 +191,7 @@
 
         self.uiRemoteMainServerHostLineEdit.setText(servers_settings["host"])
         self.uiRemoteMainServerPortSpinBox.setValue(servers_settings["port"])
+        
self.uiRemoteMainServerProtocolComboBox.setCurrentText(servers_settings["protocol"].upper())
         self.uiRemoteMainServerUserLineEdit.setText(servers_settings["user"])
         
self.uiRemoteMainServerPasswordLineEdit.setText(servers_settings["password"])
         
self.uiRemoteMainServerAuthCheckBox.setChecked(servers_settings["auth"])
@@ -285,7 +286,7 @@
         else:
             new_local_server_settings["host"] = 
self.uiRemoteMainServerHostLineEdit.text()
             new_local_server_settings["port"] = 
self.uiRemoteMainServerPortSpinBox.value()
-            new_local_server_settings["protocol"] = "http"
+            new_local_server_settings["protocol"] = 
self.uiRemoteMainServerProtocolComboBox.currentText().lower()
             new_local_server_settings["user"] = 
self.uiRemoteMainServerUserLineEdit.text()
             new_local_server_settings["password"] = 
self.uiRemoteMainServerPasswordLineEdit.text()
             new_local_server_settings["auth"] = 
self.uiRemoteMainServerAuthCheckBox.isChecked()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/project.py 
new/gns3-gui-2.2.19/gns3/project.py
--- old/gns3-gui-2.2.17/gns3/project.py 2020-12-04 06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/project.py 2021-03-05 05:21:03.000000000 +0100
@@ -632,6 +632,7 @@
             self._notification_stream = 
Controller.instance().httpClient().connectWebSocket(self._websocket, path)
             
self._notification_stream.textMessageReceived.connect(self._websocket_event_received)
             self._notification_stream.error.connect(self._websocket_error)
+            self._notification_stream.sslErrors.connect(self._sslErrorsSlot)
 
     def _endListenNotificationCallback(self, result, error=False, **kwargs):
         """
@@ -649,6 +650,11 @@
             self._startListenNotifications()
 
     @qslot
+    def _sslErrorsSlot(self, ssl_errors):
+
+        
Controller.instance().httpClient().handleSslError(self._notification_stream, 
ssl_errors)
+
+    @qslot
     def _websocket_event_received(self, event):
         try:
             self._event_received(json.loads(event))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/ui/edit_compute_dialog.ui 
new/gns3-gui-2.2.19/gns3/ui/edit_compute_dialog.ui
--- old/gns3-gui-2.2.17/gns3/ui/edit_compute_dialog.ui  2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/ui/edit_compute_dialog.ui  2021-03-05 
05:21:03.000000000 +0100
@@ -9,8 +9,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>579</width>
-    <height>374</height>
+    <width>585</width>
+    <height>353</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -23,10 +23,31 @@
       <string>Server settings</string>
      </property>
      <layout class="QGridLayout" name="gridLayout">
+      <item row="3" column="0">
+       <widget class="QLabel" name="uiServerPortLabel">
+        <property name="text">
+         <string>Port:</string>
+        </property>
+       </widget>
+      </item>
       <item row="0" column="1">
        <widget class="QLineEdit" name="uiServerNameLineEdit"/>
       </item>
       <item row="2" column="1" colspan="2">
+       <widget class="QLineEdit" name="uiServerHostLineEdit">
+        <property name="text">
+         <string>192.168.56.101</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="uiServerHostLabel">
+        <property name="text">
+         <string>Host:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="1" colspan="2">
        <widget class="QSpinBox" name="uiServerPortSpinBox">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@@ -52,25 +73,25 @@
         </property>
        </widget>
       </item>
-      <item row="1" column="1" colspan="2">
-       <widget class="QLineEdit" name="uiServerHostLineEdit">
-        <property name="text">
-         <string>192.168.56.101</string>
-        </property>
-       </widget>
-      </item>
       <item row="1" column="0">
-       <widget class="QLabel" name="uiServerHostLabel">
+       <widget class="QLabel" name="uiServerProtocolLabel">
         <property name="text">
-         <string>Host:</string>
+         <string>Protocol:</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="0">
-       <widget class="QLabel" name="uiServerPortLabel">
-        <property name="text">
-         <string>Port:</string>
-        </property>
+      <item row="1" column="1">
+       <widget class="QComboBox" name="uiServerProtocolComboBox">
+        <item>
+         <property name="text">
+          <string>HTTP</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>HTTPS</string>
+         </property>
+        </item>
        </widget>
       </item>
      </layout>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/ui/edit_compute_dialog_ui.py 
new/gns3-gui-2.2.19/gns3/ui/edit_compute_dialog_ui.py
--- old/gns3-gui-2.2.17/gns3/ui/edit_compute_dialog_ui.py       2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/ui/edit_compute_dialog_ui.py       2021-03-05 
05:21:03.000000000 +0100
@@ -1,29 +1,39 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 
'/Users/noplay/code/gns3/gns3-gui/gns3/ui/edit_compute_dialog.ui'
+# Form implementation generated from reading ui file 
'/home/grossmj/PycharmProjects/gns3-gui/gns3/ui/edit_compute_dialog.ui'
 #
-# Created by: PyQt5 UI code generator 5.8
+# Created by: PyQt5 UI code generator 5.15.2
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
 
 from PyQt5 import QtCore, QtGui, QtWidgets
 
 
 class Ui_EditComputeDialog(object):
-
     def setupUi(self, EditComputeDialog):
         EditComputeDialog.setObjectName("EditComputeDialog")
         EditComputeDialog.setWindowModality(QtCore.Qt.WindowModal)
-        EditComputeDialog.resize(579, 374)
+        EditComputeDialog.resize(585, 353)
         self.verticalLayout = QtWidgets.QVBoxLayout(EditComputeDialog)
         self.verticalLayout.setObjectName("verticalLayout")
         self.groupBox = QtWidgets.QGroupBox(EditComputeDialog)
         self.groupBox.setObjectName("groupBox")
         self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
         self.gridLayout.setObjectName("gridLayout")
+        self.uiServerPortLabel = QtWidgets.QLabel(self.groupBox)
+        self.uiServerPortLabel.setObjectName("uiServerPortLabel")
+        self.gridLayout.addWidget(self.uiServerPortLabel, 3, 0, 1, 1)
         self.uiServerNameLineEdit = QtWidgets.QLineEdit(self.groupBox)
         self.uiServerNameLineEdit.setObjectName("uiServerNameLineEdit")
         self.gridLayout.addWidget(self.uiServerNameLineEdit, 0, 1, 1, 1)
+        self.uiServerHostLineEdit = QtWidgets.QLineEdit(self.groupBox)
+        self.uiServerHostLineEdit.setObjectName("uiServerHostLineEdit")
+        self.gridLayout.addWidget(self.uiServerHostLineEdit, 2, 1, 1, 2)
+        self.uiServerHostLabel = QtWidgets.QLabel(self.groupBox)
+        self.uiServerHostLabel.setObjectName("uiServerHostLabel")
+        self.gridLayout.addWidget(self.uiServerHostLabel, 2, 0, 1, 1)
         self.uiServerPortSpinBox = QtWidgets.QSpinBox(self.groupBox)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, 
QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
@@ -34,19 +44,18 @@
         self.uiServerPortSpinBox.setMaximum(65535)
         self.uiServerPortSpinBox.setProperty("value", 3080)
         self.uiServerPortSpinBox.setObjectName("uiServerPortSpinBox")
-        self.gridLayout.addWidget(self.uiServerPortSpinBox, 2, 1, 1, 2)
+        self.gridLayout.addWidget(self.uiServerPortSpinBox, 3, 1, 1, 2)
         self.label = QtWidgets.QLabel(self.groupBox)
         self.label.setObjectName("label")
         self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
-        self.uiServerHostLineEdit = QtWidgets.QLineEdit(self.groupBox)
-        self.uiServerHostLineEdit.setObjectName("uiServerHostLineEdit")
-        self.gridLayout.addWidget(self.uiServerHostLineEdit, 1, 1, 1, 2)
-        self.uiServerHostLabel = QtWidgets.QLabel(self.groupBox)
-        self.uiServerHostLabel.setObjectName("uiServerHostLabel")
-        self.gridLayout.addWidget(self.uiServerHostLabel, 1, 0, 1, 1)
-        self.uiServerPortLabel = QtWidgets.QLabel(self.groupBox)
-        self.uiServerPortLabel.setObjectName("uiServerPortLabel")
-        self.gridLayout.addWidget(self.uiServerPortLabel, 2, 0, 1, 1)
+        self.uiServerProtocolLabel = QtWidgets.QLabel(self.groupBox)
+        self.uiServerProtocolLabel.setObjectName("uiServerProtocolLabel")
+        self.gridLayout.addWidget(self.uiServerProtocolLabel, 1, 0, 1, 1)
+        self.uiServerProtocolComboBox = QtWidgets.QComboBox(self.groupBox)
+        self.uiServerProtocolComboBox.setObjectName("uiServerProtocolComboBox")
+        self.uiServerProtocolComboBox.addItem("")
+        self.uiServerProtocolComboBox.addItem("")
+        self.gridLayout.addWidget(self.uiServerProtocolComboBox, 1, 1, 1, 1)
         self.verticalLayout.addWidget(self.groupBox)
         self.uiEnableAuthenticationCheckBox = 
QtWidgets.QGroupBox(EditComputeDialog)
         self.uiEnableAuthenticationCheckBox.setCheckable(True)
@@ -67,7 +76,7 @@
         self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, 
self.uiServerPasswordLabel)
         self.uiServerPasswordLineEdit = 
QtWidgets.QLineEdit(self.uiEnableAuthenticationCheckBox)
         self.uiServerPasswordLineEdit.setEnabled(True)
-        
self.uiServerPasswordLineEdit.setInputMethodHints(QtCore.Qt.ImhHiddenText | 
QtCore.Qt.ImhNoAutoUppercase | QtCore.Qt.ImhNoPredictiveText | 
QtCore.Qt.ImhSensitiveData)
+        
self.uiServerPasswordLineEdit.setInputMethodHints(QtCore.Qt.ImhHiddenText|QtCore.Qt.ImhNoAutoUppercase|QtCore.Qt.ImhNoPredictiveText|QtCore.Qt.ImhSensitiveData)
         self.uiServerPasswordLineEdit.setEchoMode(QtWidgets.QLineEdit.Password)
         self.uiServerPasswordLineEdit.setObjectName("uiServerPasswordLineEdit")
         self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, 
self.uiServerPasswordLineEdit)
@@ -80,7 +89,7 @@
         self.verticalLayout.addItem(spacerItem)
         self.buttonBox = QtWidgets.QDialogButtonBox(EditComputeDialog)
         self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel | 
QtWidgets.QDialogButtonBox.Ok)
+        
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
         self.buttonBox.setObjectName("buttonBox")
         self.verticalLayout.addWidget(self.buttonBox)
 
@@ -98,10 +107,13 @@
         _translate = QtCore.QCoreApplication.translate
         EditComputeDialog.setWindowTitle(_translate("EditComputeDialog", "Edit 
server settings"))
         self.groupBox.setTitle(_translate("EditComputeDialog", "Server 
settings"))
-        self.label.setText(_translate("EditComputeDialog", "Name:"))
+        self.uiServerPortLabel.setText(_translate("EditComputeDialog", 
"Port:"))
         self.uiServerHostLineEdit.setText(_translate("EditComputeDialog", 
"192.168.56.101"))
         self.uiServerHostLabel.setText(_translate("EditComputeDialog", 
"Host:"))
-        self.uiServerPortLabel.setText(_translate("EditComputeDialog", 
"Port:"))
+        self.label.setText(_translate("EditComputeDialog", "Name:"))
+        self.uiServerProtocolLabel.setText(_translate("EditComputeDialog", 
"Protocol:"))
+        self.uiServerProtocolComboBox.setItemText(0, 
_translate("EditComputeDialog", "HTTP"))
+        self.uiServerProtocolComboBox.setItemText(1, 
_translate("EditComputeDialog", "HTTPS"))
         
self.uiEnableAuthenticationCheckBox.setTitle(_translate("EditComputeDialog", 
"Enable authentication"))
         self.uiServerUserLabel.setText(_translate("EditComputeDialog", 
"User:"))
         self.uiServerPasswordLabel.setText(_translate("EditComputeDialog", 
"Password:"))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/ui/server_preferences_page.ui 
new/gns3-gui-2.2.19/gns3/ui/server_preferences_page.ui
--- old/gns3-gui-2.2.17/gns3/ui/server_preferences_page.ui      2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/ui/server_preferences_page.ui      2021-03-05 
05:21:03.000000000 +0100
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1273</width>
-    <height>1097</height>
+    <width>681</width>
+    <height>843</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -295,24 +295,14 @@
           <string>Remote main server</string>
          </property>
          <layout class="QGridLayout" name="gridLayout_4">
-          <item row="0" column="0">
+          <item row="1" column="0">
            <widget class="QLabel" name="label_2">
             <property name="text">
              <string>Host:</string>
             </property>
            </widget>
           </item>
-          <item row="0" column="1" colspan="2">
-           <widget class="QLineEdit" name="uiRemoteMainServerHostLineEdit"/>
-          </item>
-          <item row="1" column="0">
-           <widget class="QLabel" name="label_3">
-            <property name="text">
-             <string>Port:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="1" colspan="2">
+          <item row="2" column="1" colspan="2">
            <widget class="QSpinBox" name="uiRemoteMainServerPortSpinBox">
             <property name="sizePolicy">
              <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
@@ -331,44 +321,75 @@
             </property>
            </widget>
           </item>
-          <item row="2" column="0">
+          <item row="3" column="0">
            <widget class="QLabel" name="label">
             <property name="text">
              <string>Auth:</string>
             </property>
            </widget>
           </item>
-          <item row="2" column="2">
-           <widget class="QCheckBox" name="uiRemoteMainServerAuthCheckBox">
+          <item row="4" column="2">
+           <widget class="QLineEdit" name="uiRemoteMainServerUserLineEdit"/>
+          </item>
+          <item row="4" column="0">
+           <widget class="QLabel" name="label_4">
             <property name="text">
-             <string/>
+             <string>User:</string>
             </property>
            </widget>
           </item>
-          <item row="3" column="0">
-           <widget class="QLabel" name="label_4">
+          <item row="5" column="2">
+           <widget class="QLineEdit" name="uiRemoteMainServerPasswordLineEdit">
+            <property name="echoMode">
+             <enum>QLineEdit::Password</enum>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0">
+           <widget class="QLabel" name="label_3">
             <property name="text">
-             <string>User:</string>
+             <string>Port:</string>
             </property>
            </widget>
           </item>
-          <item row="3" column="2">
-           <widget class="QLineEdit" name="uiRemoteMainServerUserLineEdit"/>
+          <item row="1" column="1" colspan="2">
+           <widget class="QLineEdit" name="uiRemoteMainServerHostLineEdit"/>
           </item>
-          <item row="4" column="0" colspan="2">
+          <item row="5" column="0" colspan="2">
            <widget class="QLabel" name="label_5">
             <property name="text">
              <string>Password:</string>
             </property>
            </widget>
           </item>
-          <item row="4" column="2">
-           <widget class="QLineEdit" name="uiRemoteMainServerPasswordLineEdit">
-            <property name="echoMode">
-             <enum>QLineEdit::Password</enum>
+          <item row="3" column="2">
+           <widget class="QCheckBox" name="uiRemoteMainServerAuthCheckBox">
+            <property name="text">
+             <string/>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="0">
+           <widget class="QLabel" name="uiRemoteMainServerProtocolLabel">
+            <property name="text">
+             <string>Protocol:</string>
             </property>
            </widget>
           </item>
+          <item row="0" column="1" colspan="2">
+           <widget class="QComboBox" name="uiRemoteMainServerProtocolComboBox">
+            <item>
+             <property name="text">
+              <string>HTTP</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>HTTPS</string>
+             </property>
+            </item>
+           </widget>
+          </item>
          </layout>
         </widget>
        </item>
@@ -404,7 +425,16 @@
        <string>Remote servers</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_5">
-       <property name="margin">
+       <property name="leftMargin">
+        <number>10</number>
+       </property>
+       <property name="topMargin">
+        <number>10</number>
+       </property>
+       <property name="rightMargin">
+        <number>10</number>
+       </property>
+       <property name="bottomMargin">
         <number>10</number>
        </property>
        <item row="0" column="0" colspan="2">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gns3-gui-2.2.17/gns3/ui/server_preferences_page_ui.py 
new/gns3-gui-2.2.19/gns3/ui/server_preferences_page_ui.py
--- old/gns3-gui-2.2.17/gns3/ui/server_preferences_page_ui.py   2020-12-04 
06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/ui/server_preferences_page_ui.py   2021-03-05 
05:21:03.000000000 +0100
@@ -2,16 +2,19 @@
 
 # Form implementation generated from reading ui file 
'/home/grossmj/PycharmProjects/gns3-gui/gns3/ui/server_preferences_page.ui'
 #
-# Created by: PyQt5 UI code generator 5.9
+# Created by: PyQt5 UI code generator 5.15.2
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
 
 from PyQt5 import QtCore, QtGui, QtWidgets
 
+
 class Ui_ServerPreferencesPageWidget(object):
     def setupUi(self, ServerPreferencesPageWidget):
         
ServerPreferencesPageWidget.setObjectName("ServerPreferencesPageWidget")
-        ServerPreferencesPageWidget.resize(1273, 1097)
+        ServerPreferencesPageWidget.resize(681, 843)
         sizePolicy = 
QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, 
QtWidgets.QSizePolicy.MinimumExpanding)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
@@ -149,13 +152,7 @@
         self.gridLayout_4.setObjectName("gridLayout_4")
         self.label_2 = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
         self.label_2.setObjectName("label_2")
-        self.gridLayout_4.addWidget(self.label_2, 0, 0, 1, 1)
-        self.uiRemoteMainServerHostLineEdit = 
QtWidgets.QLineEdit(self.uiRemoteMainServerGroupBox)
-        
self.uiRemoteMainServerHostLineEdit.setObjectName("uiRemoteMainServerHostLineEdit")
-        self.gridLayout_4.addWidget(self.uiRemoteMainServerHostLineEdit, 0, 1, 
1, 2)
-        self.label_3 = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
-        self.label_3.setObjectName("label_3")
-        self.gridLayout_4.addWidget(self.label_3, 1, 0, 1, 1)
+        self.gridLayout_4.addWidget(self.label_2, 1, 0, 1, 1)
         self.uiRemoteMainServerPortSpinBox = 
QtWidgets.QSpinBox(self.uiRemoteMainServerGroupBox)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, 
QtWidgets.QSizePolicy.Preferred)
         sizePolicy.setHorizontalStretch(0)
@@ -165,27 +162,41 @@
         self.uiRemoteMainServerPortSpinBox.setMaximum(65535)
         self.uiRemoteMainServerPortSpinBox.setProperty("value", 3080)
         
self.uiRemoteMainServerPortSpinBox.setObjectName("uiRemoteMainServerPortSpinBox")
-        self.gridLayout_4.addWidget(self.uiRemoteMainServerPortSpinBox, 1, 1, 
1, 2)
+        self.gridLayout_4.addWidget(self.uiRemoteMainServerPortSpinBox, 2, 1, 
1, 2)
         self.label = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
         self.label.setObjectName("label")
-        self.gridLayout_4.addWidget(self.label, 2, 0, 1, 1)
-        self.uiRemoteMainServerAuthCheckBox = 
QtWidgets.QCheckBox(self.uiRemoteMainServerGroupBox)
-        self.uiRemoteMainServerAuthCheckBox.setText("")
-        
self.uiRemoteMainServerAuthCheckBox.setObjectName("uiRemoteMainServerAuthCheckBox")
-        self.gridLayout_4.addWidget(self.uiRemoteMainServerAuthCheckBox, 2, 2, 
1, 1)
-        self.label_4 = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
-        self.label_4.setObjectName("label_4")
-        self.gridLayout_4.addWidget(self.label_4, 3, 0, 1, 1)
+        self.gridLayout_4.addWidget(self.label, 3, 0, 1, 1)
         self.uiRemoteMainServerUserLineEdit = 
QtWidgets.QLineEdit(self.uiRemoteMainServerGroupBox)
         
self.uiRemoteMainServerUserLineEdit.setObjectName("uiRemoteMainServerUserLineEdit")
-        self.gridLayout_4.addWidget(self.uiRemoteMainServerUserLineEdit, 3, 2, 
1, 1)
-        self.label_5 = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
-        self.label_5.setObjectName("label_5")
-        self.gridLayout_4.addWidget(self.label_5, 4, 0, 1, 2)
+        self.gridLayout_4.addWidget(self.uiRemoteMainServerUserLineEdit, 4, 2, 
1, 1)
+        self.label_4 = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
+        self.label_4.setObjectName("label_4")
+        self.gridLayout_4.addWidget(self.label_4, 4, 0, 1, 1)
         self.uiRemoteMainServerPasswordLineEdit = 
QtWidgets.QLineEdit(self.uiRemoteMainServerGroupBox)
         
self.uiRemoteMainServerPasswordLineEdit.setEchoMode(QtWidgets.QLineEdit.Password)
         
self.uiRemoteMainServerPasswordLineEdit.setObjectName("uiRemoteMainServerPasswordLineEdit")
-        self.gridLayout_4.addWidget(self.uiRemoteMainServerPasswordLineEdit, 
4, 2, 1, 1)
+        self.gridLayout_4.addWidget(self.uiRemoteMainServerPasswordLineEdit, 
5, 2, 1, 1)
+        self.label_3 = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
+        self.label_3.setObjectName("label_3")
+        self.gridLayout_4.addWidget(self.label_3, 2, 0, 1, 1)
+        self.uiRemoteMainServerHostLineEdit = 
QtWidgets.QLineEdit(self.uiRemoteMainServerGroupBox)
+        
self.uiRemoteMainServerHostLineEdit.setObjectName("uiRemoteMainServerHostLineEdit")
+        self.gridLayout_4.addWidget(self.uiRemoteMainServerHostLineEdit, 1, 1, 
1, 2)
+        self.label_5 = QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
+        self.label_5.setObjectName("label_5")
+        self.gridLayout_4.addWidget(self.label_5, 5, 0, 1, 2)
+        self.uiRemoteMainServerAuthCheckBox = 
QtWidgets.QCheckBox(self.uiRemoteMainServerGroupBox)
+        self.uiRemoteMainServerAuthCheckBox.setText("")
+        
self.uiRemoteMainServerAuthCheckBox.setObjectName("uiRemoteMainServerAuthCheckBox")
+        self.gridLayout_4.addWidget(self.uiRemoteMainServerAuthCheckBox, 3, 2, 
1, 1)
+        self.uiRemoteMainServerProtocolLabel = 
QtWidgets.QLabel(self.uiRemoteMainServerGroupBox)
+        
self.uiRemoteMainServerProtocolLabel.setObjectName("uiRemoteMainServerProtocolLabel")
+        self.gridLayout_4.addWidget(self.uiRemoteMainServerProtocolLabel, 0, 
0, 1, 1)
+        self.uiRemoteMainServerProtocolComboBox = 
QtWidgets.QComboBox(self.uiRemoteMainServerGroupBox)
+        
self.uiRemoteMainServerProtocolComboBox.setObjectName("uiRemoteMainServerProtocolComboBox")
+        self.uiRemoteMainServerProtocolComboBox.addItem("")
+        self.uiRemoteMainServerProtocolComboBox.addItem("")
+        self.gridLayout_4.addWidget(self.uiRemoteMainServerProtocolComboBox, 
0, 1, 1, 2)
         self.verticalLayout.addWidget(self.uiRemoteMainServerGroupBox)
         spacerItem2 = QtWidgets.QSpacerItem(10, 10, 
QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
         self.verticalLayout.addItem(spacerItem2)
@@ -290,11 +301,14 @@
         
self.uiUDPPortRangeLabel.setText(_translate("ServerPreferencesPageWidget", 
"to"))
         
self.uiRemoteMainServerGroupBox.setTitle(_translate("ServerPreferencesPageWidget",
 "Remote main server"))
         self.label_2.setText(_translate("ServerPreferencesPageWidget", 
"Host:"))
-        self.label_3.setText(_translate("ServerPreferencesPageWidget", 
"Port:"))
         
self.uiRemoteMainServerPortSpinBox.setSuffix(_translate("ServerPreferencesPageWidget",
 " TCP"))
         self.label.setText(_translate("ServerPreferencesPageWidget", "Auth:"))
         self.label_4.setText(_translate("ServerPreferencesPageWidget", 
"User:"))
+        self.label_3.setText(_translate("ServerPreferencesPageWidget", 
"Port:"))
         self.label_5.setText(_translate("ServerPreferencesPageWidget", 
"Password:"))
+        
self.uiRemoteMainServerProtocolLabel.setText(_translate("ServerPreferencesPageWidget",
 "Protocol:"))
+        self.uiRemoteMainServerProtocolComboBox.setItemText(0, 
_translate("ServerPreferencesPageWidget", "HTTP"))
+        self.uiRemoteMainServerProtocolComboBox.setItemText(1, 
_translate("ServerPreferencesPageWidget", "HTTPS"))
         
self.uiServerPreferenceTabWidget.setTabText(self.uiServerPreferenceTabWidget.indexOf(self.uiLocalTabWidget),
 _translate("ServerPreferencesPageWidget", "Main server"))
         self.uiRemoteServersTreeWidget.headerItem().setText(0, 
_translate("ServerPreferencesPageWidget", "Name"))
         self.uiRemoteServersTreeWidget.headerItem().setText(4, 
_translate("ServerPreferencesPageWidget", "User"))
@@ -304,4 +318,3 @@
         self.label_7.setText(_translate("ServerPreferencesPageWidget", "Note: 
Changes are not visible in other part of the settings or application until you 
apply them."))
         
self.uiServerPreferenceTabWidget.setTabText(self.uiServerPreferenceTabWidget.indexOf(self.uiRemoteTabWidget),
 _translate("ServerPreferencesPageWidget", "Remote servers"))
         
self.uiRestoreDefaultsPushButton.setText(_translate("ServerPreferencesPageWidget",
 "Restore defaults"))
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gns3-gui-2.2.17/gns3/version.py 
new/gns3-gui-2.2.19/gns3/version.py
--- old/gns3-gui-2.2.17/gns3/version.py 2020-12-04 06:56:56.000000000 +0100
+++ new/gns3-gui-2.2.19/gns3/version.py 2021-03-05 05:21:03.000000000 +0100
@@ -23,8 +23,8 @@
 # or negative for a release candidate or beta (after the base version
 # number has been incremented)
 
-__version__ = "2.2.17"
-__version_info__ = (2, 2, 17, 0)
+__version__ = "2.2.19"
+__version_info__ = (2, 2, 19, 0)
 
 if "dev" in __version__:
     try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' "old/gns3-gui-2.2.17/resources/charcoal_icons/zoom-in 
(copy).svg" "new/gns3-gui-2.2.19/resources/charcoal_icons/zoom-in (copy).svg"
--- "old/gns3-gui-2.2.17/resources/charcoal_icons/zoom-in (copy).svg"   
2020-12-04 06:56:56.000000000 +0100
+++ "new/gns3-gui-2.2.19/resources/charcoal_icons/zoom-in (copy).svg"   
1970-01-01 01:00:00.000000000 +0100
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 
6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<svg version="1.1"
-        id="svg7631" xmlns:cc="http://creativecommons.org/ns#"; 
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"; 
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"; 
xmlns:dc="http://purl.org/dc/elements/1.1/"; 
xmlns:svg="http://www.w3.org/2000/svg"; 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
sodipodi:docname="camera-photo.svg" sodipodi:version="0.32" 
inkscape:version="0.48.3.1 r9886" 
inkscape:output_extension="org.inkscape.output.svg.inkscape"
-        xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; x="0px" y="0px" viewBox="0 0 48 48"
-        enable-background="new 0 0 48 48" xml:space="preserve">
-<g>
-       <g>
-               <path fill="#231F20" 
d="M42.8,38.4l-7.4-9c1.6-2.6,2.5-5.6,2.5-8.8c0-9.3-7.5-16.8-16.8-16.8S4.3,11.3,4.3,20.6
-                       
c0,9.3,7.5,16.8,16.8,16.8c3.7,0,7.1-1.2,9.9-3.2l6.8,8.3c0.6,0.7,1.5,0.8,2.2,0.2l2.5-2.1C43.2,40.1,43.3,39.1,42.8,38.4z
-                        
M9,20.6c0-6.7,5.4-12.1,12.1-12.1s12.1,5.4,12.1,12.1c0,6.7-5.4,12.1-12.1,12.1S9,27.3,9,20.6z"/>
-               <polygon fill="#231F20" points="27.6,19 23.2,19 23.2,14.4 
19,14.4 19,19 14.5,19 14.5,23.2 19,23.2 19,27.8 23.2,27.8 23.2,23.2 
-                       27.6,23.2               "/>
-       </g>
-       <g>
-               <path fill="#CDCDCD" 
d="M42.6,40l-7.4-9c1.6-2.6,2.5-5.6,2.5-8.8C37.7,13,30.2,5.4,21,5.4S4.2,13,4.2,22.2C4.2,31.5,11.7,39,21,39
-                       
c3.7,0,7.1-1.2,9.9-3.2l6.8,8.3c0.6,0.7,1.5,0.8,2.2,0.2l2.5-2.1C43.1,41.7,43.2,40.7,42.6,40z
 M8.9,22.2
-                       
c0-6.7,5.4-12.1,12.1-12.1S33,15.6,33,22.2c0,6.7-5.4,12.1-12.1,12.1S8.9,28.9,8.9,22.2z"/>
-               <polygon fill="#CDCDCD" points="27.8,20.6 23.2,20.6 23.2,16 
18.9,16 18.9,20.6 14.4,20.6 14.4,24.9 18.9,24.9 18.9,29.4 
-                       23.2,29.4 23.2,24.9 27.8,24.9           "/>
-       </g>
-</g>
-</svg>

Reply via email to