Blame src/firewall-applet

Packit Service 84cb3c
#!/bin/python
Packit Service 84cb3c
# -*- coding: utf-8 -*-
Packit Service 84cb3c
#
Packit Service 84cb3c
# Copyright (C) 2010-2015 Red Hat, Inc.
Packit Service 84cb3c
#
Packit Service 84cb3c
# Authors:
Packit Service 84cb3c
# Thomas Woerner <twoerner@redhat.com>
Packit Service 84cb3c
#
Packit Service 84cb3c
# This program is free software; you can redistribute it and/or modify
Packit Service 84cb3c
# it under the terms of the GNU General Public License as published by
Packit Service 84cb3c
# the Free Software Foundation; either version 2 of the License, or
Packit Service 84cb3c
# (at your option) any later version.
Packit Service 84cb3c
#
Packit Service 84cb3c
# This program is distributed in the hope that it will be useful,
Packit Service 84cb3c
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 84cb3c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 84cb3c
# GNU General Public License for more details.
Packit Service 84cb3c
#
Packit Service 84cb3c
# You should have received a copy of the GNU General Public License
Packit Service 84cb3c
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 84cb3c
#
Packit Service 84cb3c
Packit Service 84cb3c
import sys
Packit Service 84cb3c
from PyQt5 import QtGui, QtCore, QtWidgets
Packit Service 84cb3c
Packit Service 84cb3c
import gi
Packit Service 84cb3c
gi.require_version('Notify', '0.7')
Packit Service 84cb3c
from gi.repository import Notify
Packit Service 84cb3c
Packit Service 84cb3c
import os
Packit Service 84cb3c
from dbus.mainloop.pyqt5 import DBusQtMainLoop
Packit Service 84cb3c
import functools
Packit Service 84cb3c
Packit Service 84cb3c
from firewall import config
Packit Service 84cb3c
from firewall.core.fw_nm import nm_is_imported, nm_get_zone_of_connection, \
Packit Service 84cb3c
                                nm_set_zone_of_connection, \
Packit Service 84cb3c
                                nm_get_dbus_interface, \
Packit Service 84cb3c
                                nm_get_connections
Packit Service 84cb3c
from firewall.core.watcher import Watcher
Packit Service 84cb3c
from firewall.client import FirewallClient
Packit Service 84cb3c
import slip.dbus
Packit Service 84cb3c
import dbus
Packit Service 84cb3c
import signal
Packit Service 84cb3c
Packit Service 84cb3c
import gettext
Packit Service 84cb3c
gettext.textdomain(config.DOMAIN)
Packit Service 84cb3c
_ = gettext.gettext
Packit Service 84cb3c
Packit Service 84cb3c
PATH = [ ]
Packit Service 84cb3c
for p in os.getenv("PATH").split(":"):
Packit Service 84cb3c
    if p not in PATH:
Packit Service 84cb3c
        PATH.append(p)
Packit Service 84cb3c
Packit Service 84cb3c
def search_app(app):
Packit Service 84cb3c
    for p in PATH:
Packit Service 84cb3c
        _app = "%s/%s" % (p, app)
Packit Service 84cb3c
        if os.path.exists(_app):
Packit Service 84cb3c
            return _app
Packit Service 84cb3c
    return None
Packit Service 84cb3c
Packit Service 84cb3c
NM_CONNECTION_EDITOR = ""
Packit Service 84cb3c
for binary in [ "/usr/bin/nm-connection-editor",
Packit Service 84cb3c
                    "/bin/nm-connection-editor",
Packit Service 84cb3c
                "/usr/bin/kde5-nm-connection-editor",
Packit Service 84cb3c
                    "/bin/kde5-nm-connection-editor",
Packit Service 84cb3c
                "/usr/bin/kde-nm-connection-editor",
Packit Service 84cb3c
                    "/bin/kde-nm-connection-editor" ]:
Packit Service 84cb3c
    if os.path.exists(binary):
Packit Service 84cb3c
        NM_CONNECTION_EDITOR = binary
Packit Service 84cb3c
        break
Packit Service 84cb3c
Packit Service 84cb3c
PY2 = sys.version < '3'
Packit Service 84cb3c
Packit Service 84cb3c
def escape(text):
Packit Service 84cb3c
    text = text.replace('&', '&')
Packit Service 84cb3c
    text = text.replace('>', '>')
Packit Service 84cb3c
    text = text.replace('<', '<')
Packit Service 84cb3c
    return text
Packit Service 84cb3c
Packit Service 84cb3c
def fromUTF8(text):
Packit Service 84cb3c
    if PY2 and QtCore.QT_VERSION < 0x050000:
Packit Service 84cb3c
        return QtCore.QString.fromUtf8(text)
Packit Service 84cb3c
    return text
Packit Service 84cb3c
Packit Service 84cb3c
# ZoneInterfaceEditor #########################################################
Packit Service 84cb3c
Packit Service 84cb3c
class ZoneInterfaceEditor(QtWidgets.QDialog):
Packit Service 84cb3c
    def __init__(self, fw, interface, zone):
Packit Service 84cb3c
        self.fw = fw
Packit Service 84cb3c
        self.interface = interface
Packit Service 84cb3c
        self.zone = None
Packit Service 84cb3c
        self.title = _("Select zone for interface '%s'") % self.interface
Packit Service 84cb3c
Packit Service 84cb3c
        QtWidgets.QDialog.__init__(self)
Packit Service 84cb3c
        self.create_ui(zone)
Packit Service 84cb3c
Packit Service 84cb3c
    def create_ui(self, zone):
Packit Service 84cb3c
        self.setWindowTitle(fromUTF8(escape(self.title)))
Packit Service 84cb3c
        self.rejected.connect(self.hide)
Packit Service 84cb3c
Packit Service 84cb3c
        self.resize(100, 50)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox = QtWidgets.QVBoxLayout()
Packit Service 84cb3c
        vbox.setSpacing(6)
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel(fromUTF8(escape(self.title)))
Packit Service 84cb3c
        vbox.addWidget(label)
Packit Service 84cb3c
Packit Service 84cb3c
        self.combo = QtWidgets.QComboBox()
Packit Service 84cb3c
        self.fill_zone_combo()
Packit Service 84cb3c
        vbox.addWidget(self.combo)
Packit Service 84cb3c
Packit Service 84cb3c
        buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok
Packit Service 84cb3c
                                           | QtWidgets.QDialogButtonBox.Cancel)
Packit Service 84cb3c
        self.ok_button = buttonBox.button(QtWidgets.QDialogButtonBox.Ok)
Packit Service 84cb3c
        buttonBox.accepted.connect(self.ok)
Packit Service 84cb3c
        buttonBox.rejected.connect(self.hide)
Packit Service 84cb3c
        vbox.addWidget(buttonBox)
Packit Service 84cb3c
        self.ok_button.setDisabled(True)
Packit Service 84cb3c
Packit Service 84cb3c
        self.combo.activated.connect(self.combo_changed)
Packit Service 84cb3c
        self.setLayout(vbox)
Packit Service 84cb3c
        self.set_zone(zone)
Packit Service 84cb3c
Packit Service 84cb3c
    def combo_changed(self):
Packit Service 84cb3c
        self.ok_button.setDisabled(self.get_zone() == self.zone)
Packit Service 84cb3c
Packit Service 84cb3c
    def set_zone(self, zone):
Packit Service 84cb3c
        self.zone = zone
Packit Service 84cb3c
        if zone == "":
Packit Service 84cb3c
            self.combo.setCurrentIndex(self.combo.findText(
Packit Service 84cb3c
                escape(_("Default Zone"))))
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.combo.setCurrentIndex(self.combo.findText(self.zone))
Packit Service 84cb3c
        self.combo_changed()
Packit Service 84cb3c
Packit Service 84cb3c
    def get_zone(self):
Packit Service 84cb3c
        text = str(self.combo.currentText())
Packit Service 84cb3c
        if text == escape(_("Default Zone")):
Packit Service 84cb3c
            text = ""
Packit Service 84cb3c
        return text
Packit Service 84cb3c
Packit Service 84cb3c
    def fill_zone_combo(self):
Packit Service 84cb3c
        self.combo.clear()
Packit Service 84cb3c
        self.combo.addItem(fromUTF8(escape(_("Default Zone"))))
Packit Service 84cb3c
        for z in self.fw.getZones():
Packit Service 84cb3c
            self.combo.addItem(z)
Packit Service 84cb3c
Packit Service 84cb3c
    def zones_changed(self):
