Blame gui/booleansPage.py

Packit Service 9fb14c
#
Packit Service 9fb14c
# booleansPage.py - GUI for Booleans page in system-config-securitylevel
Packit Service 9fb14c
#
Packit Service 9fb14c
# Dan Walsh <dwalsh@redhat.com>
Packit Service 9fb14c
#
Packit Service 9fb14c
# Copyright 2006, 2007 Red Hat, Inc.
Packit Service 9fb14c
#
Packit Service 9fb14c
# This program is free software; you can redistribute it and/or modify
Packit Service 9fb14c
# it under the terms of the GNU General Public License as published by
Packit Service 9fb14c
# the Free Software Foundation; either version 2 of the License, or
Packit Service 9fb14c
# (at your option) any later version.
Packit Service 9fb14c
#
Packit Service 9fb14c
# This program is distributed in the hope that it will be useful,
Packit Service 9fb14c
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 9fb14c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 9fb14c
# GNU General Public License for more details.
Packit Service 9fb14c
#
Packit Service 9fb14c
# You should have received a copy of the GNU General Public License
Packit Service 9fb14c
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Packit Service 9fb14c
#
Packit Service 9fb14c
import sys
Packit Service 9fb14c
from gi.repository import Gdk, GObject, Gtk
Packit Service 9fb14c
import seobject
Packit Service 9fb14c
import semanagePage
Packit Service 9fb14c
Packit Service 9fb14c
INSTALLPATH = '/usr/share/system-config-selinux'
Packit Service 9fb14c
sys.path.append(INSTALLPATH)
Packit Service 9fb14c
Packit Service 9fb14c
try:
Packit Service 9fb14c
    from subprocess import getstatusoutput
Packit Service 9fb14c
except ImportError:
Packit Service 9fb14c
    from commands import getstatusoutput
Packit Service 9fb14c
Packit Service 9fb14c
ENFORCING = 0
Packit Service 9fb14c
PERMISSIVE = 1
Packit Service 9fb14c
DISABLED = 2
Packit Service 9fb14c
Packit Service 9fb14c
##
Packit Service 9fb14c
## I18N
Packit Service 9fb14c
##
Packit Service 9fb14c
PROGNAME = "selinux-gui"
Packit Service 9fb14c
try:
Packit Service 9fb14c
    import gettext
Packit Service 9fb14c
    kwargs = {}
Packit Service 9fb14c
    if sys.version_info < (3,):
Packit Service 9fb14c
        kwargs['unicode'] = True
Packit Service 9fb14c
    gettext.install(PROGNAME,
Packit Service 9fb14c
                    localedir="/usr/share/locale",
Packit Service 9fb14c
                    codeset='utf-8',
Packit Service 9fb14c
                    **kwargs)
Packit Service 9fb14c
except:
Packit Service 9fb14c
    try:
Packit Service 9fb14c
        import builtins
Packit Service 9fb14c
        builtins.__dict__['_'] = str
Packit Service 9fb14c
    except ImportError:
Packit Service 9fb14c
        import __builtin__
Packit Service 9fb14c
        __builtin__.__dict__['_'] = unicode
Packit Service 9fb14c
Packit Service 9fb14c
Packit Service 9fb14c
class Modifier:
Packit Service 9fb14c
Packit Service 9fb14c
    def __init__(self, name, on, save):
Packit Service 9fb14c
        self.on = on
Packit Service 9fb14c
        self.name = name
Packit Service 9fb14c
        self.save = save
Packit Service 9fb14c
Packit Service 9fb14c
    def set(self, value):
Packit Service 9fb14c
        self.on = value
Packit Service 9fb14c
        self.save = True
Packit Service 9fb14c
Packit Service 9fb14c
    def isOn(self):
Packit Service 9fb14c
        return self.on
Packit Service 9fb14c
Packit Service 9fb14c
Packit Service 9fb14c
class Boolean(Modifier):
Packit Service 9fb14c
Packit Service 9fb14c
    def __init__(self, name, val, save=False):
Packit Service 9fb14c
        Modifier.__init__(self, name, val, save)
Packit Service 9fb14c
Packit Service 9fb14c
ACTIVE = 0
Packit Service 9fb14c
MODULE = 1
Packit Service 9fb14c
DESC = 2
Packit Service 9fb14c
BOOLEAN = 3
Packit Service 9fb14c
Packit Service 9fb14c
Packit Service 9fb14c
class booleansPage:
Packit Service 9fb14c
Packit Service 9fb14c
    def __init__(self, xml, doDebug=None):
Packit Service 9fb14c
        self.xml = xml
Packit Service 9fb14c
        self.window = self.xml.get_object("mainWindow").get_root_window()
Packit Service 9fb14c
        self.local = False
Packit Service 9fb14c
        self.types = []
Packit Service 9fb14c
        self.selinuxsupport = True
Packit Service 9fb14c
        self.typechanged = False
Packit Service 9fb14c
        self.doDebug = doDebug
