1#!/usr/bin/python3 -Es
2#
3# system-config-selinux.py - GUI for SELinux Config tool in system-config-selinux
4#
5# Dan Walsh <dwalsh@redhat.com>
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
35from gi.repository import GObject
36import statusPage
37import booleansPage
38import loginsPage
39import usersPage
40import portsPage
41import modulesPage
42import domainsPage
43import fcontextPage
44import selinux
45##
46## I18N
47##
48PROGNAME = "policycoreutils"
49try:
50    import gettext
51    kwargs = {}
52    if sys.version_info < (3,):
53        kwargs['unicode'] = True
54    gettext.install(PROGNAME,
55                    localedir="/usr/share/locale",
56                    codeset='utf-8',
57                    **kwargs)
58except:
59    try:
60        import builtins
61        builtins.__dict__['_'] = str
62    except ImportError:
63        import __builtin__
64        __builtin__.__dict__['_'] = unicode
65
66version = "1.0"
67
68sys.path.append('/usr/share/system-config-selinux')
69
70
71##
72## Pull in the Glade file
73##
74xml = Gtk.Builder()
75xml.set_translation_domain(PROGNAME)
76if os.access("system-config-selinux.ui", os.F_OK):
77    xml.add_from_file("system-config-selinux.ui")
78else:
79    xml.add_from_file("/usr/share/system-config-selinux/system-config-selinux.ui")
80
81
82class childWindow:
83
84    def __init__(self):
85        self.tabs = []
86        self.xml = xml
87        xml.connect_signals({
88            "on_quit_activate": self.destroy,
89            "on_delete_clicked": self.delete,
90            "on_add_clicked": self.add,
91            "on_properties_clicked": self.properties,
92            "on_local_clicked": self.on_local_clicked,
93            "on_policy_activate": self.policy,
94            "on_logging_activate": self.logging,
95            "on_about_activate": self.on_about_activate,
96        })
97        self.add_page(statusPage.statusPage(xml))
98        if selinux.is_selinux_enabled() > 0:
99            try:
100                self.add_page(booleansPage.booleansPage(xml))
101                self.add_page(fcontextPage.fcontextPage(xml))
102                self.add_page(loginsPage.loginsPage(xml))
103                self.add_page(usersPage.usersPage(xml))
104                self.add_page(portsPage.portsPage(xml))
105                self.add_page(modulesPage.modulesPage(xml))  # modules
106                self.add_page(domainsPage.domainsPage(xml))  # domains
107            except ValueError as e:
108                self.error(e.message)
109
110        self.add_menu = xml.get_object("add_menu_item")
111        self.properties_menu = xml.get_object("properties_menu_item")
112        self.delete_menu = xml.get_object("delete_menu_item")
113
114    def error(self, message):
115        dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
116                                Gtk.ButtonsType.CLOSE,
117                                message)
118        dlg.set_position(Gtk.WindowPosition.MOUSE)
119        dlg.show_all()
120        dlg.run()
121        dlg.destroy()
122
123    def add_page(self, page):
124        self.tabs.append(page)
125
126    def policy(self, args):
127        os.spawnl(os.P_NOWAIT, "/usr/share/system-config-selinux/semanagegui.py")
128
129    def logging(self, args):
130        os.spawnl(os.P_NOWAIT, "/usr/bin/seaudit")
131
132    def delete(self, args):
133        self.tabs[self.notebook.get_current_page()].deleteDialog()
134
135    def add(self, args):
136        self.tabs[self.notebook.get_current_page()].addDialog()
137
138    def properties(self, args):
139        self.tabs[self.notebook.get_current_page()].propertiesDialog()
140
141    def on_local_clicked(self, button):
142        self.tabs[self.notebook.get_current_page()].on_local_clicked(button)
143
144    def on_about_activate(self, args):
145        dlg = xml.get_object("aboutWindow")
146        dlg.run()
147        dlg.hide()
148
149    def destroy(self, args):
150        Gtk.main_quit()
151
152    def use_menus(self, use_menus):
153        self.add_menu.set_sensitive(use_menus)
154        self.properties_menu.set_sensitive(use_menus)
155        self.delete_menu.set_sensitive(use_menus)
156
157    def itemSelected(self, selection):
158        store, rows = selection.get_selected_rows()
159        if store != None and len(rows) > 0:
160            self.notebook.set_current_page(rows[0][0])
161            self.use_menus(self.tabs[rows[0][0]].use_menus())
162        else:
163            self.notebook.set_current_page(0)
164            self.use_menus(self.tabs[0].use_menus())
165
166    def setupScreen(self):
167        # Bring in widgets from glade file.
168        self.mainWindow = self.xml.get_object("mainWindow")
169        self.notebook = self.xml.get_object("notebook")
170        self.view = self.xml.get_object("selectView")
171        self.view.get_selection().connect("changed", self.itemSelected)
172        self.store = Gtk.ListStore(GObject.TYPE_STRING)
173        self.view.set_model(self.store)
174        col = Gtk.TreeViewColumn("", Gtk.CellRendererText(), text=0)
175        col.set_resizable(True)
176        self.view.append_column(col)
177
178        for page in self.tabs:
179            iter = self.store.append()
180            self.store.set_value(iter, 0, page.get_description())
181        self.view.get_selection().select_path((0,))
182
183    def stand_alone(self):
184        desktopName = _("Configure SELinux")
185
186        self.setupScreen()
187
188        self.mainWindow.connect("destroy", self.destroy)
189
190        self.mainWindow.show_all()
191        Gtk.main()
192
193if __name__ == "__main__":
194    signal.signal(signal.SIGINT, signal.SIG_DFL)
195
196    app = childWindow()
197    app.stand_alone()
198