Packit Service 84cb3c
        zone = self.get_zone()
Packit Service 84cb3c
        self.fill_zone_combo()
Packit Service 84cb3c
        self.set_zone(zone)
Packit Service 84cb3c
Packit Service 84cb3c
    def ok(self):
Packit Service 84cb3c
        self.fw.changeZoneOfInterface(self.get_zone(), self.interface)
Packit Service 84cb3c
        self.hide()
Packit Service 84cb3c
Packit Service 84cb3c
# ZoneConnectionEditor ########################################################
Packit Service 84cb3c
Packit Service 84cb3c
class ZoneConnectionEditor(ZoneInterfaceEditor):
Packit Service 84cb3c
    def __init__(self, fw, connection, connection_name, zone):
Packit Service 84cb3c
        self.fw = fw
Packit Service 84cb3c
        self.connection = connection
Packit Service 84cb3c
        self.connection_name = connection_name
Packit Service 84cb3c
        self.zone = None
Packit Service 84cb3c
        self.title = _("Select zone for connection '%s'") % self.connection_name
Packit Service 84cb3c
Packit Service 84cb3c
        QtWidgets.QDialog.__init__(self)
Packit Service 84cb3c
        self.create_ui(zone)
Packit Service 84cb3c
Packit Service 84cb3c
    def ok(self):
Packit Service 84cb3c
        # apply changes
Packit Service 84cb3c
        try:
Packit Service 84cb3c
            nm_set_zone_of_connection(self.get_zone(), self.connection)
Packit Service 84cb3c
        except Exception:
Packit Service 84cb3c
            text = _("Failed to set zone {zone} for connection {connection_name}")
Packit Service 84cb3c
            QtWidgets.QMessageBox.warning(None, fromUTF8(escape(self.title)),
Packit Service 84cb3c
                                      escape(text.format(
Packit Service 84cb3c
                                          zone=self.get_zone(),
Packit Service 84cb3c
                                          connection_name=self.connection_name)))
Packit Service 84cb3c
        self.hide()
Packit Service 84cb3c
Packit Service 84cb3c
# ZoneSourceEditor ############################################################
Packit Service 84cb3c
Packit Service 84cb3c
class ZoneSourceEditor(ZoneInterfaceEditor):
Packit Service 84cb3c
    def __init__(self, fw, source, zone):
Packit Service 84cb3c
        self.fw = fw
Packit Service 84cb3c
        self.source = source
Packit Service 84cb3c
        self.zone = None
Packit Service 84cb3c
        self.title = _("Select zone for source '%s'") % self.source
Packit Service 84cb3c
Packit Service 84cb3c
        QtWidgets.QDialog.__init__(self)
Packit Service 84cb3c
        self.create_ui(zone)
Packit Service 84cb3c
Packit Service 84cb3c
    def ok(self):
Packit Service 84cb3c
        self.fw.changeZoneOfSource(self.get_zone(), self.source)
Packit Service 84cb3c
        self.hide()
Packit Service 84cb3c
Packit Service 84cb3c
# ShieldsEditor #########################################################
Packit Service 84cb3c
Packit Service 84cb3c
class ShieldsEditor(QtWidgets.QDialog):
Packit Service 84cb3c
    def __init__(self, fw, settings, shields_up, shields_down):
Packit Service 84cb3c
        self.fw = fw
Packit Service 84cb3c
        self.settings = settings
Packit Service 84cb3c
        self.shields_up = shields_up
Packit Service 84cb3c
        self.shields_down = shields_down
Packit Service 84cb3c
        self.title = _("Configure Shields Up/Down Zones")
Packit Service 84cb3c
Packit Service 84cb3c
        QtWidgets.QDialog.__init__(self)
Packit Service 84cb3c
        self.create_ui()
Packit Service 84cb3c
Packit Service 84cb3c
    def create_ui(self):
Packit Service 84cb3c
        self.setWindowTitle(fromUTF8(escape(self.title)))
Packit Service 84cb3c
        self.rejected.connect(self.hide)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox = QtWidgets.QVBoxLayout()
Packit Service 84cb3c
        vbox.setSpacing(6)
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel(fromUTF8(escape(
Packit Service 84cb3c
            _("Here you can select the zones used for Shields Up and "
Packit Service 84cb3c
              "Shields Down."))))
Packit Service 84cb3c
        label.setWordWrap(True)
Packit Service 84cb3c
        vbox.addWidget(label)
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel(fromUTF8(escape(
Packit Service 84cb3c
            _("This feature is useful for people using the default zones "
Packit Service 84cb3c
              "mostly. For users, that are changing zones of connections, it "
Packit Service 84cb3c
              "might be of limited use."))))
Packit Service 84cb3c
        label.setWordWrap(True)
Packit Service 84cb3c
        vbox.addWidget(label)
Packit Service 84cb3c
Packit Service 84cb3c
        grid = QtWidgets.QGridLayout()
Packit Service 84cb3c
        grid.setSpacing(6)
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel(fromUTF8(escape(_("Shields Up Zone:"))))
Packit Service 84cb3c
        label.setWordWrap(True)
Packit Service 84cb3c
        grid.addWidget(label, 0, 0, 1, 1)
Packit Service 84cb3c
Packit Service 84cb3c
        self.shields_up_combo = QtWidgets.QComboBox()
Packit Service 84cb3c
        #self.fill_combo(self.shields_up_combo)
Packit Service 84cb3c
        #self.set_shields_up(self.shields_up)
Packit Service 84cb3c
        grid.addWidget(self.shields_up_combo, 0, 1, 1, 1)
Packit Service 84cb3c
Packit Service 84cb3c
        button = QtWidgets.QPushButton(_("Reset To Default"))
Packit Service 84cb3c
        button.clicked.connect(self.reset_shields_up)
Packit Service 84cb3c
        grid.addWidget(button, 0, 2, 1, 1)
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel(fromUTF8(escape(_("Shields Down Zone:"))))
Packit Service 84cb3c
        label.setWordWrap(True)
Packit Service 84cb3c
        grid.addWidget(label, 1, 0, 1, 1)
Packit Service 84cb3c
Packit Service 84cb3c
        self.shields_down_combo = QtWidgets.QComboBox()
Packit Service 84cb3c
        #self.fill_combo(self.shields_down_combo)
Packit Service 84cb3c
        #self.set_shields_down(self.shields_down)
Packit Service 84cb3c
        grid.addWidget(self.shields_down_combo, 1, 1, 1, 1)
Packit Service 84cb3c
Packit Service 84cb3c
        button = QtWidgets.QPushButton(_("Reset To Default"))
Packit Service 84cb3c
        button.clicked.connect(self.reset_shields_down)
Packit Service 84cb3c
        grid.addWidget(button, 1, 2, 1, 1)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox.addLayout(grid)
Packit Service 84cb3c
Packit Service 84cb3c
        buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok
Packit Service 84cb3c
                                           | QtWidgets.QDialogButtonBox.Cancel)
Packit Service 84cb3c
        self.ok_button = buttonBox.button(QtWidgets.QDialogButtonBox.Ok)
Packit Service 84cb3c
        buttonBox.accepted.connect(self.ok)
Packit Service 84cb3c
        buttonBox.rejected.connect(self.hide)
Packit Service 84cb3c
        vbox.addWidget(buttonBox)
Packit Service 84cb3c
        self.ok_button.setDisabled(True)
Packit Service 84cb3c
Packit Service 84cb3c
        self.shields_up_combo.activated.connect(self.shields_combo_changed)
Packit Service 84cb3c
        self.shields_down_combo.activated.connect(self.shields_combo_changed)
Packit Service 84cb3c
Packit Service 84cb3c
        self.setLayout(vbox)
Packit Service 84cb3c
Packit Service 84cb3c
    def shields_combo_changed(self):
Packit Service 84cb3c
        self.ok_button.setDisabled(
Packit Service 84cb3c
            self.get_shields_up() == self.shields_up and \
Packit Service 84cb3c
            self.get_shields_down() == self.shields_down)
Packit Service 84cb3c
Packit Service 84cb3c
    def set_shields_up(self, zone):
Packit Service 84cb3c
        self.shields_up = zone
Packit Service 84cb3c
        if self.shields_up_combo.count() > 0:
Packit Service 84cb3c
            self.shields_up_combo.setCurrentIndex(
Packit Service 84cb3c
                self.shields_up_combo.findText(self.shields_up))
Packit Service 84cb3c
        self.shields_combo_changed()