Packit Service 9fb14c
        self.busy_cursor = Gdk.Cursor.new(Gdk.CursorType.WATCH)
Packit Service 9fb14c
        self.ready_cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)
Packit Service 9fb14c
Packit Service 9fb14c
        # Bring in widgets from glade file.
Packit Service 9fb14c
        self.booleansFilter = xml.get_object("booleansFilter")
Packit Service 9fb14c
        self.booleansFilter.connect("focus_out_event", self.filter_changed)
Packit Service 9fb14c
        self.booleansFilter.connect("activate", self.filter_changed)
Packit Service 9fb14c
        self.booleansFilter.connect("changed", self.filter_changed)
Packit Service 9fb14c
Packit Service 9fb14c
        self.booleansView = xml.get_object("booleansView")
Packit Service 9fb14c
Packit Service 9fb14c
        self.revertButton = xml.get_object("booleanRevertButton")
Packit Service 9fb14c
        self.revertButton.set_sensitive(self.local)
Packit Service 9fb14c
        self.revertButton.connect("clicked", self.on_revert_clicked)
Packit Service 9fb14c
        listStore = Gtk.ListStore(GObject.TYPE_STRING)
Packit Service 9fb14c
        cell = Gtk.CellRendererText()
Packit Service 9fb14c
Packit Service 9fb14c
        self.store = Gtk.ListStore(GObject.TYPE_BOOLEAN, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
Packit Service 9fb14c
        self.store.set_sort_column_id(1, Gtk.SortType.ASCENDING)
Packit Service 9fb14c
        self.booleansView.set_model(self.store)
Packit Service 9fb14c
Packit Service 9fb14c
        checkbox = Gtk.CellRendererToggle()
Packit Service 9fb14c
        checkbox.connect("toggled", self.boolean_toggled)
Packit Service 9fb14c
        col = Gtk.TreeViewColumn('Active', checkbox, active=ACTIVE)
Packit Service 9fb14c
        col.set_clickable(True)
Packit Service 9fb14c
        col.set_sort_column_id(ACTIVE)
Packit Service 9fb14c
        self.booleansView.append_column(col)
Packit Service 9fb14c
Packit Service 9fb14c
        col = Gtk.TreeViewColumn("Module", Gtk.CellRendererText(), text=MODULE)
Packit Service 9fb14c
        col.set_sort_column_id(MODULE)
Packit Service 9fb14c
        col.set_resizable(True)
Packit Service 9fb14c
        self.booleansView.append_column(col)
Packit Service 9fb14c
Packit Service 9fb14c
        col = Gtk.TreeViewColumn("Description", Gtk.CellRendererText(), text=DESC)
Packit Service 9fb14c
        col.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
Packit Service 9fb14c
        col.set_fixed_width(400)
Packit Service 9fb14c
        col.set_sort_column_id(DESC)
Packit Service 9fb14c
        col.set_resizable(True)
Packit Service 9fb14c
        self.booleansView.append_column(col)
Packit Service 9fb14c
Packit Service 9fb14c
        col = Gtk.TreeViewColumn("Name", Gtk.CellRendererText(), text=BOOLEAN)
Packit Service 9fb14c
        col.set_sort_column_id(BOOLEAN)
Packit Service 9fb14c
        col.set_resizable(True)
Packit Service 9fb14c
        self.booleansView.set_search_equal_func(self.__search)
Packit Service 9fb14c
        self.booleansView.append_column(col)
Packit Service 9fb14c
        self.filter = ""
Packit Service 9fb14c
        self.load(self.filter)
Packit Service 9fb14c
Packit Service 9fb14c
    def error(self, message):
Packit Service 9fb14c
        dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
Packit Service 9fb14c
                                Gtk.ButtonsType.CLOSE,
Packit Service 9fb14c
                                message)
Packit Service 9fb14c
        dlg.set_position(Gtk.WindowPosition.MOUSE)
Packit Service 9fb14c
        dlg.show_all()
Packit Service 9fb14c
        dlg.run()
Packit Service 9fb14c
        dlg.destroy()
Packit Service 9fb14c
Packit Service 9fb14c
    def __search(self, model, col, key, i):
Packit Service 9fb14c
        sort_col = self.store.get_sort_column_id()[0]
Packit Service 9fb14c
        if sort_col > 0:
Packit Service 9fb14c
            val = model.get_value(i, sort_col)
Packit Service 9fb14c
            if val.lower().startswith(key.lower()):
Packit Service 9fb14c
                return False
Packit Service 9fb14c
        return True
Packit Service 9fb14c
Packit Service 9fb14c
    def wait(self):
Packit Service 9fb14c
        self.window.set_cursor(self.busy_cursor)
Packit Service 9fb14c
        semanagePage.idle_func()
Packit Service 9fb14c
Packit Service 9fb14c
    def ready(self):
Packit Service 9fb14c
        self.window.set_cursor(self.ready_cursor)
Packit Service 9fb14c
        semanagePage.idle_func()
Packit Service 9fb14c
Packit Service 9fb14c
    def deleteDialog(self):
