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