Packit Service 84cb3c
Packit Service 84cb3c
    def set_shields_down(self, zone):
Packit Service 84cb3c
        self.shields_down = zone
Packit Service 84cb3c
        if self.shields_down_combo.count() > 0:
Packit Service 84cb3c
            self.shields_down_combo.setCurrentIndex(
Packit Service 84cb3c
                self.shields_down_combo.findText(self.shields_down))
Packit Service 84cb3c
        self.shields_combo_changed()
Packit Service 84cb3c
Packit Service 84cb3c
    def reset_shields_up(self):
Packit Service 84cb3c
        self.set_shields_up(self.shields_up)
Packit Service 84cb3c
        # remove user key to get fallback again
Packit Service 84cb3c
        self.settings.remove("shields-up")
Packit Service 84cb3c
Packit Service 84cb3c
    def reset_shields_down(self):
Packit Service 84cb3c
        self.set_shields_down(self.shields_down)
Packit Service 84cb3c
        # remove user key to get fallback again
Packit Service 84cb3c
        self.settings.remove("shields-down")
Packit Service 84cb3c
Packit Service 84cb3c
    def get_shields_up(self):
Packit Service 84cb3c
        return str(self.shields_up_combo.currentText())
Packit Service 84cb3c
Packit Service 84cb3c
    def get_shields_down(self):
Packit Service 84cb3c
        return str(self.shields_down_combo.currentText())
Packit Service 84cb3c
Packit Service 84cb3c
    def zones_changed(self):
Packit Service 84cb3c
        up_zone = self.shields_up
Packit Service 84cb3c
        if self.get_shields_up():
Packit Service 84cb3c
            up_zone = self.get_shields_up()
Packit Service 84cb3c
        down_zone = self.shields_down
Packit Service 84cb3c
        if self.get_shields_down():
Packit Service 84cb3c
            down_zone = self.get_shields_down()
Packit Service 84cb3c
Packit Service 84cb3c
        for z in self.fw.getZones():
Packit Service 84cb3c
            self.shields_up_combo.addItem(z)
Packit Service 84cb3c
            self.shields_down_combo.addItem(z)
Packit Service 84cb3c
Packit Service 84cb3c
        self.set_shields_up(up_zone)
Packit Service 84cb3c
        self.set_shields_down(down_zone)
Packit Service 84cb3c
Packit Service 84cb3c
    def ok(self):
Packit Service 84cb3c
        if self.shields_up != self.get_shields_up():
Packit Service 84cb3c
            self.settings.setValue("shields-up", self.get_shields_up())
Packit Service 84cb3c
        if self.shields_down != self.get_shields_down():
Packit Service 84cb3c
            self.settings.setValue("shields-down", self.get_shields_down())
Packit Service 84cb3c
        self.settings.sync()
Packit Service 84cb3c
        self.hide()
Packit Service 84cb3c
Packit Service 84cb3c
# AboutDialog #################################################################
Packit Service 84cb3c
Packit Service 84cb3c
class AboutDialog(QtWidgets.QDialog):
Packit Service 84cb3c
    def __init__(self, name, icon, version, url, copyright, authors, license):
Packit Service 84cb3c
        QtWidgets.QDialog.__init__(self)
Packit Service 84cb3c
        self.setWindowIcon(icon)
Packit Service 84cb3c
        self.setWindowTitle(fromUTF8(escape(_("About %s" % name))))
Packit Service 84cb3c
        self.resize(500, 250)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox = QtWidgets.QVBoxLayout()
Packit Service 84cb3c
        vbox.setSpacing(6)
Packit Service 84cb3c
Packit Service 84cb3c
        hbox = QtWidgets.QHBoxLayout()
Packit Service 84cb3c
        hbox.setSpacing(24)
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel()
Packit Service 84cb3c
        label.setPixmap(icon.pixmap(96))
Packit Service 84cb3c
        label.setMinimumSize(96, 96)
Packit Service 84cb3c
        label.setMaximumSize(96, 96)
Packit Service 84cb3c
        hbox.addWidget(label)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox2 = QtWidgets.QVBoxLayout()
Packit Service 84cb3c
        vbox2.setSpacing(3)
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel(name)
Packit Service 84cb3c
        font = label.font()
Packit Service 84cb3c
        font.setPointSize(font.pointSize()*2)
Packit Service 84cb3c
        font.setBold(True)
Packit Service 84cb3c
        label.setFont(font)
Packit Service 84cb3c
        vbox2.addWidget(label)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox2.addWidget(QtWidgets.QLabel(version))
Packit Service 84cb3c
Packit Service 84cb3c
        label = QtWidgets.QLabel("%s" % (url, url))
Packit Service 84cb3c
        label.setTextFormat(QtCore.Qt.RichText)
Packit Service 84cb3c
        label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
Packit Service 84cb3c
        label.setOpenExternalLinks(True)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox2.addWidget(label)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox2.addWidget(QtWidgets.QLabel(copyright))
Packit Service 84cb3c
Packit Service 84cb3c
        hbox.addLayout(vbox2)
Packit Service 84cb3c
Packit Service 84cb3c
        vbox.addLayout(hbox)
Packit Service 84cb3c
Packit Service 84cb3c
        tabs = QtWidgets.QTabWidget()
Packit Service 84cb3c
        tabs.setStyleSheet("QTabWidget::tab { padding: 1px 1px 1px 1px; }")
Packit Service 84cb3c
Packit Service 84cb3c
        tab = QtWidgets.QWidget()
Packit Service 84cb3c
        vbox3 = QtWidgets.QVBoxLayout()
Packit Service 84cb3c
        textedit = QtWidgets.QPlainTextEdit()
Packit Service 84cb3c
        #textedit.setStyleSheet("QPlainTextEdit { border: 0; padding: 0; }")
Packit Service 84cb3c
        textedit.setReadOnly(True)
Packit Service 84cb3c
        textedit.setPlainText(fromUTF8("\n".join(authors)))
Packit Service 84cb3c
        vbox3.addWidget(textedit)
Packit Service 84cb3c
        tab.setLayout(vbox3)
Packit Service 84cb3c
        tabs.addTab(tab, fromUTF8(escape(_("Authors"))))
Packit Service 84cb3c
Packit Service 84cb3c
        tab = QtWidgets.QWidget()
Packit Service 84cb3c
        vbox3 = QtWidgets.QVBoxLayout()
Packit Service 84cb3c
        textedit = QtWidgets.QPlainTextEdit()
Packit Service 84cb3c
        #textedit.setStyleSheet("QPlainTextEdit { border: 0; padding: 0; }")
Packit Service 84cb3c
        textedit.setReadOnly(True)
Packit Service 84cb3c
        textedit.setPlainText(license)
Packit Service 84cb3c
        vbox3.addWidget(textedit)
Packit Service 84cb3c
        tab.setLayout(vbox3)
Packit Service 84cb3c
        tabs.addTab(tab, fromUTF8(escape(_("License"))))
Packit Service 84cb3c
Packit Service 84cb3c
        vbox.addWidget(tabs)
Packit Service 84cb3c
Packit Service 84cb3c
        buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Close)
Packit Service 84cb3c
        buttonBox.rejected.connect(self.hide)
Packit Service 84cb3c
        vbox.addWidget(buttonBox)
Packit Service 84cb3c
Packit Service 84cb3c
        self.setLayout(vbox)
Packit Service 84cb3c
Packit Service 84cb3c
# TrayApplet ##################################################################
Packit Service 84cb3c
Packit Service 84cb3c
class TrayApplet(QtWidgets.QSystemTrayIcon):
Packit Service 84cb3c
    def __init__(self):
Packit Service 84cb3c
        super(TrayApplet, self).__init__()
Packit Service 84cb3c
        self.name = _("Firewall Applet")
Packit Service 84cb3c
        self.prog = "firewall-applet"
Packit Service 84cb3c
        self.icon_name = "firewall-applet"
Packit Service 84cb3c
        self.icons = {
Packit Service 84cb3c
            "normal": QtGui.QIcon.fromTheme(self.icon_name),
Packit Service 84cb3c
            "error": QtGui.QIcon.fromTheme(self.icon_name+"-error"),
Packit Service 84cb3c
            "panic": QtGui.QIcon.fromTheme(self.icon_name+"-panic"),
Packit Service 84cb3c
            "normal-shields_up": QtGui.QIcon.fromTheme(self.icon_name+"-shields_up"),
Packit Service 84cb3c
            "normal-shields_down": QtGui.QIcon.fromTheme(self.icon_name+"-shields_down"),
Packit Service 84cb3c
        }
