mirror of
https://github.com/topjohnwu/selinux.git
synced 2024-11-23 19:49:39 +00:00
gui: port to Python 3 by migrating to PyGI
PyGTK has been deprecated in favor of PyGI+GTK and thus has never been ported to python3. Using pygi-convert.sh from https://git.gnome.org/browse/pygobject/tree/pygi-convert.sh helps migrating most of the API but gnome-python. The glade file has been converted to GtkBuilder using gtk-builder-convert system-config-selinux.glade system-config-selinux.ui and some fixes in order to provide an application window (object GnomeApp disappeared, GtkVBox is deprecated, etc.). The associated Python code also needed some modifications in order to migrate to GtkBuilder. The result has been tested on Arch Linux with Python 3.6. There are some bugs in the GUI itself, for which patches will be sent afterwards. Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
This commit is contained in:
parent
8f0ea463bc
commit
0f3beeb00e
@ -17,8 +17,8 @@ polgen.glade \
|
||||
portsPage.py \
|
||||
semanagePage.py \
|
||||
statusPage.py \
|
||||
system-config-selinux.glade \
|
||||
system-config-selinux.png \
|
||||
system-config-selinux.ui \
|
||||
usersPage.py
|
||||
|
||||
all: $(TARGETS) system-config-selinux.py polgengui.py
|
||||
|
@ -18,13 +18,8 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
#
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
import sys
|
||||
import tempfile
|
||||
from gi.repository import Gdk, GObject, Gtk
|
||||
import seobject
|
||||
import semanagePage
|
||||
|
||||
@ -61,8 +56,6 @@ except:
|
||||
import __builtin__
|
||||
__builtin__.__dict__['_'] = unicode
|
||||
|
||||
from glob import fnmatch
|
||||
|
||||
|
||||
class Modifier:
|
||||
|
||||
@ -94,56 +87,53 @@ class booleansPage:
|
||||
|
||||
def __init__(self, xml, doDebug=None):
|
||||
self.xml = xml
|
||||
self.window = self.xml.get_widget("mainWindow").get_root_window()
|
||||
self.window = self.xml.get_object("mainWindow").get_root_window()
|
||||
self.local = False
|
||||
self.types = []
|
||||
self.selinuxsupport = True
|
||||
self.typechanged = False
|
||||
self.doDebug = doDebug
|
||||
self.busy_cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
|
||||
self.ready_cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)
|
||||
self.busy_cursor = Gdk.Cursor.new(Gdk.CursorType.WATCH)
|
||||
self.ready_cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)
|
||||
|
||||
# Bring in widgets from glade file.
|
||||
self.typeHBox = xml.get_widget("typeHBox")
|
||||
self.booleanSW = xml.get_widget("booleanSW")
|
||||
self.booleansFilter = xml.get_widget("booleansFilter")
|
||||
self.booleansFilter = xml.get_object("booleansFilter")
|
||||
self.booleansFilter.connect("focus_out_event", self.filter_changed)
|
||||
self.booleansFilter.connect("activate", self.filter_changed)
|
||||
self.booleansFilter.connect("changed", self.filter_changed)
|
||||
|
||||
self.booleansView = xml.get_widget("booleansView")
|
||||
self.typeLabel = xml.get_widget("typeLabel")
|
||||
self.modifySeparator = xml.get_widget("modifySeparator")
|
||||
self.booleansView = xml.get_object("booleansView")
|
||||
|
||||
self.revertButton = xml.get_widget("booleanRevertButton")
|
||||
self.revertButton = xml.get_object("booleanRevertButton")
|
||||
self.revertButton.set_sensitive(self.local)
|
||||
self.revertButton.connect("clicked", self.on_revert_clicked)
|
||||
listStore = gtk.ListStore(gobject.TYPE_STRING)
|
||||
cell = gtk.CellRendererText()
|
||||
listStore = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
cell = Gtk.CellRendererText()
|
||||
|
||||
self.store = gtk.ListStore(gobject.TYPE_BOOLEAN, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.store.set_sort_column_id(1, gtk.SORT_ASCENDING)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_BOOLEAN, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.store.set_sort_column_id(1, Gtk.SortType.ASCENDING)
|
||||
self.booleansView.set_model(self.store)
|
||||
|
||||
checkbox = gtk.CellRendererToggle()
|
||||
checkbox = Gtk.CellRendererToggle()
|
||||
checkbox.connect("toggled", self.boolean_toggled)
|
||||
col = gtk.TreeViewColumn('Active', checkbox, active=ACTIVE)
|
||||
col = Gtk.TreeViewColumn('Active', checkbox, active=ACTIVE)
|
||||
col.set_clickable(True)
|
||||
col.set_sort_column_id(ACTIVE)
|
||||
self.booleansView.append_column(col)
|
||||
|
||||
col = gtk.TreeViewColumn("Module", gtk.CellRendererText(), text=MODULE)
|
||||
col = Gtk.TreeViewColumn("Module", Gtk.CellRendererText(), text=MODULE)
|
||||
col.set_sort_column_id(MODULE)
|
||||
col.set_resizable(True)
|
||||
self.booleansView.append_column(col)
|
||||
|
||||
col = gtk.TreeViewColumn("Description", gtk.CellRendererText(), text=DESC)
|
||||
col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||
col = Gtk.TreeViewColumn("Description", Gtk.CellRendererText(), text=DESC)
|
||||
col.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
|
||||
col.set_fixed_width(400)
|
||||
col.set_sort_column_id(DESC)
|
||||
col.set_resizable(True)
|
||||
self.booleansView.append_column(col)
|
||||
|
||||
col = gtk.TreeViewColumn("Name", gtk.CellRendererText(), text=BOOLEAN)
|
||||
col = Gtk.TreeViewColumn("Name", Gtk.CellRendererText(), text=BOOLEAN)
|
||||
col.set_sort_column_id(BOOLEAN)
|
||||
col.set_resizable(True)
|
||||
self.booleansView.set_search_equal_func(self.__search)
|
||||
@ -152,10 +142,10 @@ class booleansPage:
|
||||
self.load(self.filter)
|
||||
|
||||
def error(self, message):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR,
|
||||
gtk.BUTTONS_CLOSE,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
|
||||
Gtk.ButtonsType.CLOSE,
|
||||
message)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
dlg.run()
|
||||
dlg.destroy()
|
||||
@ -178,11 +168,11 @@ class booleansPage:
|
||||
|
||||
def deleteDialog(self):
|
||||
store, iter = self.booleansView.get_selection().get_selected()
|
||||
if iter == None:
|
||||
if iter is None:
|
||||
return
|
||||
boolean = store.get_value(iter, BOOLEAN)
|
||||
# change cursor
|
||||
if boolean == None:
|
||||
if boolean is None:
|
||||
return
|
||||
try:
|
||||
self.wait()
|
||||
|
@ -16,19 +16,14 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
try:
|
||||
from subprocess import getstatusoutput
|
||||
except ImportError:
|
||||
from commands import getstatusoutput
|
||||
|
||||
import gobject
|
||||
import sys
|
||||
import seobject
|
||||
import selinux
|
||||
from gi.repository import GObject, Gtk
|
||||
import sepolicy
|
||||
from semanagePage import *
|
||||
|
||||
@ -58,26 +53,26 @@ class domainsPage(semanagePage):
|
||||
|
||||
def __init__(self, xml):
|
||||
semanagePage.__init__(self, xml, "domains", _("Process Domain"))
|
||||
self.domain_filter = xml.get_widget("domainsFilterEntry")
|
||||
self.domain_filter = xml.get_object("domainsFilterEntry")
|
||||
self.domain_filter.connect("focus_out_event", self.filter_changed)
|
||||
self.domain_filter.connect("activate", self.filter_changed)
|
||||
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.view.set_model(self.store)
|
||||
self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Domain Name"), gtk.CellRendererText(), text=0)
|
||||
self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Domain Name"), Gtk.CellRendererText(), text=0)
|
||||
col.set_sort_column_id(0)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Mode"), gtk.CellRendererText(), text=1)
|
||||
self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Mode"), Gtk.CellRendererText(), text=1)
|
||||
col.set_sort_column_id(1)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
self.view.get_selection().connect("changed", self.itemSelected)
|
||||
|
||||
self.permissive_button = xml.get_widget("permissiveButton")
|
||||
self.enforcing_button = xml.get_widget("enforcingButton")
|
||||
self.permissive_button = xml.get_object("permissiveButton")
|
||||
self.enforcing_button = xml.get_object("enforcingButton")
|
||||
|
||||
self.domains = sepolicy.get_all_entrypoint_domains()
|
||||
self.load()
|
||||
@ -112,7 +107,7 @@ class domainsPage(semanagePage):
|
||||
|
||||
def itemSelected(self, selection):
|
||||
store, iter = selection.get_selected()
|
||||
if iter == None:
|
||||
if iter is None:
|
||||
return
|
||||
p = store.get_value(iter, 1) == _("Permissive")
|
||||
self.permissive_button.set_sensitive(not p)
|
||||
|
@ -16,10 +16,7 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
from gi.repository import GObject, Gtk
|
||||
import seobject
|
||||
try:
|
||||
from subprocess import getstatusoutput
|
||||
@ -73,40 +70,40 @@ class fcontextPage(semanagePage):
|
||||
|
||||
def __init__(self, xml):
|
||||
semanagePage.__init__(self, xml, "fcontext", _("File Labeling"))
|
||||
self.fcontextFilter = xml.get_widget("fcontextFilterEntry")
|
||||
self.fcontextFilter = xml.get_object("fcontextFilterEntry")
|
||||
self.fcontextFilter.connect("focus_out_event", self.filter_changed)
|
||||
self.fcontextFilter.connect("activate", self.filter_changed)
|
||||
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.view = xml.get_widget("fcontextView")
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.view = xml.get_object("fcontextView")
|
||||
self.view.set_model(self.store)
|
||||
self.view.set_search_equal_func(self.search)
|
||||
|
||||
col = gtk.TreeViewColumn(_("File\nSpecification"), gtk.CellRendererText(), text=SPEC_COL)
|
||||
col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||
col = Gtk.TreeViewColumn(_("File\nSpecification"), Gtk.CellRendererText(), text=SPEC_COL)
|
||||
col.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
|
||||
col.set_fixed_width(250)
|
||||
|
||||
col.set_sort_column_id(SPEC_COL)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
col = gtk.TreeViewColumn(_("Selinux\nFile Type"), gtk.CellRendererText(), text=TYPE_COL)
|
||||
col = Gtk.TreeViewColumn(_("Selinux\nFile Type"), Gtk.CellRendererText(), text=TYPE_COL)
|
||||
|
||||
col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||
col.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
|
||||
col.set_fixed_width(250)
|
||||
col.set_sort_column_id(TYPE_COL)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
col = gtk.TreeViewColumn(_("File\nType"), gtk.CellRendererText(), text=2)
|
||||
col = Gtk.TreeViewColumn(_("File\nType"), Gtk.CellRendererText(), text=2)
|
||||
col.set_sort_column_id(FTYPE_COL)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
|
||||
self.store.set_sort_column_id(SPEC_COL, gtk.SORT_ASCENDING)
|
||||
self.store.set_sort_column_id(SPEC_COL, Gtk.SortType.ASCENDING)
|
||||
self.load()
|
||||
self.fcontextEntry = xml.get_widget("fcontextEntry")
|
||||
self.fcontextFileTypeCombo = xml.get_widget("fcontextFileTypeCombo")
|
||||
self.fcontextTypeEntry = xml.get_widget("fcontextTypeEntry")
|
||||
self.fcontextMLSEntry = xml.get_widget("fcontextMLSEntry")
|
||||
self.fcontextEntry = xml.get_object("fcontextEntry")
|
||||
self.fcontextFileTypeCombo = xml.get_object("fcontextFileTypeCombo")
|
||||
self.fcontextTypeEntry = xml.get_object("fcontextTypeEntry")
|
||||
self.fcontextMLSEntry = xml.get_object("fcontextMLSEntry")
|
||||
|
||||
def match(self, fcon_dict, k, filter):
|
||||
try:
|
||||
@ -192,7 +189,7 @@ class fcontextPage(semanagePage):
|
||||
mls = self.fcontextMLSEntry.get_text().strip()
|
||||
list_model = self.fcontextFileTypeCombo.get_model()
|
||||
it = self.fcontextFileTypeCombo.get_active_iter()
|
||||
ftype = list_model.get_value(it,0)
|
||||
ftype = list_model.get_value(it, 0)
|
||||
self.wait()
|
||||
(rc, out) = getstatusoutput("semanage fcontext -a -t %s -r %s -f '%s' '%s'" % (type, mls, seobject.file_type_str_to_option[ftype], fspec))
|
||||
self.ready()
|
||||
|
@ -16,17 +16,13 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
import sys
|
||||
try:
|
||||
from subprocess import getstatusoutput
|
||||
except ImportError:
|
||||
from commands import getstatusoutput
|
||||
|
||||
from gi.repository import GObject, Gtk
|
||||
import seobject
|
||||
from semanagePage import *
|
||||
|
||||
@ -57,23 +53,23 @@ class loginsPage(semanagePage):
|
||||
def __init__(self, xml):
|
||||
self.firstTime = False
|
||||
semanagePage.__init__(self, xml, "logins", _("User Mapping"))
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.view.set_model(self.store)
|
||||
self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Login\nName"), gtk.CellRendererText(), text=0)
|
||||
self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Login\nName"), Gtk.CellRendererText(), text=0)
|
||||
col.set_sort_column_id(0)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
col = gtk.TreeViewColumn(_("SELinux\nUser"), gtk.CellRendererText(), text=1)
|
||||
col = Gtk.TreeViewColumn(_("SELinux\nUser"), Gtk.CellRendererText(), text=1)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
col = gtk.TreeViewColumn(_("MLS/\nMCS Range"), gtk.CellRendererText(), text=2)
|
||||
col = Gtk.TreeViewColumn(_("MLS/\nMCS Range"), Gtk.CellRendererText(), text=2)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
self.load()
|
||||
self.loginsNameEntry = xml.get_widget("loginsNameEntry")
|
||||
self.loginsSelinuxUserCombo = xml.get_widget("loginsSelinuxUserCombo")
|
||||
self.loginsMLSEntry = xml.get_widget("loginsMLSEntry")
|
||||
self.loginsNameEntry = xml.get_object("loginsNameEntry")
|
||||
self.loginsSelinuxUserCombo = xml.get_object("loginsSelinuxUserCombo")
|
||||
self.loginsMLSEntry = xml.get_object("loginsMLSEntry")
|
||||
|
||||
def load(self, filter=""):
|
||||
self.filter = filter
|
||||
@ -91,12 +87,12 @@ class loginsPage(semanagePage):
|
||||
self.view.get_selection().select_path((0,))
|
||||
|
||||
def __dialogSetup(self):
|
||||
if self.firstTime == True:
|
||||
if self.firstTime:
|
||||
return
|
||||
self.firstTime = True
|
||||
liststore = gtk.ListStore(gobject.TYPE_STRING)
|
||||
liststore = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
self.loginsSelinuxUserCombo.set_model(liststore)
|
||||
cell = gtk.CellRendererText()
|
||||
cell = Gtk.CellRendererText()
|
||||
self.loginsSelinuxUserCombo.pack_start(cell, True)
|
||||
self.loginsSelinuxUserCombo.add_attribute(cell, 'text', 0)
|
||||
|
||||
|
@ -16,21 +16,16 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import sys
|
||||
from subprocess import Popen, PIPE
|
||||
try:
|
||||
from subprocess import getstatusoutput
|
||||
except ImportError:
|
||||
from commands import getstatusoutput
|
||||
|
||||
import gobject
|
||||
import sys
|
||||
import seobject
|
||||
from gi.repository import GObject, Gtk
|
||||
import selinux
|
||||
from semanagePage import *
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
##
|
||||
## I18N
|
||||
@ -58,23 +53,23 @@ class modulesPage(semanagePage):
|
||||
|
||||
def __init__(self, xml):
|
||||
semanagePage.__init__(self, xml, "modules", _("Policy Module"))
|
||||
self.module_filter = xml.get_widget("modulesFilterEntry")
|
||||
self.module_filter = xml.get_object("modulesFilterEntry")
|
||||
self.module_filter.connect("focus_out_event", self.filter_changed)
|
||||
self.module_filter.connect("activate", self.filter_changed)
|
||||
self.audit_enabled = False
|
||||
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.view.set_model(self.store)
|
||||
self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Module Name"), gtk.CellRendererText(), text=0)
|
||||
self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Module Name"), Gtk.CellRendererText(), text=0)
|
||||
col.set_sort_column_id(0)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Version"), gtk.CellRendererText(), text=1)
|
||||
self.enable_audit_button = xml.get_widget("enableAuditButton")
|
||||
self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Version"), Gtk.CellRendererText(), text=1)
|
||||
self.enable_audit_button = xml.get_object("enableAuditButton")
|
||||
self.enable_audit_button.connect("clicked", self.enable_audit)
|
||||
self.new_button = xml.get_widget("newModuleButton")
|
||||
self.new_button = xml.get_object("newModuleButton")
|
||||
self.new_button.connect("clicked", self.new_module)
|
||||
col.set_sort_column_id(1)
|
||||
col.set_resizable(True)
|
||||
@ -170,20 +165,20 @@ class modulesPage(semanagePage):
|
||||
return
|
||||
|
||||
def addDialog(self):
|
||||
dialog = gtk.FileChooserDialog(_("Load Policy Module"),
|
||||
dialog = Gtk.FileChooserDialog(_("Load Policy Module"),
|
||||
None,
|
||||
gtk.FILE_CHOOSER_ACTION_OPEN,
|
||||
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
|
||||
gtk.STOCK_OPEN, gtk.RESPONSE_OK))
|
||||
dialog.set_default_response(gtk.RESPONSE_OK)
|
||||
Gtk.FileChooserAction.OPEN,
|
||||
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
|
||||
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
|
||||
dialog.set_default_response(Gtk.ResponseType.OK)
|
||||
|
||||
filter = gtk.FileFilter()
|
||||
filter = Gtk.FileFilter()
|
||||
filter.set_name("Policy Files")
|
||||
filter.add_pattern("*.pp")
|
||||
dialog.add_filter(filter)
|
||||
|
||||
response = dialog.run()
|
||||
if response == gtk.RESPONSE_OK:
|
||||
if response == Gtk.ResponseType.OK:
|
||||
self.add(dialog.get_filename())
|
||||
dialog.destroy()
|
||||
|
||||
|
118
gui/polgengui.py
118
gui/polgengui.py
@ -22,11 +22,11 @@
|
||||
#
|
||||
import signal
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
import os
|
||||
import gobject
|
||||
import gnome
|
||||
from gi.repository import GObject
|
||||
import sys
|
||||
try:
|
||||
import sepolicy
|
||||
@ -79,8 +79,6 @@ except:
|
||||
import __builtin__
|
||||
__builtin__.__dict__['_'] = unicode
|
||||
|
||||
gnome.program_init("SELinux Policy Generation Tool", "5")
|
||||
|
||||
version = "1.0"
|
||||
|
||||
sys.path.append('/usr/share/system-config-selinux')
|
||||
@ -95,10 +93,12 @@ def foreach(model, path, iter, selected):
|
||||
##
|
||||
## Pull in the Glade file
|
||||
##
|
||||
xml = Gtk.Builder()
|
||||
xml.set_translation_domain(PROGNAME)
|
||||
if os.access("polgen.glade", os.F_OK):
|
||||
xml = gtk.glade.XML("polgen.glade", domain=PROGNAME)
|
||||
xml.add_from_file("polgen.glade")
|
||||
else:
|
||||
xml = gtk.glade.XML("/usr/share/system-config-selinux/polgen.glade", domain=PROGNAME)
|
||||
xml.add_from_file("/usr/share/system-config-selinux/polgen.glade")
|
||||
|
||||
FILE = 1
|
||||
DIR = 2
|
||||
@ -277,27 +277,27 @@ class childWindow:
|
||||
b.connect("clicked", self.network_all_clicked)
|
||||
|
||||
self.boolean_treeview = self.xml.get_widget("boolean_treeview")
|
||||
self.boolean_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.boolean_store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.boolean_treeview.set_model(self.boolean_store)
|
||||
self.boolean_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Name"), gtk.CellRendererText(), text=0)
|
||||
self.boolean_store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Name"), Gtk.CellRendererText(), text=0)
|
||||
self.boolean_treeview.append_column(col)
|
||||
col = gtk.TreeViewColumn(_("Description"), gtk.CellRendererText(), text=1)
|
||||
col = Gtk.TreeViewColumn(_("Description"), Gtk.CellRendererText(), text=1)
|
||||
self.boolean_treeview.append_column(col)
|
||||
|
||||
self.role_treeview = self.xml.get_widget("role_treeview")
|
||||
self.role_store = gtk.ListStore(gobject.TYPE_STRING)
|
||||
self.role_store = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
self.role_treeview.set_model(self.role_store)
|
||||
self.role_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.role_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Role"), gtk.CellRendererText(), text=0)
|
||||
self.role_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
|
||||
self.role_store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Role"), Gtk.CellRendererText(), text=0)
|
||||
self.role_treeview.append_column(col)
|
||||
|
||||
self.existing_user_treeview = self.xml.get_widget("existing_user_treeview")
|
||||
self.existing_user_store = gtk.ListStore(gobject.TYPE_STRING)
|
||||
self.existing_user_store = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
self.existing_user_treeview.set_model(self.existing_user_store)
|
||||
self.existing_user_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Existing_User"), gtk.CellRendererText(), text=0)
|
||||
self.existing_user_store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Existing_User"), Gtk.CellRendererText(), text=0)
|
||||
self.existing_user_treeview.append_column(col)
|
||||
|
||||
for i in self.all_roles:
|
||||
@ -307,19 +307,19 @@ class childWindow:
|
||||
self.in_tcp_reserved_checkbutton = xml.get_widget("in_tcp_reserved_checkbutton")
|
||||
|
||||
self.transition_treeview = self.xml.get_widget("transition_treeview")
|
||||
self.transition_store = gtk.ListStore(gobject.TYPE_STRING)
|
||||
self.transition_store = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
self.transition_treeview.set_model(self.transition_store)
|
||||
self.transition_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.transition_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Application"), gtk.CellRendererText(), text=0)
|
||||
self.transition_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
|
||||
self.transition_store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Application"), Gtk.CellRendererText(), text=0)
|
||||
self.transition_treeview.append_column(col)
|
||||
|
||||
self.user_transition_treeview = self.xml.get_widget("user_transition_treeview")
|
||||
self.user_transition_store = gtk.ListStore(gobject.TYPE_STRING)
|
||||
self.user_transition_store = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
self.user_transition_treeview.set_model(self.user_transition_store)
|
||||
self.user_transition_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.user_transition_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Application"), gtk.CellRendererText(), text=0)
|
||||
self.user_transition_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
|
||||
self.user_transition_store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Application"), Gtk.CellRendererText(), text=0)
|
||||
self.user_transition_treeview.append_column(col)
|
||||
|
||||
for i in self.all_users:
|
||||
@ -329,11 +329,11 @@ class childWindow:
|
||||
self.existing_user_store.set_value(iter, 0, i[:-2])
|
||||
|
||||
self.admin_treeview = self.xml.get_widget("admin_treeview")
|
||||
self.admin_store = gtk.ListStore(gobject.TYPE_STRING)
|
||||
self.admin_store = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
self.admin_treeview.set_model(self.admin_store)
|
||||
self.admin_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.admin_store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
col = gtk.TreeViewColumn(_("Application"), gtk.CellRendererText(), text=0)
|
||||
self.admin_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
|
||||
self.admin_store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
col = Gtk.TreeViewColumn(_("Application"), Gtk.CellRendererText(), text=0)
|
||||
self.admin_treeview.append_column(col)
|
||||
|
||||
try:
|
||||
@ -383,17 +383,17 @@ class childWindow:
|
||||
|
||||
if self.pages[type][self.current_page] == self.FINISH_PAGE:
|
||||
self.generate_policy()
|
||||
self.xml.get_widget("cancel_button").set_label(gtk.STOCK_CLOSE)
|
||||
self.xml.get_widget("cancel_button").set_label(Gtk.STOCK_CLOSE)
|
||||
else:
|
||||
self.current_page = self.current_page + 1
|
||||
self.notebook.set_current_page(self.pages[type][self.current_page])
|
||||
if self.pages[type][self.current_page] == self.FINISH_PAGE:
|
||||
self.forward_button.set_label(gtk.STOCK_APPLY)
|
||||
self.forward_button.set_label(Gtk.STOCK_APPLY)
|
||||
|
||||
def back(self, arg):
|
||||
type = self.get_type()
|
||||
if self.pages[type][self.current_page] == self.FINISH_PAGE:
|
||||
self.forward_button.set_label(gtk.STOCK_GO_FORWARD)
|
||||
self.forward_button.set_label(Gtk.STOCK_GO_FORWARD)
|
||||
|
||||
self.current_page = self.current_page - 1
|
||||
self.notebook.set_current_page(self.pages[type][self.current_page])
|
||||
@ -406,30 +406,30 @@ class childWindow:
|
||||
b.set_sensitive(not active)
|
||||
|
||||
def verify(self, message, title=""):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
|
||||
gtk.BUTTONS_YES_NO,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO,
|
||||
Gtk.ButtonsType.YES_NO,
|
||||
message)
|
||||
dlg.set_title(title)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
rc = dlg.run()
|
||||
dlg.destroy()
|
||||
return rc
|
||||
|
||||
def info(self, message):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
|
||||
gtk.BUTTONS_OK,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO,
|
||||
Gtk.ButtonsType.OK,
|
||||
message)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
dlg.run()
|
||||
dlg.destroy()
|
||||
|
||||
def error(self, message):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR,
|
||||
gtk.BUTTONS_CLOSE,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
|
||||
Gtk.ButtonsType.CLOSE,
|
||||
message)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
dlg.run()
|
||||
dlg.destroy()
|
||||
@ -550,7 +550,7 @@ class childWindow:
|
||||
self.boolean_description_entry.set_text("")
|
||||
rc = self.boolean_dialog.run()
|
||||
self.boolean_dialog.hide()
|
||||
if rc == gtk.RESPONSE_CANCEL:
|
||||
if rc == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
iter = self.boolean_store.append()
|
||||
self.boolean_store.set_value(iter, 0, self.boolean_name_entry.get_text())
|
||||
@ -559,7 +559,7 @@ class childWindow:
|
||||
def __add(self, type):
|
||||
rc = self.file_dialog.run()
|
||||
self.file_dialog.hide()
|
||||
if rc == gtk.RESPONSE_CANCEL:
|
||||
if rc == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
for i in self.file_dialog.get_filenames():
|
||||
iter = self.store.append()
|
||||
@ -569,29 +569,29 @@ class childWindow:
|
||||
def exec_select(self, args):
|
||||
self.file_dialog.set_select_multiple(0)
|
||||
self.file_dialog.set_title(_("Select executable file to be confined."))
|
||||
self.file_dialog.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
|
||||
self.file_dialog.set_action(Gtk.FileChooserAction.OPEN)
|
||||
self.file_dialog.set_current_folder("/usr/sbin")
|
||||
rc = self.file_dialog.run()
|
||||
self.file_dialog.hide()
|
||||
if rc == gtk.RESPONSE_CANCEL:
|
||||
if rc == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
self.exec_entry.set_text(self.file_dialog.get_filename())
|
||||
|
||||
def init_script_select(self, args):
|
||||
self.file_dialog.set_select_multiple(0)
|
||||
self.file_dialog.set_title(_("Select init script file to be confined."))
|
||||
self.file_dialog.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
|
||||
self.file_dialog.set_action(Gtk.FileChooserAction.OPEN)
|
||||
self.file_dialog.set_current_folder("/etc/rc.d/init.d")
|
||||
rc = self.file_dialog.run()
|
||||
self.file_dialog.hide()
|
||||
if rc == gtk.RESPONSE_CANCEL:
|
||||
if rc == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
self.init_script_entry.set_text(self.file_dialog.get_filename())
|
||||
|
||||
def add(self, args):
|
||||
self.file_dialog.set_title(_("Select file(s) that confined application creates or writes"))
|
||||
self.file_dialog.set_current_folder("/")
|
||||
self.file_dialog.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
|
||||
self.file_dialog.set_action(Gtk.FileChooserAction.OPEN)
|
||||
self.file_dialog.set_select_multiple(1)
|
||||
self.__add(FILE)
|
||||
|
||||
@ -599,7 +599,7 @@ class childWindow:
|
||||
self.file_dialog.set_title(_("Select directory(s) that the confined application owns and writes into"))
|
||||
self.file_dialog.set_current_folder("/")
|
||||
self.file_dialog.set_select_multiple(1)
|
||||
self.file_dialog.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
|
||||
self.file_dialog.set_action(Gtk.FileChooserAction.SELECT_FOLDER)
|
||||
self.__add(DIR)
|
||||
|
||||
def on_about_clicked(self, args):
|
||||
@ -608,7 +608,7 @@ class childWindow:
|
||||
dlg.hide()
|
||||
|
||||
def quit(self, args):
|
||||
gtk.main_quit()
|
||||
Gtk.main_quit()
|
||||
|
||||
def setupScreen(self):
|
||||
# Bring in widgets from glade file.
|
||||
@ -650,20 +650,20 @@ class childWindow:
|
||||
self.view = self.xml.get_widget("write_treeview")
|
||||
self.file_dialog = self.xml.get_widget("filechooserdialog")
|
||||
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_INT)
|
||||
self.view.set_model(self.store)
|
||||
col = gtk.TreeViewColumn("", gtk.CellRendererText(), text=0)
|
||||
col = Gtk.TreeViewColumn("", Gtk.CellRendererText(), text=0)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
self.view.get_selection().select_path((0,))
|
||||
|
||||
def output_button_clicked(self, *args):
|
||||
self.file_dialog.set_title(_("Select directory to generate policy files in"))
|
||||
self.file_dialog.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
|
||||
self.file_dialog.set_action(Gtk.FileChooserAction.SELECT_FOLDER)
|
||||
self.file_dialog.set_select_multiple(0)
|
||||
rc = self.file_dialog.run()
|
||||
self.file_dialog.hide()
|
||||
if rc == gtk.RESPONSE_CANCEL:
|
||||
if rc == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
self.output_entry.set_text(self.file_dialog.get_filename())
|
||||
|
||||
@ -675,11 +675,11 @@ class childWindow:
|
||||
name = entry.get_text()
|
||||
if self.name != name:
|
||||
if name in self.all_types:
|
||||
if self.verify(_("Type %s_t already defined in current policy.\nDo you want to continue?") % name, _("Verify Name")) == gtk.RESPONSE_NO:
|
||||
if self.verify(_("Type %s_t already defined in current policy.\nDo you want to continue?") % name, _("Verify Name")) == Gtk.ResponseType.NO:
|
||||
entry.set_text("")
|
||||
return False
|
||||
if name in self.all_modules:
|
||||
if self.verify(_("Module %s already loaded in current policy.\nDo you want to continue?") % name, _("Verify Name")) == gtk.RESPONSE_NO:
|
||||
if self.verify(_("Module %s already loaded in current policy.\nDo you want to continue?") % name, _("Verify Name")) == Gtk.ResponseType.NO:
|
||||
entry.set_text("")
|
||||
return False
|
||||
|
||||
@ -770,7 +770,7 @@ class childWindow:
|
||||
self.mainWindow.connect("destroy", self.quit)
|
||||
|
||||
self.mainWindow.show_all()
|
||||
gtk.main()
|
||||
Gtk.main()
|
||||
|
||||
if __name__ == "__main__":
|
||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||
|
@ -16,12 +16,8 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
import sys
|
||||
from gi.repository import GObject, Gtk
|
||||
import seobject
|
||||
|
||||
TYPE_COL = 0
|
||||
@ -62,18 +58,19 @@ class portsPage(semanagePage):
|
||||
|
||||
def __init__(self, xml):
|
||||
semanagePage.__init__(self, xml, "ports", _("Network Port"))
|
||||
xml.signal_connect("on_group_clicked", self.on_group_clicked)
|
||||
group_listview = xml.get_object("listViewButton")
|
||||
group_listview.connect("clicked", self.on_group_clicked)
|
||||
self.group = False
|
||||
self.ports_filter = xml.get_widget("portsFilterEntry")
|
||||
self.ports_filter = xml.get_object("portsFilterEntry")
|
||||
self.ports_filter.connect("focus_out_event", self.filter_changed)
|
||||
self.ports_filter.connect("activate", self.filter_changed)
|
||||
self.ports_name_entry = xml.get_widget("portsNameEntry")
|
||||
self.ports_protocol_combo = xml.get_widget("portsProtocolCombo")
|
||||
self.ports_number_entry = xml.get_widget("portsNumberEntry")
|
||||
self.ports_mls_entry = xml.get_widget("portsMLSEntry")
|
||||
self.ports_add_button = xml.get_widget("portsAddButton")
|
||||
self.ports_properties_button = xml.get_widget("portsPropertiesButton")
|
||||
self.ports_delete_button = xml.get_widget("portsDeleteButton")
|
||||
self.ports_name_entry = xml.get_object("portsNameEntry")
|
||||
self.ports_protocol_combo = xml.get_object("portsProtocolCombo")
|
||||
self.ports_number_entry = xml.get_object("portsNumberEntry")
|
||||
self.ports_mls_entry = xml.get_object("portsMLSEntry")
|
||||
self.ports_add_button = xml.get_object("portsAddButton")
|
||||
self.ports_properties_button = xml.get_object("portsPropertiesButton")
|
||||
self.ports_delete_button = xml.get_object("portsDeleteButton")
|
||||
liststore = self.ports_protocol_combo.get_model()
|
||||
iter = liststore.get_iter_first()
|
||||
self.ports_protocol_combo.set_active_iter(iter)
|
||||
@ -90,28 +87,28 @@ class portsPage(semanagePage):
|
||||
self.group_load(filter)
|
||||
|
||||
def init_store(self):
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.view.set_model(self.store)
|
||||
self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
|
||||
self.view.set_search_equal_func(self.search)
|
||||
col = gtk.TreeViewColumn(_("SELinux Port\nType"), gtk.CellRendererText(), text=TYPE_COL)
|
||||
col = Gtk.TreeViewColumn(_("SELinux Port\nType"), Gtk.CellRendererText(), text=TYPE_COL)
|
||||
col.set_sort_column_id(TYPE_COL)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
self.store.set_sort_column_id(TYPE_COL, gtk.SORT_ASCENDING)
|
||||
self.store.set_sort_column_id(TYPE_COL, Gtk.SortType.ASCENDING)
|
||||
|
||||
col = gtk.TreeViewColumn(_("Protocol"), gtk.CellRendererText(), text=PROTOCOL_COL)
|
||||
col = Gtk.TreeViewColumn(_("Protocol"), Gtk.CellRendererText(), text=PROTOCOL_COL)
|
||||
col.set_sort_column_id(PROTOCOL_COL)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
|
||||
self.mls_col = gtk.TreeViewColumn(_("MLS/MCS\nLevel"), gtk.CellRendererText(), text=MLS_COL)
|
||||
self.mls_col = Gtk.TreeViewColumn(_("MLS/MCS\nLevel"), Gtk.CellRendererText(), text=MLS_COL)
|
||||
self.mls_col.set_resizable(True)
|
||||
self.mls_col.set_sort_column_id(MLS_COL)
|
||||
self.view.append_column(self.mls_col)
|
||||
|
||||
col = gtk.TreeViewColumn(_("Port"), gtk.CellRendererText(), text=PORT_COL)
|
||||
col = Gtk.TreeViewColumn(_("Port"), Gtk.CellRendererText(), text=PORT_COL)
|
||||
col.set_sort_column_id(PORT_COL)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
@ -139,7 +136,7 @@ class portsPage(semanagePage):
|
||||
continue
|
||||
iter = self.store.append()
|
||||
if k[0] == k[1]:
|
||||
self.store.set_value(iter, PORT_COL, k[0])
|
||||
self.store.set_value(iter, PORT_COL, str(k[0]))
|
||||
else:
|
||||
rec = "%s-%s" % k[:2]
|
||||
self.store.set_value(iter, PORT_COL, rec)
|
||||
|
@ -16,13 +16,8 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
import sys
|
||||
import seobject
|
||||
from gi.repository import Gdk, Gtk
|
||||
|
||||
##
|
||||
## I18N
|
||||
@ -47,24 +42,25 @@ except:
|
||||
|
||||
|
||||
def idle_func():
|
||||
while gtk.events_pending():
|
||||
gtk.main_iteration()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
|
||||
|
||||
class semanagePage:
|
||||
|
||||
def __init__(self, xml, name, description):
|
||||
self.xml = xml
|
||||
self.window = self.xml.get_widget("mainWindow").get_root_window()
|
||||
self.busy_cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
|
||||
self.ready_cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)
|
||||
self.window = self.xml.get_object("mainWindow").get_root_window()
|
||||
self.busy_cursor = Gdk.Cursor.new(Gdk.CursorType.WATCH)
|
||||
self.ready_cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)
|
||||
|
||||
self.local = False
|
||||
self.view = xml.get_widget("%sView" % name)
|
||||
self.dialog = xml.get_widget("%sDialog" % name)
|
||||
self.filter_entry = xml.get_widget("%sFilterEntry" % name)
|
||||
self.view = xml.get_object("%sView" % name)
|
||||
self.dialog = xml.get_object("%sDialog" % name)
|
||||
self.filter_entry = xml.get_object("%sFilterEntry" % name)
|
||||
self.filter_entry.connect("focus_out_event", self.filter_changed)
|
||||
self.filter_entry.connect("activate", self.filter_changed)
|
||||
self.filter_entry.connect("changed", self.filter_changed)
|
||||
|
||||
self.view.connect("row_activated", self.rowActivated)
|
||||
self.view.get_selection().connect("changed", self.itemSelected)
|
||||
@ -81,7 +77,7 @@ class semanagePage:
|
||||
def get_description(self):
|
||||
return self.description
|
||||
|
||||
def itemSelected(self, args):
|
||||
def itemSelected(self, selection):
|
||||
return
|
||||
|
||||
def filter_changed(self, *arg):
|
||||
@ -110,28 +106,28 @@ class semanagePage:
|
||||
self.propertiesDialog()
|
||||
|
||||
def verify(self, message, title=""):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
|
||||
gtk.BUTTONS_YES_NO,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO,
|
||||
Gtk.ButtonsType.YES_NO,
|
||||
message)
|
||||
dlg.set_title(title)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
rc = dlg.run()
|
||||
dlg.destroy()
|
||||
return rc
|
||||
|
||||
def error(self, message):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR,
|
||||
gtk.BUTTONS_CLOSE,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
|
||||
Gtk.ButtonsType.CLOSE,
|
||||
message)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
dlg.run()
|
||||
dlg.destroy()
|
||||
|
||||
def deleteDialog(self):
|
||||
store, it = self.view.get_selection().get_selected()
|
||||
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.RESPONSE_YES):
|
||||
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):
|
||||
self.delete()
|
||||
|
||||
def use_menus(self):
|
||||
@ -140,11 +136,11 @@ class semanagePage:
|
||||
def addDialog(self):
|
||||
self.dialogClear()
|
||||
self.dialog.set_title(_("Add %s" % self.description))
|
||||
self.dialog.set_position(gtk.WIN_POS_MOUSE)
|
||||
self.dialog.set_position(Gtk.WindowPosition.MOUSE)
|
||||
|
||||
while self.dialog.run() == gtk.RESPONSE_OK:
|
||||
while self.dialog.run() == Gtk.ResponseType.OK:
|
||||
try:
|
||||
if self.add() == False:
|
||||
if not self.add():
|
||||
continue
|
||||
break
|
||||
except ValueError as e:
|
||||
@ -154,10 +150,10 @@ class semanagePage:
|
||||
def propertiesDialog(self):
|
||||
self.dialogInit()
|
||||
self.dialog.set_title(_("Modify %s" % self.description))
|
||||
self.dialog.set_position(gtk.WIN_POS_MOUSE)
|
||||
while self.dialog.run() == gtk.RESPONSE_OK:
|
||||
self.dialog.set_position(Gtk.WindowPosition.MOUSE)
|
||||
while self.dialog.run() == Gtk.ResponseType.OK:
|
||||
try:
|
||||
if self.modify() == False:
|
||||
if not self.modify():
|
||||
continue
|
||||
break
|
||||
except ValueError as e:
|
||||
|
@ -16,23 +16,14 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
import sys
|
||||
import tempfile
|
||||
from gi.repository import Gtk
|
||||
import selinux
|
||||
|
||||
INSTALLPATH = '/usr/share/system-config-selinux'
|
||||
sys.path.append(INSTALLPATH)
|
||||
|
||||
try:
|
||||
from subprocess import getstatusoutput
|
||||
except ImportError:
|
||||
from commands import getstatusoutput
|
||||
|
||||
ENFORCING = 1
|
||||
PERMISSIVE = 0
|
||||
DISABLED = -1
|
||||
@ -71,12 +62,11 @@ class statusPage:
|
||||
|
||||
self.type = selinux.selinux_getpolicytype()
|
||||
# Bring in widgets from glade file.
|
||||
self.typeHBox = xml.get_widget("typeHBox")
|
||||
self.selinuxTypeOptionMenu = xml.get_widget("selinuxTypeOptionMenu")
|
||||
self.typeLabel = xml.get_widget("typeLabel")
|
||||
self.enabledOptionMenu = xml.get_widget("enabledOptionMenu")
|
||||
self.currentOptionMenu = xml.get_widget("currentOptionMenu")
|
||||
self.relabel_checkbutton = xml.get_widget("relabelCheckbutton")
|
||||
self.selinuxTypeOptionMenu = xml.get_object("selinuxTypeOptionMenu")
|
||||
self.typeLabel = xml.get_object("typeLabel")
|
||||
self.enabledOptionMenu = xml.get_object("enabledOptionMenu")
|
||||
self.currentOptionMenu = xml.get_object("currentOptionMenu")
|
||||
self.relabel_checkbutton = xml.get_object("relabelCheckbutton")
|
||||
self.relabel_checkbutton.set_active(self.is_relabel())
|
||||
self.relabel_checkbutton.connect("toggled", self.on_relabel_toggle)
|
||||
if self.get_current_mode() == ENFORCING or self.get_current_mode() == PERMISSIVE:
|
||||
@ -90,7 +80,7 @@ class statusPage:
|
||||
self.currentOptionMenu.set_active(0)
|
||||
self.currentOptionMenu.set_sensitive(False)
|
||||
|
||||
if self.read_selinux_config() == None:
|
||||
if self.read_selinux_config() is None:
|
||||
self.selinuxsupport = False
|
||||
else:
|
||||
self.enabledOptionMenu.connect("changed", self.enabled_changed)
|
||||
@ -131,10 +121,10 @@ class statusPage:
|
||||
os.unlink(RELABELFILE)
|
||||
|
||||
def verify(self, message):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
|
||||
gtk.BUTTONS_YES_NO,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO,
|
||||
Gtk.ButtonsType.YES_NO,
|
||||
message)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
rc = dlg.run()
|
||||
dlg.destroy()
|
||||
@ -144,7 +134,7 @@ class statusPage:
|
||||
type = self.get_type()
|
||||
enabled = self.enabledOptionMenu.get_active()
|
||||
if self.initialtype != type:
|
||||
if self.verify(_("Changing the policy type will cause a relabel of the entire file system on the next boot. Relabeling takes a long time depending on the size of the file system. Do you wish to continue?")) == gtk.RESPONSE_NO:
|
||||
if self.verify(_("Changing the policy type will cause a relabel of the entire file system on the next boot. Relabeling takes a long time depending on the size of the file system. Do you wish to continue?")) == Gtk.ResponseType.NO:
|
||||
menu.set_active(self.typeHistory)
|
||||
return None
|
||||
|
||||
@ -158,12 +148,12 @@ class statusPage:
|
||||
type = self.get_type()
|
||||
|
||||
if self.initEnabled != DISABLED and enabled == DISABLED:
|
||||
if self.verify(_("Changing to SELinux disabled requires a reboot. It is not recommended. If you later decide to turn SELinux back on, the system will be required to relabel. If you just want to see if SELinux is causing a problem on your system, you can go to permissive mode which will only log errors and not enforce SELinux policy. Permissive mode does not require a reboot Do you wish to continue?")) == gtk.RESPONSE_NO:
|
||||
if self.verify(_("Changing to SELinux disabled requires a reboot. It is not recommended. If you later decide to turn SELinux back on, the system will be required to relabel. If you just want to see if SELinux is causing a problem on your system, you can go to permissive mode which will only log errors and not enforce SELinux policy. Permissive mode does not require a reboot Do you wish to continue?")) == Gtk.ResponseType.NO:
|
||||
combo.set_active(self.enabled)
|
||||
return None
|
||||
|
||||
if self.initEnabled == DISABLED and enabled < 2:
|
||||
if self.verify(_("Changing to SELinux enabled will cause a relabel of the entire file system on the next boot. Relabeling takes a long time depending on the size of the file system. Do you wish to continue?")) == gtk.RESPONSE_NO:
|
||||
if self.verify(_("Changing to SELinux enabled will cause a relabel of the entire file system on the next boot. Relabeling takes a long time depending on the size of the file system. Do you wish to continue?")) == Gtk.ResponseType.NO:
|
||||
combo.set_active(self.enabled)
|
||||
return None
|
||||
self.relabel_checkbutton.set_active(True)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -20,20 +20,19 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
#
|
||||
import os
|
||||
import signal
|
||||
import string
|
||||
import sys
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
try:
|
||||
import gtk
|
||||
from gi.repository import Gtk
|
||||
except RuntimeError as e:
|
||||
print("system-config-selinux:", e)
|
||||
print("This is a graphical application and requires DISPLAY to be set.")
|
||||
sys.exit(1)
|
||||
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
import gnome
|
||||
from gi.repository import GObject
|
||||
import statusPage
|
||||
import booleansPage
|
||||
import loginsPage
|
||||
@ -64,8 +63,6 @@ except:
|
||||
import __builtin__
|
||||
__builtin__.__dict__['_'] = unicode
|
||||
|
||||
gnome.program_init("SELinux Management Tool", "5")
|
||||
|
||||
version = "1.0"
|
||||
|
||||
sys.path.append('/usr/share/system-config-selinux')
|
||||
@ -74,10 +71,12 @@ sys.path.append('/usr/share/system-config-selinux')
|
||||
##
|
||||
## Pull in the Glade file
|
||||
##
|
||||
if os.access("system-config-selinux.glade", os.F_OK):
|
||||
xml = gtk.glade.XML("system-config-selinux.glade", domain=PROGNAME)
|
||||
xml = Gtk.Builder()
|
||||
xml.set_translation_domain(PROGNAME)
|
||||
if os.access("system-config-selinux.ui", os.F_OK):
|
||||
xml.add_from_file("system-config-selinux.ui")
|
||||
else:
|
||||
xml = gtk.glade.XML("/usr/share/system-config-selinux/system-config-selinux.glade", domain=PROGNAME)
|
||||
xml.add_from_file("/usr/share/system-config-selinux/system-config-selinux.ui")
|
||||
|
||||
|
||||
class childWindow:
|
||||
@ -85,11 +84,16 @@ class childWindow:
|
||||
def __init__(self):
|
||||
self.tabs = []
|
||||
self.xml = xml
|
||||
xml.signal_connect("on_quit_activate", self.destroy)
|
||||
xml.signal_connect("on_delete_clicked", self.delete)
|
||||
xml.signal_connect("on_add_clicked", self.add)
|
||||
xml.signal_connect("on_properties_clicked", self.properties)
|
||||
xml.signal_connect("on_local_clicked", self.on_local_clicked)
|
||||
xml.connect_signals({
|
||||
"on_quit_activate": self.destroy,
|
||||
"on_delete_clicked": self.delete,
|
||||
"on_add_clicked": self.add,
|
||||
"on_properties_clicked": self.properties,
|
||||
"on_local_clicked": self.on_local_clicked,
|
||||
"on_policy_activate": self.policy,
|
||||
"on_logging_activate": self.logging,
|
||||
"on_about_activate": self.on_about_activate,
|
||||
})
|
||||
self.add_page(statusPage.statusPage(xml))
|
||||
if selinux.is_selinux_enabled() > 0:
|
||||
try:
|
||||
@ -103,20 +107,15 @@ class childWindow:
|
||||
except ValueError as e:
|
||||
self.error(e.message)
|
||||
|
||||
xml.signal_connect("on_quit_activate", self.destroy)
|
||||
xml.signal_connect("on_policy_activate", self.policy)
|
||||
xml.signal_connect("on_logging_activate", self.logging)
|
||||
xml.signal_connect("on_about_activate", self.on_about_activate)
|
||||
|
||||
self.add_menu = xml.get_widget("add_menu_item")
|
||||
self.properties_menu = xml.get_widget("properties_menu_item")
|
||||
self.delete_menu = xml.get_widget("delete_menu_item")
|
||||
self.add_menu = xml.get_object("add_menu_item")
|
||||
self.properties_menu = xml.get_object("properties_menu_item")
|
||||
self.delete_menu = xml.get_object("delete_menu_item")
|
||||
|
||||
def error(self, message):
|
||||
dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR,
|
||||
gtk.BUTTONS_CLOSE,
|
||||
dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR,
|
||||
Gtk.ButtonsType.CLOSE,
|
||||
message)
|
||||
dlg.set_position(gtk.WIN_POS_MOUSE)
|
||||
dlg.set_position(Gtk.WindowPosition.MOUSE)
|
||||
dlg.show_all()
|
||||
dlg.run()
|
||||
dlg.destroy()
|
||||
@ -143,12 +142,12 @@ class childWindow:
|
||||
self.tabs[self.notebook.get_current_page()].on_local_clicked(button)
|
||||
|
||||
def on_about_activate(self, args):
|
||||
dlg = xml.get_widget("aboutWindow")
|
||||
dlg = xml.get_object("aboutWindow")
|
||||
dlg.run()
|
||||
dlg.hide()
|
||||
|
||||
def destroy(self, args):
|
||||
gtk.main_quit()
|
||||
Gtk.main_quit()
|
||||
|
||||
def use_menus(self, use_menus):
|
||||
self.add_menu.set_sensitive(use_menus)
|
||||
@ -166,13 +165,13 @@ class childWindow:
|
||||
|
||||
def setupScreen(self):
|
||||
# Bring in widgets from glade file.
|
||||
self.mainWindow = self.xml.get_widget("mainWindow")
|
||||
self.notebook = self.xml.get_widget("notebook")
|
||||
self.view = self.xml.get_widget("selectView")
|
||||
self.mainWindow = self.xml.get_object("mainWindow")
|
||||
self.notebook = self.xml.get_object("notebook")
|
||||
self.view = self.xml.get_object("selectView")
|
||||
self.view.get_selection().connect("changed", self.itemSelected)
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
self.view.set_model(self.store)
|
||||
col = gtk.TreeViewColumn("", gtk.CellRendererText(), text=0)
|
||||
col = Gtk.TreeViewColumn("", Gtk.CellRendererText(), text=0)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
|
||||
@ -189,7 +188,7 @@ class childWindow:
|
||||
self.mainWindow.connect("destroy", self.destroy)
|
||||
|
||||
self.mainWindow.show_all()
|
||||
gtk.main()
|
||||
Gtk.main()
|
||||
|
||||
if __name__ == "__main__":
|
||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||
|
2043
gui/system-config-selinux.ui
Normal file
2043
gui/system-config-selinux.ui
Normal file
File diff suppressed because it is too large
Load Diff
@ -16,17 +16,13 @@
|
||||
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
## Author: Dan Walsh
|
||||
import string
|
||||
import gtk
|
||||
import gtk.glade
|
||||
import os
|
||||
import gobject
|
||||
import sys
|
||||
try:
|
||||
from subprocess import getstatusoutput
|
||||
except ImportError:
|
||||
from commands import getstatusoutput
|
||||
|
||||
from gi.repository import GObject, Gtk
|
||||
import seobject
|
||||
from semanagePage import *
|
||||
|
||||
@ -57,27 +53,27 @@ class usersPage(semanagePage):
|
||||
def __init__(self, xml):
|
||||
semanagePage.__init__(self, xml, "users", _("SELinux User"))
|
||||
|
||||
self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||
self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
|
||||
self.view.set_model(self.store)
|
||||
self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
||||
self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
|
||||
col = gtk.TreeViewColumn(_("SELinux\nUser"), gtk.CellRendererText(), text=0)
|
||||
col = Gtk.TreeViewColumn(_("SELinux\nUser"), Gtk.CellRendererText(), text=0)
|
||||
col.set_sort_column_id(0)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
|
||||
col = gtk.TreeViewColumn(_("MLS/\nMCS Range"), gtk.CellRendererText(), text=1)
|
||||
col = Gtk.TreeViewColumn(_("MLS/\nMCS Range"), Gtk.CellRendererText(), text=1)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
|
||||
col = gtk.TreeViewColumn(_("SELinux Roles"), gtk.CellRendererText(), text=2)
|
||||
col = Gtk.TreeViewColumn(_("SELinux Roles"), Gtk.CellRendererText(), text=2)
|
||||
col.set_resizable(True)
|
||||
self.view.append_column(col)
|
||||
|
||||
self.load()
|
||||
self.selinuxUserEntry = xml.get_widget("selinuxUserEntry")
|
||||
self.mlsRangeEntry = xml.get_widget("mlsRangeEntry")
|
||||
self.selinuxRolesEntry = xml.get_widget("selinuxRolesEntry")
|
||||
self.selinuxUserEntry = xml.get_object("selinuxUserEntry")
|
||||
self.mlsRangeEntry = xml.get_object("mlsRangeEntry")
|
||||
self.selinuxRolesEntry = xml.get_object("selinuxRolesEntry")
|
||||
|
||||
def load(self, filter=""):
|
||||
self.filter = filter
|
||||
@ -96,7 +92,7 @@ class usersPage(semanagePage):
|
||||
self.view.get_selection().select_path((0,))
|
||||
|
||||
def delete(self):
|
||||
if semanagePage.delete(self) == gtk.RESPONSE_NO:
|
||||
if semanagePage.delete(self) == Gtk.ResponseType.NO:
|
||||
return None
|
||||
|
||||
def dialogInit(self):
|
||||
|
Loading…
Reference in New Issue
Block a user