xref: /aosp_15_r20/external/selinux/gui/semanagePage.py (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker## semanagePage.py - show selinux mappings
2*2d543d20SAndroid Build Coastguard Worker## Copyright (C) 2006 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 gi.repository import Gdk, Gtk
21*2d543d20SAndroid Build Coastguard Worker
22*2d543d20SAndroid Build Coastguard Worker##
23*2d543d20SAndroid Build Coastguard Worker## I18N
24*2d543d20SAndroid Build Coastguard Worker##
25*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-gui"
26*2d543d20SAndroid Build Coastguard Workertry:
27*2d543d20SAndroid Build Coastguard Worker    import gettext
28*2d543d20SAndroid Build Coastguard Worker    kwargs = {}
29*2d543d20SAndroid Build Coastguard Worker    if sys.version_info < (3,):
30*2d543d20SAndroid Build Coastguard Worker        kwargs['unicode'] = True
31*2d543d20SAndroid Build Coastguard Worker    t = gettext.translation(PROGNAME,
32*2d543d20SAndroid Build Coastguard Worker                    localedir="/usr/share/locale",
33*2d543d20SAndroid Build Coastguard Worker                    **kwargs,
34*2d543d20SAndroid Build Coastguard Worker                    fallback=True)
35*2d543d20SAndroid Build Coastguard Worker    _ = t.gettext
36*2d543d20SAndroid Build Coastguard Workerexcept:
37*2d543d20SAndroid Build Coastguard Worker    try:
38*2d543d20SAndroid Build Coastguard Worker        import builtins
39*2d543d20SAndroid Build Coastguard Worker        builtins.__dict__['_'] = str
40*2d543d20SAndroid Build Coastguard Worker    except ImportError:
41*2d543d20SAndroid Build Coastguard Worker        import __builtin__
42*2d543d20SAndroid Build Coastguard Worker        __builtin__.__dict__['_'] = unicode
43*2d543d20SAndroid Build Coastguard Worker
44*2d543d20SAndroid Build Coastguard Worker
45*2d543d20SAndroid Build Coastguard Workerdef idle_func():
46*2d543d20SAndroid Build Coastguard Worker    while Gtk.events_pending():
47*2d543d20SAndroid Build Coastguard Worker        Gtk.main_iteration()
48*2d543d20SAndroid Build Coastguard Worker
49*2d543d20SAndroid Build Coastguard Worker
50*2d543d20SAndroid Build Coastguard Workerclass semanagePage:
51*2d543d20SAndroid Build Coastguard Worker
52*2d543d20SAndroid Build Coastguard Worker    def __init__(self, xml, name, description):
53*2d543d20SAndroid Build Coastguard Worker        self.xml = xml
54*2d543d20SAndroid Build Coastguard Worker        self.window = self.xml.get_object("mainWindow").get_root_window()
55*2d543d20SAndroid Build Coastguard Worker        self.busy_cursor = Gdk.Cursor.new(Gdk.CursorType.WATCH)
56*2d543d20SAndroid Build Coastguard Worker        self.ready_cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)
57*2d543d20SAndroid Build Coastguard Worker
58*2d543d20SAndroid Build Coastguard Worker        self.local = False
59*2d543d20SAndroid Build Coastguard Worker        self.view = xml.get_object("%sView" % name)
60*2d543d20SAndroid Build Coastguard Worker        self.dialog = xml.get_object("%sDialog" % name)
61*2d543d20SAndroid Build Coastguard Worker        self.filter_entry = xml.get_object("%sFilterEntry" % name)
62*2d543d20SAndroid Build Coastguard Worker        self.filter_entry.connect("focus_out_event", self.filter_changed)
63*2d543d20SAndroid Build Coastguard Worker        self.filter_entry.connect("activate", self.filter_changed)
64*2d543d20SAndroid Build Coastguard Worker        self.filter_entry.connect("changed", self.filter_changed)
65*2d543d20SAndroid Build Coastguard Worker
66*2d543d20SAndroid Build Coastguard Worker        self.view.connect("row_activated", self.rowActivated)
67*2d543d20SAndroid Build Coastguard Worker        self.view.get_selection().connect("changed", self.itemSelected)
68*2d543d20SAndroid Build Coastguard Worker        self.description = description
69*2d543d20SAndroid Build Coastguard Worker
70*2d543d20SAndroid Build Coastguard Worker    def wait(self):
71*2d543d20SAndroid Build Coastguard Worker        self.window.set_cursor(self.busy_cursor)
72*2d543d20SAndroid Build Coastguard Worker        idle_func()
73*2d543d20SAndroid Build Coastguard Worker
74*2d543d20SAndroid Build Coastguard Worker    def ready(self):
75*2d543d20SAndroid Build Coastguard Worker        self.window.set_cursor(self.ready_cursor)
76*2d543d20SAndroid Build Coastguard Worker        idle_func()
77*2d543d20SAndroid Build Coastguard Worker
78*2d543d20SAndroid Build Coastguard Worker    def get_description(self):
79*2d543d20SAndroid Build Coastguard Worker        return self.description
80*2d543d20SAndroid Build Coastguard Worker
81*2d543d20SAndroid Build Coastguard Worker    def itemSelected(self, selection):
82*2d543d20SAndroid Build Coastguard Worker        return
83*2d543d20SAndroid Build Coastguard Worker
84*2d543d20SAndroid Build Coastguard Worker    def filter_changed(self, *arg):
85*2d543d20SAndroid Build Coastguard Worker        filter = arg[0].get_text()
86*2d543d20SAndroid Build Coastguard Worker        if filter != self.filter:
87*2d543d20SAndroid Build Coastguard Worker            self.load(filter)
88*2d543d20SAndroid Build Coastguard Worker
89*2d543d20SAndroid Build Coastguard Worker    def search(self, model, col, key, i):
90*2d543d20SAndroid Build Coastguard Worker        sort_col = self.store.get_sort_column_id()[0]
91*2d543d20SAndroid Build Coastguard Worker        val = model.get_value(i, sort_col)
92*2d543d20SAndroid Build Coastguard Worker        if val.lower().startswith(key.lower()):
93*2d543d20SAndroid Build Coastguard Worker            return False
94*2d543d20SAndroid Build Coastguard Worker        return True
95*2d543d20SAndroid Build Coastguard Worker
96*2d543d20SAndroid Build Coastguard Worker    def match(self, target, filter):
97*2d543d20SAndroid Build Coastguard Worker        try:
98*2d543d20SAndroid Build Coastguard Worker            f = filter.lower()
99*2d543d20SAndroid Build Coastguard Worker            t = target.lower()
100*2d543d20SAndroid Build Coastguard Worker            if t.find(f) >= 0:
101*2d543d20SAndroid Build Coastguard Worker                return True
102*2d543d20SAndroid Build Coastguard Worker        except:
103*2d543d20SAndroid Build Coastguard Worker            pass
104*2d543d20SAndroid Build Coastguard Worker        return False
105*2d543d20SAndroid Build Coastguard Worker
106*2d543d20SAndroid Build Coastguard Worker    def rowActivated(self, view, row, Column):
107*2d543d20SAndroid Build Coastguard Worker        self.propertiesDialog()
108*2d543d20SAndroid Build Coastguard Worker
109*2d543d20SAndroid Build Coastguard Worker    def verify(self, message, title=""):
110*2d543d20SAndroid Build Coastguard Worker        dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO,
111*2d543d20SAndroid Build Coastguard Worker                                Gtk.ButtonsType.YES_NO,
112*2d543d20SAndroid Build Coastguard Worker                                message)
113*2d543d20SAndroid Build Coastguard Worker        dlg.set_title(title)
114*2d543d20SAndroid Build Coastguard Worker        dlg.set_position(Gtk.WindowPosition.MOUSE)
115*2d543d20SAndroid Build Coastguard Worker        dlg.show_all()
116*2d543d20SAndroid Build Coastguard Worker        rc = dlg.run()
117*2d543d20SAndroid Build Coastguard Worker        dlg.destroy()
118*2d543d20SAndroid Build Coastguard Worker        return rc
119*2d543d20SAndroid Build Coastguard Worker
120*2d543d20SAndroid Build Coastguard Worker    def error(self, message):
121*2d543d20SAndroid Build Coastguard Worker        dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
122*2d543d20SAndroid Build Coastguard Worker                                Gtk.ButtonsType.CLOSE,
123*2d543d20SAndroid Build Coastguard Worker                                message)
124*2d543d20SAndroid Build Coastguard Worker        dlg.set_position(Gtk.WindowPosition.MOUSE)
125*2d543d20SAndroid Build Coastguard Worker        dlg.show_all()
126*2d543d20SAndroid Build Coastguard Worker        dlg.run()
127*2d543d20SAndroid Build Coastguard Worker        dlg.destroy()
128*2d543d20SAndroid Build Coastguard Worker
129*2d543d20SAndroid Build Coastguard Worker    def deleteDialog(self):
130*2d543d20SAndroid Build Coastguard Worker        store, it = self.view.get_selection().get_selected()
131*2d543d20SAndroid Build Coastguard Worker        if (it is not None) and (self.verify(_("Are you sure you want to delete %s '%s'?" % (self.description, store.get_value(it, 0))), _("Delete %s" % self.description)) == Gtk.ResponseType.YES):
132*2d543d20SAndroid Build Coastguard Worker            self.delete()
133*2d543d20SAndroid Build Coastguard Worker
134*2d543d20SAndroid Build Coastguard Worker    def use_menus(self):
135*2d543d20SAndroid Build Coastguard Worker        return True
136*2d543d20SAndroid Build Coastguard Worker
137*2d543d20SAndroid Build Coastguard Worker    def addDialog(self):
138*2d543d20SAndroid Build Coastguard Worker        self.dialogClear()
139*2d543d20SAndroid Build Coastguard Worker        self.dialog.set_title(_("Add %s" % self.description))
140*2d543d20SAndroid Build Coastguard Worker        self.dialog.set_position(Gtk.WindowPosition.MOUSE)
141*2d543d20SAndroid Build Coastguard Worker
142*2d543d20SAndroid Build Coastguard Worker        while self.dialog.run() == Gtk.ResponseType.OK:
143*2d543d20SAndroid Build Coastguard Worker            try:
144*2d543d20SAndroid Build Coastguard Worker                if self.add() is False:
145*2d543d20SAndroid Build Coastguard Worker                    continue
146*2d543d20SAndroid Build Coastguard Worker                break
147*2d543d20SAndroid Build Coastguard Worker            except ValueError as e:
148*2d543d20SAndroid Build Coastguard Worker                self.error(e.args[0])
149*2d543d20SAndroid Build Coastguard Worker        self.dialog.hide()
150*2d543d20SAndroid Build Coastguard Worker
151*2d543d20SAndroid Build Coastguard Worker    def propertiesDialog(self):
152*2d543d20SAndroid Build Coastguard Worker        self.dialogInit()
153*2d543d20SAndroid Build Coastguard Worker        self.dialog.set_title(_("Modify %s" % self.description))
154*2d543d20SAndroid Build Coastguard Worker        self.dialog.set_position(Gtk.WindowPosition.MOUSE)
155*2d543d20SAndroid Build Coastguard Worker        while self.dialog.run() == Gtk.ResponseType.OK:
156*2d543d20SAndroid Build Coastguard Worker            try:
157*2d543d20SAndroid Build Coastguard Worker                if self.modify() is False:
158*2d543d20SAndroid Build Coastguard Worker                    continue
159*2d543d20SAndroid Build Coastguard Worker                break
160*2d543d20SAndroid Build Coastguard Worker            except ValueError as e:
161*2d543d20SAndroid Build Coastguard Worker                self.error(e.args[0])
162*2d543d20SAndroid Build Coastguard Worker        self.dialog.hide()
163*2d543d20SAndroid Build Coastguard Worker
164*2d543d20SAndroid Build Coastguard Worker    def on_local_clicked(self, button):
165*2d543d20SAndroid Build Coastguard Worker        self.local = not self.local
166*2d543d20SAndroid Build Coastguard Worker        if self.local:
167*2d543d20SAndroid Build Coastguard Worker            button.set_label(_("all"))
168*2d543d20SAndroid Build Coastguard Worker        else:
169*2d543d20SAndroid Build Coastguard Worker            button.set_label(_("Customized"))
170*2d543d20SAndroid Build Coastguard Worker
171*2d543d20SAndroid Build Coastguard Worker        self.load(self.filter)
172*2d543d20SAndroid Build Coastguard Worker        return True
173