Blame gui/portsPage.py

Packit Service 9fb14c
## portsPage.py - show selinux mappings
Packit Service 9fb14c
## Copyright (C) 2006 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
## along with this program; if not, write to the Free Software
Packit Service 9fb14c
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Packit Service 9fb14c
Packit Service 9fb14c
## Author: Dan Walsh
Packit Service 9fb14c
import sys
Packit Service 9fb14c
from gi.repository import GObject, Gtk
Packit Service 9fb14c
import seobject
Packit Service 9fb14c
Packit Service 9fb14c
TYPE_COL = 0
Packit Service 9fb14c
PROTOCOL_COL = 1
Packit Service 9fb14c
MLS_COL = 2
Packit Service 9fb14c
PORT_COL = 3
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
from semanagePage import *
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 portsPage(semanagePage):
Packit Service 9fb14c
Packit Service 9fb14c
    def __init__(self, xml):
Packit Service 9fb14c
        semanagePage.__init__(self, xml, "ports", _("Network Port"))
Packit Service 9fb14c
        group_listview = xml.get_object("listViewButton")
Packit Service 9fb14c
        group_listview.connect("clicked", self.on_group_clicked)
Packit Service 9fb14c
        self.group = False
Packit Service 9fb14c
        self.ports_filter = xml.get_object("portsFilterEntry")
Packit Service 9fb14c
        self.ports_filter.connect("focus_out_event", self.filter_changed)
Packit Service 9fb14c
        self.ports_filter.connect("activate", self.filter_changed)
Packit Service 9fb14c
        self.ports_name_entry = xml.get_object("portsNameEntry")
Packit Service 9fb14c
        self.ports_protocol_combo = xml.get_object("portsProtocolCombo")
Packit Service 9fb14c
        self.ports_number_entry = xml.get_object("portsNumberEntry")
Packit Service 9fb14c
        self.ports_mls_entry = xml.get_object("portsMLSEntry")
Packit Service 9fb14c
        self.ports_add_button = xml.get_object("portsAddButton")
Packit Service 9fb14c
        self.ports_properties_button = xml.get_object("portsPropertiesButton")
Packit Service 9fb14c
        self.ports_delete_button = xml.get_object("portsDeleteButton")
Packit Service 9fb14c
        liststore = self.ports_protocol_combo.get_model()
Packit Service 9fb14c
        iter = liststore.get_iter_first()
Packit Service 9fb14c
        self.ports_protocol_combo.set_active_iter(iter)
Packit Service 9fb14c
        self.init_store()
Packit Service 9fb14c
        self.edit = True
Packit Service 9fb14c
        self.load()
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
            if self.edit:
Packit Service 9fb14c
                self.load(filter)
Packit Service 9fb14c
            else:
Packit Service 9fb14c
                self.group_load(filter)
Packit Service 9fb14c
Packit Service 9fb14c
    def init_store(self):
Packit Service 9fb14c
        self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
Packit Service 9fb14c
        self.view.set_model(self.store)
Packit Service 9fb14c
        self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
Packit Service 9fb14c
Packit Service 9fb14c
        self.view.set_search_equal_func(self.search)
Packit Service 9fb14c
        col = Gtk.TreeViewColumn(_("SELinux Port\nType"), Gtk.CellRendererText(), text=TYPE_COL)
Packit Service 9fb14c
        col.set_sort_column_id(TYPE_COL)
Packit Service 9fb14c
        col.set_resizable(True)
Packit Service 9fb14c
        self.view.append_column(col)
Packit Service 9fb14c
        self.store.set_sort_column_id(TYPE_COL, Gtk.SortType.ASCENDING)
Packit Service 9fb14c
Packit Service 9fb14c
        col = Gtk.TreeViewColumn(_("Protocol"), Gtk.CellRendererText(), text=PROTOCOL_COL)
Packit Service 9fb14c
        col.set_sort_column_id(PROTOCOL_COL)