Packit Service 84cb3c
        self.timer = None
Packit Service 84cb3c
        self.mode = None
Packit Service 84cb3c
        self.blink = False
Packit Service 84cb3c
        self.blink_count = 0
Packit Service 84cb3c
        self._blink = False
Packit Service 84cb3c
        self._blink_count = 0
Packit Service 84cb3c
        self.show_inactive = False
Packit Service 84cb3c
        self.tooltip_messages = [ ]
Packit Service 84cb3c
Packit Service 84cb3c
        self.active_zones = { }
Packit Service 84cb3c
        self.connections = { }
Packit Service 84cb3c
        self.connections_name = { }
Packit Service 84cb3c
        self.default_zone = None
Packit Service 84cb3c
        self.zone_connection_editors = { }
Packit Service 84cb3c
        self.zone_interface_editors = { }
Packit Service 84cb3c
        self.zone_source_editors = { }
Packit Service 84cb3c
Packit Service 84cb3c
        # settings
Packit Service 84cb3c
Packit Service 84cb3c
        self.settings = QtCore.QSettings("firewall", "applet")
Packit Service 84cb3c
Packit Service 84cb3c
        # file system watcher
Packit Service 84cb3c
Packit Service 84cb3c
        self.watcher = Watcher(self.load_settings, 2)
Packit Service 84cb3c
        self.watcher.add_watch_file("/etc/firewall/applet.conf")
Packit Service 84cb3c
        self.watcher.add_watch_file(str(self.settings.fileName()))
Packit Service 84cb3c
Packit Service 84cb3c
        # about dialog
Packit Service 84cb3c
Packit Service 84cb3c
        self.about_dialog = AboutDialog(self.name,
Packit Service 84cb3c
                                        self.icons["normal"],
Packit Service 84cb3c
                                        config.VERSION, config.WEBSITE,
Packit Service 84cb3c
                                        config.COPYRIGHT, config.AUTHORS,
Packit Service 84cb3c
                                        config.LICENSE)
Packit Service 84cb3c
Packit Service 84cb3c
        # urgencies
Packit Service 84cb3c
Packit Service 84cb3c
        self.urgencies = { "noicon": QtWidgets.QSystemTrayIcon.NoIcon,
Packit Service 84cb3c
                           "information": QtWidgets.QSystemTrayIcon.Information,
Packit Service 84cb3c
                           "warning": QtWidgets.QSystemTrayIcon.Warning,
Packit Service 84cb3c
                           "critical": QtWidgets.QSystemTrayIcon.Critical }
Packit Service 84cb3c
Packit Service 84cb3c
        # actions
Packit Service 84cb3c
Packit Service 84cb3c
        self.shieldsupAction = QtWidgets.QAction(fromUTF8(escape(_("Shields Up"))),
Packit Service 84cb3c
                                             self)
Packit Service 84cb3c
        self.shieldsupAction.setCheckable(True)
Packit Service 84cb3c
        self.shieldsupAction.setChecked(False)
Packit Service 84cb3c
        self.shieldsupAction.triggered.connect(self.shieldsup_changed_cb)
Packit Service 84cb3c
Packit Service 84cb3c
        self.notificationsAction = QtWidgets.QAction(
Packit Service 84cb3c
            fromUTF8(escape(_("Enable Notifications"))), self)
Packit Service 84cb3c
        self.notificationsAction.setCheckable(True)
Packit Service 84cb3c
        self.notificationsAction.setChecked(False)
Packit Service 84cb3c
        self.notificationsAction.triggered.connect(self.notification_changed_cb)
Packit Service 84cb3c
Packit Service 84cb3c
        self.settingsAction = QtWidgets.QAction(
Packit Service 84cb3c
            fromUTF8(escape(_("Edit Firewall Settings..."))), self)
Packit Service 84cb3c
        self.settingsAction.triggered.connect(self.configure_cb)
Packit Service 84cb3c
Packit Service 84cb3c
        self.changeZonesAction = QtWidgets.QAction(
Packit Service 84cb3c
            fromUTF8(escape(_("Change Zones of Connections..."))), self)
Packit Service 84cb3c
        self.changeZonesAction.triggered.connect(self.nm_connection_editor)
Packit Service 84cb3c
Packit Service 84cb3c
        self.shieldsAction = QtWidgets.QAction(
Packit Service 84cb3c
            fromUTF8(escape(_("Configure Shields UP/Down Zones..."))), self)
Packit Service 84cb3c
        self.shieldsAction.triggered.connect(self.configure_shields)
Packit Service 84cb3c
Packit Service 84cb3c
        self.panicAction = QtWidgets.QAction(
Packit Service 84cb3c
            fromUTF8(escape(_("Block all network traffic"))), self)
Packit Service 84cb3c
        self.panicAction.setCheckable(True)
Packit Service 84cb3c
        self.panicAction.setChecked(False)
Packit Service 84cb3c
        self.panicAction.triggered.connect(self.panic_mode_cb)
Packit Service 84cb3c
Packit Service 84cb3c
        self.aboutAction = QtWidgets.QAction(fromUTF8(escape(_("About"))), self)
Packit Service 84cb3c
        self.aboutAction.triggered.connect(self.about_dialog.exec_)
Packit Service 84cb3c
Packit Service 84cb3c
        #self.quitAction = QtWidgets.QAction(fromUTF8(escape(_("Quit"))), self,
Packit Service 84cb3c
        #                                triggered=self.quit)
Packit Service 84cb3c
Packit Service 84cb3c
        self.connectionsAction = QtWidgets.QWidgetAction(self)
Packit Service 84cb3c
        self.connectionsAction.setDefaultWidget(QtWidgets.QLabel(
Packit Service 84cb3c
            fromUTF8(""+escape(_("Connections"))+" ")))
Packit Service 84cb3c
Packit Service 84cb3c
        self.interfacesAction = QtWidgets.QWidgetAction(self)
Packit Service 84cb3c
        self.interfacesAction.setDefaultWidget(QtWidgets.QLabel(
Packit Service 84cb3c
            fromUTF8(""+escape(_("Interfaces"))+" ")))
Packit Service 84cb3c
Packit Service 84cb3c
        self.sourcesAction = QtWidgets.QWidgetAction(self)
Packit Service 84cb3c
        self.sourcesAction.setDefaultWidget(QtWidgets.QLabel(
Packit Service 84cb3c
            fromUTF8(""+escape(_("Sources"))+" ")))
Packit Service 84cb3c
Packit Service 84cb3c
        # init
Packit Service 84cb3c
Packit Service 84cb3c
        self.left_menu = QtWidgets.QMenu()
Packit Service 84cb3c
        self.left_menu.setStyleSheet('QMenu { margin: 5px; }')
Packit Service 84cb3c
Packit Service 84cb3c
        self.right_menu = QtWidgets.QMenu()
Packit Service 84cb3c
        self.right_menu.addAction(self.shieldsupAction)
Packit Service 84cb3c
        self.right_menu.addAction(self.notificationsAction)
Packit Service 84cb3c
        self.right_menu.addSeparator()
Packit Service 84cb3c
        self.right_menu.addAction(self.settingsAction)
Packit Service 84cb3c
        self.right_menu.addAction(self.changeZonesAction)
Packit Service 84cb3c
        self.right_menu.addAction(self.shieldsAction)
Packit Service 84cb3c
        self.right_menu.addSeparator()
Packit Service 84cb3c
        self.right_menu.addAction(self.panicAction)
Packit Service 84cb3c
        self.right_menu.addSeparator()
Packit Service 84cb3c
        self.right_menu.addAction(self.aboutAction)
Packit Service 84cb3c
        #self.right_menu.addSeparator()
Packit Service 84cb3c
        #self.right_menu.addAction(self.quitAction)
Packit Service 84cb3c
        self.setContextMenu(self.right_menu)
Packit Service 84cb3c
Packit Service 84cb3c
        self.activated.connect(self.activated_cb)
Packit Service 84cb3c
Packit Service 84cb3c
        self.set_mode("error")
Packit Service 84cb3c
        self.set_icon()
Packit Service 84cb3c
Packit Service 84cb3c
        self.setVisible(self.show_inactive)
Packit Service 84cb3c
Packit Service 84cb3c
        # init notification
Packit Service 84cb3c
Packit Service 84cb3c
        Notify.init(self.prog)
