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 2505d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zamantry: 2605d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zaman from subprocess import getstatusoutput 2705d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zamanexcept ImportError: 2805d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zaman from commands import getstatusoutput 2905d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zaman 30514af85b89fff54f079f239294c727e4d61319edDan Walshimport seobject 31789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zamanfrom semanagePage import * 32514af85b89fff54f079f239294c727e4d61319edDan Walsh 33514af85b89fff54f079f239294c727e4d61319edDan Walsh## 34514af85b89fff54f079f239294c727e4d61319edDan Walsh## I18N 35514af85b89fff54f079f239294c727e4d61319edDan Walsh## 36789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason ZamanPROGNAME = "policycoreutils" 37514af85b89fff54f079f239294c727e4d61319edDan Walshtry: 38af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman import gettext 39af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman kwargs = {} 40af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman if sys.version_info < (3,): 41af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman kwargs['unicode'] = True 42514af85b89fff54f079f239294c727e4d61319edDan Walsh gettext.install(PROGNAME, 43514af85b89fff54f079f239294c727e4d61319edDan Walsh localedir="/usr/share/locale", 44af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman codeset='utf-8', 45af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman **kwargs) 46af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zamanexcept: 47af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman try: 48af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman import builtins 49af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman builtins.__dict__['_'] = str 50af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman except ImportError: 51af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman import __builtin__ 52af59544e5f54b8948d79ad5bbca6868c13948d40Jason Zaman __builtin__.__dict__['_'] = unicode 53514af85b89fff54f079f239294c727e4d61319edDan Walsh 54789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman 55514af85b89fff54f079f239294c727e4d61319edDan Walshclass loginsPage(semanagePage): 56789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman 57514af85b89fff54f079f239294c727e4d61319edDan Walsh def __init__(self, xml): 58514af85b89fff54f079f239294c727e4d61319edDan Walsh self.firstTime = False 59514af85b89fff54f079f239294c727e4d61319edDan Walsh semanagePage.__init__(self, xml, "logins", _("User Mapping")) 60514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) 61514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.set_model(self.store) 62514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 63789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman col = gtk.TreeViewColumn(_("Login\nName"), gtk.CellRendererText(), text=0) 64514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_sort_column_id(0) 65514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 66514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 67789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman col = gtk.TreeViewColumn(_("SELinux\nUser"), gtk.CellRendererText(), text=1) 68514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 69514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 70789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman col = gtk.TreeViewColumn(_("MLS/\nMCS Range"), gtk.CellRendererText(), text=2) 71514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 72514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 73514af85b89fff54f079f239294c727e4d61319edDan Walsh self.load() 74514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry = xml.get_widget("loginsNameEntry") 75514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo = xml.get_widget("loginsSelinuxUserCombo") 76514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsMLSEntry = xml.get_widget("loginsMLSEntry") 77514af85b89fff54f079f239294c727e4d61319edDan Walsh 78789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman def load(self, filter=""): 79789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman self.filter = filter 80514af85b89fff54f079f239294c727e4d61319edDan Walsh self.login = seobject.loginRecords() 81514af85b89fff54f079f239294c727e4d61319edDan Walsh dict = self.login.get_all(0) 82514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.clear() 834d340e467a2ff0e188eb952a1646dbea86c64d9eJason Zaman for k in sorted(dict.keys()): 84514af85b89fff54f079f239294c727e4d61319edDan Walsh range = seobject.translate(dict[k][1]) 85514af85b89fff54f079f239294c727e4d61319edDan Walsh if not (self.match(k, filter) or self.match(dict[k][0], filter) or self.match(range, filter)): 86514af85b89fff54f079f239294c727e4d61319edDan Walsh continue 87514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.store.append() 88514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 0, k) 89514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 1, dict[k][0]) 90514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 2, range) 91789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman self.view.get_selection().select_path((0,)) 92514af85b89fff54f079f239294c727e4d61319edDan Walsh 93514af85b89fff54f079f239294c727e4d61319edDan Walsh def __dialogSetup(self): 94514af85b89fff54f079f239294c727e4d61319edDan Walsh if self.firstTime == True: 95514af85b89fff54f079f239294c727e4d61319edDan Walsh return 96514af85b89fff54f079f239294c727e4d61319edDan Walsh self.firstTime = True 97514af85b89fff54f079f239294c727e4d61319edDan Walsh liststore = gtk.ListStore(gobject.TYPE_STRING) 98514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.set_model(liststore) 99514af85b89fff54f079f239294c727e4d61319edDan Walsh cell = gtk.CellRendererText() 100514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.pack_start(cell, True) 101514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.add_attribute(cell, 'text', 0) 102514af85b89fff54f079f239294c727e4d61319edDan Walsh 103514af85b89fff54f079f239294c727e4d61319edDan Walsh selusers = seobject.seluserRecords().get_all(0) 1044d340e467a2ff0e188eb952a1646dbea86c64d9eJason Zaman for k in sorted(selusers.keys()): 105514af85b89fff54f079f239294c727e4d61319edDan Walsh if k != "system_u": 106514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.append_text(k) 107514af85b89fff54f079f239294c727e4d61319edDan Walsh 108514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.get_iter_first() 109789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman while liststore.get_value(iter, 0) != "user_u": 110514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.iter_next(iter) 111514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.set_active_iter(iter) 112514af85b89fff54f079f239294c727e4d61319edDan Walsh 113514af85b89fff54f079f239294c727e4d61319edDan Walsh def dialogInit(self): 114514af85b89fff54f079f239294c727e4d61319edDan Walsh self.__dialogSetup() 115514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 116514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_text(store.get_value(iter, 0)) 117514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_sensitive(False) 118514af85b89fff54f079f239294c727e4d61319edDan Walsh 119514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsMLSEntry.set_text(store.get_value(iter, 2)) 120514af85b89fff54f079f239294c727e4d61319edDan Walsh seuser = store.get_value(iter, 1) 121514af85b89fff54f079f239294c727e4d61319edDan Walsh liststore = self.loginsSelinuxUserCombo.get_model() 122514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.get_iter_first() 123789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman while iter != None and liststore.get_value(iter, 0) != seuser: 124514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = liststore.iter_next(iter) 125514af85b89fff54f079f239294c727e4d61319edDan Walsh if iter != None: 126514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsSelinuxUserCombo.set_active_iter(iter) 127514af85b89fff54f079f239294c727e4d61319edDan Walsh 128514af85b89fff54f079f239294c727e4d61319edDan Walsh def dialogClear(self): 129514af85b89fff54f079f239294c727e4d61319edDan Walsh self.__dialogSetup() 130514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_text("") 131514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsNameEntry.set_sensitive(True) 132514af85b89fff54f079f239294c727e4d61319edDan Walsh self.loginsMLSEntry.set_text("s0") 133514af85b89fff54f079f239294c727e4d61319edDan Walsh 134514af85b89fff54f079f239294c727e4d61319edDan Walsh def delete(self): 135514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 136514af85b89fff54f079f239294c727e4d61319edDan Walsh try: 137789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman login = store.get_value(iter, 0) 138514af85b89fff54f079f239294c727e4d61319edDan Walsh if login == "root" or login == "__default__": 139514af85b89fff54f079f239294c727e4d61319edDan Walsh raise ValueError(_("Login '%s' is required") % login) 140514af85b89fff54f079f239294c727e4d61319edDan Walsh 141514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 14205d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zaman (rc, out) = getstatusoutput("semanage login -d %s" % login) 143514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 144514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 145514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 146514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 147514af85b89fff54f079f239294c727e4d61319edDan Walsh store.remove(iter) 148789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman self.view.get_selection().select_path((0,)) 1494d340e467a2ff0e188eb952a1646dbea86c64d9eJason Zaman except ValueError as e: 150514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(e.args[0]) 151514af85b89fff54f079f239294c727e4d61319edDan Walsh 152514af85b89fff54f079f239294c727e4d61319edDan Walsh def add(self): 153789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman target = self.loginsNameEntry.get_text().strip() 154789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman serange = self.loginsMLSEntry.get_text().strip() 155514af85b89fff54f079f239294c727e4d61319edDan Walsh if serange == "": 156789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman serange = "s0" 157789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman list_model = self.loginsSelinuxUserCombo.get_model() 158514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.loginsSelinuxUserCombo.get_active_iter() 159789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman seuser = list_model.get_value(iter, 0) 160514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 16105d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zaman (rc, out) = getstatusoutput("semanage login -a -s %s -r %s %s" % (seuser, serange, target)) 162514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 163514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 164514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 165514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 166514af85b89fff54f079f239294c727e4d61319edDan Walsh 167514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.store.append() 168514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 0, target) 169514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 1, seuser) 170514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 2, seobject.translate(serange)) 171514af85b89fff54f079f239294c727e4d61319edDan Walsh 172514af85b89fff54f079f239294c727e4d61319edDan Walsh def modify(self): 173789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman target = self.loginsNameEntry.get_text().strip() 174789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman serange = self.loginsMLSEntry.get_text().strip() 175514af85b89fff54f079f239294c727e4d61319edDan Walsh if serange == "": 176514af85b89fff54f079f239294c727e4d61319edDan Walsh serange = "s0" 177514af85b89fff54f079f239294c727e4d61319edDan Walsh list_model = self.loginsSelinuxUserCombo.get_model() 178514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.loginsSelinuxUserCombo.get_active_iter() 179789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman seuser = list_model.get_value(iter, 0) 180514af85b89fff54f079f239294c727e4d61319edDan Walsh self.wait() 18105d1cead3d30fc8c1a3f5d9475c4af786e5c03a4Jason Zaman (rc, out) = getstatusoutput("semanage login -m -s %s -r %s %s" % (seuser, serange, target)) 182514af85b89fff54f079f239294c727e4d61319edDan Walsh self.ready() 183514af85b89fff54f079f239294c727e4d61319edDan Walsh if rc != 0: 184514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(out) 185514af85b89fff54f079f239294c727e4d61319edDan Walsh return False 186514af85b89fff54f079f239294c727e4d61319edDan Walsh 187514af85b89fff54f079f239294c727e4d61319edDan Walsh store, iter = self.view.get_selection().get_selected() 188514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 0, target) 189514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 1, seuser) 190514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 2, seobject.translate(serange)) 191