Packit Service 9fb14c
        col.set_resizable(True)
Packit Service 9fb14c
        self.view.append_column(col)
Packit Service 9fb14c
Packit Service 9fb14c
        self.mls_col = Gtk.TreeViewColumn(_("MLS/MCS\nLevel"), Gtk.CellRendererText(), text=MLS_COL)
Packit Service 9fb14c
        self.mls_col.set_resizable(True)
Packit Service 9fb14c
        self.mls_col.set_sort_column_id(MLS_COL)
Packit Service 9fb14c
        self.view.append_column(self.mls_col)
Packit Service 9fb14c
Packit Service 9fb14c
        col = Gtk.TreeViewColumn(_("Port"), Gtk.CellRendererText(), text=PORT_COL)
Packit Service 9fb14c
        col.set_sort_column_id(PORT_COL)
Packit Service 9fb14c
        col.set_resizable(True)
Packit Service 9fb14c
        self.view.append_column(col)
Packit Service 9fb14c
        self.store.set_sort_func(PORT_COL, self.sort_int, "")
Packit Service 9fb14c
Packit Service 9fb14c
    def sort_int(self, treemodel, iter1, iter2, user_data):
Packit Service 9fb14c
        try:
Packit Service 9fb14c
            p1 = int(treemodel.get_value(iter1, PORT_COL).split('-')[0])
Packit Service 9fb14c
            p2 = int(treemodel.get_value(iter2, PORT_COL).split('-')[0])
Packit Service 9fb14c
            if p1 > p2:
Packit Service 9fb14c
                return 1
Packit Service 9fb14c
            if p1 == p2:
Packit Service 9fb14c
                return 0
Packit Service 9fb14c
            return -1
Packit Service 9fb14c
        except:
Packit Service 9fb14c
            return 0
Packit Service 9fb14c
Packit Service 9fb14c
    def load(self, filter=""):
Packit Service 9fb14c
        self.filter = filter
Packit Service 9fb14c
        self.port = seobject.portRecords()
Packit Service 9fb14c
        dict = self.port.get_all(self.local)
Packit Service 9fb14c
        self.store.clear()
Packit Service 9fb14c
        for k in sorted(dict.keys()):
Packit Service 9fb14c
            if not (self.match(str(k[0]), filter) or self.match(dict[k][0], filter) or self.match(k[2], filter) or self.match(dict[k][1], filter) or self.match(dict[k][1], filter)):
Packit Service 9fb14c
                continue
Packit Service 9fb14c
            iter = self.store.append()
Packit Service 9fb14c
            if k[0] == k[1]:
Packit Service 9fb14c
                self.store.set_value(iter, PORT_COL, str(k[0]))
Packit Service 9fb14c
            else:
Packit Service 9fb14c
                rec = "%s-%s" % k[:2]
Packit Service 9fb14c
                self.store.set_value(iter, PORT_COL, rec)
Packit Service 9fb14c
            self.store.set_value(iter, TYPE_COL, dict[k][0])
Packit Service 9fb14c
            self.store.set_value(iter, PROTOCOL_COL, k[2])
Packit Service 9fb14c
            self.store.set_value(iter, MLS_COL, dict[k][1])
Packit Service 9fb14c
        self.view.get_selection().select_path((0,))
Packit Service 9fb14c
Packit Service 9fb14c
    def group_load(self, filter=""):
Packit Service 9fb14c
        self.filter = filter
Packit Service 9fb14c
        self.port = seobject.portRecords()
Packit Service 9fb14c
        dict = self.port.get_all_by_type(self.local)
Packit Service 9fb14c
        self.store.clear()
Packit Service 9fb14c
        for k in sorted(dict.keys()):
Packit Service 9fb14c
            ports_string = ", ".join(dict[k])
Packit Service 9fb14c
            if not (self.match(ports_string, filter) or self.match(k[0], filter) or self.match(k[1], filter)):