Packit Service 84cb3c
Packit Service 84cb3c
        # connect to firewalld
Packit Service 84cb3c
Packit Service 84cb3c
        DBusQtMainLoop(set_as_default=True)
Packit Service 84cb3c
        try:
Packit Service 84cb3c
            self.bus = slip.dbus.SystemBus()
Packit Service 84cb3c
            self.bus.default_timeout = None
Packit Service 84cb3c
        except Exception as msg:
Packit Service 84cb3c
            print("Not using slip", msg)
Packit Service 84cb3c
            self.bus = dbus.SystemBus()
Packit Service 84cb3c
Packit Service 84cb3c
        if nm_is_imported():
Packit Service 84cb3c
            self.bus.add_signal_receiver(
Packit Service 84cb3c
                self.nm_signal_receiver,
Packit Service 84cb3c
                dbus_interface=nm_get_dbus_interface(),
Packit Service 84cb3c
                signal_name='PropertiesChanged',
Packit Service 84cb3c
                member_keyword='member')
Packit Service 84cb3c
        self.nm_signal_receiver()
Packit Service 84cb3c
Packit Service 84cb3c
        self.fw = FirewallClient(self.bus, wait=1)
Packit Service 84cb3c
        self.fw.setExceptionHandler(self._exception_handler)
Packit Service 84cb3c
Packit Service 84cb3c
        self.fw.connect("connection-established", self.connection_established)
Packit Service 84cb3c
        self.fw.connect("connection-lost", self.connection_lost)
Packit Service 84cb3c
Packit Service 84cb3c
        self.fw.connect("reloaded", self.reloaded),
Packit Service 84cb3c
        self.fw.connect("default-zone-changed", self.default_zone_changed)
Packit Service 84cb3c
        self.fw.connect("panic-mode-enabled", self.panic_mode_enabled)
Packit Service 84cb3c
        self.fw.connect("panic-mode-disabled", self.panic_mode_disabled)
Packit Service 84cb3c
        self.fw.connect("interface-added", self.interface_added)
Packit Service 84cb3c
        self.fw.connect("interface-removed", self.interface_removed)
Packit Service 84cb3c
        self.fw.connect("zone-of-interface-changed",
Packit Service 84cb3c
                        self.zone_of_interface_changed)
Packit Service 84cb3c
        self.fw.connect("source-added", self.source_added)
Packit Service 84cb3c
        self.fw.connect("source-removed", self.source_removed)
Packit Service 84cb3c
        self.fw.connect("zone-of-source-changed",
Packit Service 84cb3c
                        self.zone_of_source_changed)
Packit Service 84cb3c
Packit Service 84cb3c
        self.shields_editor = ShieldsEditor(self.fw, self.settings, None, None)
Packit Service 84cb3c
Packit Service 84cb3c
        self.load_settings()
Packit Service 84cb3c
Packit Service 84cb3c
    def _exception_handler(self, exception_message):
Packit Service 84cb3c
        if "NotAuthorizedException" in exception_message:
Packit Service 84cb3c
            self.error(fromUTF8(escape(_("Authorization failed."))))
Packit Service 84cb3c
        elif "INVALID_NAME" in exception_message:
Packit Service 84cb3c
            msg = exception_message.replace("INVALID_NAME", _("Invalid name"))
Packit Service 84cb3c
            self.warning(fromUTF8(escape(msg)))
Packit Service 84cb3c
        elif "NAME_CONFLICT" in exception_message:
Packit Service 84cb3c
            msg = exception_message.replace("NAME_CONFLICT",
Packit Service 84cb3c
                                            _("Name already exists"))
Packit Service 84cb3c
            self.warning(fromUTF8(escape(msg)))
Packit Service 84cb3c
        elif "NO_DEFAULTS" in exception_message:
Packit Service 84cb3c
            pass
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.error(fromUTF8(exception_message))
Packit Service 84cb3c
Packit Service 84cb3c
    def quit(self):
Packit Service 84cb3c
        sys.exit(1)
Packit Service 84cb3c
Packit Service 84cb3c
    def set_icon(self, mode=None):
Packit Service 84cb3c
        if mode is not None:
Packit Service 84cb3c
            self.setIcon(self.icons[mode])
Packit Service 84cb3c
        elif self.mode != "normal":
Packit Service 84cb3c
            self.setIcon(self.icons[self.mode])
Packit Service 84cb3c
        elif self.default_zone == self.shields_up:
Packit Service 84cb3c
            self.setIcon(self.icons["normal-shields_up"])
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.setIcon(self.icons["normal-shields_down"])
Packit Service 84cb3c
Packit Service 84cb3c
    def load_settings(self, name=None):
Packit Service 84cb3c
        self.settings.sync()
Packit Service 84cb3c
Packit Service 84cb3c
        notifications = self.settings.value("notifications", False, type=bool)
Packit Service 84cb3c
        self.notificationsAction.setChecked(notifications)
Packit Service 84cb3c
        self.show_inactive = self.settings.value("show-inactive", False,
Packit Service 84cb3c
                                                 type=bool)
Packit Service 84cb3c
        self.blink = self.settings.value("blink", False, type=bool)
Packit Service 84cb3c
        self.blink_count = self.settings.value("blink-count", 5, type=int)
Packit Service 84cb3c
Packit Service 84cb3c
        self.shields_up = self.settings.value("shields-up", "block", type=str)
Packit Service 84cb3c
        if self.default_zone:
Packit Service 84cb3c
            self.shieldsupAction.setChecked(
Packit Service 84cb3c
                self.default_zone == self.shields_up)
Packit Service 84cb3c
        self.shields_editor.set_shields_up(self.shields_up)
Packit Service 84cb3c
        self.shields_down = self.settings.value("shields-down", "public",
Packit Service 84cb3c
                                                type=str)
Packit Service 84cb3c
        self.shields_editor.set_shields_down(self.shields_down)
Packit Service 84cb3c
Packit Service 84cb3c
        #print("shields-up=%s" % self.shields_up)
Packit Service 84cb3c
        #print("notifications=%s" % notifications)
Packit Service 84cb3c
        #print("blink=%s" % self.blink)
Packit Service 84cb3c
        #print("blink-count=%s" % self.blink_count)
Packit Service 84cb3c
        #print("show-inactive=%s" % self.show_inactive)
Packit Service 84cb3c
Packit Service 84cb3c
        if not self.fw.connected:
Packit Service 84cb3c
            self.setVisible(self.show_inactive)
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.setVisible(True)
Packit Service 84cb3c
Packit Service 84cb3c
    def activated_cb(self, reason):
Packit Service 84cb3c
        if reason == QtWidgets.QSystemTrayIcon.Trigger:
Packit Service 84cb3c
            self.left_menu.popup(QtGui.QCursor.pos())
Packit Service 84cb3c
Packit Service 84cb3c
    def update_active_zones(self):
Packit Service 84cb3c
        self.active_zones.clear()
Packit Service 84cb3c
Packit Service 84cb3c
        # remove all entries for the left menu
Packit Service 84cb3c
        self.left_menu.clear()
Packit Service 84cb3c
Packit Service 84cb3c
        # add connections entry
Packit Service 84cb3c
        self.left_menu.addAction(self.connectionsAction)
Packit Service 84cb3c
Packit Service 84cb3c
        if not self.fw.connected:
Packit Service 84cb3c
            return
Packit Service 84cb3c
Packit Service 84cb3c
        active_zones = self.fw.getActiveZones()
Packit Service 84cb3c
        if active_zones:
Packit Service 84cb3c
            self.active_zones = active_zones
Packit Service 84cb3c
Packit Service 84cb3c
        # get all active connections (NM) and interfaces
Packit Service 84cb3c
        connections = { }
Packit Service 84cb3c
        interfaces = { }
Packit Service 84cb3c
        sources = { }
Packit Service 84cb3c
        for zone in sorted(self.active_zones):
Packit Service 84cb3c
            if "interfaces" in self.active_zones[zone]:
Packit Service 84cb3c
                for interface in sorted(self.active_zones[zone]["interfaces"]):
Packit Service 84cb3c
                    if interface not in self.connections:
Packit Service 84cb3c
                        interfaces[interface] = zone
Packit Service 84cb3c
            if "sources" in self.active_zones[zone]:
Packit Service 84cb3c
                for source in sorted(self.active_zones[zone]["sources"]):
Packit Service 84cb3c
                    sources[source] = zone
Packit Service 84cb3c
        # NM controlled connections
