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
19import string
20import gtk
21import gtk.glade
22import os
23import commands
24import gobject
25import sys
26import seobject
27import selinux
28from semanagePage import *;
29from sepolicy import get_all_entrypoint_domains
30
31##
32## I18N
33##
34PROGNAME="policycoreutils"
35import gettext
36gettext.bindtextdomain(PROGNAME, "/usr/share/locale")
37gettext.textdomain(PROGNAME)
38try:
39    gettext.install(PROGNAME,
40                    localedir="/usr/share/locale",
41                    unicode=False,
42                    codeset = 'utf-8')
43except IOError:
44    import __builtin__
45    __builtin__.__dict__['_'] = unicode
46
47class domainsPage(semanagePage):
48    def __init__(self, xml):
49        semanagePage.__init__(self, xml, "domains", _("Process Domain"))
50        self.domain_filter = xml.get_widget("domainsFilterEntry")
51        self.domain_filter.connect("focus_out_event", self.filter_changed)
52        self.domain_filter.connect("activate", self.filter_changed)
53
54        self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
55        self.view.set_model(self.store)
56        self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
57        col = gtk.TreeViewColumn(_("Domain Name"), gtk.CellRendererText(), text = 0)
58        col.set_sort_column_id(0)
59        col.set_resizable(True)
60        self.view.append_column(col)
61        self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
62        col = gtk.TreeViewColumn(_("Mode"), gtk.CellRendererText(), text = 1)
63        col.set_sort_column_id(1)
64        col.set_resizable(True)
65        self.view.append_column(col)
66        self.view.get_selection().connect("changed", self.itemSelected)
67
68        self.permissive_button = xml.get_widget("permissiveButton")
69        self.enforcing_button = xml.get_widget("enforcingButton")
70
71        self.domains=get_all_entrypoint_domains()
72        self.load()
73
74    def get_modules(self):
75        modules=[]
76        fd=os.popen("semodule -l")
77        mods = fd.readlines()
78        fd.close()
79        for l in mods:
80            modules.append(l.split()[0])
81        return modules
82
83    def load(self, filter=""):
84        self.filter=filter
85        self.store.clear()
86        try:
87            modules=self.get_modules()
88            for domain in self.domains:
89                if not self.match(domain, filter):
90                    continue
91                iter = self.store.append()
92                self.store.set_value(iter, 0, domain)
93                t = "permissive_%s_t" % domain
94                if t in modules:
95                    self.store.set_value(iter, 1, _("Permissive"))
96                else:
97                    self.store.set_value(iter, 1, "")
98        except:
99            pass
100        self.view.get_selection().select_path ((0,))
101
102    def itemSelected(self, selection):
103        store, iter = selection.get_selected()
104        if iter == None:
105            return
106        p = store.get_value(iter, 1) == _("Permissive")
107        self.permissive_button.set_sensitive(not p)
108        self.enforcing_button.set_sensitive(p)
109
110    def deleteDialog(self):
111        # Do nothing
112        return self.delete()
113
114    def delete(self):
115        selection = self.view.get_selection()
116        store, iter = selection.get_selected()
117        domain = store.get_value(iter, 0)
118        try:
119            self.wait()
120            status, output = commands.getstatusoutput("semanage permissive -d %s_t" % domain)
121            self.ready()
122            if status != 0:
123                self.error(output)
124            else:
125                domain = store.set_value(iter, 1, "")
126                self.itemSelected(selection)
127
128        except ValueError, e:
129            self.error(e.args[0])
130
131    def propertiesDialog(self):
132        # Do nothing
133        return
134
135    def addDialog(self):
136        # Do nothing
137        return self.add()
138
139    def add(self):
140        selection = self.view.get_selection()
141        store, iter = selection.get_selected()
142        domain = store.get_value(iter, 0)
143        try:
144            self.wait()
145            status, output = commands.getstatusoutput("semanage permissive -a %s_t" % domain)
146            self.ready()
147            if status != 0:
148                self.error(output)
149            else:
150                domain = store.set_value(iter, 1, _("Permissive"))
151                self.itemSelected(selection)
152
153        except ValueError, e:
154            self.error(e.args[0])
155