1514af85b89fff54f079f239294c727e4d61319edDan Walsh## loginsPage.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 string 20514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk 21514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk.glade 22514af85b89fff54f079f239294c727e4d61319edDan Walshimport os 23514af85b89fff54f079f239294c727e4d61319edDan Walshimport gobject 24514af85b89fff54f079f239294c727e4d61319edDan Walshimport sys 25514af85b89fff54f079f239294c727e4d61319edDan Walshimport commands 26514af85b89fff54f079f239294c727e4d61319edDan Walshimport seobject 27514af85b89fff54f079f239294c727e4d61319edDan Walshfrom semanagePage import *; 28514af85b89fff54f079f239294c727e4d61319edDan Walsh 29514af85b89fff54f079f239294c727e4d61319edDan Walsh## 30514af85b89fff54f079f239294c727e4d61319edDan Walsh## I18N 31514af85b89fff54f079f239294c727e4d61319edDan Walsh## 32514af85b89fff54f079f239294c727e4d61319edDan WalshPROGNAME="policycoreutils" 33514af85b89fff54f079f239294c727e4d61319edDan Walshimport gettext 34514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.bindtextdomain(PROGNAME, "/usr/share/locale") 35514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.textdomain(PROGNAME) 36514af85b89fff54f079f239294c727e4d61319edDan Walshtry: 37514af85b89fff54f079f239294c727e4d61319edDan Walsh gettext.install(PROGNAME, 38514af85b89fff54f079f239294c727e4d61319edDan Walsh localedir="/usr/share/locale", 39514af85b89fff54f079f239294c727e4d61319edDan Walsh unicode=False, 40514af85b89fff54f079f239294c727e4d61319edDan Walsh codeset = 'utf-8') 41514af85b89fff54f079f239294c727e4d61319edDan Walshexcept IOError: 42514af85b89fff54f079f239294c727e4d61319edDan Walsh import __builtin__ 43514af85b89fff54f079f239294c727e4d61319edDan Walsh __builtin__.__dict__['_'] = unicode 44514af85b89fff54f079f239294c727e4d61319edDan Walsh 45514af85b89fff54f079f239294c727e4d61319edDan Walshclass loginsPage(semanagePage): 46514af85b89fff54f079f239294c727e4d61319edDan Walsh def __init__(self, xml): 47514af85b89fff54f079f239294c727e4d61319edDan Walsh self.firstTime = False 48514af85b89fff54f079f239294c727e4d61319edDan Walsh semanagePage.__init__(self, xml, "logins", _("User Mapping")) 49514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) 50514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.set_model(self.store) 51514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 52514af85b89fff54f079f239294c727e4d61319edDan Walsh col = gtk.TreeViewColumn(_("Login\nName"), gtk.CellRendererText(), text = 0) 53514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_sort_column_id(0) 54514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 55514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 56514af85b89fff54f079f239294c727e4d61319edDan Walsh col = gtk.TreeViewColumn(_("SELinux\nUser"), gtk.CellRendererText(), text = 1) 57514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 58514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 59514af85b89fff54f079f239294c727e4d61319edDan Walsh col = gtk.TreeViewColumn(_("MLS/\nMCS Range"), gtk.CellRendererText(), text = 2) 60514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 61514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 62514af85b89fff54f079f239294c727e4d61319edDan Walsh self.load() 63514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry = xml.get_widget("loginsNameEntry") 64514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo = xml.get_widget("loginsSelinuxUserCombo") 65514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsMLSEntry = xml.get_widget("loginsMLSEntry") 66514af85b89fff54f079f239294c727e4d61319edDan Walsh 67514af85b89fff54f079f239294c727e4d61319edDan Walsh def load(self, filter = ""): 68514af85b89fff54f079f239294c727e4d61319edDan Walsh self.filter=filter 69514af85b89fff54f079f239294c727e4d61319edDan Walsh self.login = seobject.loginRecords() 70514af85b89fff54f079f239294c727e4d61319edDan Walsh dict = self.login.get_all(0) 71514af85b89fff54f079f239294c727e4d61319edDan Walsh keys = dict.keys() 72514af85b89fff54f079f239294c727e4d61319edDan Walsh keys.sort() 73514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.clear() 74514af85b89fff54f079f239294c727e4d61319edDan Walsh for k in keys: 75514af85b89fff54f079f239294c727e4d61319edDan Walsh range = seobject.translate(dict[k][1]) 76514af85b89fff54f079f239294c727e4d61319edDan Walsh if not (self.match(k, filter) or self.match(dict[k][0], filter) or self.match(range, filter)): 77514af85b89fff54f079f239294c727e4d61319edDan Walsh continue 78514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.store.append() 79514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 0, k) 80514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 1, dict[k][0]) 81514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 2, range) 82514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.get_selection().select_path ((0,)) 83514af85b89fff54f079f239294c727e4d61319edDan Walsh 84514af85b89fff54f079f239294c727e4d61319edDan Walsh def __dialogSetup(self): 85514af85b89fff54f079f239294c727e4d61319edDan Walsh if self.firstTime == True: 86514af85b89fff54f079f239294c727e4d61319edDan Walsh return 87514af85b89fff54f079f239294c727e4d61319edDan Walsh self.firstTime = True 88514af85b89fff54f079f239294c727e4d61319edDan Walsh liststore = gtk.ListStore(gobject.TYPE_STRING) 89514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.set_model(liststore) 90514af85b89fff54f079f239294c727e4d61319edDan Walsh cell = gtk.CellRendererText() 91514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.pack_start(cell, True) 92514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.add_attribute(cell, 'text', 0) 93514af85b89fff54f079f239294c727e4d61319edDan Walsh 94514af85b89fff54f079f239294c727e4d61319edDan Walsh selusers = seobject.seluserRecords().get_all(0) 95514af85b89fff54f079f239294c727e4d61319edDan Walsh keys = selusers.keys() 96514af85b89fff54f079f239294c727e4d61319edDan Walsh keys.sort() 97514af85b89fff54f079f239294c727e4d61319edDan Walsh for k in keys: 98514af85b89fff54f079f239294c727e4d61319edDan Walsh if k != "system_u": 99514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.append_text(k) 100514af85b89fff54f079f239294c727e4d61319edDan Walsh 101514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.get_iter_first() 102514af85b89fff54f079f239294c727e4d61319edDan Walsh while liststore.get_value(iter,0) != "user_u": 103514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.iter_next(iter) 104514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.set_active_iter(iter) 105514af85b89fff54f079f239294c727e4d61319edDan Walsh 106514af85b89fff54f079f239294c727e4d61319edDan Walsh def dialogInit(self): 107514af85b89fff54f079f239294c727e4d61319edDan Walsh self.__dialogSetup() 108514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 109514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_text(store.get_value(iter, 0)) 110514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_sensitive(False) 111514af85b89fff54f079f239294c727e4d61319edDan Walsh 112514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsMLSEntry.set_text(store.get_value(iter, 2)) 113514af85b89fff54f079f239294c727e4d61319edDan Walsh seuser = store.get_value(iter, 1) 114514af85b89fff54f079f239294c727e4d61319edDan Walsh liststore = self.loginsSelinuxUserCombo.get_model() 115514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.get_iter_first() 116514af85b89fff54f079f239294c727e4d61319edDan Walsh while iter != None and liststore.get_value(iter,0) != seuser: 117514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.iter_next(iter) 118514af85b89fff54f079f239294c727e4d61319edDan Walsh if iter != None: 119514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.set_active_iter(iter) 120514af85b89fff54f079f239294c727e4d61319edDan Walsh 121514af85b89fff54f079f239294c727e4d61319edDan Walsh 122514af85b89fff54f079f239294c727e4d61319edDan Walsh def dialogClear(self): 123514af85b89fff54f079f239294c727e4d61319edDan Walsh self.__dialogSetup() 124514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_text("") 125514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_sensitive(True) 126514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsMLSEntry.set_text("s0") 127514af85b89fff54f079f239294c727e4d61319edDan Walsh 128514af85b89fff54f079f239294c727e4d61319edDan Walsh def delete(self): 129514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 130514af85b89fff54f079f239294c727e4d61319edDan Walsh try: 131514af85b89fff54f079f239294c727e4d61319edDan Walsh login=store.get_value(iter, 0) 132514af85b89fff54f079f239294c727e4d61319edDan Walsh if login == "root" or login == "__default__": 133514af85b89fff54f079f239294c727e4d61319edDan Walsh raise ValueError(_("Login '%s' is required") % login) 134514af85b89fff54f079f239294c727e4d61319edDan Walsh 135514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 136514af85b89fff54f079f239294c727e4d61319edDan Walsh (rc, out) = commands.getstatusoutput("semanage login -d %s" % login) 137514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 138514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 139514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 140514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 141514af85b89fff54f079f239294c727e4d61319edDan Walsh store.remove(iter) 142514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.get_selection().select_path ((0,)) 143514af85b89fff54f079f239294c727e4d61319edDan Walsh except ValueError, e: 144514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(e.args[0]) 145514af85b89fff54f079f239294c727e4d61319edDan Walsh 146514af85b89fff54f079f239294c727e4d61319edDan Walsh def add(self): 147514af85b89fff54f079f239294c727e4d61319edDan Walsh target=self.loginsNameEntry.get_text().strip() 148514af85b89fff54f079f239294c727e4d61319edDan Walsh serange=self.loginsMLSEntry.get_text().strip() 149514af85b89fff54f079f239294c727e4d61319edDan Walsh if serange == "": 150514af85b89fff54f079f239294c727e4d61319edDan Walsh serange="s0" 151514af85b89fff54f079f239294c727e4d61319edDan Walsh list_model=self.loginsSelinuxUserCombo.get_model() 152514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.loginsSelinuxUserCombo.get_active_iter() 153514af85b89fff54f079f239294c727e4d61319edDan Walsh seuser = list_model.get_value(iter,0) 154514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 155514af85b89fff54f079f239294c727e4d61319edDan Walsh (rc, out) = commands.getstatusoutput("semanage login -a -s %s -r %s %s" % (seuser, serange, target)) 156514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 157514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 158514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 159514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 160514af85b89fff54f079f239294c727e4d61319edDan Walsh 161514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.store.append() 162514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 0, target) 163514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 1, seuser) 164514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 2, seobject.translate(serange)) 165514af85b89fff54f079f239294c727e4d61319edDan Walsh 166514af85b89fff54f079f239294c727e4d61319edDan Walsh def modify(self): 167514af85b89fff54f079f239294c727e4d61319edDan Walsh target=self.loginsNameEntry.get_text().strip() 168514af85b89fff54f079f239294c727e4d61319edDan Walsh serange=self.loginsMLSEntry.get_text().strip() 169514af85b89fff54f079f239294c727e4d61319edDan Walsh if serange == "": 170514af85b89fff54f079f239294c727e4d61319edDan Walsh serange = "s0" 171514af85b89fff54f079f239294c727e4d61319edDan Walsh list_model = self.loginsSelinuxUserCombo.get_model() 172514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.loginsSelinuxUserCombo.get_active_iter() 173514af85b89fff54f079f239294c727e4d61319edDan Walsh seuser=list_model.get_value(iter,0) 174514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 175514af85b89fff54f079f239294c727e4d61319edDan Walsh (rc, out) = commands.getstatusoutput("semanage login -m -s %s -r %s %s" % (seuser, serange, target)) 176514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 177514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 178514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 179514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 180514af85b89fff54f079f239294c727e4d61319edDan Walsh 181514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 182514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 0, target) 183514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 1, seuser) 184514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 2, seobject.translate(serange)) 185