Packit Service 84cb3c
        for interface in self.connections:
Packit Service 84cb3c
            connection = self.connections[interface]
Packit Service 84cb3c
            if connection not in self.connections_name:
Packit Service 84cb3c
                connection_name = None
Packit Service 84cb3c
            else:
Packit Service 84cb3c
                connection_name = self.connections_name[connection]
Packit Service 84cb3c
            zone = nm_get_zone_of_connection(connection)
Packit Service 84cb3c
            connections[connection] = [ zone, connection_name ]
Packit Service 84cb3c
Packit Service 84cb3c
        binding = _("{entry} (Zone: {zone})")
Packit Service 84cb3c
Packit Service 84cb3c
        # add NM controlled bindings
Packit Service 84cb3c
        for connection in sorted(connections):
Packit Service 84cb3c
            zone = connections[connection][0]
Packit Service 84cb3c
            connection_name = connections[connection][1]
Packit Service 84cb3c
            if zone == "":
Packit Service 84cb3c
                _binding = _("{entry} (Default Zone: {default_zone})")
Packit Service 84cb3c
                action = QtWidgets.QAction(
Packit Service 84cb3c
                    fromUTF8(escape(
Packit Service 84cb3c
                        _binding.format(default_zone=self.default_zone,
Packit Service 84cb3c
                                        entry=connection_name))), self)
Packit Service 84cb3c
            else:
Packit Service 84cb3c
                action = QtWidgets.QAction(
Packit Service 84cb3c
                    fromUTF8(escape(binding.format(zone=zone,
Packit Service 84cb3c
                                                   entry=connection_name))), self)
Packit Service 84cb3c
            action.triggered.connect(functools.partial(
Packit Service 84cb3c
                self.zone_connection_editor, connection, connection_name, zone))
Packit Service 84cb3c
            self.left_menu.addAction(action)
Packit Service 84cb3c
Packit Service 84cb3c
        # add interfaces entry
Packit Service 84cb3c
        self.left_menu.addAction(self.interfacesAction)
Packit Service 84cb3c
Packit Service 84cb3c
        # add other interfaces
Packit Service 84cb3c
        for interface in sorted(interfaces):
Packit Service 84cb3c
            zone = interfaces[interface]
Packit Service 84cb3c
            action = QtWidgets.QAction(
Packit Service 84cb3c
                fromUTF8(escape(binding.format(zone=zone, entry=interface))),
Packit Service 84cb3c
                self)
Packit Service 84cb3c
            action.triggered.connect(functools.partial(
Packit Service 84cb3c
                self.zone_interface_editor, interface, zone))
Packit Service 84cb3c
            self.left_menu.addAction(action)
Packit Service 84cb3c
Packit Service 84cb3c
        # add interfaces entry
Packit Service 84cb3c
        self.left_menu.addAction(self.sourcesAction)
Packit Service 84cb3c
Packit Service 84cb3c
        for source in sorted(sources):
Packit Service 84cb3c
            zone = sources[source]
Packit Service 84cb3c
            action = QtWidgets.QAction(
Packit Service 84cb3c
                fromUTF8(escape(binding.format(zone=zone, entry=source))),
Packit Service 84cb3c
                self)
Packit Service 84cb3c
            action.triggered.connect(functools.partial(
Packit Service 84cb3c
                self.zone_source_editor, source, zone))
Packit Service 84cb3c
            self.left_menu.addAction(action)
Packit Service 84cb3c
Packit Service 84cb3c
    def zone_interface_editor(self, interface, zone):
Packit Service 84cb3c
        if interface in self.zone_interface_editors:
Packit Service 84cb3c
            self.zone_interface_editors[interface].set_zone(zone)
Packit Service 84cb3c
            self.zone_interface_editors[interface].show()
Packit Service 84cb3c
            return self.zone_interface_editors[interface].raise_()
Packit Service 84cb3c
Packit Service 84cb3c
        editor = ZoneInterfaceEditor(self.fw, interface, zone)
Packit Service 84cb3c
        self.zone_interface_editors[interface] = editor
Packit Service 84cb3c
        editor.show()
Packit Service 84cb3c
        editor.raise_()
Packit Service 84cb3c
        editor.show()
Packit Service 84cb3c
Packit Service 84cb3c
    def zone_connection_editor(self, connection, connection_name, zone):
Packit Service 84cb3c
        if connection in self.zone_connection_editors:
Packit Service 84cb3c
            self.zone_connection_editors[connection].set_zone(zone)
Packit Service 84cb3c
            self.zone_connection_editors[connection].show()
Packit Service 84cb3c
            return self.zone_connection_editors[connection].raise_()
Packit Service 84cb3c
Packit Service 84cb3c
        editor = ZoneConnectionEditor(self.fw, connection, connection_name, zone)
Packit Service 84cb3c
        self.zone_connection_editors[connection] = editor
Packit Service 84cb3c
        editor.show()
Packit Service 84cb3c
        editor.raise_()
Packit Service 84cb3c
        editor.show()
Packit Service 84cb3c
Packit Service 84cb3c
    def zone_source_editor(self, source, zone):
Packit Service 84cb3c
        if source in self.zone_source_editors:
Packit Service 84cb3c
            self.zone_source_editors[source].set_zone(zone)
Packit Service 84cb3c
            self.zone_source_editors[source].show()
Packit Service 84cb3c
            return self.zone_source_editors[source].raise_()
Packit Service 84cb3c
Packit Service 84cb3c
        editor = ZoneSourceEditor(self.fw, source, zone)
Packit Service 84cb3c
        self.zone_source_editors[source] = editor
Packit Service 84cb3c
        editor.show()
Packit Service 84cb3c
        editor.raise_()
Packit Service 84cb3c
        editor.show()
Packit Service 84cb3c
Packit Service 84cb3c
    def nm_signal_receiver(self, *args, **kwargs):
Packit Service 84cb3c
        self.connections.clear()
Packit Service 84cb3c
        self.connections_name.clear()
Packit Service 84cb3c
Packit Service 84cb3c
        # do not use NMClient could result in python core dump
Packit Service 84cb3c
Packit Service 84cb3c
        if nm_is_imported():
Packit Service 84cb3c
            text = _("Failed to get connections from NetworkManager")
Packit Service 84cb3c
            try:
Packit Service 84cb3c
                nm_get_connections(self.connections, self.connections_name)
Packit Service 84cb3c
            except Exception:
Packit Service 84cb3c
                self.notify(escape(text), urgency=Notify.Urgency.CRITICAL)
Packit Service 84cb3c
                if text not in self.tooltip_messages:
Packit Service 84cb3c
                    self.tooltip_messages.append(text)
Packit Service 84cb3c
            else:
Packit Service 84cb3c
                if text in self.tooltip_messages:
Packit Service 84cb3c
                    self.tooltip_messages.remove(text)
Packit Service 84cb3c
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            text = _("No NetworkManager imports available")
Packit Service 84cb3c
            self.notify(escape(text), urgency=Notify.Urgency.CRITICAL)
Packit Service 84cb3c
            if text not in self.tooltip_messages:
Packit Service 84cb3c
                self.tooltip_messages.append(text)
Packit Service 84cb3c
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
    def notify(self, msg, urgency="noicon", timeout=5):
Packit Service 84cb3c
        #self.showMessage(fromUTF8(escape(self.name)), msg, self.urgencies[urgency], timeout*1000)
Packit Service 84cb3c
        n = Notify.Notification.new(escape(self.name), msg, self.icon_name)
Packit Service 84cb3c
        n.set_urgency(Notify.Urgency.NORMAL)
Packit Service 84cb3c
        try:
Packit Service 84cb3c
            n.show()
Packit Service 84cb3c
        except:
Packit Service 84cb3c
            return
Packit Service 84cb3c
Packit Service 84cb3c
    def shieldsup_changed_cb(self):
Packit Service 84cb3c
        if self.shieldsupAction.isChecked():
Packit Service 84cb3c
            zone = str(self.shields_up)
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            zone = str(self.shields_down)
Packit Service 84cb3c
Packit Service 84cb3c
        if self.fw.connected and self.default_zone != zone:
Packit Service 84cb3c
            try:
Packit Service 84cb3c
                self.fw.setDefaultZone(zone)
Packit Service 84cb3c
            except dbus.exceptions.DBusException as e:
Packit Service 84cb3c
                print("Error: %s" % e.get_dbus_message())
Packit Service 84cb3c
Packit Service 84cb3c
    def notification_changed_cb(self):
