Home | History | Annotate | Download | only in gui
      1 ## domainsPage.py - show selinux domains
      2 ## Copyright (C) 2009 Red Hat, Inc.
      3 
      4 ## This program is free software; you can redistribute it and/or modify
      5 ## it under the terms of the GNU General Public License as published by
      6 ## the Free Software Foundation; either version 2 of the License, or
      7 ## (at your option) any later version.
      8 
      9 ## This program is distributed in the hope that it will be useful,
     10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 ## GNU General Public License for more details.
     13 
     14 ## You should have received a copy of the GNU General Public License
     15 ## along with this program; if not, write to the Free Software
     16 ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     17 
     18 ## Author: Dan Walsh
     19 import os
     20 try:
     21     from subprocess import getstatusoutput
     22 except ImportError:
     23     from commands import getstatusoutput
     24 
     25 import sys
     26 from gi.repository import GObject, Gtk
     27 import sepolicy
     28 from semanagePage import *
     29 
     30 ##
     31 ## I18N
     32 ##
     33 PROGNAME = "policycoreutils"
     34 try:
     35     import gettext
     36     kwargs = {}
     37     if sys.version_info < (3,):
     38         kwargs['unicode'] = True
     39     gettext.install(PROGNAME,
     40                     localedir="/usr/share/locale",
     41                     codeset='utf-8',
     42                     **kwargs)
     43 except:
     44     try:
     45         import builtins
     46         builtins.__dict__['_'] = str
     47     except ImportError:
     48         import __builtin__
     49         __builtin__.__dict__['_'] = unicode
     50 
     51 
     52 class domainsPage(semanagePage):
     53 
     54     def __init__(self, xml):
     55         semanagePage.__init__(self, xml, "domains", _("Process Domain"))
     56         self.domain_filter = xml.get_object("domainsFilterEntry")
     57         self.domain_filter.connect("focus_out_event", self.filter_changed)
     58         self.domain_filter.connect("activate", self.filter_changed)
     59 
     60         self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING)
     61         self.view.set_model(self.store)
     62         self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
     63         col = Gtk.TreeViewColumn(_("Domain Name"), Gtk.CellRendererText(), text=0)
     64         col.set_sort_column_id(0)
     65         col.set_resizable(True)
     66         self.view.append_column(col)
     67         self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
     68         col = Gtk.TreeViewColumn(_("Mode"), Gtk.CellRendererText(), text=1)
     69         col.set_sort_column_id(1)
     70         col.set_resizable(True)
     71         self.view.append_column(col)
     72         self.view.get_selection().connect("changed", self.itemSelected)
     73 
     74         self.permissive_button = xml.get_object("permissiveButton")
     75         self.enforcing_button = xml.get_object("enforcingButton")
     76 
     77         self.domains = sepolicy.get_all_entrypoint_domains()
     78         self.load()
     79 
     80     def get_modules(self):
     81         modules = []
     82         fd = os.popen("semodule -l")
     83         mods = fd.readlines()
     84         fd.close()
     85         for l in mods:
     86             modules.append(l.split()[0])
     87         return modules
     88 
     89     def load(self, filter=""):
     90         self.filter = filter
     91         self.store.clear()
     92         try:
     93             modules = self.get_modules()
     94             for domain in self.domains:
     95                 if not self.match(domain, filter):
     96                     continue
     97                 iter = self.store.append()
     98                 self.store.set_value(iter, 0, domain)
     99                 t = "permissive_%s_t" % domain
    100                 if t in modules:
    101                     self.store.set_value(iter, 1, _("Permissive"))
    102                 else:
    103                     self.store.set_value(iter, 1, "")
    104         except:
    105             pass
    106         self.view.get_selection().select_path((0,))
    107 
    108     def itemSelected(self, selection):
    109         store, iter = selection.get_selected()
    110         if iter is None:
    111             return
    112         p = store.get_value(iter, 1) == _("Permissive")
    113         self.permissive_button.set_sensitive(not p)
    114         self.enforcing_button.set_sensitive(p)
    115 
    116     def deleteDialog(self):
    117         # Do nothing
    118         return self.delete()
    119 
    120     def delete(self):
    121         selection = self.view.get_selection()
    122         store, iter = selection.get_selected()
    123         domain = store.get_value(iter, 0)
    124         try:
    125             self.wait()
    126             status, output = getstatusoutput("semanage permissive -d %s_t" % domain)
    127             self.ready()
    128             if status != 0:
    129                 self.error(output)
    130             else:
    131                 domain = store.set_value(iter, 1, "")
    132                 self.itemSelected(selection)
    133 
    134         except ValueError as e:
    135             self.error(e.args[0])
    136 
    137     def propertiesDialog(self):
    138         # Do nothing
    139         return
    140 
    141     def addDialog(self):
    142         # Do nothing
    143         return self.add()
    144 
    145     def add(self):
    146         selection = self.view.get_selection()
    147         store, iter = selection.get_selected()
    148         domain = store.get_value(iter, 0)
    149         try:
    150             self.wait()
    151             status, output = getstatusoutput("semanage permissive -a %s_t" % domain)
    152             self.ready()
    153             if status != 0:
    154                 self.error(output)
    155             else:
    156                 domain = store.set_value(iter, 1, _("Permissive"))
    157                 self.itemSelected(selection)
    158 
    159         except ValueError as e:
    160             self.error(e.args[0])
    161