[firewalld/f18] Fixes for RHBZ#903475, RHBZ#909466, RHBZ#915985, RHBZ#947230
Jiří Popelka
jpopelka at fedoraproject.org
Wed Apr 3 10:27:09 UTC 2013
commit 3c57b18fdce8c33c5601bb502e486f896441e130
Author: Jiri Popelka <jpopelka at redhat.com>
Date: Wed Apr 3 12:22:34 2013 +0200
Fixes for RHBZ#903475, RHBZ#909466, RHBZ#915985, RHBZ#947230
firewalld-0.2.12-bz903475.patch | 57 ++++++++++++++++++++
firewalld-0.2.12-bz909466_1.patch | 94 ++++++++++++++++++++++++++++++++
firewalld-0.2.12-bz909466_2.patch | 90 +++++++++++++++++++++++++++++++
firewalld-0.2.12-bz909466_3.patch | 57 ++++++++++++++++++++
firewalld-0.2.12-bz915985.patch | 106 +++++++++++++++++++++++++++++++++++++
firewalld-0.2.12-bz947230.patch | 70 ++++++++++++++++++++++++
firewalld.spec | 26 +++++++--
7 files changed, 495 insertions(+), 5 deletions(-)
---
diff --git a/firewalld-0.2.12-bz903475.patch b/firewalld-0.2.12-bz903475.patch
new file mode 100644
index 0000000..319c527
--- /dev/null
+++ b/firewalld-0.2.12-bz903475.patch
@@ -0,0 +1,57 @@
+From e2ae60bf86335ea914574174a722f0ffdfb81e2f Mon Sep 17 00:00:00 2001
+From: Thomas Woerner <twoerner at redhat.com>
+Date: Tue, 26 Feb 2013 18:36:41 +0100
+Subject: [PATCH] Fix interaction problem of changed event of gtk combobox with
+ polkit-kde by processing all remaining events.
+
+The changed callback is signaled before the popup window has been
+destroyed and before the focus (keyboard and mouse) has been reset.
+
+This results in a deadlock in KDE and Qt, because the polkit KDE
+agent can not get the focus and the user has no chance to enter the
+desired password into the agent and is also not able to close the
+agent with the mouse. The focus is still on the combobox popup.
+
+Update: Use gdk, code by Ray Strode
+
+Revert "Fix interaction problem of changed event of gtk combobox with polkit-kde"
+
+This reverts commit f57e72ba526e3cd982c8fc072cefc9efd616b428.
+---
+ src/firewall-config | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/src/firewall-config b/src/firewall-config
+index 199f202..9f4566a 100755
+--- a/src/firewall-config
++++ b/src/firewall-config
+@@ -23,7 +23,7 @@
+ import sys
+
+ try:
+- from gi.repository import Gtk
++ from gi.repository import Gtk, Gdk
+ except RuntimeError as e:
+ print ("firewall-config: %s" % e)
+ print ("This is a graphical application and requires DISPLAY to be set.")
+@@ -810,6 +810,17 @@ class FirewallConfig(object):
+ self.fw.reload()
+
+ def onChangeView(self, *args):
++ # Fix interaction problem of changed event of gtk combobox with
++ # polkit-kde by processing all remaining events.
++ #
++ # The changed callback is signaled before the popup window has been
++ # destroyed and before the focus (keyboard and mouse) has been reset.
++ # This results in a deadlock in KDE and Qt, because the polkit KDE
++ # agent can not get the focus and the user has no chance to enter the
++ # desired password into the agent and is also not able to close the
++ # agent with the mouse. The focus is still on the combobox popup.
++ Gdk.DisplayManager.get().get_default_display().flush()
++
+ self.runtime_view = (self.currentViewCombobox.get_active_text() == \
+ _("Runtime Configuration"))
+
+--
+1.8.1.4
+
diff --git a/firewalld-0.2.12-bz909466_1.patch b/firewalld-0.2.12-bz909466_1.patch
new file mode 100644
index 0000000..9591dde
--- /dev/null
+++ b/firewalld-0.2.12-bz909466_1.patch
@@ -0,0 +1,94 @@
+From c5bff8daecfc5f386a6169a200f208ed6a96d72e Mon Sep 17 00:00:00 2001
+From: Jiri Popelka <jpopelka at redhat.com>
+Date: Wed, 13 Feb 2013 12:57:37 +0100
+Subject: [PATCH 1/3] Check also services and icmptypes in Zone(), RHBZ#909466
+
+To be able to check if services and/or icmptypes exist,
+we need to add pointer to FirewallConfig instance, so
+we can use its get_services() and get_icmptypes() methods.
+---
+ src/firewall/core/fw.py | 1 +
+ src/firewall/core/fw_config.py | 2 ++
+ src/firewall/core/io/service.py | 2 +-
+ src/firewall/core/io/zone.py | 15 +++++++++++++--
+ 4 files changed, 17 insertions(+), 3 deletions(-)
+
+diff --git a/src/firewall/core/fw.py b/src/firewall/core/fw.py
+index 39f8145..570f2d6 100644
+--- a/src/firewall/core/fw.py
++++ b/src/firewall/core/fw.py
+@@ -213,6 +213,7 @@ class Firewall:
+ self.config.add_service(copy.deepcopy(obj), default)
+ elif reader_type == "zone":
+ obj = zone_reader(filename, path)
++ obj.fw_config = self.config
+ if obj.name in self.zone.get_zones():
+ orig_obj = self.zone.get_zone(obj.name)
+ if orig_obj.immutable:
+diff --git a/src/firewall/core/fw_config.py b/src/firewall/core/fw_config.py
+index 9ec2d40..abda3ce 100644
+--- a/src/firewall/core/fw_config.py
++++ b/src/firewall/core/fw_config.py
+@@ -451,6 +451,7 @@ class FirewallConfig:
+ x.name = name
+ x.filename = "%s.xml" % name
+ x.path = ETC_FIREWALLD_ZONES
++ x.fw_config = self
+
+ zone_writer(x)
+ self.add_zone(x, False)
+@@ -491,6 +492,7 @@ class FirewallConfig:
+ # new or updated file
+
+ obj = zone_reader(filename, path)
++ obj.fw_config = self
+ obj.defaults = False
+
+ # new zone
+diff --git a/src/firewall/core/io/service.py b/src/firewall/core/io/service.py
+index 406731e..6e7f1db 100644
+--- a/src/firewall/core/io/service.py
++++ b/src/firewall/core/io/service.py
+@@ -66,7 +66,7 @@ class Service(IO_Object):
+ for port in config:
+ check_port(port[0])
+ check_protocol(port[1])
+- if item == "destination":
++ elif item == "destination":
+ for destination in config:
+ if destination not in [ "ipv4", "ipv6" ]:
+ raise FirewallError(INVALID_DESTINATION, destination)
+diff --git a/src/firewall/core/io/zone.py b/src/firewall/core/io/zone.py
+index 0f326be..b2ea63b 100644
+--- a/src/firewall/core/io/zone.py
++++ b/src/firewall/core/io/zone.py
+@@ -74,13 +74,24 @@ class Zone(IO_Object):
+ self.icmp_blocks = [ ]
+ self.masquerade = False
+ self.forward_ports = [ ]
++ self.fw_config = None # to be able to check services and a icmp_blocks
+
+ def _check_config(self, config, item):
+- if item == "ports":
++ if item == "services" and self.fw_config:
++ existing_services = self.fw_config.get_services()
++ for service in config:
++ if not service in existing_services:
++ raise FirewallError(INVALID_SERVICE, service)
++ elif item == "ports":
+ for port in config:
+ check_port(port[0])
+ check_protocol(port[1])
+- if item == "forward_ports":
++ elif item == "icmp_blocks" and self.fw_config:
++ existing_icmptypes = self.fw_config.get_icmptypes()
++ for icmptype in config:
++ if not icmptype in existing_icmptypes:
++ raise FirewallError(INVALID_ICMPTYPE, icmptype)
++ elif item == "forward_ports":
+ for fwd_port in config:
+ check_port(fwd_port[0])
+ check_protocol(fwd_port[1])
+--
+1.8.1.4
+
diff --git a/firewalld-0.2.12-bz909466_2.patch b/firewalld-0.2.12-bz909466_2.patch
new file mode 100644
index 0000000..0acf03d
--- /dev/null
+++ b/firewalld-0.2.12-bz909466_2.patch
@@ -0,0 +1,90 @@
+From 8871709124a3899d9bfb24c4b42bdf464258a6ab Mon Sep 17 00:00:00 2001
+From: Jiri Popelka <jpopelka at redhat.com>
+Date: Wed, 13 Feb 2013 15:12:09 +0100
+Subject: [PATCH 2/3] Continue loading zone in case of wrong service/port etc.
+ (RHBZ#909466)
+
+---
+ src/firewall/core/fw_zone.py | 57 ++++++++++++++++++++++----------------------
+ 1 file changed, 28 insertions(+), 29 deletions(-)
+
+diff --git a/src/firewall/core/fw_zone.py b/src/firewall/core/fw_zone.py
+index 1810f1c..6d874e5 100644
+--- a/src/firewall/core/fw_zone.py
++++ b/src/firewall/core/fw_zone.py
+@@ -54,44 +54,43 @@ class FirewallZone:
+ z = self._fw.check_zone(zone)
+ return self._zones[z]
+
++ def _error2warning(self, f, name, *args):
++ # transform errors into warnings
++ try:
++ f(name, *args)
++ except FirewallError as msg:
++ log.warning("%s: %s" % (name, msg))
++
+ def add_zone(self, obj):
+ obj.settings = { x : {} for x in [ "interfaces", "services", "ports",
+ "masquerade", "forward_ports", "icmp_blocks" ] }
+
+ self._zones[obj.name] = obj
+
+- # transform errors into warnings here, load zone in case of
+- # missing services, icmptypes etc.
+- try:
+- # apply default zone settings from config files
+- for args in obj.icmp_blocks:
+- self.add_icmp_block(obj.name, args)
+- for args in obj.forward_ports:
+- self.add_forward_port(obj.name, *args)
+- for args in obj.services:
+- self.add_service(obj.name, args)
+- for args in obj.ports:
+- self.add_port(obj.name, *args)
+- if obj.masquerade:
+- self.add_masquerade(obj.name)
+- except FirewallError as msg:
+- log.warning("%s: %s" % (obj.name, msg))
++ # load zone in case of missing services, icmptypes etc.
++ for args in obj.icmp_blocks:
++ self._error2warning(self.add_icmp_block, obj.name, args)
++ for args in obj.forward_ports:
++ self._error2warning(self.add_forward_port, obj.name, *args)
++ for args in obj.services:
++ self._error2warning(self.add_service, obj.name, args)
++ for args in obj.ports:
++ self._error2warning(self.add_port, obj.name, *args)
++ if obj.masquerade:
++ self._error2warning(self.add_masquerade, obj.name)
+
+ def remove_zone(self, zone):
+ obj = self._zones[zone]
+- try:
+- for args in obj.icmp_blocks:
+- self.remove_icmp_block(obj.name, args)
+- for args in obj.forward_ports:
+- self.remove_forward_port(obj.name, *args)
+- for args in obj.services:
+- self.remove_service(obj.name, args)
+- for args in obj.ports:
+- self.remove_port(obj.name, *args)
+- if obj.masquerade:
+- self.remove_masquerade(obj.name)
+- except FirewallError as msg:
+- log.warning("%s: %s" % (obj.name, msg))
++ for args in obj.icmp_blocks:
++ self._error2warning(self.remove_icmp_block, obj.name, args)
++ for args in obj.forward_ports:
++ self._error2warning(self.remove_forward_port, obj.name, *args)
++ for args in obj.services:
++ self._error2warning(self.remove_service, obj.name, args)
++ for args in obj.ports:
++ self._error2warning(self.remove_port, obj.name, *args)
++ if obj.masquerade:
++ self._error2warning(self.remove_masquerade, obj.name)
+
+ obj.settings.clear()
+ del self._zones[zone]
+--
+1.8.1.4
+
diff --git a/firewalld-0.2.12-bz909466_3.patch b/firewalld-0.2.12-bz909466_3.patch
new file mode 100644
index 0000000..c8a261f
--- /dev/null
+++ b/firewalld-0.2.12-bz909466_3.patch
@@ -0,0 +1,57 @@
+From e9c7c99dbea80a8630cc43918855b3a1ad4656ec Mon Sep 17 00:00:00 2001
+From: Jiri Popelka <jpopelka at redhat.com>
+Date: Thu, 14 Feb 2013 11:08:05 +0100
+Subject: [PATCH 3/3] Amend commit c5bff8d
+
+---
+ src/firewall/core/fw.py | 1 -
+ src/firewall/core/fw_config.py | 4 +++-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/firewall/core/fw.py b/src/firewall/core/fw.py
+index 570f2d6..39f8145 100644
+--- a/src/firewall/core/fw.py
++++ b/src/firewall/core/fw.py
+@@ -213,7 +213,6 @@ class Firewall:
+ self.config.add_service(copy.deepcopy(obj), default)
+ elif reader_type == "zone":
+ obj = zone_reader(filename, path)
+- obj.fw_config = self.config
+ if obj.name in self.zone.get_zones():
+ orig_obj = self.zone.get_zone(obj.name)
+ if orig_obj.immutable:
+diff --git a/src/firewall/core/fw_config.py b/src/firewall/core/fw_config.py
+index abda3ce..a0196b0 100644
+--- a/src/firewall/core/fw_config.py
++++ b/src/firewall/core/fw_config.py
+@@ -427,12 +427,14 @@ class FirewallConfig:
+ def set_zone_config(self, obj, config):
+ if obj.defaults:
+ x = copy.copy(obj)
++ x.fw_config = self
+ x.import_config(config)
+ x.path = ETC_FIREWALLD_ZONES
+ self.add_zone(x, False)
+ zone_writer(x)
+ return x
+ else:
++ obj.fw_config = self
+ obj.import_config(config)
+ zone_writer(obj)
+ return obj
+@@ -447,11 +449,11 @@ class FirewallConfig:
+
+ x = Zone()
+ x.check_name(name)
++ x.fw_config = self
+ x.import_config(config)
+ x.name = name
+ x.filename = "%s.xml" % name
+ x.path = ETC_FIREWALLD_ZONES
+- x.fw_config = self
+
+ zone_writer(x)
+ self.add_zone(x, False)
+--
+1.8.1.4
+
diff --git a/firewalld-0.2.12-bz915985.patch b/firewalld-0.2.12-bz915985.patch
new file mode 100644
index 0000000..1d4633c
--- /dev/null
+++ b/firewalld-0.2.12-bz915985.patch
@@ -0,0 +1,106 @@
+From be2be66d3d68ed1737fd43f9283cbbdf205d1f94 Mon Sep 17 00:00:00 2001
+From: Jiri Popelka <jpopelka at redhat.com>
+Date: Thu, 24 Jan 2013 17:39:47 +0100
+Subject: [PATCH] Use zone's target only in %s_ZONES chains.
+
+Previously if the zone's target was other than default
+and there were any services/ports etc. allowed, we
+were trying to add rules to TARGET_allow chain
+(i.e. ACCEPT_allow or DROP_allow), which doesn't exist.
+
+https://lists.fedorahosted.org/pipermail/firewalld-users/2013-January/000040.html
+---
+ src/firewall/core/fw_zone.py | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/src/firewall/core/fw_zone.py b/src/firewall/core/fw_zone.py
+index b13d050..1810f1c 100644
+--- a/src/firewall/core/fw_zone.py
++++ b/src/firewall/core/fw_zone.py
+@@ -117,7 +117,7 @@ class FirewallZone:
+
+ chains = [ ]
+ rules = [ ]
+- zones = [ self._zones[zone].target.format(chain=SHORTCUTS[chain],
++ zones = [ DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain],
+ zone=zone) ]
+
+ # TODO: simplify for one zone only
+@@ -379,7 +379,7 @@ class FirewallZone:
+
+ # handle rules
+ for (port,proto) in svc.ports:
+- target = self._zones[zone].target.format(
++ target = DEFAULT_ZONE_TARGET.format(
+ chain=SHORTCUTS["INPUT"], zone=zone)
+ rule = [ "%s_allow" % (target), "-t", "filter" ]
+ if proto in [ "tcp", "udp" ]:
+@@ -477,7 +477,7 @@ class FirewallZone:
+
+ rules = [ ]
+ for ipv in [ "ipv4", "ipv6" ]:
+- target = self._zones[zone].target.format(chain=SHORTCUTS["INPUT"],
++ target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"],
+ zone=zone)
+ rules.append((ipv, [ "%s_allow" % (target),
+ "-t", "filter",
+@@ -548,12 +548,12 @@ class FirewallZone:
+
+ rules = [ ]
+ for ipv in [ "ipv4" ]: # IPv4 only!
+- target = self._zones[zone].target.format(
++ target = DEFAULT_ZONE_TARGET.format(
+ chain=SHORTCUTS["POSTROUTING"], zone=zone)
+ rules.append((ipv, [ "%s_allow" % (target),
+ "-t", "nat", "-j", "MASQUERADE" ]))
+ # FORWARD_OUT
+- target = self._zones[zone].target.format(
++ target = DEFAULT_ZONE_TARGET.format(
+ chain=SHORTCUTS["FORWARD_OUT"], zone=zone)
+ rules.append((ipv, [ "%s_allow" % (target),
+ "-t", "filter", "-j", "ACCEPT" ]))
+@@ -650,7 +650,7 @@ class FirewallZone:
+
+ rules = [ ]
+ for ipv in [ "ipv4" ]: # IPv4 only!
+- target = self._zones[zone].target.format(
++ target = DEFAULT_ZONE_TARGET.format(
+ chain=SHORTCUTS["PREROUTING"], zone=zone)
+ rules.append((ipv, [ "%s_allow" % (target),
+ "-t", "mangle",
+@@ -664,7 +664,7 @@ class FirewallZone:
+
+ if not toaddr:
+ # local only
+- target = self._zones[zone].target.format(
++ target = DEFAULT_ZONE_TARGET.format(
+ chain=SHORTCUTS["INPUT"], zone=zone)
+ rules.append((ipv, [ "%s_allow" % (target),
+ "-t", "filter",
+@@ -672,7 +672,7 @@ class FirewallZone:
+ mark + [ "-j", "ACCEPT" ]))
+ else:
+ # FORWARD_IN
+- target = self._zones[zone].target.format(
++ target = DEFAULT_ZONE_TARGET.format(
+ chain=SHORTCUTS["FORWARD_IN"], zone=zone)
+ rules.append((ipv, [ "%s_allow" % (target),
+ "-t", "filter",
+@@ -774,12 +774,12 @@ class FirewallZone:
+ proto = [ "-p", "ipv6-icmp" ]
+ match = [ "-m", "icmp6", "--icmpv6-type", icmp ]
+
+- target = self._zones[zone].target.format(chain=SHORTCUTS["INPUT"],
++ target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"],
+ zone=zone)
+ rules.append((ipv, [ "%s_deny" % (target),
+ "-t", "filter", ] + proto + \
+ match + [ "-j", "%%REJECT%%" ]))
+- target = self._zones[zone].target.format(
++ target = DEFAULT_ZONE_TARGET.format(
+ chain=SHORTCUTS["FORWARD_IN"], zone=zone)
+ rules.append((ipv, [ "%s_deny" % (target),
+ "-t", "filter", ] + proto + \
+--
+1.8.1.4
+
diff --git a/firewalld-0.2.12-bz947230.patch b/firewalld-0.2.12-bz947230.patch
new file mode 100644
index 0000000..fdb1f48
--- /dev/null
+++ b/firewalld-0.2.12-bz947230.patch
@@ -0,0 +1,70 @@
+From bbc6e18ba0c0c1da16019813ce8c0326adc2cf06 Mon Sep 17 00:00:00 2001
+From: Jiri Popelka <jpopelka at redhat.com>
+Date: Tue, 2 Apr 2013 16:13:26 +0200
+Subject: [PATCH] firewall-applet: fix default zone hangling in 'shields-up'
+ (RHBZ#947230)
+
+default_zone_changed(): check/uncheck shields-up if something else
+ changes default zone
+shieldsup_check_toggled(): do not change default zone if already changed
+connection_established(): do not call getDefaultZone() twice
+---
+ src/firewall-applet | 20 +++++++++++++++++---
+ 1 file changed, 17 insertions(+), 3 deletions(-)
+
+diff --git a/src/firewall-applet b/src/firewall-applet
+index c547244..589af7a 100755
+--- a/src/firewall-applet
++++ b/src/firewall-applet
+@@ -42,6 +42,7 @@ from firewall.config import *
+ from firewall.config.dbus import *
+ from firewall.client import FirewallClient
+ from firewall.dbus_utils import dbus_to_python
++from firewall.errors import *
+ import dbus
+
+
+@@ -370,9 +371,15 @@ class TrayApplet(object):
+
+ def shieldsup_check_toggled(self, button):
+ if button.get_active():
+- self.fw.setDefaultZone(self.settings.get_string("shields-up"))
++ zone = self.settings.get_string("shields-up")
+ else:
+- self.fw.setDefaultZone(self.settings.get_string("shields-down"))
++ zone = self.settings.get_string("shields-down")
++
++ if self.fw.connected and self.fw.getDefaultZone() != zone:
++ try:
++ self.fw.setDefaultZone(zone)
++ except dbus.DBusException as e:
++ print("Error: %s" % e.message)
+
+ def notification_check_toggled(self, button, settings, key):
+ settings.set_boolean(key, button.get_active())
+@@ -519,7 +526,7 @@ class TrayApplet(object):
+ self.settings.reset("shields-down")
+
+ self.shieldsup_check.handler_block(self.shieldsup_check_id)
+- if self.fw.getDefaultZone() == self.settings.get_string("shields-up"):
++ if self.default_zone == self.settings.get_string("shields-up"):
+ self.shieldsup_check.set_active(True)
+ else:
+ self.shieldsup_check.set_active(False)
+@@ -704,6 +711,13 @@ class TrayApplet(object):
+ self.update_active_zones()
+ self.update_tooltip()
+
++ # in case something else changes default zone
++ if self.default_zone == self.settings.get_string("shields-up"):
++ self.shieldsup_check.set_active(True)
++ else:
++ self.shieldsup_check.set_active(False)
++
++
+ def _panic_mode(self, enable):
+ self.panic_check.handler_block(self.panic_check_id)
+ self.panic_check.set_active(enable)
+--
+1.8.1.4
+
diff --git a/firewalld.spec b/firewalld.spec
index 4b6bff5..47b773a 100644
--- a/firewalld.spec
+++ b/firewalld.spec
@@ -1,7 +1,7 @@
Summary: A firewall daemon with D-BUS interface providing a dynamic firewall
Name: firewalld
Version: 0.2.12
-Release: 4%{?dist}
+Release: 5%{?dist}
URL: http://fedorahosted.org/firewalld
License: GPLv2+
ExclusiveOS: Linux
@@ -11,10 +11,17 @@ Source0: https://fedorahosted.org/released/firewalld/%{name}-%{version}.tar.bz2
%if 0%{?fedora} > 17
Patch0: firewalld-0.2.6-MDNS-default.patch
%endif
-Patch1: firewalld-0.2.12-conf.patch
-Patch2: firewalld-0.2.12-gtk.patch
-Patch3: firewalld-0.2.12-bz912782.patch
-Patch4: firewalld-0.2.12-bz912782_2.patch
+Patch1: firewalld-0.2.12-conf.patch
+Patch2: firewalld-0.2.12-gtk.patch
+Patch3: firewalld-0.2.12-bz912782.patch
+Patch4: firewalld-0.2.12-bz912782_2.patch
+Patch5: firewalld-0.2.12-bz903475.patch
+Patch6: firewalld-0.2.12-bz909466_1.patch
+Patch7: firewalld-0.2.12-bz909466_2.patch
+Patch8: firewalld-0.2.12-bz909466_3.patch
+Patch9: firewalld-0.2.12-bz915985.patch
+Patch10: firewalld-0.2.12-bz947230.patch
+
BuildRequires: desktop-file-utils
BuildRequires: gettext
BuildRequires: intltool
@@ -84,6 +91,12 @@ firewalld.
%patch2 -p1
%patch3 -p1
%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
%build
%configure --with-systemd-unitdir=%{_unitdir}
@@ -200,6 +213,9 @@ fi
%{_datadir}/icons/hicolor/*/apps/firewall-config*.*
%changelog
+* Wed Apr 03 2013 Jiri Popelka <jpopelka at redhat.com> - 0.2.12-5
+- Fixes for RHBZ#903475, RHBZ#909466, RHBZ#915985, RHBZ#947230
+
* Thu Mar 07 2013 Jiri Popelka <jpopelka at redhat.com> - 0.2.12-4
- Another fix for RHBZ#912782
More information about the scm-commits
mailing list