Packit Service 9fb14c
                continue
Packit Service 9fb14c
            iter = self.store.append()
Packit Service 9fb14c
            self.store.set_value(iter, TYPE_COL, k[0])
Packit Service 9fb14c
            self.store.set_value(iter, PROTOCOL_COL, k[1])
Packit Service 9fb14c
            self.store.set_value(iter, PORT_COL, ports_string)
Packit Service 9fb14c
            self.store.set_value(iter, MLS_COL, "")
Packit Service 9fb14c
        self.view.get_selection().select_path((0,))
Packit Service 9fb14c
Packit Service 9fb14c
    def propertiesDialog(self):
Packit Service 9fb14c
        if self.edit:
Packit Service 9fb14c
            semanagePage.propertiesDialog(self)
Packit Service 9fb14c
Packit Service 9fb14c
    def dialogInit(self):
Packit Service 9fb14c
        store, iter = self.view.get_selection().get_selected()
Packit Service 9fb14c
        self.ports_number_entry.set_text(store.get_value(iter, PORT_COL))
Packit Service 9fb14c
        self.ports_number_entry.set_sensitive(False)
Packit Service 9fb14c
        self.ports_protocol_combo.set_sensitive(False)
Packit Service 9fb14c
        self.ports_name_entry.set_text(store.get_value(iter, TYPE_COL))
Packit Service 9fb14c
        self.ports_mls_entry.set_text(store.get_value(iter, MLS_COL))
Packit Service 9fb14c
        protocol = store.get_value(iter, PROTOCOL_COL)
Packit Service 9fb14c
        liststore = self.ports_protocol_combo.get_model()
Packit Service 9fb14c
        iter = liststore.get_iter_first()
Packit Service 9fb14c
        while iter != None and liststore.get_value(iter, 0) != protocol:
Packit Service 9fb14c
            iter = liststore.iter_next(iter)
Packit Service 9fb14c
        if iter != None:
Packit Service 9fb14c
            self.ports_protocol_combo.set_active_iter(iter)
Packit Service 9fb14c
Packit Service 9fb14c
    def dialogClear(self):
Packit Service 9fb14c
        self.ports_number_entry.set_text("")
Packit Service 9fb14c
        self.ports_number_entry.set_sensitive(True)
Packit Service 9fb14c
        self.ports_protocol_combo.set_sensitive(True)
Packit Service 9fb14c
        self.ports_name_entry.set_text("")
Packit Service 9fb14c
        self.ports_mls_entry.set_text("s0")
Packit Service 9fb14c
Packit Service 9fb14c
    def delete(self):
Packit Service 9fb14c
        store, iter = self.view.get_selection().get_selected()
Packit Service 9fb14c
        port = store.get_value(iter, PORT_COL)
Packit Service 9fb14c
        protocol = store.get_value(iter, 1)
Packit Service 9fb14c
        try:
Packit Service 9fb14c
            self.wait()
Packit Service 9fb14c
            (rc, out) = getstatusoutput("semanage port -d -p %s %s" % (protocol, port))
Packit Service 9fb14c
            self.ready()
Packit Service 9fb14c
            if rc != 0:
Packit Service 9fb14c
                return self.error(out)
Packit Service 9fb14c
            store.remove(iter)
Packit Service 9fb14c
            self.view.get_selection().select_path((0,))
Packit Service 9fb14c
        except ValueError as e:
Packit Service 9fb14c
            self.error(e.args[0])
Packit Service 9fb14c
Packit Service 9fb14c
    def add(self):
Packit Service 9fb14c
        target = self.ports_name_entry.get_text().strip()
Packit Service 9fb14c
        mls = self.ports_mls_entry.get_text().strip()
Packit Service 9fb14c
        port_number = self.ports_number_entry.get_text().strip()
Packit Service 9fb14c
        if port_number == "":