Packit Service 9fb14c
        store, iter = self.booleansView.get_selection().get_selected()
Packit Service 9fb14c
        if iter is None:
Packit Service 9fb14c
            return
Packit Service 9fb14c
        boolean = store.get_value(iter, BOOLEAN)
Packit Service 9fb14c
        # change cursor
Packit Service 9fb14c
        if boolean is None:
Packit Service 9fb14c
            return
Packit Service 9fb14c
        try:
Packit Service 9fb14c
            self.wait()
Packit Service 9fb14c
            (rc, out) = getstatusoutput("semanage boolean -d %s" % boolean)
Packit Service 9fb14c
Packit Service 9fb14c
            self.ready()
Packit Service 9fb14c
            if rc != 0:
Packit Service 9fb14c
                return self.error(out)
Packit Service 9fb14c
            self.load(self.filter)
Packit Service 9fb14c
        except ValueError as e:
Packit Service 9fb14c
            self.error(e.args[0])
Packit Service 9fb14c
Packit Service 9fb14c
    def filter_changed(self, *arg):
Packit Service 9fb14c
        filter = arg[0].get_text()
Packit Service 9fb14c
        if filter != self.filter:
Packit Service 9fb14c
            self.load(filter)
Packit Service 9fb14c
            self.filter = filter
Packit Service 9fb14c
Packit Service 9fb14c
    def use_menus(self):
Packit Service 9fb14c
        return False
Packit Service 9fb14c
Packit Service 9fb14c
    def get_description(self):
Packit Service 9fb14c
        return _("Boolean")
Packit Service 9fb14c
Packit Service 9fb14c
    def match(self, key, filter=""):
Packit Service 9fb14c
        try:
Packit Service 9fb14c
            f = filter.lower()
Packit Service 9fb14c
            cat = self.booleans.get_category(key).lower()
Packit Service 9fb14c
            val = self.booleans.get_desc(key).lower()
Packit Service 9fb14c
            k = key.lower()
Packit Service 9fb14c
            return val.find(f) >= 0 or k.find(f) >= 0 or cat.find(f) >= 0
Packit Service 9fb14c
        except:
Packit Service 9fb14c
            return False
Packit Service 9fb14c
Packit Service 9fb14c
    def load(self, filter=None):
Packit Service 9fb14c
        self.store.clear()
Packit Service 9fb14c
        self.booleans = seobject.booleanRecords()
Packit Service 9fb14c
        booleansList = self.booleans.get_all(self.local)
Packit Service 9fb14c
        for name in booleansList:
Packit Service 9fb14c
            rec = booleansList[name]
Packit Service 9fb14c
            if self.match(name, filter):
Packit Service 9fb14c
                iter = self.store.append()
Packit Service 9fb14c
                self.store.set_value(iter, ACTIVE, rec[2] == 1)
Packit Service 9fb14c
                self.store.set_value(iter, MODULE, self.booleans.get_category(name))
Packit Service 9fb14c
                self.store.set_value(iter, DESC, self.booleans.get_desc(name))
Packit Service 9fb14c
                self.store.set_value(iter, BOOLEAN, name)
Packit Service 9fb14c
Packit Service 9fb14c
    def boolean_toggled(self, widget, row):
Packit Service 9fb14c
        iter = self.store.get_iter(row)
Packit Service 9fb14c
        val = self.store.get_value(iter, ACTIVE)
Packit Service 9fb14c
        key = self.store.get_value(iter, BOOLEAN)
Packit Service 9fb14c
        self.store.set_value(iter, ACTIVE, not val)
Packit Service 9fb14c
        self.wait()
Packit Service 9fb14c
        setsebool = "/usr/sbin/setsebool -P %s %d" % (key, not val)
Packit Service 9fb14c
        rc, out = getstatusoutput(setsebool)
Packit Service 9fb14c
        if rc != 0:
Packit Service 9fb14c
            self.error(out)
Packit Service 9fb14c
        self.load(self.filter)
Packit Service 9fb14c
        self.ready()
Packit Service 9fb14c
Packit Service 9fb14c
    def on_revert_clicked(self, button):
Packit Service 9fb14c
        self.wait()
Packit Service 9fb14c
        setsebool = "semanage boolean --deleteall"
Packit Service 9fb14c
        getstatusoutput(setsebool)
Packit Service 9fb14c
        self.load(self.filter)
Packit Service 9fb14c
        self.ready()
Packit Service 9fb14c
Packit Service 9fb14c
    def on_local_clicked(self, button):
Packit Service 9fb14c
        self.local = not self.local
Packit Service 9fb14c
        self.revertButton.set_sensitive(self.local)
Packit Service 9fb14c
Packit Service 9fb14c
        if self.local:
Packit Service 9fb14c
            button.set_label(_("all"))
Packit Service 9fb14c
        else:
Packit Service 9fb14c
            button.set_label(_("Customized"))
Packit Service 9fb14c
Packit Service 9fb14c
        self.load(self.filter)
Packit Service 9fb14c
        return True