You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
16 KiB
352 lines
16 KiB
From 0ce07e30014a8ee6b2a8a4909c313f207d9c9b31 Mon Sep 17 00:00:00 2001 |
|
From: Lubomir Rintel <lkundrak@v3.sk> |
|
Date: Mon, 16 Jul 2018 17:43:04 +0200 |
|
Subject: [PATCH 2/3] firewall.core.fw_nm: identify the connections by uuid |
|
|
|
...as opposed by id. Uuid is guarranteed to be uniquie, while the id is |
|
provided merely for convenience without any guarrantees. |
|
|
|
(cherry picked from commit 624039964bd16e5e0e8ffb73e708d3d0c40e89d3) |
|
--- |
|
src/firewall-applet | 38 ++++++++++++++++++++------------------ |
|
src/firewall-config | 45 +++++++++++++++++++++++++-------------------- |
|
src/firewall/core/fw_nm.py | 16 ++++++++-------- |
|
3 files changed, 53 insertions(+), 46 deletions(-) |
|
|
|
diff --git a/src/firewall-applet b/src/firewall-applet |
|
index 3dc149c32755..86aaccab9f88 100755 |
|
--- a/src/firewall-applet |
|
+++ b/src/firewall-applet |
|
@@ -155,11 +155,12 @@ class ZoneInterfaceEditor(QtGui.QDialog): |
|
# ZoneConnectionEditor ######################################################## |
|
|
|
class ZoneConnectionEditor(ZoneInterfaceEditor): |
|
- def __init__(self, fw, connection, zone): |
|
+ def __init__(self, fw, connection, connection_name, zone): |
|
self.fw = fw |
|
self.connection = connection |
|
+ self.connection_name = connection_name |
|
self.zone = None |
|
- self.title = _("Select zone for connection '%s'") % self.connection |
|
+ self.title = _("Select zone for connection '%s'") % self.connection_name |
|
|
|
QtGui.QDialog.__init__(self) |
|
self.create_ui(zone) |
|
@@ -168,12 +169,12 @@ class ZoneConnectionEditor(ZoneInterfaceEditor): |
|
# apply changes |
|
try: |
|
nm_set_zone_of_connection(self.get_zone(), self.connection) |
|
- except Exception as msg: |
|
- text = _("Failed to set zone {zone} for connection {connection}") |
|
+ except Exception: |
|
+ text = _("Failed to set zone {zone} for connection {connection_name}") |
|
QtGui.QMessageBox.warning(None, fromUTF8(escape(self.title)), |
|
escape(text.format( |
|
zone=self.get_zone(), |
|
- connection=self.connection))) |
|
+ connection_name=self.connection_name))) |
|
self.hide() |
|
|
|
# ZoneSourceEditor ############################################################ |
|
@@ -428,7 +429,7 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
|
|
|
self.active_zones = { } |
|
self.connections = { } |
|
- self.connections_uuid = { } |
|
+ self.connections_name = { } |
|
self.default_zone = None |
|
self.zone_connection_editors = { } |
|
self.zone_interface_editors = { } |
|
@@ -666,30 +667,31 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
|
# NM controlled connections |
|
for interface in self.connections: |
|
connection = self.connections[interface] |
|
- if connection not in self.connections_uuid: |
|
- uuid = None |
|
+ if connection not in self.connections_name: |
|
+ connection_name = None |
|
else: |
|
- uuid = self.connections_uuid[connection] |
|
+ connection_name = self.connections_name[connection] |
|
zone = nm_get_zone_of_connection(connection) |
|
- connections[connection] = [ zone, uuid ] |
|
+ connections[connection] = [ zone, connection_name ] |
|
|
|
binding = _("{entry} (Zone: {zone})") |
|
|
|
# add NM controlled bindings |
|
for connection in sorted(connections): |
|
zone = connections[connection][0] |
|
+ connection_name = connections[connection][1] |
|
if zone == "": |
|
_binding = _("{entry} (Default Zone: {default_zone})") |
|
action = QtGui.QAction( |
|
fromUTF8(escape( |
|
_binding.format(default_zone=self.default_zone, |
|
- entry=connection))), self) |
|
+ entry=connection_name))), self) |
|
else: |
|
action = QtGui.QAction( |
|
fromUTF8(escape(binding.format(zone=zone, |
|
- entry=connection))), self) |
|
+ entry=connection_name))), self) |
|
action.triggered.connect(functools.partial( |
|
- self.zone_connection_editor, connection, zone)) |
|
+ self.zone_connection_editor, connection, connection_name, zone)) |
|
self.left_menu.addAction(action) |
|
|
|
# add interfaces entry |
|
@@ -729,13 +731,13 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
|
editor.raise_() |
|
editor.show() |
|
|
|
- def zone_connection_editor(self, connection, zone): |
|
+ def zone_connection_editor(self, connection, connection_name, zone): |
|
if connection in self.zone_connection_editors: |
|
self.zone_connection_editors[connection].set_zone(zone) |
|
self.zone_connection_editors[connection].show() |
|
return self.zone_connection_editors[connection].raise_() |
|
|
|
- editor = ZoneConnectionEditor(self.fw, connection, zone) |
|
+ editor = ZoneConnectionEditor(self.fw, connection, connection_name, zone) |
|
self.zone_connection_editors[connection] = editor |
|
editor.show() |
|
editor.raise_() |
|
@@ -755,15 +757,15 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
|
|
|
def nm_signal_receiver(self, *args, **kwargs): |
|
self.connections.clear() |
|
- self.connections_uuid.clear() |
|
+ self.connections_name.clear() |
|
|
|
# do not use NMClient could result in python core dump |
|
|
|
if nm_is_imported(): |
|
text = _("Failed to get connections from NetworkManager") |
|
try: |
|
- nm_get_connections(self.connections, self.connections_uuid) |
|
- except Exception as msg: |
|
+ nm_get_connections(self.connections, self.connections_name) |
|
+ except Exception: |
|
self.notify(escape(text), urgency=Notify.Urgency.CRITICAL) |
|
if text not in self.tooltip_messages: |
|
self.tooltip_messages.append(text) |
|
diff --git a/src/firewall-config b/src/firewall-config |
|
index 02bffabf457c..223c0ff6d27d 100755 |
|
--- a/src/firewall-config |
|
+++ b/src/firewall-config |
|
@@ -1368,7 +1368,7 @@ class FirewallConfig(object): |
|
# connect |
|
|
|
self.connections = { } |
|
- self.connections_uuid = { } |
|
+ self.connections_name = { } |
|
|
|
if nm_is_imported(): |
|
self.fw.bus.add_signal_receiver( |
|
@@ -1428,11 +1428,11 @@ class FirewallConfig(object): |
|
self.fw.changeZoneOfInterface(editor.get_zone(), interface) |
|
del self.zone_interface_editors[interface] |
|
|
|
- def change_zone_connection_editor(self, item, connection, zone): |
|
+ def change_zone_connection_editor(self, item, connection, connection_name, zone): |
|
if connection in self.zone_connection_editors: |
|
return self.zone_connection_editors[connection].present() |
|
|
|
- editor = ZoneConnectionEditor(self.fw, connection, zone) |
|
+ editor = ZoneConnectionEditor(self.fw, connection, connection_name, zone) |
|
editor.set_icon(self.icon) |
|
editor.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) |
|
editor.set_transient_for(self.mainWindow) |
|
@@ -1557,14 +1557,14 @@ class FirewallConfig(object): |
|
self.update_active_zones() |
|
|
|
self.connections.clear() |
|
- self.connections_uuid.clear() |
|
+ self.connections_name.clear() |
|
|
|
# do not use NMClient could result in python core dump |
|
|
|
if nm_is_imported(): |
|
try: |
|
- nm_get_connections(self.connections, self.connections_uuid) |
|
- except Exception as msg: |
|
+ nm_get_connections(self.connections, self.connections_name) |
|
+ except Exception: |
|
text = _("Failed to get connections from NetworkManager") |
|
self._warning(text) |
|
|
|
@@ -1572,12 +1572,14 @@ class FirewallConfig(object): |
|
while iter: |
|
interface = self.interfaceStore.get_value(iter, 0) |
|
if interface in self.connections: |
|
- zone = nm_get_zone_of_connection(self.connections[interface]) |
|
+ connection = self.connections[interface] |
|
+ connection_name = self.connections_name[connection] |
|
+ zone = nm_get_zone_of_connection(connection) |
|
if zone == "": |
|
comment = self.default_zone_used_by_label % \ |
|
- self.connections[interface] |
|
+ connection_name |
|
else: |
|
- comment = self.used_by_label % self.connections[interface] |
|
+ comment = self.used_by_label % connection_name |
|
self.interfaceStore.set_value(iter, 1, comment) |
|
iter = self.interfaceStore.iter_next(iter) |
|
self.change_interface_selection_cb(self.interfaceView.get_selection()) |
|
@@ -2427,37 +2429,38 @@ class FirewallConfig(object): |
|
# add NM controlled entries |
|
for connection in sorted(connections): |
|
[ zone, _interfaces ] = connections[connection] |
|
+ connection_name = self.connections_name[connection] |
|
|
|
item = Gtk.MenuItem.new() |
|
hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) |
|
label = Gtk.Label() |
|
if zone == "": |
|
label.set_markup("%s (%s)\n<small>%s: %s</small>" % \ |
|
- (connection, ",".join(_interfaces), |
|
+ (connection_name, ",".join(_interfaces), |
|
escape(_("Default Zone")), self.default_zone)) |
|
else: |
|
label.set_markup("%s (%s)\n<small>%s: %s</small>" % \ |
|
- (connection, ",".join(_interfaces), |
|
+ (connection_name, ",".join(_interfaces), |
|
escape(_("Zone")), zone)) |
|
label.set_alignment(0, 0.5) |
|
label.set_padding(12, 0) |
|
hbox.pack_start(label, True, True, 0) |
|
item.add(hbox) |
|
- item.connect("activate", self.change_zone_connection_editor, connection, zone) |
|
+ item.connect("activate", self.change_zone_connection_editor, connection, connection_name, zone) |
|
self.left_menu.append(item) |
|
|
|
if zone == "": |
|
self.bindingsStore.append( |
|
self.connectionsIter, |
|
[ "%s (%s)\n<small>%s</small>" % ( |
|
- connection, ",".join(_interfaces), |
|
+ connection_name, ",".join(_interfaces), |
|
_("Default Zone: %s") % self.default_zone), |
|
connection, zone ]) |
|
else: |
|
self.bindingsStore.append( |
|
self.connectionsIter, |
|
[ "%s (%s)\n<small>%s</small>" % ( |
|
- connection, ",".join(_interfaces), |
|
+ connection_name, ",".join(_interfaces), |
|
_("Zone: %s") % zone), |
|
connection, zone ]) |
|
|
|
@@ -2683,7 +2686,7 @@ class FirewallConfig(object): |
|
zone = self.bindingsStore.get_value(iter, 2) |
|
|
|
if self.bindingsStore.get_value(parent_iter, 0) == _("Connections"): |
|
- self.change_zone_connection_editor(None, item, zone) |
|
+ self.change_zone_connection_editor(None, item, self.connections_name[item], zone) |
|
elif self.bindingsStore.get_value(parent_iter, 0) == _("Interfaces"): |
|
self.change_zone_interface_editor(None, item, zone) |
|
elif self.bindingsStore.get_value(parent_iter, 0) == _("Sources"): |
|
@@ -3894,9 +3897,10 @@ class FirewallConfig(object): |
|
interface = self.interfaceStore.get_value(iter, 0) |
|
if interface in self.connections: |
|
connection = self.connections[interface] |
|
+ connection_name = self.connections_name[connection] |
|
if selected_zone == self.default_zone: |
|
selected_zone = nm_get_zone_of_connection(connection) |
|
- editor = ZoneConnectionEditor(self.fw, connection, selected_zone) |
|
+ editor = ZoneConnectionEditor(self.fw, connection, connection_name, selected_zone) |
|
editor.set_icon(self.icon) |
|
editor.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) |
|
editor.set_transient_for(self.mainWindow) |
|
@@ -3905,9 +3909,9 @@ class FirewallConfig(object): |
|
result = editor.run() |
|
except Exception: |
|
text = _("Failed to set zone {zone} " |
|
- "for connection {connection}") |
|
+ "for connection {connection_name}") |
|
self._warning(text.format(zone=editor.get_zone(), |
|
- connection=editor.connection)) |
|
+ connection_name=editor.connection_name)) |
|
editor.hide() |
|
else: |
|
self.add_edit_interface(False) |
|
@@ -8115,11 +8119,12 @@ class ZoneInterfaceEditor(Gtk.Dialog): |
|
self.fw.changeZoneOfInterface(self.get_zone(), self.interface) |
|
|
|
class ZoneConnectionEditor(ZoneInterfaceEditor): |
|
- def __init__(self, fw, connection, zone): |
|
+ def __init__(self, fw, connection, connection_name, zone): |
|
self.fw = fw |
|
self.connection = connection |
|
+ self.connection_name = connection_name |
|
self.zone = None |
|
- self.title = _("Select zone for connection '%s'") % self.connection |
|
+ self.title = _("Select zone for connection '%s'") % self.connection_name |
|
|
|
Gtk.Dialog.__init__(self, self.title) |
|
self.create_ui(zone) |
|
diff --git a/src/firewall/core/fw_nm.py b/src/firewall/core/fw_nm.py |
|
index 76901cee2adf..d21cc25feb8b 100644 |
|
--- a/src/firewall/core/fw_nm.py |
|
+++ b/src/firewall/core/fw_nm.py |
|
@@ -73,7 +73,7 @@ def nm_get_zone_of_connection(connection): |
|
""" |
|
check_nm_imported() |
|
|
|
- con = nm_get_client().get_connection_by_id(connection) |
|
+ con = nm_get_client().get_connection_by_uuid(connection) |
|
if con is None: |
|
return False |
|
|
|
@@ -94,7 +94,7 @@ def nm_set_zone_of_connection(zone, connection): |
|
""" |
|
check_nm_imported() |
|
|
|
- con = nm_get_client().get_connection_by_id(connection) |
|
+ con = nm_get_client().get_connection_by_uuid(connection) |
|
if con is None: |
|
return False |
|
|
|
@@ -107,14 +107,14 @@ def nm_set_zone_of_connection(zone, connection): |
|
setting_con.set_property("zone", zone) |
|
return con.commit_changes(True, None) |
|
|
|
-def nm_get_connections(connections, connections_uuid): |
|
+def nm_get_connections(connections, connections_name): |
|
"""Get active connections from NM |
|
@param connections return dict |
|
- @param connections_uuid return dict |
|
+ @param connections_name return dict |
|
""" |
|
|
|
connections.clear() |
|
- connections_uuid.clear() |
|
+ connections_name.clear() |
|
|
|
check_nm_imported() |
|
|
|
@@ -129,9 +129,9 @@ def nm_get_connections(connections, connections_uuid): |
|
uuid = active_con.get_uuid() |
|
devices = active_con.get_devices() |
|
|
|
- connections_uuid[name] = uuid |
|
+ connections_name[uuid] = name |
|
for dev in devices: |
|
- connections[dev.get_iface()] = name |
|
+ connections[dev.get_iface()] = uuid |
|
|
|
def nm_get_connection_of_interface(interface): |
|
"""Get connection from NM that is using the interface |
|
@@ -148,7 +148,7 @@ def nm_get_connection_of_interface(interface): |
|
if active_con is None: |
|
return None |
|
|
|
- return active_con.get_id() |
|
+ return active_con.get_uuid() |
|
|
|
def nm_get_bus_name(): |
|
if not _nm_imported: |
|
-- |
|
2.16.3 |
|
|
|
|