1*2d543d20SAndroid Build Coastguard Worker## modulesPage.py - show selinux mappings 2*2d543d20SAndroid Build Coastguard Worker## Copyright (C) 2006-2009 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 subprocess import Popen, PIPE 21*2d543d20SAndroid Build Coastguard Workertry: 22*2d543d20SAndroid Build Coastguard Worker from subprocess import getstatusoutput 23*2d543d20SAndroid Build Coastguard Workerexcept ImportError: 24*2d543d20SAndroid Build Coastguard Worker from commands import getstatusoutput 25*2d543d20SAndroid Build Coastguard Worker 26*2d543d20SAndroid Build Coastguard Workerfrom gi.repository import GObject, Gtk 27*2d543d20SAndroid Build Coastguard Workerimport selinux 28*2d543d20SAndroid Build Coastguard Workerfrom semanagePage import * 29*2d543d20SAndroid Build Coastguard Worker 30*2d543d20SAndroid Build Coastguard Worker## 31*2d543d20SAndroid Build Coastguard Worker## I18N 32*2d543d20SAndroid Build Coastguard Worker## 33*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-gui" 34*2d543d20SAndroid Build Coastguard Workertry: 35*2d543d20SAndroid Build Coastguard Worker import gettext 36*2d543d20SAndroid Build Coastguard Worker kwargs = {} 37*2d543d20SAndroid Build Coastguard Worker if sys.version_info < (3,): 38*2d543d20SAndroid Build Coastguard Worker kwargs['unicode'] = True 39*2d543d20SAndroid Build Coastguard Worker t = gettext.translation(PROGNAME, 40*2d543d20SAndroid Build Coastguard Worker localedir="/usr/share/locale", 41*2d543d20SAndroid Build Coastguard Worker **kwargs, 42*2d543d20SAndroid Build Coastguard Worker fallback=True) 43*2d543d20SAndroid Build Coastguard Worker _ = t.gettext 44*2d543d20SAndroid Build Coastguard Workerexcept: 45*2d543d20SAndroid Build Coastguard Worker try: 46*2d543d20SAndroid Build Coastguard Worker import builtins 47*2d543d20SAndroid Build Coastguard Worker builtins.__dict__['_'] = str 48*2d543d20SAndroid Build Coastguard Worker except ImportError: 49*2d543d20SAndroid Build Coastguard Worker import __builtin__ 50*2d543d20SAndroid Build Coastguard Worker __builtin__.__dict__['_'] = unicode 51*2d543d20SAndroid Build Coastguard Worker 52*2d543d20SAndroid Build Coastguard Worker 53*2d543d20SAndroid Build Coastguard Workerclass modulesPage(semanagePage): 54*2d543d20SAndroid Build Coastguard Worker 55*2d543d20SAndroid Build Coastguard Worker def __init__(self, xml): 56*2d543d20SAndroid Build Coastguard Worker semanagePage.__init__(self, xml, "modules", _("Policy Module")) 57*2d543d20SAndroid Build Coastguard Worker self.module_filter = xml.get_object("modulesFilterEntry") 58*2d543d20SAndroid Build Coastguard Worker self.module_filter.connect("focus_out_event", self.filter_changed) 59*2d543d20SAndroid Build Coastguard Worker self.module_filter.connect("activate", self.filter_changed) 60*2d543d20SAndroid Build Coastguard Worker self.audit_enabled = False 61*2d543d20SAndroid Build Coastguard Worker 62*2d543d20SAndroid Build Coastguard Worker self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, 63*2d543d20SAndroid Build Coastguard Worker GObject.TYPE_STRING) 64*2d543d20SAndroid Build Coastguard Worker self.view.set_model(self.store) 65*2d543d20SAndroid Build Coastguard Worker self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 66*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Module Name"), Gtk.CellRendererText(), text=0) 67*2d543d20SAndroid Build Coastguard Worker col.set_sort_column_id(0) 68*2d543d20SAndroid Build Coastguard Worker col.set_resizable(True) 69*2d543d20SAndroid Build Coastguard Worker self.view.append_column(col) 70*2d543d20SAndroid Build Coastguard Worker self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 71*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Priority"), Gtk.CellRendererText(), text=1) 72*2d543d20SAndroid Build Coastguard Worker self.enable_audit_button = xml.get_object("enableAuditButton") 73*2d543d20SAndroid Build Coastguard Worker self.enable_audit_button.connect("clicked", self.enable_audit) 74*2d543d20SAndroid Build Coastguard Worker self.new_button = xml.get_object("newModuleButton") 75*2d543d20SAndroid Build Coastguard Worker self.new_button.connect("clicked", self.new_module) 76*2d543d20SAndroid Build Coastguard Worker col.set_sort_column_id(1) 77*2d543d20SAndroid Build Coastguard Worker col.set_resizable(True) 78*2d543d20SAndroid Build Coastguard Worker self.view.append_column(col) 79*2d543d20SAndroid Build Coastguard Worker self.store.set_sort_column_id(2, Gtk.SortType.ASCENDING) 80*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Kind"), Gtk.CellRendererText(), text=2) 81*2d543d20SAndroid Build Coastguard Worker col.set_sort_column_id(2) 82*2d543d20SAndroid Build Coastguard Worker col.set_resizable(True) 83*2d543d20SAndroid Build Coastguard Worker self.view.append_column(col) 84*2d543d20SAndroid Build Coastguard Worker self.store.set_sort_func(1, self.sort_int, "") 85*2d543d20SAndroid Build Coastguard Worker status, self.policy_type = selinux.selinux_getpolicytype() 86*2d543d20SAndroid Build Coastguard Worker 87*2d543d20SAndroid Build Coastguard Worker self.load() 88*2d543d20SAndroid Build Coastguard Worker 89*2d543d20SAndroid Build Coastguard Worker def sort_int(self, treemodel, iter1, iter2, user_data): 90*2d543d20SAndroid Build Coastguard Worker try: 91*2d543d20SAndroid Build Coastguard Worker p1 = int(treemodel.get_value(iter1, 1)) 92*2d543d20SAndroid Build Coastguard Worker p2 = int(treemodel.get_value(iter1, 1)) 93*2d543d20SAndroid Build Coastguard Worker if p1 > p2: 94*2d543d20SAndroid Build Coastguard Worker return 1 95*2d543d20SAndroid Build Coastguard Worker if p1 == p2: 96*2d543d20SAndroid Build Coastguard Worker return 0 97*2d543d20SAndroid Build Coastguard Worker return -1 98*2d543d20SAndroid Build Coastguard Worker except: 99*2d543d20SAndroid Build Coastguard Worker return 0 100*2d543d20SAndroid Build Coastguard Worker 101*2d543d20SAndroid Build Coastguard Worker def load(self, filter=""): 102*2d543d20SAndroid Build Coastguard Worker self.filter = filter 103*2d543d20SAndroid Build Coastguard Worker self.store.clear() 104*2d543d20SAndroid Build Coastguard Worker try: 105*2d543d20SAndroid Build Coastguard Worker fd = Popen("semodule -lfull", shell=True, stdout=PIPE).stdout 106*2d543d20SAndroid Build Coastguard Worker l = fd.readlines() 107*2d543d20SAndroid Build Coastguard Worker fd.close() 108*2d543d20SAndroid Build Coastguard Worker for i in l: 109*2d543d20SAndroid Build Coastguard Worker priority, module, kind = i.decode('utf-8').split() 110*2d543d20SAndroid Build Coastguard Worker if not (self.match(module, filter) or self.match(priority, filter)): 111*2d543d20SAndroid Build Coastguard Worker continue 112*2d543d20SAndroid Build Coastguard Worker iter = self.store.append() 113*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 0, module.strip()) 114*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 1, priority.strip()) 115*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, 2, kind.strip()) 116*2d543d20SAndroid Build Coastguard Worker except: 117*2d543d20SAndroid Build Coastguard Worker pass 118*2d543d20SAndroid Build Coastguard Worker self.view.get_selection().select_path((0,)) 119*2d543d20SAndroid Build Coastguard Worker 120*2d543d20SAndroid Build Coastguard Worker def new_module(self, args): 121*2d543d20SAndroid Build Coastguard Worker try: 122*2d543d20SAndroid Build Coastguard Worker Popen(["selinux-polgengui"]) 123*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 124*2d543d20SAndroid Build Coastguard Worker self.error(e.args[0]) 125*2d543d20SAndroid Build Coastguard Worker 126*2d543d20SAndroid Build Coastguard Worker def delete(self): 127*2d543d20SAndroid Build Coastguard Worker store, iter = self.view.get_selection().get_selected() 128*2d543d20SAndroid Build Coastguard Worker module = store.get_value(iter, 0) 129*2d543d20SAndroid Build Coastguard Worker priority = store.get_value(iter, 1) 130*2d543d20SAndroid Build Coastguard Worker try: 131*2d543d20SAndroid Build Coastguard Worker self.wait() 132*2d543d20SAndroid Build Coastguard Worker status, output = getstatusoutput("semodule -X %s -r %s" % (priority, module)) 133*2d543d20SAndroid Build Coastguard Worker self.ready() 134*2d543d20SAndroid Build Coastguard Worker if status != 0: 135*2d543d20SAndroid Build Coastguard Worker self.error(output) 136*2d543d20SAndroid Build Coastguard Worker else: 137*2d543d20SAndroid Build Coastguard Worker store.remove(iter) 138*2d543d20SAndroid Build Coastguard Worker self.view.get_selection().select_path((0,)) 139*2d543d20SAndroid Build Coastguard Worker 140*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 141*2d543d20SAndroid Build Coastguard Worker self.error(e.args[0]) 142*2d543d20SAndroid Build Coastguard Worker 143*2d543d20SAndroid Build Coastguard Worker def enable_audit(self, button): 144*2d543d20SAndroid Build Coastguard Worker self.audit_enabled = not self.audit_enabled 145*2d543d20SAndroid Build Coastguard Worker try: 146*2d543d20SAndroid Build Coastguard Worker self.wait() 147*2d543d20SAndroid Build Coastguard Worker if self.audit_enabled: 148*2d543d20SAndroid Build Coastguard Worker status, output = getstatusoutput("semodule -DB") 149*2d543d20SAndroid Build Coastguard Worker button.set_label(_("Disable Audit")) 150*2d543d20SAndroid Build Coastguard Worker else: 151*2d543d20SAndroid Build Coastguard Worker status, output = getstatusoutput("semodule -B") 152*2d543d20SAndroid Build Coastguard Worker button.set_label(_("Enable Audit")) 153*2d543d20SAndroid Build Coastguard Worker self.ready() 154*2d543d20SAndroid Build Coastguard Worker 155*2d543d20SAndroid Build Coastguard Worker if status != 0: 156*2d543d20SAndroid Build Coastguard Worker self.error(output) 157*2d543d20SAndroid Build Coastguard Worker 158*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 159*2d543d20SAndroid Build Coastguard Worker self.error(e.args[0]) 160*2d543d20SAndroid Build Coastguard Worker 161*2d543d20SAndroid Build Coastguard Worker def disable_audit(self, button): 162*2d543d20SAndroid Build Coastguard Worker try: 163*2d543d20SAndroid Build Coastguard Worker self.wait() 164*2d543d20SAndroid Build Coastguard Worker status, output = getstatusoutput("semodule -B") 165*2d543d20SAndroid Build Coastguard Worker self.ready() 166*2d543d20SAndroid Build Coastguard Worker if status != 0: 167*2d543d20SAndroid Build Coastguard Worker self.error(output) 168*2d543d20SAndroid Build Coastguard Worker 169*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 170*2d543d20SAndroid Build Coastguard Worker self.error(e.args[0]) 171*2d543d20SAndroid Build Coastguard Worker 172*2d543d20SAndroid Build Coastguard Worker def propertiesDialog(self): 173*2d543d20SAndroid Build Coastguard Worker # Do nothing 174*2d543d20SAndroid Build Coastguard Worker return 175*2d543d20SAndroid Build Coastguard Worker 176*2d543d20SAndroid Build Coastguard Worker def addDialog(self): 177*2d543d20SAndroid Build Coastguard Worker dialog = Gtk.FileChooserDialog(_("Load Policy Module"), 178*2d543d20SAndroid Build Coastguard Worker None, 179*2d543d20SAndroid Build Coastguard Worker Gtk.FileChooserAction.OPEN, 180*2d543d20SAndroid Build Coastguard Worker (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 181*2d543d20SAndroid Build Coastguard Worker Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) 182*2d543d20SAndroid Build Coastguard Worker dialog.set_default_response(Gtk.ResponseType.OK) 183*2d543d20SAndroid Build Coastguard Worker 184*2d543d20SAndroid Build Coastguard Worker filter = Gtk.FileFilter() 185*2d543d20SAndroid Build Coastguard Worker filter.set_name("Policy Files") 186*2d543d20SAndroid Build Coastguard Worker filter.add_pattern("*.pp") 187*2d543d20SAndroid Build Coastguard Worker dialog.add_filter(filter) 188*2d543d20SAndroid Build Coastguard Worker 189*2d543d20SAndroid Build Coastguard Worker response = dialog.run() 190*2d543d20SAndroid Build Coastguard Worker if response == Gtk.ResponseType.OK: 191*2d543d20SAndroid Build Coastguard Worker self.add(dialog.get_filename()) 192*2d543d20SAndroid Build Coastguard Worker dialog.destroy() 193*2d543d20SAndroid Build Coastguard Worker 194*2d543d20SAndroid Build Coastguard Worker def add(self, file): 195*2d543d20SAndroid Build Coastguard Worker try: 196*2d543d20SAndroid Build Coastguard Worker self.wait() 197*2d543d20SAndroid Build Coastguard Worker status, output = getstatusoutput("semodule -i %s" % file) 198*2d543d20SAndroid Build Coastguard Worker self.ready() 199*2d543d20SAndroid Build Coastguard Worker if status != 0: 200*2d543d20SAndroid Build Coastguard Worker self.error(output) 201*2d543d20SAndroid Build Coastguard Worker else: 202*2d543d20SAndroid Build Coastguard Worker self.load() 203*2d543d20SAndroid Build Coastguard Worker 204*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 205*2d543d20SAndroid Build Coastguard Worker self.error(e.args[0]) 206