Packit Service 84cb3c
        self.settings.setValue("notifications",
Packit Service 84cb3c
                               self.notificationsAction.isChecked())
Packit Service 84cb3c
        self.settings.sync()
Packit Service 84cb3c
Packit Service 84cb3c
    def __blink(self, arg=None):
Packit Service 84cb3c
        if self._blink_count != 0:
Packit Service 84cb3c
            if self._blink_count > 0 and self._blink:
Packit Service 84cb3c
                self._blink_count -= 1
Packit Service 84cb3c
            self._blink = not self._blink
Packit Service 84cb3c
            if not self.timer:
Packit Service 84cb3c
                self.timer = QtCore.QTimer(self)
Packit Service 84cb3c
                self.timer.timeout.connect(self.__blink)
Packit Service 84cb3c
                self.timer.setInterval(1000)
Packit Service 84cb3c
            self.timer.start()
Packit Service 84cb3c
        if not self._blink:
Packit Service 84cb3c
            self.set_icon()
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.set_icon("normal")
Packit Service 84cb3c
Packit Service 84cb3c
    def get_mode(self):
Packit Service 84cb3c
        return self.mode
Packit Service 84cb3c
Packit Service 84cb3c
    def set_mode(self, mode):
Packit Service 84cb3c
        if self.mode != mode:
Packit Service 84cb3c
            if self.timer and self.timer.isActive():
Packit Service 84cb3c
                self.timer.stop()
Packit Service 84cb3c
                self._blink = False
Packit Service 84cb3c
            self.mode = mode
Packit Service 84cb3c
Packit Service 84cb3c
        elif self.mode == mode and self.timer:
Packit Service 84cb3c
            if self._blink_count == 0:
Packit Service 84cb3c
                self._blink_count += 1
Packit Service 84cb3c
            return
Packit Service 84cb3c
Packit Service 84cb3c
        if mode == "normal":
Packit Service 84cb3c
            self.set_icon()
Packit Service 84cb3c
            return
Packit Service 84cb3c
Packit Service 84cb3c
        if self.blink:
Packit Service 84cb3c
            if self.blink_count != 0:
Packit Service 84cb3c
                self._blink = True
Packit Service 84cb3c
                self._blink_count = self.blink_count
Packit Service 84cb3c
                self.__blink()
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.set_icon()
Packit Service 84cb3c
Packit Service 84cb3c
    def update_tooltip(self):
Packit Service 84cb3c
        if self.get_mode() == "error":
Packit Service 84cb3c
            self.setToolTip(fromUTF8("<big>" + \
Packit Service 84cb3c
                                     _("No connection to firewall daemon") + \
Packit Service 84cb3c
                                     "</big>"))
Packit Service 84cb3c
            return
Packit Service 84cb3c
Packit Service 84cb3c
        messages = [ ]
Packit Service 84cb3c
Packit Service 84cb3c
        if self.panicAction.isChecked():
Packit Service 84cb3c
            messages.append("<big>" + \
Packit Service 84cb3c
                            _("All network traffic is blocked.") + \
Packit Service 84cb3c
                            "</big>")
Packit Service 84cb3c
Packit Service 84cb3c
        if self.default_zone:
Packit Service 84cb3c
            messages.append(_("Default Zone: '%s'") % self.default_zone)
Packit Service 84cb3c
Packit Service 84cb3c
        for interface in self.connections:
Packit Service 84cb3c
            connection = self.connections[interface]
Packit Service 84cb3c
            zone = nm_get_zone_of_connection(connection)
Packit Service 84cb3c
            if zone == "":
Packit Service 84cb3c
                text = _("Default Zone '{default_zone}' active for connection "
Packit Service 84cb3c
                         "'{connection}' on interface '{interface}'")
Packit Service 84cb3c
            else:
Packit Service 84cb3c
                text = _("Zone '{zone}' active for connection "
Packit Service 84cb3c
                         "'{connection}' on interface '{interface}'")
Packit Service 84cb3c
            messages.append(text.format(zone=zone,
Packit Service 84cb3c
                                        default_zone=self.default_zone,
Packit Service 84cb3c
                                        connection=connection,
Packit Service 84cb3c
                                        interface=interface))
Packit Service 84cb3c
Packit Service 84cb3c
        if len(self.active_zones) > 0:
Packit Service 84cb3c
            for zone in sorted(self.active_zones):
Packit Service 84cb3c
                if "interfaces" in self.active_zones[zone]:
Packit Service 84cb3c
                    for interface in sorted(self.active_zones[zone]["interfaces"]):
Packit Service 84cb3c
                        if interface not in self.connections:
Packit Service 84cb3c
                            text = _("Zone '{zone}' active for interface "
Packit Service 84cb3c
                                     "'{interface}'")
Packit Service 84cb3c
                            connection = None
Packit Service 84cb3c
                            messages.append(text.format(zone=zone,
Packit Service 84cb3c
                                                        connection=connection,
Packit Service 84cb3c
                                                        interface=interface))
Packit Service 84cb3c
                if "sources" in self.active_zones[zone]:
Packit Service 84cb3c
                    for source in sorted(self.active_zones[zone]["sources"]):
Packit Service 84cb3c
                        text = _("Zone '{zone}' active for source {source}")
Packit Service 84cb3c
                        connection = None
Packit Service 84cb3c
                        messages.append(text.format(zone=zone, source=source))
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            messages.append(_("No Active Zones."))
Packit Service 84cb3c
        messages.extend(self.tooltip_messages)
Packit Service 84cb3c
Packit Service 84cb3c
        tooltip = "<nobr>"+"</nobr>
<nobr>".join(messages)+"</nobr>"
Packit Service 84cb3c
        self.setToolTip(fromUTF8("<font size=\"3\">"+tooltip+"</font>"))
Packit Service 84cb3c
        self.set_icon()
Packit Service 84cb3c
Packit Service 84cb3c
    def show(self):
Packit Service 84cb3c
        # do not automatically show the applet
Packit Service 84cb3c
        pass
Packit Service 84cb3c
Packit Service 84cb3c
    def panic_mode_cb(self):
Packit Service 84cb3c
        if not self.fw or not self.fw.connected:
Packit Service 84cb3c
            return
Packit Service 84cb3c
        if self.panicAction.isChecked():
Packit Service 84cb3c
            self.fw.enablePanicMode()
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.fw.disablePanicMode()
Packit Service 84cb3c
        self.panicAction.setChecked(not self.panicAction.isChecked())
Packit Service 84cb3c
Packit Service 84cb3c
    def configure_shields(self):
Packit Service 84cb3c
        self.shields_editor.show()
Packit Service 84cb3c
        self.shields_editor.raise_()
Packit Service 84cb3c
Packit Service 84cb3c
    def nm_connection_editor(self, item, uuid=None):
Packit Service 84cb3c
        if NM_CONNECTION_EDITOR == "":
Packit Service 84cb3c
            self.warning("NetworkManager connection editor is missing.")
Packit Service 84cb3c
            return
Packit Service 84cb3c
Packit Service 84cb3c
        if uuid:
Packit Service 84cb3c
            if "kde-" in NM_CONNECTION_EDITOR:
Packit Service 84cb3c
                os.system("%s %s &" % (NM_CONNECTION_EDITOR, uuid))
Packit Service 84cb3c
            else:
Packit Service 84cb3c
                os.system("%s --edit=%s &" % (NM_CONNECTION_EDITOR, uuid))
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            os.system("%s &" % NM_CONNECTION_EDITOR)
Packit Service 84cb3c
Packit Service 84cb3c
    def warning(self, text):
Packit Service 84cb3c
        QtWidgets.QMessageBox.warning(None, fromUTF8(escape(self.name)), text)
Packit Service 84cb3c
Packit Service 84cb3c
    def error(self, text):
Packit Service 84cb3c
        QtWidgets.QMessageBox.critical(None, fromUTF8(escape(self.name)), text)
Packit Service 84cb3c
Packit Service 84cb3c
    def configure_cb(self, widget):
Packit Service 84cb3c
        os.system("firewall-config &")
Packit Service 84cb3c
Packit Service 84cb3c
    # firewallClient signal receivers
Packit Service 84cb3c
Packit Service 84cb3c
    def connection_established(self, first=False):
Packit Service 84cb3c
        self.default_zone = self.fw.getDefaultZone()
Packit Service 84cb3c
        self.panicAction.setChecked(self.fw.queryPanicMode())
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.shields_editor.zones_changed()
Packit Service 84cb3c
Packit Service 84cb3c
        if self.shields_up:
