xref: /aosp_15_r20/external/selinux/gui/modulesPage.py (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker## modulesPage.py - show selinux mappings
2*2d543d20SAndroid Build Coastguard Worker## Copyright (C) 2006-2009 Red Hat, Inc.
3*2d543d20SAndroid Build Coastguard Worker
4*2d543d20SAndroid Build Coastguard Worker## This program is free software; you can redistribute it and/or modify
5*2d543d20SAndroid Build Coastguard Worker## it under the terms of the GNU General Public License as published by
6*2d543d20SAndroid Build Coastguard Worker## the Free Software Foundation; either version 2 of the License, or
7*2d543d20SAndroid Build Coastguard Worker## (at your option) any later version.
8*2d543d20SAndroid Build Coastguard Worker
9*2d543d20SAndroid Build Coastguard Worker## This program is distributed in the hope that it will be useful,
10*2d543d20SAndroid Build Coastguard Worker## but WITHOUT ANY WARRANTY; without even the implied warranty of
11*2d543d20SAndroid Build Coastguard Worker## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*2d543d20SAndroid Build Coastguard Worker## GNU General Public License for more details.
13*2d543d20SAndroid Build Coastguard Worker
14*2d543d20SAndroid Build Coastguard Worker## You should have received a copy of the GNU General Public License
15*2d543d20SAndroid Build Coastguard Worker## along with this program; if not, write to the Free Software
16*2d543d20SAndroid Build Coastguard Worker## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17*2d543d20SAndroid Build Coastguard Worker
18*2d543d20SAndroid Build Coastguard Worker## Author: Dan Walsh
19*2d543d20SAndroid Build Coastguard Workerimport sys
20*2d543d20SAndroid Build Coastguard Workerfrom subprocess import Popen, PIPE
21*2d543d20SAndroid Build Coastguard Workertry:
22*2d543d20SAndroid Build Coastguard Worker    from subprocess import getstatusoutput
23*2d543d20SAndroid Build Coastguard Workerexcept ImportError:
24*2d543d20SAndroid Build Coastguard Worker    from commands import getstatusoutput
25*2d543d20SAndroid Build Coastguard Worker
26*2d543d20SAndroid Build Coastguard Workerfrom gi.repository import GObject, Gtk
27*2d543d20SAndroid Build Coastguard Workerimport selinux
28*2d543d20SAndroid Build Coastguard Workerfrom semanagePage import *
29*2d543d20SAndroid Build Coastguard Worker
30*2d543d20SAndroid Build Coastguard Worker##
31*2d543d20SAndroid Build Coastguard Worker## I18N
32*2d543d20SAndroid Build Coastguard Worker##
33*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-gui"
34*2d543d20SAndroid Build Coastguard Workertry:
35*2d543d20SAndroid Build Coastguard Worker    import gettext
36*2d543d20SAndroid Build Coastguard Worker    kwargs = {}
37*2d543d20SAndroid Build Coastguard Worker    if sys.version_info < (3,):
38*2d543d20SAndroid Build Coastguard Worker        kwargs['unicode'] = True
39*2d543d20SAndroid Build Coastguard Worker    t = gettext.translation(PROGNAME,
40*2d543d20SAndroid Build Coastguard Worker                    localedir="/usr/share/locale",
41*2d543d20SAndroid Build Coastguard Worker                    **kwargs,
42*2d543d20SAndroid Build Coastguard Worker                    fallback=True)
43*2d543d20SAndroid Build Coastguard Worker    _ = t.gettext
44*2d543d20SAndroid Build Coastguard Workerexcept:
45*2d543d20SAndroid Build Coastguard Worker    try:
46*2d543d20SAndroid Build Coastguard Worker        import builtins
47*2d543d20SAndroid Build Coastguard Worker        builtins.__dict__['_'] = str
48*2d543d20SAndroid Build Coastguard Worker    except ImportError:
49*2d543d20SAndroid Build Coastguard Worker        import __builtin__
50*2d543d20SAndroid Build Coastguard Worker        __builtin__.__dict__['_'] = unicode
51*2d543d20SAndroid Build Coastguard Worker
52*2d543d20SAndroid Build Coastguard Worker
53*2d543d20SAndroid Build Coastguard Workerclass modulesPage(semanagePage):
54*2d543d20SAndroid Build Coastguard Worker
55*2d543d20SAndroid Build Coastguard Worker    def __init__(self, xml):
56*2d543d20SAndroid Build Coastguard Worker        semanagePage.__init__(self, xml, "modules", _("Policy Module"))
57*2d543d20SAndroid Build Coastguard Worker        self.module_filter = xml.get_object("modulesFilterEntry")
58*2d543d20SAndroid Build Coastguard Worker        self.module_filter.connect("focus_out_event", self.filter_changed)
59*2d543d20SAndroid Build Coastguard Worker        self.module_filter.connect("activate", self.filter_changed)
60*2d543d20SAndroid Build Coastguard Worker        self.audit_enabled = False
61*2d543d20SAndroid Build Coastguard Worker
62*2d543d20SAndroid Build Coastguard Worker        self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING,
63*2d543d20SAndroid Build Coastguard Worker                                   GObject.TYPE_STRING)
64*2d543d20SAndroid Build Coastguard Worker        self.view.set_model(self.store)
65*2d543d20SAndroid Build Coastguard Worker        self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
66*2d543d20SAndroid Build Coastguard Worker        col = Gtk.TreeViewColumn(_("Module Name"), Gtk.CellRendererText(), text=0)
67*2d543d20SAndroid Build Coastguard Worker        col.set_sort_column_id(0)
68*2d543d20SAndroid Build Coastguard Worker        col.set_resizable(True)
69*2d543d20SAndroid Build Coastguard Worker        self.view.append_column(col)
70*2d543d20SAndroid Build Coastguard Worker        self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
71*2d543d20SAndroid Build Coastguard Worker        col = Gtk.TreeViewColumn(_("Priority"), Gtk.CellRendererText(), text=1)
72*2d543d20SAndroid Build Coastguard Worker        self.enable_audit_button = xml.get_object("enableAuditButton")
73*2d543d20SAndroid Build Coastguard Worker        self.enable_audit_button.connect("clicked", self.enable_audit)
74*2d543d20SAndroid Build Coastguard Worker        self.new_button = xml.get_object("newModuleButton")
75*2d543d20SAndroid Build Coastguard Worker        self.new_button.connect("clicked", self.new_module)
76*2d543d20SAndroid Build Coastguard Worker        col.set_sort_column_id(1)
77*2d543d20SAndroid Build Coastguard Worker        col.set_resizable(True)
78*2d543d20SAndroid Build Coastguard Worker        self.view.append_column(col)
79*2d543d20SAndroid Build Coastguard Worker        self.store.set_sort_column_id(2, Gtk.SortType.ASCENDING)
80*2d543d20SAndroid Build Coastguard Worker        col = Gtk.TreeViewColumn(_("Kind"), Gtk.CellRendererText(), text=2)
81*2d543d20SAndroid Build Coastguard Worker        col.set_sort_column_id(2)
82*2d543d20SAndroid Build Coastguard Worker        col.set_resizable(True)
83*2d543d20SAndroid Build Coastguard Worker        self.view.append_column(col)
84*2d543d20SAndroid Build Coastguard Worker        self.store.set_sort_func(1, self.sort_int, "")
85*2d543d20SAndroid Build Coastguard Worker        status, self.policy_type = selinux.selinux_getpolicytype()
86*2d543d20SAndroid Build Coastguard Worker
87*2d543d20SAndroid Build Coastguard Worker        self.load()
88*2d543d20SAndroid Build Coastguard Worker
89*2d543d20SAndroid Build Coastguard Worker    def sort_int(self, treemodel, iter1, iter2, user_data):
90*2d543d20SAndroid Build Coastguard Worker        try:
91*2d543d20SAndroid Build Coastguard Worker            p1 = int(treemodel.get_value(iter1, 1))
92*2d543d20SAndroid Build Coastguard Worker            p2 = int(treemodel.get_value(iter1, 1))
93*2d543d20SAndroid Build Coastguard Worker            if p1 > p2:
94*2d543d20SAndroid Build Coastguard Worker                return 1
95*2d543d20SAndroid Build Coastguard Worker            if p1 == p2:
96*2d543d20SAndroid Build Coastguard Worker                return 0
97*2d543d20SAndroid Build Coastguard Worker            return -1
98*2d543d20SAndroid Build Coastguard Worker        except:
99*2d543d20SAndroid Build Coastguard Worker            return 0
100*2d543d20SAndroid Build Coastguard Worker
101*2d543d20SAndroid Build Coastguard Worker    def load(self, filter=""):
102*2d543d20SAndroid Build Coastguard Worker        self.filter = filter
103*2d543d20SAndroid Build Coastguard Worker        self.store.clear()
104*2d543d20SAndroid Build Coastguard Worker        try:
105*2d543d20SAndroid Build Coastguard Worker            fd = Popen("semodule -lfull", shell=True, stdout=PIPE).stdout
106*2d543d20SAndroid Build Coastguard Worker            l = fd.readlines()
107*2d543d20SAndroid Build Coastguard Worker            fd.close()
108*2d543d20SAndroid Build Coastguard Worker            for i in l:
109*2d543d20SAndroid Build Coastguard Worker                priority, module, kind = i.decode('utf-8').split()
110*2d543d20SAndroid Build Coastguard Worker                if not (self.match(module, filter) or self.match(priority, filter)):
111*2d543d20SAndroid Build Coastguard Worker                    continue
112*2d543d20SAndroid Build Coastguard Worker                iter = self.store.append()
113*2d543d20SAndroid Build Coastguard Worker                self.store.set_value(iter, 0, module.strip())
114*2d543d20SAndroid Build Coastguard Worker                self.store.set_value(iter, 1, priority.strip())
115*2d543d20SAndroid Build Coastguard Worker                self.store.set_value(iter, 2, kind.strip())
116*2d543d20SAndroid Build Coastguard Worker        except:
117*2d543d20SAndroid Build Coastguard Worker            pass
118*2d543d20SAndroid Build Coastguard Worker        self.view.get_selection().select_path((0,))
119*2d543d20SAndroid Build Coastguard Worker
120*2d543d20SAndroid Build Coastguard Worker    def new_module(self, args):
121*2d543d20SAndroid Build Coastguard Worker        try:
122*2d543d20SAndroid Build Coastguard Worker            Popen(["selinux-polgengui"])
123*2d543d20SAndroid Build Coastguard Worker        except ValueError as e:
124*2d543d20SAndroid Build Coastguard Worker            self.error(e.args[0])
125*2d543d20SAndroid Build Coastguard Worker
126*2d543d20SAndroid Build Coastguard Worker    def delete(self):
127*2d543d20SAndroid Build Coastguard Worker        store, iter = self.view.get_selection().get_selected()
128*2d543d20SAndroid Build Coastguard Worker        module = store.get_value(iter, 0)
129*2d543d20SAndroid Build Coastguard Worker        priority = store.get_value(iter, 1)
130*2d543d20SAndroid Build Coastguard Worker        try:
131*2d543d20SAndroid Build Coastguard Worker            self.wait()
132*2d543d20SAndroid Build Coastguard Worker            status, output = getstatusoutput("semodule -X %s -r %s" % (priority, module))
133*2d543d20SAndroid Build Coastguard Worker            self.ready()
134*2d543d20SAndroid Build Coastguard Worker            if status != 0:
135*2d543d20SAndroid Build Coastguard Worker                self.error(output)
136*2d543d20SAndroid Build Coastguard Worker            else:
137*2d543d20SAndroid Build Coastguard Worker                store.remove(iter)
138*2d543d20SAndroid Build Coastguard Worker                self.view.get_selection().select_path((0,))
139*2d543d20SAndroid Build Coastguard Worker
140*2d543d20SAndroid Build Coastguard Worker        except ValueError as e:
141*2d543d20SAndroid Build Coastguard Worker            self.error(e.args[0])
142*2d543d20SAndroid Build Coastguard Worker
143*2d543d20SAndroid Build Coastguard Worker    def enable_audit(self, button):
144*2d543d20SAndroid Build Coastguard Worker        self.audit_enabled = not self.audit_enabled
145*2d543d20SAndroid Build Coastguard Worker        try:
146*2d543d20SAndroid Build Coastguard Worker            self.wait()
147*2d543d20SAndroid Build Coastguard Worker            if self.audit_enabled:
148*2d543d20SAndroid Build Coastguard Worker                status, output = getstatusoutput("semodule -DB")
149*2d543d20SAndroid Build Coastguard Worker                button.set_label(_("Disable Audit"))
150*2d543d20SAndroid Build Coastguard Worker            else:
151*2d543d20SAndroid Build Coastguard Worker                status, output = getstatusoutput("semodule -B")
152*2d543d20SAndroid Build Coastguard Worker                button.set_label(_("Enable Audit"))
153*2d543d20SAndroid Build Coastguard Worker            self.ready()
154*2d543d20SAndroid Build Coastguard Worker
155*2d543d20SAndroid Build Coastguard Worker            if status != 0:
156*2d543d20SAndroid Build Coastguard Worker                self.error(output)
157*2d543d20SAndroid Build Coastguard Worker
158*2d543d20SAndroid Build Coastguard Worker        except ValueError as e:
159*2d543d20SAndroid Build Coastguard Worker            self.error(e.args[0])
160*2d543d20SAndroid Build Coastguard Worker
161*2d543d20SAndroid Build Coastguard Worker    def disable_audit(self, button):
162*2d543d20SAndroid Build Coastguard Worker        try:
163*2d543d20SAndroid Build Coastguard Worker            self.wait()
164*2d543d20SAndroid Build Coastguard Worker            status, output = getstatusoutput("semodule -B")
165*2d543d20SAndroid Build Coastguard Worker            self.ready()
166*2d543d20SAndroid Build Coastguard Worker            if status != 0:
167*2d543d20SAndroid Build Coastguard Worker                self.error(output)
168*2d543d20SAndroid Build Coastguard Worker
169*2d543d20SAndroid Build Coastguard Worker        except ValueError as e:
170*2d543d20SAndroid Build Coastguard Worker            self.error(e.args[0])
171*2d543d20SAndroid Build Coastguard Worker
172*2d543d20SAndroid Build Coastguard Worker    def propertiesDialog(self):
173*2d543d20SAndroid Build Coastguard Worker        # Do nothing
174*2d543d20SAndroid Build Coastguard Worker        return
175*2d543d20SAndroid Build Coastguard Worker
176*2d543d20SAndroid Build Coastguard Worker    def addDialog(self):
177*2d543d20SAndroid Build Coastguard Worker        dialog = Gtk.FileChooserDialog(_("Load Policy Module"),
178*2d543d20SAndroid Build Coastguard Worker                                       None,
179*2d543d20SAndroid Build Coastguard Worker                                       Gtk.FileChooserAction.OPEN,
180*2d543d20SAndroid Build Coastguard Worker                                       (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
181*2d543d20SAndroid Build Coastguard Worker                                        Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
182*2d543d20SAndroid Build Coastguard Worker        dialog.set_default_response(Gtk.ResponseType.OK)
183*2d543d20SAndroid Build Coastguard Worker
184*2d543d20SAndroid Build Coastguard Worker        filter = Gtk.FileFilter()
185*2d543d20SAndroid Build Coastguard Worker        filter.set_name("Policy Files")
186*2d543d20SAndroid Build Coastguard Worker        filter.add_pattern("*.pp")
187*2d543d20SAndroid Build Coastguard Worker        dialog.add_filter(filter)
188*2d543d20SAndroid Build Coastguard Worker
189*2d543d20SAndroid Build Coastguard Worker        response = dialog.run()
190*2d543d20SAndroid Build Coastguard Worker        if response == Gtk.ResponseType.OK:
191*2d543d20SAndroid Build Coastguard Worker            self.add(dialog.get_filename())
192*2d543d20SAndroid Build Coastguard Worker        dialog.destroy()
193*2d543d20SAndroid Build Coastguard Worker
194*2d543d20SAndroid Build Coastguard Worker    def add(self, file):
195*2d543d20SAndroid Build Coastguard Worker        try:
196*2d543d20SAndroid Build Coastguard Worker            self.wait()
197*2d543d20SAndroid Build Coastguard Worker            status, output = getstatusoutput("semodule -i %s" % file)
198*2d543d20SAndroid Build Coastguard Worker            self.ready()
199*2d543d20SAndroid Build Coastguard Worker            if status != 0:
200*2d543d20SAndroid Build Coastguard Worker                self.error(output)
201*2d543d20SAndroid Build Coastguard Worker            else:
202*2d543d20SAndroid Build Coastguard Worker                self.load()
203*2d543d20SAndroid Build Coastguard Worker
204*2d543d20SAndroid Build Coastguard Worker        except ValueError as e:
205*2d543d20SAndroid Build Coastguard Worker            self.error(e.args[0])
206