1*2d543d20SAndroid Build Coastguard Worker## fcontextPage.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 Workerfrom gi.repository import GObject, Gtk 20*2d543d20SAndroid Build Coastguard Workerimport seobject 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 semanagePage import * 27*2d543d20SAndroid Build Coastguard Worker 28*2d543d20SAndroid Build Coastguard WorkerSPEC_COL = 0 29*2d543d20SAndroid Build Coastguard WorkerTYPE_COL = 1 30*2d543d20SAndroid Build Coastguard WorkerFTYPE_COL = 2 31*2d543d20SAndroid Build Coastguard Worker 32*2d543d20SAndroid Build Coastguard Worker 33*2d543d20SAndroid Build Coastguard Workerclass context: 34*2d543d20SAndroid Build Coastguard Worker 35*2d543d20SAndroid Build Coastguard Worker def __init__(self, scontext): 36*2d543d20SAndroid Build Coastguard Worker self.scontext = scontext 37*2d543d20SAndroid Build Coastguard Worker con = scontext.split(":") 38*2d543d20SAndroid Build Coastguard Worker self.type = con[0] 39*2d543d20SAndroid Build Coastguard Worker if len(con) > 1: 40*2d543d20SAndroid Build Coastguard Worker self.mls = con[1] 41*2d543d20SAndroid Build Coastguard Worker else: 42*2d543d20SAndroid Build Coastguard Worker self.mls = "s0" 43*2d543d20SAndroid Build Coastguard Worker 44*2d543d20SAndroid Build Coastguard Worker def __str__(self): 45*2d543d20SAndroid Build Coastguard Worker return self.scontext 46*2d543d20SAndroid Build Coastguard Worker 47*2d543d20SAndroid Build Coastguard Worker## 48*2d543d20SAndroid Build Coastguard Worker## I18N 49*2d543d20SAndroid Build Coastguard Worker## 50*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-gui" 51*2d543d20SAndroid Build Coastguard Workertry: 52*2d543d20SAndroid Build Coastguard Worker import gettext 53*2d543d20SAndroid Build Coastguard Worker kwargs = {} 54*2d543d20SAndroid Build Coastguard Worker if sys.version_info < (3,): 55*2d543d20SAndroid Build Coastguard Worker kwargs['unicode'] = True 56*2d543d20SAndroid Build Coastguard Worker t = gettext.translation(PROGNAME, 57*2d543d20SAndroid Build Coastguard Worker localedir="/usr/share/locale", 58*2d543d20SAndroid Build Coastguard Worker **kwargs, 59*2d543d20SAndroid Build Coastguard Worker fallback=True) 60*2d543d20SAndroid Build Coastguard Worker _ = t.gettext 61*2d543d20SAndroid Build Coastguard Workerexcept: 62*2d543d20SAndroid Build Coastguard Worker try: 63*2d543d20SAndroid Build Coastguard Worker import builtins 64*2d543d20SAndroid Build Coastguard Worker builtins.__dict__['_'] = str 65*2d543d20SAndroid Build Coastguard Worker except ImportError: 66*2d543d20SAndroid Build Coastguard Worker import __builtin__ 67*2d543d20SAndroid Build Coastguard Worker __builtin__.__dict__['_'] = unicode 68*2d543d20SAndroid Build Coastguard Worker 69*2d543d20SAndroid Build Coastguard Worker 70*2d543d20SAndroid Build Coastguard Workerclass fcontextPage(semanagePage): 71*2d543d20SAndroid Build Coastguard Worker 72*2d543d20SAndroid Build Coastguard Worker def __init__(self, xml): 73*2d543d20SAndroid Build Coastguard Worker semanagePage.__init__(self, xml, "fcontext", _("File Labeling")) 74*2d543d20SAndroid Build Coastguard Worker self.fcontextFilter = xml.get_object("fcontextFilterEntry") 75*2d543d20SAndroid Build Coastguard Worker self.fcontextFilter.connect("focus_out_event", self.filter_changed) 76*2d543d20SAndroid Build Coastguard Worker self.fcontextFilter.connect("activate", self.filter_changed) 77*2d543d20SAndroid Build Coastguard Worker 78*2d543d20SAndroid Build Coastguard Worker self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING) 79*2d543d20SAndroid Build Coastguard Worker self.view = xml.get_object("fcontextView") 80*2d543d20SAndroid Build Coastguard Worker self.view.set_model(self.store) 81*2d543d20SAndroid Build Coastguard Worker self.view.set_search_equal_func(self.search) 82*2d543d20SAndroid Build Coastguard Worker 83*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("File\nSpecification"), Gtk.CellRendererText(), text=SPEC_COL) 84*2d543d20SAndroid Build Coastguard Worker col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) 85*2d543d20SAndroid Build Coastguard Worker col.set_fixed_width(250) 86*2d543d20SAndroid Build Coastguard Worker 87*2d543d20SAndroid Build Coastguard Worker col.set_sort_column_id(SPEC_COL) 88*2d543d20SAndroid Build Coastguard Worker col.set_resizable(True) 89*2d543d20SAndroid Build Coastguard Worker self.view.append_column(col) 90*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("Selinux\nFile Type"), Gtk.CellRendererText(), text=TYPE_COL) 91*2d543d20SAndroid Build Coastguard Worker 92*2d543d20SAndroid Build Coastguard Worker col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) 93*2d543d20SAndroid Build Coastguard Worker col.set_fixed_width(250) 94*2d543d20SAndroid Build Coastguard Worker col.set_sort_column_id(TYPE_COL) 95*2d543d20SAndroid Build Coastguard Worker col.set_resizable(True) 96*2d543d20SAndroid Build Coastguard Worker self.view.append_column(col) 97*2d543d20SAndroid Build Coastguard Worker col = Gtk.TreeViewColumn(_("File\nType"), Gtk.CellRendererText(), text=2) 98*2d543d20SAndroid Build Coastguard Worker col.set_sort_column_id(FTYPE_COL) 99*2d543d20SAndroid Build Coastguard Worker col.set_resizable(True) 100*2d543d20SAndroid Build Coastguard Worker self.view.append_column(col) 101*2d543d20SAndroid Build Coastguard Worker 102*2d543d20SAndroid Build Coastguard Worker self.store.set_sort_column_id(SPEC_COL, Gtk.SortType.ASCENDING) 103*2d543d20SAndroid Build Coastguard Worker self.load() 104*2d543d20SAndroid Build Coastguard Worker self.fcontextEntry = xml.get_object("fcontextEntry") 105*2d543d20SAndroid Build Coastguard Worker self.fcontextFileTypeCombo = xml.get_object("fcontextFileTypeCombo") 106*2d543d20SAndroid Build Coastguard Worker # Populate file type combo_box 107*2d543d20SAndroid Build Coastguard Worker liststore = self.fcontextFileTypeCombo.get_model() 108*2d543d20SAndroid Build Coastguard Worker for ftype in seobject.file_type_str_to_option.keys(): 109*2d543d20SAndroid Build Coastguard Worker iter = liststore.append() 110*2d543d20SAndroid Build Coastguard Worker liststore.set_value(iter, 0, ftype) 111*2d543d20SAndroid Build Coastguard Worker iter = liststore.get_iter_first() 112*2d543d20SAndroid Build Coastguard Worker self.fcontextFileTypeCombo.set_active_iter(iter) 113*2d543d20SAndroid Build Coastguard Worker self.fcontextTypeEntry = xml.get_object("fcontextTypeEntry") 114*2d543d20SAndroid Build Coastguard Worker self.fcontextMLSEntry = xml.get_object("fcontextMLSEntry") 115*2d543d20SAndroid Build Coastguard Worker 116*2d543d20SAndroid Build Coastguard Worker def match(self, fcon_dict, k, filter): 117*2d543d20SAndroid Build Coastguard Worker try: 118*2d543d20SAndroid Build Coastguard Worker f = filter.lower() 119*2d543d20SAndroid Build Coastguard Worker for con in k: 120*2d543d20SAndroid Build Coastguard Worker k = con.lower() 121*2d543d20SAndroid Build Coastguard Worker if k.find(f) >= 0: 122*2d543d20SAndroid Build Coastguard Worker return True 123*2d543d20SAndroid Build Coastguard Worker for con in fcon_dict[k]: 124*2d543d20SAndroid Build Coastguard Worker k = con.lower() 125*2d543d20SAndroid Build Coastguard Worker if k.find(f) >= 0: 126*2d543d20SAndroid Build Coastguard Worker return True 127*2d543d20SAndroid Build Coastguard Worker except: 128*2d543d20SAndroid Build Coastguard Worker pass 129*2d543d20SAndroid Build Coastguard Worker return False 130*2d543d20SAndroid Build Coastguard Worker 131*2d543d20SAndroid Build Coastguard Worker def load(self, filter=""): 132*2d543d20SAndroid Build Coastguard Worker self.filter = filter 133*2d543d20SAndroid Build Coastguard Worker self.fcontext = seobject.fcontextRecords() 134*2d543d20SAndroid Build Coastguard Worker self.store.clear() 135*2d543d20SAndroid Build Coastguard Worker fcon_dict = self.fcontext.get_all(self.local) 136*2d543d20SAndroid Build Coastguard Worker if self.local: 137*2d543d20SAndroid Build Coastguard Worker fkeys = fcon_dict.keys() 138*2d543d20SAndroid Build Coastguard Worker else: 139*2d543d20SAndroid Build Coastguard Worker fkeys = sorted(fcon_dict.keys()) 140*2d543d20SAndroid Build Coastguard Worker for k in fkeys: 141*2d543d20SAndroid Build Coastguard Worker if not self.match(fcon_dict, k, filter): 142*2d543d20SAndroid Build Coastguard Worker continue 143*2d543d20SAndroid Build Coastguard Worker iter = self.store.append() 144*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, SPEC_COL, k[0]) 145*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, FTYPE_COL, k[1]) 146*2d543d20SAndroid Build Coastguard Worker if fcon_dict[k]: 147*2d543d20SAndroid Build Coastguard Worker rec = "%s:%s" % (fcon_dict[k][2], seobject.translate(fcon_dict[k][3], False)) 148*2d543d20SAndroid Build Coastguard Worker else: 149*2d543d20SAndroid Build Coastguard Worker rec = "<<None>>" 150*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, TYPE_COL, rec) 151*2d543d20SAndroid Build Coastguard Worker self.view.get_selection().select_path((0,)) 152*2d543d20SAndroid Build Coastguard Worker 153*2d543d20SAndroid Build Coastguard Worker def filter_changed(self, *arg): 154*2d543d20SAndroid Build Coastguard Worker filter = arg[0].get_text() 155*2d543d20SAndroid Build Coastguard Worker if filter != self.filter: 156*2d543d20SAndroid Build Coastguard Worker self.load(filter) 157*2d543d20SAndroid Build Coastguard Worker 158*2d543d20SAndroid Build Coastguard Worker def dialogInit(self): 159*2d543d20SAndroid Build Coastguard Worker store, iter = self.view.get_selection().get_selected() 160*2d543d20SAndroid Build Coastguard Worker self.fcontextEntry.set_text(store.get_value(iter, SPEC_COL)) 161*2d543d20SAndroid Build Coastguard Worker self.fcontextEntry.set_sensitive(False) 162*2d543d20SAndroid Build Coastguard Worker scontext = store.get_value(iter, TYPE_COL) 163*2d543d20SAndroid Build Coastguard Worker scon = context(scontext) 164*2d543d20SAndroid Build Coastguard Worker self.fcontextTypeEntry.set_text(scon.type) 165*2d543d20SAndroid Build Coastguard Worker self.fcontextMLSEntry.set_text(scon.mls) 166*2d543d20SAndroid Build Coastguard Worker type = store.get_value(iter, FTYPE_COL) 167*2d543d20SAndroid Build Coastguard Worker liststore = self.fcontextFileTypeCombo.get_model() 168*2d543d20SAndroid Build Coastguard Worker iter = liststore.get_iter_first() 169*2d543d20SAndroid Build Coastguard Worker while iter != None and liststore.get_value(iter, 0) != type: 170*2d543d20SAndroid Build Coastguard Worker iter = liststore.iter_next(iter) 171*2d543d20SAndroid Build Coastguard Worker if iter != None: 172*2d543d20SAndroid Build Coastguard Worker self.fcontextFileTypeCombo.set_active_iter(iter) 173*2d543d20SAndroid Build Coastguard Worker self.fcontextFileTypeCombo.set_sensitive(False) 174*2d543d20SAndroid Build Coastguard Worker 175*2d543d20SAndroid Build Coastguard Worker def dialogClear(self): 176*2d543d20SAndroid Build Coastguard Worker self.fcontextEntry.set_text("") 177*2d543d20SAndroid Build Coastguard Worker self.fcontextEntry.set_sensitive(True) 178*2d543d20SAndroid Build Coastguard Worker self.fcontextFileTypeCombo.set_sensitive(True) 179*2d543d20SAndroid Build Coastguard Worker self.fcontextFileTypeCombo.set_active(0) 180*2d543d20SAndroid Build Coastguard Worker self.fcontextTypeEntry.set_text("") 181*2d543d20SAndroid Build Coastguard Worker self.fcontextMLSEntry.set_text("s0") 182*2d543d20SAndroid Build Coastguard Worker 183*2d543d20SAndroid Build Coastguard Worker def delete(self): 184*2d543d20SAndroid Build Coastguard Worker store, iter = self.view.get_selection().get_selected() 185*2d543d20SAndroid Build Coastguard Worker try: 186*2d543d20SAndroid Build Coastguard Worker fspec = store.get_value(iter, SPEC_COL) 187*2d543d20SAndroid Build Coastguard Worker ftype = store.get_value(iter, FTYPE_COL) 188*2d543d20SAndroid Build Coastguard Worker self.wait() 189*2d543d20SAndroid Build Coastguard Worker (rc, out) = getstatusoutput("semanage fcontext -d -f '%s' '%s'" % (seobject.file_type_str_to_option[ftype], fspec)) 190*2d543d20SAndroid Build Coastguard Worker self.ready() 191*2d543d20SAndroid Build Coastguard Worker 192*2d543d20SAndroid Build Coastguard Worker if rc != 0: 193*2d543d20SAndroid Build Coastguard Worker return self.error(out) 194*2d543d20SAndroid Build Coastguard Worker store.remove(iter) 195*2d543d20SAndroid Build Coastguard Worker self.view.get_selection().select_path((0,)) 196*2d543d20SAndroid Build Coastguard Worker except ValueError as e: 197*2d543d20SAndroid Build Coastguard Worker self.error(e.args[0]) 198*2d543d20SAndroid Build Coastguard Worker 199*2d543d20SAndroid Build Coastguard Worker def add(self): 200*2d543d20SAndroid Build Coastguard Worker fspec = self.fcontextEntry.get_text().strip() 201*2d543d20SAndroid Build Coastguard Worker type = self.fcontextTypeEntry.get_text().strip() 202*2d543d20SAndroid Build Coastguard Worker mls = self.fcontextMLSEntry.get_text().strip() 203*2d543d20SAndroid Build Coastguard Worker list_model = self.fcontextFileTypeCombo.get_model() 204*2d543d20SAndroid Build Coastguard Worker it = self.fcontextFileTypeCombo.get_active_iter() 205*2d543d20SAndroid Build Coastguard Worker ftype = list_model.get_value(it, 0) 206*2d543d20SAndroid Build Coastguard Worker self.wait() 207*2d543d20SAndroid Build Coastguard Worker (rc, out) = getstatusoutput("semanage fcontext -a -t %s -r %s -f '%s' '%s'" % (type, mls, seobject.file_type_str_to_option[ftype], fspec)) 208*2d543d20SAndroid Build Coastguard Worker self.ready() 209*2d543d20SAndroid Build Coastguard Worker if rc != 0: 210*2d543d20SAndroid Build Coastguard Worker self.error(out) 211*2d543d20SAndroid Build Coastguard Worker return False 212*2d543d20SAndroid Build Coastguard Worker 213*2d543d20SAndroid Build Coastguard Worker iter = self.store.append() 214*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, SPEC_COL, fspec) 215*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, FTYPE_COL, ftype) 216*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls)) 217*2d543d20SAndroid Build Coastguard Worker 218*2d543d20SAndroid Build Coastguard Worker def modify(self): 219*2d543d20SAndroid Build Coastguard Worker fspec = self.fcontextEntry.get_text().strip() 220*2d543d20SAndroid Build Coastguard Worker type = self.fcontextTypeEntry.get_text().strip() 221*2d543d20SAndroid Build Coastguard Worker mls = self.fcontextMLSEntry.get_text().strip() 222*2d543d20SAndroid Build Coastguard Worker list_model = self.fcontextFileTypeCombo.get_model() 223*2d543d20SAndroid Build Coastguard Worker iter = self.fcontextFileTypeCombo.get_active_iter() 224*2d543d20SAndroid Build Coastguard Worker ftype = list_model.get_value(iter, 0) 225*2d543d20SAndroid Build Coastguard Worker self.wait() 226*2d543d20SAndroid Build Coastguard Worker (rc, out) = getstatusoutput("semanage fcontext -m -t %s -r %s -f '%s' '%s'" % (type, mls, seobject.file_type_str_to_option[ftype], fspec)) 227*2d543d20SAndroid Build Coastguard Worker self.ready() 228*2d543d20SAndroid Build Coastguard Worker if rc != 0: 229*2d543d20SAndroid Build Coastguard Worker self.error(out) 230*2d543d20SAndroid Build Coastguard Worker return False 231*2d543d20SAndroid Build Coastguard Worker 232*2d543d20SAndroid Build Coastguard Worker store, iter = self.view.get_selection().get_selected() 233*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, SPEC_COL, fspec) 234*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, FTYPE_COL, ftype) 235*2d543d20SAndroid Build Coastguard Worker self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls)) 236