1514af85b89fff54f079f239294c727e4d61319edDan Walsh## fcontextPage.py - show selinux mappings 2514af85b89fff54f079f239294c727e4d61319edDan Walsh## Copyright (C) 2006 Red Hat, Inc. 3514af85b89fff54f079f239294c727e4d61319edDan Walsh 4514af85b89fff54f079f239294c727e4d61319edDan Walsh## This program is free software; you can redistribute it and/or modify 5514af85b89fff54f079f239294c727e4d61319edDan Walsh## it under the terms of the GNU General Public License as published by 6514af85b89fff54f079f239294c727e4d61319edDan Walsh## the Free Software Foundation; either version 2 of the License, or 7514af85b89fff54f079f239294c727e4d61319edDan Walsh## (at your option) any later version. 8514af85b89fff54f079f239294c727e4d61319edDan Walsh 9514af85b89fff54f079f239294c727e4d61319edDan Walsh## This program is distributed in the hope that it will be useful, 10514af85b89fff54f079f239294c727e4d61319edDan Walsh## but WITHOUT ANY WARRANTY; without even the implied warranty of 11514af85b89fff54f079f239294c727e4d61319edDan Walsh## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12514af85b89fff54f079f239294c727e4d61319edDan Walsh## GNU General Public License for more details. 13514af85b89fff54f079f239294c727e4d61319edDan Walsh 14514af85b89fff54f079f239294c727e4d61319edDan Walsh## You should have received a copy of the GNU General Public License 15514af85b89fff54f079f239294c727e4d61319edDan Walsh## along with this program; if not, write to the Free Software 16514af85b89fff54f079f239294c727e4d61319edDan Walsh## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17514af85b89fff54f079f239294c727e4d61319edDan Walsh 18514af85b89fff54f079f239294c727e4d61319edDan Walsh## Author: Dan Walsh 19514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk 20514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk.glade 21514af85b89fff54f079f239294c727e4d61319edDan Walshimport os 22514af85b89fff54f079f239294c727e4d61319edDan Walshimport gobject 23514af85b89fff54f079f239294c727e4d61319edDan Walshimport seobject 24514af85b89fff54f079f239294c727e4d61319edDan Walshimport commands 25789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zamanfrom semanagePage import * 26514af85b89fff54f079f239294c727e4d61319edDan Walsh 27514af85b89fff54f079f239294c727e4d61319edDan WalshSPEC_COL = 0 28514af85b89fff54f079f239294c727e4d61319edDan WalshTYPE_COL = 1 29514af85b89fff54f079f239294c727e4d61319edDan WalshFTYPE_COL = 2 30514af85b89fff54f079f239294c727e4d61319edDan Walsh 31789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman 32514af85b89fff54f079f239294c727e4d61319edDan Walshclass context: 33789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman 34514af85b89fff54f079f239294c727e4d61319edDan Walsh def __init__(self, scontext): 35514af85b89fff54f079f239294c727e4d61319edDan Walsh self.scontext = scontext 36789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman con = scontext.split(":") 37514af85b89fff54f079f239294c727e4d61319edDan Walsh self.type = con[0] 38514af85b89fff54f079f239294c727e4d61319edDan Walsh if len(con) > 1: 39514af85b89fff54f079f239294c727e4d61319edDan Walsh self.mls = con[1] 40514af85b89fff54f079f239294c727e4d61319edDan Walsh else: 41514af85b89fff54f079f239294c727e4d61319edDan Walsh self.mls = "s0" 42514af85b89fff54f079f239294c727e4d61319edDan Walsh 43514af85b89fff54f079f239294c727e4d61319edDan Walsh def __str__(self): 44514af85b89fff54f079f239294c727e4d61319edDan Walsh return self.scontext 45514af85b89fff54f079f239294c727e4d61319edDan Walsh 46514af85b89fff54f079f239294c727e4d61319edDan Walsh## 47514af85b89fff54f079f239294c727e4d61319edDan Walsh## I18N 48514af85b89fff54f079f239294c727e4d61319edDan Walsh## 49789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason ZamanPROGNAME = "policycoreutils" 50514af85b89fff54f079f239294c727e4d61319edDan Walsh 51514af85b89fff54f079f239294c727e4d61319edDan Walshimport gettext 52514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.bindtextdomain(PROGNAME, "/usr/share/locale") 53514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.textdomain(PROGNAME) 54514af85b89fff54f079f239294c727e4d61319edDan Walshtry: 55514af85b89fff54f079f239294c727e4d61319edDan Walsh gettext.install(PROGNAME, 56514af85b89fff54f079f239294c727e4d61319edDan Walsh localedir="/usr/share/locale", 57514af85b89fff54f079f239294c727e4d61319edDan Walsh unicode=False, 58789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman codeset='utf-8') 59514af85b89fff54f079f239294c727e4d61319edDan Walshexcept IOError: 60514af85b89fff54f079f239294c727e4d61319edDan Walsh import __builtin__ 61514af85b89fff54f079f239294c727e4d61319edDan Walsh __builtin__.__dict__['_'] = unicode 62514af85b89fff54f079f239294c727e4d61319edDan Walsh 63514af85b89fff54f079f239294c727e4d61319edDan Walsh 64514af85b89fff54f079f239294c727e4d61319edDan Walshclass fcontextPage(semanagePage): 65789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman 66514af85b89fff54f079f239294c727e4d61319edDan Walsh def __init__(self, xml): 67514af85b89fff54f079f239294c727e4d61319edDan Walsh semanagePage.__init__(self, xml, "fcontext", _("File Labeling")) 68514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFilter = xml.get_widget("fcontextFilterEntry") 69514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFilter.connect("focus_out_event", self.filter_changed) 70514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFilter.connect("activate", self.filter_changed) 71514af85b89fff54f079f239294c727e4d61319edDan Walsh 72514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) 73514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view = xml.get_widget("fcontextView") 74514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.set_model(self.store) 75514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.set_search_equal_func(self.search) 76514af85b89fff54f079f239294c727e4d61319edDan Walsh 77514af85b89fff54f079f239294c727e4d61319edDan Walsh col = gtk.TreeViewColumn(_("File\nSpecification"), gtk.CellRendererText(), text=SPEC_COL) 78789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 79789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman col.set_fixed_width(250) 80514af85b89fff54f079f239294c727e4d61319edDan Walsh 81514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_sort_column_id(SPEC_COL) 82514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 83514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 84514af85b89fff54f079f239294c727e4d61319edDan Walsh col = gtk.TreeViewColumn(_("Selinux\nFile Type"), gtk.CellRendererText(), text=TYPE_COL) 85514af85b89fff54f079f239294c727e4d61319edDan Walsh 86789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 87789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman col.set_fixed_width(250) 88514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_sort_column_id(TYPE_COL) 89514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 90514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 91514af85b89fff54f079f239294c727e4d61319edDan Walsh col = gtk.TreeViewColumn(_("File\nType"), gtk.CellRendererText(), text=2) 92514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_sort_column_id(FTYPE_COL) 93514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 94514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 95514af85b89fff54f079f239294c727e4d61319edDan Walsh 96514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_sort_column_id(SPEC_COL, gtk.SORT_ASCENDING) 97514af85b89fff54f079f239294c727e4d61319edDan Walsh self.load() 98514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextEntry = xml.get_widget("fcontextEntry") 99514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFileTypeCombo = xml.get_widget("fcontextFileTypeCombo") 100789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman liststore = self.fcontextFileTypeCombo.get_model() 101514af85b89fff54f079f239294c727e4d61319edDan Walsh for k in seobject.file_types: 102789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman if len(k) > 0 and k[0] != '-': 103789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman iter = liststore.append() 104514af85b89fff54f079f239294c727e4d61319edDan Walsh liststore.set_value(iter, 0, k) 105514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.get_iter_first() 106514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFileTypeCombo.set_active_iter(iter) 107514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextTypeEntry = xml.get_widget("fcontextTypeEntry") 108514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextMLSEntry = xml.get_widget("fcontextMLSEntry") 109514af85b89fff54f079f239294c727e4d61319edDan Walsh 110514af85b89fff54f079f239294c727e4d61319edDan Walsh def match(self, fcon_dict, k, filter): 111514af85b89fff54f079f239294c727e4d61319edDan Walsh try: 112789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman f = filter.lower() 113514af85b89fff54f079f239294c727e4d61319edDan Walsh for con in k: 114789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman k = con.lower() 115514af85b89fff54f079f239294c727e4d61319edDan Walsh if k.find(f) >= 0: 116514af85b89fff54f079f239294c727e4d61319edDan Walsh return True 117514af85b89fff54f079f239294c727e4d61319edDan Walsh for con in fcon_dict[k]: 118789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman k = con.lower() 119514af85b89fff54f079f239294c727e4d61319edDan Walsh if k.find(f) >= 0: 120514af85b89fff54f079f239294c727e4d61319edDan Walsh return True 121514af85b89fff54f079f239294c727e4d61319edDan Walsh except: 122514af85b89fff54f079f239294c727e4d61319edDan Walsh pass 123514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 124514af85b89fff54f079f239294c727e4d61319edDan Walsh 125514af85b89fff54f079f239294c727e4d61319edDan Walsh def load(self, filter=""): 126789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman self.filter = filter 127789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman self.fcontext = seobject.fcontextRecords() 128514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.clear() 129789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman fcon_dict = self.fcontext.get_all(self.local) 130514af85b89fff54f079f239294c727e4d61319edDan Walsh keys = fcon_dict.keys() 131514af85b89fff54f079f239294c727e4d61319edDan Walsh keys.sort() 132514af85b89fff54f079f239294c727e4d61319edDan Walsh for k in keys: 133514af85b89fff54f079f239294c727e4d61319edDan Walsh if not self.match(fcon_dict, k, filter): 134514af85b89fff54f079f239294c727e4d61319edDan Walsh continue 135789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman iter = self.store.append() 136514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, SPEC_COL, k[0]) 137514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, FTYPE_COL, k[1]) 138514af85b89fff54f079f239294c727e4d61319edDan Walsh if fcon_dict[k]: 139789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman rec = "%s:%s" % (fcon_dict[k][2], seobject.translate(fcon_dict[k][3], False)) 140514af85b89fff54f079f239294c727e4d61319edDan Walsh else: 141789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman rec = "<<None>>" 142514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, TYPE_COL, rec) 143789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman self.view.get_selection().select_path((0,)) 144514af85b89fff54f079f239294c727e4d61319edDan Walsh 145514af85b89fff54f079f239294c727e4d61319edDan Walsh def filter_changed(self, *arg): 146789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman filter = arg[0].get_text() 147514af85b89fff54f079f239294c727e4d61319edDan Walsh if filter != self.filter: 148514af85b89fff54f079f239294c727e4d61319edDan Walsh self.load(filter) 149514af85b89fff54f079f239294c727e4d61319edDan Walsh 150514af85b89fff54f079f239294c727e4d61319edDan Walsh def dialogInit(self): 151514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 152514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextEntry.set_text(store.get_value(iter, SPEC_COL)) 153514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextEntry.set_sensitive(False) 154514af85b89fff54f079f239294c727e4d61319edDan Walsh scontext = store.get_value(iter, TYPE_COL) 155789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman scon = context(scontext) 156514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextTypeEntry.set_text(scon.type) 157514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextMLSEntry.set_text(scon.mls) 158789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman type = store.get_value(iter, FTYPE_COL) 159789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman liststore = self.fcontextFileTypeCombo.get_model() 160514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.get_iter_first() 161789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman while iter != None and liststore.get_value(iter, 0) != type: 162514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.iter_next(iter) 163514af85b89fff54f079f239294c727e4d61319edDan Walsh if iter != None: 164514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFileTypeCombo.set_active_iter(iter) 165514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFileTypeCombo.set_sensitive(False) 166514af85b89fff54f079f239294c727e4d61319edDan Walsh 167514af85b89fff54f079f239294c727e4d61319edDan Walsh def dialogClear(self): 168514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextEntry.set_text("") 169514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextEntry.set_sensitive(True) 170514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextFileTypeCombo.set_sensitive(True) 171514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextTypeEntry.set_text("") 172514af85b89fff54f079f239294c727e4d61319edDan Walsh self.fcontextMLSEntry.set_text("s0") 173514af85b89fff54f079f239294c727e4d61319edDan Walsh 174514af85b89fff54f079f239294c727e4d61319edDan Walsh def delete(self): 175514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 176514af85b89fff54f079f239294c727e4d61319edDan Walsh try: 177789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman fspec = store.get_value(iter, SPEC_COL) 178789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman ftype = store.get_value(iter, FTYPE_COL) 179514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 180514af85b89fff54f079f239294c727e4d61319edDan Walsh (rc, out) = commands.getstatusoutput("semanage fcontext -d -f '%s' '%s'" % (ftype, fspec)) 181514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 182514af85b89fff54f079f239294c727e4d61319edDan Walsh 183514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 184514af85b89fff54f079f239294c727e4d61319edDan Walsh return self.error(out) 185514af85b89fff54f079f239294c727e4d61319edDan Walsh store.remove(iter) 186789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman self.view.get_selection().select_path((0,)) 187514af85b89fff54f079f239294c727e4d61319edDan Walsh except ValueError, e: 188514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(e.args[0]) 189514af85b89fff54f079f239294c727e4d61319edDan Walsh 190514af85b89fff54f079f239294c727e4d61319edDan Walsh def add(self): 191789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman ftype = ["", "--", "-d", "-c", "-b", "-s", "-l", "-p"] 192789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman fspec = self.fcontextEntry.get_text().strip() 193789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman type = self.fcontextTypeEntry.get_text().strip() 194789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman mls = self.fcontextMLSEntry.get_text().strip() 195789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman list_model = self.fcontextFileTypeCombo.get_model() 196514af85b89fff54f079f239294c727e4d61319edDan Walsh active = self.fcontextFileTypeCombo.get_active() 197514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 198514af85b89fff54f079f239294c727e4d61319edDan Walsh (rc, out) = commands.getstatusoutput("semanage fcontext -a -t %s -r %s -f '%s' '%s'" % (type, mls, ftype[active], fspec)) 199514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 200514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 201514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 202514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 203514af85b89fff54f079f239294c727e4d61319edDan Walsh 204789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman iter = self.store.append() 205514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, SPEC_COL, fspec) 206514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, FTYPE_COL, ftype) 207514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls)) 208514af85b89fff54f079f239294c727e4d61319edDan Walsh 209514af85b89fff54f079f239294c727e4d61319edDan Walsh def modify(self): 210789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman fspec = self.fcontextEntry.get_text().strip() 211789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman type = self.fcontextTypeEntry.get_text().strip() 212789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman mls = self.fcontextMLSEntry.get_text().strip() 213789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman list_model = self.fcontextFileTypeCombo.get_model() 214514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.fcontextFileTypeCombo.get_active_iter() 215789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman ftype = list_model.get_value(iter, 0) 216514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 217514af85b89fff54f079f239294c727e4d61319edDan Walsh (rc, out) = commands.getstatusoutput("semanage fcontext -m -t %s -r %s -f '%s' '%s'" % (type, mls, ftype, fspec)) 218514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 219514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 220514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 221514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 222514af85b89fff54f079f239294c727e4d61319edDan Walsh 223514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 224514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, SPEC_COL, fspec) 225514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, FTYPE_COL, ftype) 226514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls)) 227