xref: /aosp_15_r20/external/selinux/gui/system-config-selinux.py (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker#!/usr/bin/python3 -EsI
2*2d543d20SAndroid Build Coastguard Worker#
3*2d543d20SAndroid Build Coastguard Worker# system-config-selinux.py - GUI for SELinux Config tool in system-config-selinux
4*2d543d20SAndroid Build Coastguard Worker#
5*2d543d20SAndroid Build Coastguard Worker# Dan Walsh <[email protected]>
6*2d543d20SAndroid Build Coastguard Worker#
7*2d543d20SAndroid Build Coastguard Worker# Copyright 2006-2009 Red Hat, Inc.
8*2d543d20SAndroid Build Coastguard Worker#
9*2d543d20SAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify
10*2d543d20SAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by
11*2d543d20SAndroid Build Coastguard Worker# the Free Software Foundation; either version 2 of the License, or
12*2d543d20SAndroid Build Coastguard Worker# (at your option) any later version.
13*2d543d20SAndroid Build Coastguard Worker#
14*2d543d20SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful,
15*2d543d20SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of
16*2d543d20SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*2d543d20SAndroid Build Coastguard Worker# GNU General Public License for more details.
18*2d543d20SAndroid Build Coastguard Worker#
19*2d543d20SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License
20*2d543d20SAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software
21*2d543d20SAndroid Build Coastguard Worker# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22*2d543d20SAndroid Build Coastguard Worker#
23*2d543d20SAndroid Build Coastguard Workerimport os
24*2d543d20SAndroid Build Coastguard Workerimport signal
25*2d543d20SAndroid Build Coastguard Workerimport sys
26*2d543d20SAndroid Build Coastguard Workerimport gi
27*2d543d20SAndroid Build Coastguard Workergi.require_version('Gtk', '3.0')
28*2d543d20SAndroid Build Coastguard Workertry:
29*2d543d20SAndroid Build Coastguard Worker    from gi.repository import Gtk
30*2d543d20SAndroid Build Coastguard Workerexcept RuntimeError as e:
31*2d543d20SAndroid Build Coastguard Worker    print("system-config-selinux:", e)
32*2d543d20SAndroid Build Coastguard Worker    print("This is a graphical application and requires DISPLAY to be set.")
33*2d543d20SAndroid Build Coastguard Worker    sys.exit(1)
34*2d543d20SAndroid Build Coastguard Worker
35*2d543d20SAndroid Build Coastguard Workersys.path.append('/usr/share/system-config-selinux')
36*2d543d20SAndroid Build Coastguard Worker
37*2d543d20SAndroid Build Coastguard Workerfrom gi.repository import GObject
38*2d543d20SAndroid Build Coastguard Workerimport statusPage
39*2d543d20SAndroid Build Coastguard Workerimport booleansPage
40*2d543d20SAndroid Build Coastguard Workerimport loginsPage
41*2d543d20SAndroid Build Coastguard Workerimport usersPage
42*2d543d20SAndroid Build Coastguard Workerimport portsPage
43*2d543d20SAndroid Build Coastguard Workerimport modulesPage
44*2d543d20SAndroid Build Coastguard Workerimport domainsPage
45*2d543d20SAndroid Build Coastguard Workerimport fcontextPage
46*2d543d20SAndroid Build Coastguard Workerimport selinux
47*2d543d20SAndroid Build Coastguard Worker##
48*2d543d20SAndroid Build Coastguard Worker## I18N
49*2d543d20SAndroid Build Coastguard Worker##
50*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-gui"
51*2d543d20SAndroid Build Coastguard Workertry:
52*2d543d20SAndroid Build Coastguard Worker    import gettext
53*2d543d20SAndroid Build Coastguard Worker    kwargs = {}
54*2d543d20SAndroid Build Coastguard Worker    if sys.version_info < (3,):
55*2d543d20SAndroid Build Coastguard Worker        kwargs['unicode'] = True
56*2d543d20SAndroid Build Coastguard Worker    t = gettext.translation(PROGNAME,
57*2d543d20SAndroid Build Coastguard Worker                    localedir="/usr/share/locale",
58*2d543d20SAndroid Build Coastguard Worker                    **kwargs,
59*2d543d20SAndroid Build Coastguard Worker                    fallback=True)
60*2d543d20SAndroid Build Coastguard Worker    _ = t.gettext
61*2d543d20SAndroid Build Coastguard Workerexcept:
62*2d543d20SAndroid Build Coastguard Worker    try:
63*2d543d20SAndroid Build Coastguard Worker        import builtins
64*2d543d20SAndroid Build Coastguard Worker        builtins.__dict__['_'] = str
65*2d543d20SAndroid Build Coastguard Worker    except ImportError:
66*2d543d20SAndroid Build Coastguard Worker        import __builtin__
67*2d543d20SAndroid Build Coastguard Worker        __builtin__.__dict__['_'] = unicode
68*2d543d20SAndroid Build Coastguard Worker
69*2d543d20SAndroid Build Coastguard Workerversion = "1.0"
70*2d543d20SAndroid Build Coastguard Worker
71*2d543d20SAndroid Build Coastguard Worker
72*2d543d20SAndroid Build Coastguard Worker##
73*2d543d20SAndroid Build Coastguard Worker## Pull in the Glade file
74*2d543d20SAndroid Build Coastguard Worker##
75*2d543d20SAndroid Build Coastguard Workerxml = Gtk.Builder()
76*2d543d20SAndroid Build Coastguard Workerxml.set_translation_domain(PROGNAME)
77*2d543d20SAndroid Build Coastguard Workerif os.access("system-config-selinux.ui", os.F_OK):
78*2d543d20SAndroid Build Coastguard Worker    xml.add_from_file("system-config-selinux.ui")
79*2d543d20SAndroid Build Coastguard Workerelse:
80*2d543d20SAndroid Build Coastguard Worker    xml.add_from_file("/usr/share/system-config-selinux/system-config-selinux.ui")
81*2d543d20SAndroid Build Coastguard Worker
82*2d543d20SAndroid Build Coastguard Worker
83*2d543d20SAndroid Build Coastguard Workerclass childWindow:
84*2d543d20SAndroid Build Coastguard Worker
85*2d543d20SAndroid Build Coastguard Worker    def __init__(self):
86*2d543d20SAndroid Build Coastguard Worker        self.tabs = []
87*2d543d20SAndroid Build Coastguard Worker        self.xml = xml
88*2d543d20SAndroid Build Coastguard Worker        xml.connect_signals({
89*2d543d20SAndroid Build Coastguard Worker            "on_quit_activate": self.destroy,
90*2d543d20SAndroid Build Coastguard Worker            "on_delete_clicked": self.delete,
91*2d543d20SAndroid Build Coastguard Worker            "on_add_clicked": self.add,
92*2d543d20SAndroid Build Coastguard Worker            "on_properties_clicked": self.properties,
93*2d543d20SAndroid Build Coastguard Worker            "on_local_clicked": self.on_local_clicked,
94*2d543d20SAndroid Build Coastguard Worker            "on_policy_activate": self.policy,
95*2d543d20SAndroid Build Coastguard Worker            "on_logging_activate": self.logging,
96*2d543d20SAndroid Build Coastguard Worker            "on_about_activate": self.on_about_activate,
97*2d543d20SAndroid Build Coastguard Worker        })
98*2d543d20SAndroid Build Coastguard Worker        self.add_page(statusPage.statusPage(xml))
99*2d543d20SAndroid Build Coastguard Worker        if selinux.is_selinux_enabled() > 0:
100*2d543d20SAndroid Build Coastguard Worker            try:
101*2d543d20SAndroid Build Coastguard Worker                self.add_page(booleansPage.booleansPage(xml))
102*2d543d20SAndroid Build Coastguard Worker                self.add_page(fcontextPage.fcontextPage(xml))
103*2d543d20SAndroid Build Coastguard Worker                self.add_page(loginsPage.loginsPage(xml))
104*2d543d20SAndroid Build Coastguard Worker                self.add_page(usersPage.usersPage(xml))
105*2d543d20SAndroid Build Coastguard Worker                self.add_page(portsPage.portsPage(xml))
106*2d543d20SAndroid Build Coastguard Worker                self.add_page(modulesPage.modulesPage(xml))  # modules
107*2d543d20SAndroid Build Coastguard Worker                self.add_page(domainsPage.domainsPage(xml))  # domains
108*2d543d20SAndroid Build Coastguard Worker            except ValueError as e:
109*2d543d20SAndroid Build Coastguard Worker                self.error(e.message)
110*2d543d20SAndroid Build Coastguard Worker
111*2d543d20SAndroid Build Coastguard Worker        self.add_menu = xml.get_object("add_menu_item")
112*2d543d20SAndroid Build Coastguard Worker        self.properties_menu = xml.get_object("properties_menu_item")
113*2d543d20SAndroid Build Coastguard Worker        self.delete_menu = xml.get_object("delete_menu_item")
114*2d543d20SAndroid Build Coastguard Worker
115*2d543d20SAndroid Build Coastguard Worker    def error(self, message):
116*2d543d20SAndroid Build Coastguard Worker        dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
117*2d543d20SAndroid Build Coastguard Worker                                Gtk.ButtonsType.CLOSE,
118*2d543d20SAndroid Build Coastguard Worker                                message)
119*2d543d20SAndroid Build Coastguard Worker        dlg.set_position(Gtk.WindowPosition.MOUSE)
120*2d543d20SAndroid Build Coastguard Worker        dlg.show_all()
121*2d543d20SAndroid Build Coastguard Worker        dlg.run()
122*2d543d20SAndroid Build Coastguard Worker        dlg.destroy()
123*2d543d20SAndroid Build Coastguard Worker
124*2d543d20SAndroid Build Coastguard Worker    def add_page(self, page):
125*2d543d20SAndroid Build Coastguard Worker        self.tabs.append(page)
126*2d543d20SAndroid Build Coastguard Worker
127*2d543d20SAndroid Build Coastguard Worker    def policy(self, args):
128*2d543d20SAndroid Build Coastguard Worker        os.spawnl(os.P_NOWAIT, "/usr/share/system-config-selinux/semanagegui.py")
129*2d543d20SAndroid Build Coastguard Worker
130*2d543d20SAndroid Build Coastguard Worker    def logging(self, args):
131*2d543d20SAndroid Build Coastguard Worker        os.spawnl(os.P_NOWAIT, "/usr/bin/seaudit")
132*2d543d20SAndroid Build Coastguard Worker
133*2d543d20SAndroid Build Coastguard Worker    def delete(self, args):
134*2d543d20SAndroid Build Coastguard Worker        self.tabs[self.notebook.get_current_page()].deleteDialog()
135*2d543d20SAndroid Build Coastguard Worker
136*2d543d20SAndroid Build Coastguard Worker    def add(self, args):
137*2d543d20SAndroid Build Coastguard Worker        self.tabs[self.notebook.get_current_page()].addDialog()
138*2d543d20SAndroid Build Coastguard Worker
139*2d543d20SAndroid Build Coastguard Worker    def properties(self, args):
140*2d543d20SAndroid Build Coastguard Worker        self.tabs[self.notebook.get_current_page()].propertiesDialog()
141*2d543d20SAndroid Build Coastguard Worker
142*2d543d20SAndroid Build Coastguard Worker    def on_local_clicked(self, button):
143*2d543d20SAndroid Build Coastguard Worker        self.tabs[self.notebook.get_current_page()].on_local_clicked(button)
144*2d543d20SAndroid Build Coastguard Worker
145*2d543d20SAndroid Build Coastguard Worker    def on_about_activate(self, args):
146*2d543d20SAndroid Build Coastguard Worker        dlg = xml.get_object("aboutWindow")
147*2d543d20SAndroid Build Coastguard Worker        dlg.run()
148*2d543d20SAndroid Build Coastguard Worker        dlg.hide()
149*2d543d20SAndroid Build Coastguard Worker
150*2d543d20SAndroid Build Coastguard Worker    def destroy(self, args):
151*2d543d20SAndroid Build Coastguard Worker        Gtk.main_quit()
152*2d543d20SAndroid Build Coastguard Worker
153*2d543d20SAndroid Build Coastguard Worker    def use_menus(self, use_menus):
154*2d543d20SAndroid Build Coastguard Worker        self.add_menu.set_sensitive(use_menus)
155*2d543d20SAndroid Build Coastguard Worker        self.properties_menu.set_sensitive(use_menus)
156*2d543d20SAndroid Build Coastguard Worker        self.delete_menu.set_sensitive(use_menus)
157*2d543d20SAndroid Build Coastguard Worker
158*2d543d20SAndroid Build Coastguard Worker    def itemSelected(self, selection):
159*2d543d20SAndroid Build Coastguard Worker        store, rows = selection.get_selected_rows()
160*2d543d20SAndroid Build Coastguard Worker        if store != None and len(rows) > 0:
161*2d543d20SAndroid Build Coastguard Worker            self.notebook.set_current_page(rows[0][0])
162*2d543d20SAndroid Build Coastguard Worker            self.use_menus(self.tabs[rows[0][0]].use_menus())
163*2d543d20SAndroid Build Coastguard Worker        else:
164*2d543d20SAndroid Build Coastguard Worker            self.notebook.set_current_page(0)
165*2d543d20SAndroid Build Coastguard Worker            self.use_menus(self.tabs[0].use_menus())
166*2d543d20SAndroid Build Coastguard Worker
167*2d543d20SAndroid Build Coastguard Worker    def setupScreen(self):
168*2d543d20SAndroid Build Coastguard Worker        # Bring in widgets from glade file.
169*2d543d20SAndroid Build Coastguard Worker        self.mainWindow = self.xml.get_object("mainWindow")
170*2d543d20SAndroid Build Coastguard Worker        self.notebook = self.xml.get_object("notebook")
171*2d543d20SAndroid Build Coastguard Worker        self.view = self.xml.get_object("selectView")
172*2d543d20SAndroid Build Coastguard Worker        self.view.get_selection().connect("changed", self.itemSelected)
173*2d543d20SAndroid Build Coastguard Worker        self.store = Gtk.ListStore(GObject.TYPE_STRING)
174*2d543d20SAndroid Build Coastguard Worker        self.view.set_model(self.store)
175*2d543d20SAndroid Build Coastguard Worker        col = Gtk.TreeViewColumn("", Gtk.CellRendererText(), text=0)
176*2d543d20SAndroid Build Coastguard Worker        col.set_resizable(True)
177*2d543d20SAndroid Build Coastguard Worker        self.view.append_column(col)
178*2d543d20SAndroid Build Coastguard Worker
179*2d543d20SAndroid Build Coastguard Worker        for page in self.tabs:
180*2d543d20SAndroid Build Coastguard Worker            iter = self.store.append()
181*2d543d20SAndroid Build Coastguard Worker            self.store.set_value(iter, 0, page.get_description())
182*2d543d20SAndroid Build Coastguard Worker        self.view.get_selection().select_path((0,))
183*2d543d20SAndroid Build Coastguard Worker
184*2d543d20SAndroid Build Coastguard Worker    def stand_alone(self):
185*2d543d20SAndroid Build Coastguard Worker        desktopName = _("Configure SELinux")
186*2d543d20SAndroid Build Coastguard Worker
187*2d543d20SAndroid Build Coastguard Worker        self.setupScreen()
188*2d543d20SAndroid Build Coastguard Worker
189*2d543d20SAndroid Build Coastguard Worker        self.mainWindow.connect("destroy", self.destroy)
190*2d543d20SAndroid Build Coastguard Worker
191*2d543d20SAndroid Build Coastguard Worker        self.mainWindow.show_all()
192*2d543d20SAndroid Build Coastguard Worker        Gtk.main()
193*2d543d20SAndroid Build Coastguard Worker
194*2d543d20SAndroid Build Coastguard Workerif __name__ == "__main__":
195*2d543d20SAndroid Build Coastguard Worker    signal.signal(signal.SIGINT, signal.SIG_DFL)
196*2d543d20SAndroid Build Coastguard Worker
197*2d543d20SAndroid Build Coastguard Worker    app = childWindow()
198*2d543d20SAndroid Build Coastguard Worker    app.stand_alone()
199