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