Packit Service 9fb14c
            port_number = "1"
Packit Service 9fb14c
        for i in port_number.split("-"):
Packit Service 9fb14c
            if not i.isdigit():
Packit Service 9fb14c
                self.error(_("Port number \"%s\" is not valid.  0 < PORT_NUMBER < 65536 ") % port_number)
Packit Service 9fb14c
                return False
Packit Service 9fb14c
        list_model = self.ports_protocol_combo.get_model()
Packit Service 9fb14c
        iter = self.ports_protocol_combo.get_active_iter()
Packit Service 9fb14c
        protocol = list_model.get_value(iter, 0)
Packit Service 9fb14c
        self.wait()
Packit Service 9fb14c
        (rc, out) = getstatusoutput("semanage port -a -p %s -r %s -t %s %s" % (protocol, mls, target, port_number))
Packit Service 9fb14c
        self.ready()
Packit Service 9fb14c
        if rc != 0:
Packit Service 9fb14c
            self.error(out)
Packit Service 9fb14c
            return False
Packit Service 9fb14c
        iter = self.store.append()
Packit Service 9fb14c
Packit Service 9fb14c
        self.store.set_value(iter, TYPE_COL, target)
Packit Service 9fb14c
        self.store.set_value(iter, PORT_COL, port_number)
Packit Service 9fb14c
        self.store.set_value(iter, PROTOCOL_COL, protocol)
Packit Service 9fb14c
        self.store.set_value(iter, MLS_COL, mls)
Packit Service 9fb14c
Packit Service 9fb14c
    def modify(self):
Packit Service 9fb14c
        target = self.ports_name_entry.get_text().strip()
Packit Service 9fb14c
        mls = self.ports_mls_entry.get_text().strip()
Packit Service 9fb14c
        port_number = self.ports_number_entry.get_text().strip()
Packit Service 9fb14c
        list_model = self.ports_protocol_combo.get_model()
Packit Service 9fb14c
        iter = self.ports_protocol_combo.get_active_iter()
Packit Service 9fb14c
        protocol = list_model.get_value(iter, 0)
Packit Service 9fb14c
        self.wait()
Packit Service 9fb14c
        (rc, out) = getstatusoutput("semanage port -m -p %s -r %s -t %s %s" % (protocol, mls, target, port_number))
Packit Service 9fb14c
        self.ready()
Packit Service 9fb14c
        if rc != 0:
Packit Service 9fb14c
            self.error(out)
Packit Service 9fb14c
            return False
Packit Service 9fb14c
        store, iter = self.view.get_selection().get_selected()
Packit Service 9fb14c
        self.store.set_value(iter, TYPE_COL, target)
Packit Service 9fb14c
        self.store.set_value(iter, PORT_COL, port_number)
Packit Service 9fb14c
        self.store.set_value(iter, PROTOCOL_COL, protocol)
Packit Service 9fb14c
        self.store.set_value(iter, MLS_COL, mls)
Packit Service 9fb14c
Packit Service 9fb14c
    def on_group_clicked(self, button):
Packit Service 9fb14c
        self.ports_add_button.set_sensitive(self.group)
Packit Service 9fb14c
        self.ports_properties_button.set_sensitive(self.group)
Packit Service 9fb14c
        self.ports_delete_button.set_sensitive(self.group)
Packit Service 9fb14c
        self.mls_col.set_visible(self.group)
Packit Service 9fb14c
Packit Service 9fb14c
        self.group = not self.group
Packit Service 9fb14c
        if self.group:
Packit Service 9fb14c
            button.set_label(_("List View"))
Packit Service 9fb14c
            self.group_load(self.filter)
Packit Service 9fb14c
        else:
Packit Service 9fb14c
            button.set_label(_("Group View"))
Packit Service 9fb14c
            self.load(self.filter)
Packit Service 9fb14c
Packit Service 9fb14c
        return True