Packit Service 84cb3c
            self.shieldsupAction.setChecked(
Packit Service 84cb3c
                self.default_zone == self.shields_up)
Packit Service 84cb3c
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            self.notify(escape(_("Connection to FirewallD established.")))
Packit Service 84cb3c
        self.setVisible(True)
Packit Service 84cb3c
        self.set_mode("normal")
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
    def connection_lost(self):
Packit Service 84cb3c
        self.default_zone = None
Packit Service 84cb3c
        self.set_mode("error")
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
        self.panicAction.setChecked(False)
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            self.notify(escape(_("Connection to FirewallD lost.")))
Packit Service 84cb3c
        self.setVisible(self.show_inactive)
Packit Service 84cb3c
Packit Service 84cb3c
    def reloaded(self):
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            self.notify(escape(_("FirewallD has been reloaded.")))
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
    def default_zone_changed(self, zone):
Packit Service 84cb3c
        self.default_zone = zone
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            self.notify(escape(_("Default zone changed to '%s'.") % zone))
Packit Service 84cb3c
        if self.shields_up:
Packit Service 84cb3c
            self.shieldsupAction.setChecked(
Packit Service 84cb3c
                self.default_zone == self.shields_up)
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
    def _panic_mode(self, enable):
Packit Service 84cb3c
        self.panicAction.setChecked(enable)
Packit Service 84cb3c
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
        if enable:
Packit Service 84cb3c
            self.set_mode("panic")
Packit Service 84cb3c
        else:
Packit Service 84cb3c
            self.set_mode("normal")
Packit Service 84cb3c
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            ed = { 1: _("All network traffic is blocked."),
Packit Service 84cb3c
                   0: _("Network traffic is not blocked anymore.") }
Packit Service 84cb3c
            self.notify(escape(ed[enable]))
Packit Service 84cb3c
Packit Service 84cb3c
    def panic_mode_enabled(self):
Packit Service 84cb3c
        self._panic_mode(True)
Packit Service 84cb3c
Packit Service 84cb3c
    def panic_mode_disabled(self):
Packit Service 84cb3c
        self._panic_mode(False)
Packit Service 84cb3c
Packit Service 84cb3c
    def _interface(self, zone, interface, enable):
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
        # close dialog of removed interface
Packit Service 84cb3c
        if not enable:
Packit Service 84cb3c
            if interface in self.connections:
Packit Service 84cb3c
                connection = self.connections[interface]
Packit Service 84cb3c
                if connection in self.zone_connection_editors:
Packit Service 84cb3c
                    self.zone_connection_editors[connection].hide()
Packit Service 84cb3c
                    del self.zone_connection_editors[connection]
Packit Service 84cb3c
            elif interface in self.zone_interface_editors:
Packit Service 84cb3c
                self.zone_interface_editors[interface].hide()
Packit Service 84cb3c
                del self.zone_interface_editors[interface]
Packit Service 84cb3c
Packit Service 84cb3c
        # send notification if enabled
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            ed = { 1: _("activated"),
Packit Service 84cb3c
                   0: _("deactivated") }
Packit Service 84cb3c
            if interface in self.connections:
Packit Service 84cb3c
                connection = self.connections[interface]
Packit Service 84cb3c
                zone = nm_get_zone_of_connection(connection)
Packit Service 84cb3c
                if zone == "":
Packit Service 84cb3c
                    text = _("Default zone '{default_zone}' "
Packit Service 84cb3c
                             "{activated_deactivated} for "
Packit Service 84cb3c
                             "connection '{connection}' on "
Packit Service 84cb3c
                             "interface '{interface}'")
Packit Service 84cb3c
                else:
Packit Service 84cb3c
                    text = _("Zone '{zone}' {activated_deactivated} for "
Packit Service 84cb3c
                             "connection '{connection}' on "
Packit Service 84cb3c
                             "interface '{interface}'")
Packit Service 84cb3c
            else:
Packit Service 84cb3c
                connection = None
Packit Service 84cb3c
                text = _("Zone '{zone}' {activated_deactivated} for "
Packit Service 84cb3c
                         "interface '{interface}'")
Packit Service 84cb3c
            self.notify(escape(text.format(
Packit Service 84cb3c
                zone=zone,
Packit Service 84cb3c
                default_zone=self.default_zone,
Packit Service 84cb3c
                activated_deactivated=ed[enable],
Packit Service 84cb3c
                connection=connection, interface=interface)))
Packit Service 84cb3c
Packit Service 84cb3c
    def interface_added(self, zone, interface):
Packit Service 84cb3c
        self._interface(zone, interface, True)
Packit Service 84cb3c
Packit Service 84cb3c
    def interface_removed(self, zone, interface):
Packit Service 84cb3c
        self._interface(zone, interface, False)
Packit Service 84cb3c
Packit Service 84cb3c
    def zone_of_interface_changed(self, zone, interface):
Packit Service 84cb3c
        # update zone editor
Packit Service 84cb3c
        if interface in self.zone_interface_editors:
Packit Service 84cb3c
            self.zone_interface_editors[interface].set_zone(zone)
Packit Service 84cb3c
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            self.notify(escape(_("Zone '%s' activated for interface '%s'") % \
Packit Service 84cb3c
                               (zone, interface)))
Packit Service 84cb3c
Packit Service 84cb3c
    def _source(self, zone, source, enable):
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
        # close dialog of removed source
Packit Service 84cb3c
        if not enable:
Packit Service 84cb3c
            if source in self.zone_source_editors:
Packit Service 84cb3c
                self.zone_source_editors[source].hide()
Packit Service 84cb3c
                del self.zone_source_editors[source]
Packit Service 84cb3c
Packit Service 84cb3c
        # send notification if enabled
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            ed = { 1: _("activated"),
Packit Service 84cb3c
                   0: _("deactivated") }
Packit Service 84cb3c
            text = _("Zone '{zone}' {activated_deactivated} for "
Packit Service 84cb3c
                     "source '{source}'")
Packit Service 84cb3c
            self.notify(escape(text.format(
Packit Service 84cb3c
                zone=zone, activated_deactivated=ed[enable], source=source)))
Packit Service 84cb3c
Packit Service 84cb3c
    def source_added(self, zone, source):
Packit Service 84cb3c
        self._source(zone, source, True)
Packit Service 84cb3c
Packit Service 84cb3c
    def source_removed(self, zone, source):
Packit Service 84cb3c
        self._source(zone, source, False)
Packit Service 84cb3c
Packit Service 84cb3c
    def zone_of_source_changed(self, zone, source):
Packit Service 84cb3c
        index = source
Packit Service 84cb3c
        if source in self.zone_source_editors:
Packit Service 84cb3c
            self.zone_source_editors[source].set_zone(zone)
Packit Service 84cb3c
Packit Service 84cb3c
        # update zone editor
Packit Service 84cb3c
        if index in self.zone_interface_editors:
Packit Service 84cb3c
            self.zone_interface_editors[index].set_zone(zone)
Packit Service 84cb3c
Packit Service 84cb3c
        self.update_active_zones()
Packit Service 84cb3c
        self.update_tooltip()
Packit Service 84cb3c
Packit Service 84cb3c
        if self.notificationsAction.isChecked():
Packit Service 84cb3c
            self.notify(escape(_("Zone '%s' activated for source '%s'") % \
Packit Service 84cb3c
                               (zone, source)))
Packit Service 84cb3c
Packit Service 84cb3c
# MAIN ########################################################################
Packit Service 84cb3c
Packit Service 84cb3c
if len(sys.argv) > 1:
Packit Service 84cb3c
    print("""Usage: %s [options]
Packit Service 84cb3c
Packit Service 84cb3c
Options:
Packit Service 84cb3c
  -h, --help     show this help message and exit
Packit Service 84cb3c
"""  % sys.argv[0])
Packit Service 84cb3c
    sys.exit(1)
Packit Service 84cb3c
Packit Service 84cb3c
# reset SIGINT signal to default
Packit Service 84cb3c
signal.signal(signal.SIGINT, signal.SIG_DFL)
Packit Service 84cb3c
Packit Service 84cb3c
app = QtWidgets.QApplication(sys.argv)
Packit Service 84cb3c
app.setQuitOnLastWindowClosed(False)
Packit Service 84cb3c
Packit Service 84cb3c
applet = TrayApplet()
Packit Service 84cb3c
applet.show()
Packit Service 84cb3c
sys.exit(app.exec_())