1*2d543d20SAndroid Build Coastguard Worker# Copyright (C) 2005-2013 Red Hat 2*2d543d20SAndroid Build Coastguard Worker# see file 'COPYING' for use and warranty information 3*2d543d20SAndroid Build Coastguard Worker# 4*2d543d20SAndroid Build Coastguard Worker# semanage is a tool for managing SELinux configuration files 5*2d543d20SAndroid Build Coastguard Worker# 6*2d543d20SAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or 7*2d543d20SAndroid Build Coastguard Worker# modify it under the terms of the GNU General Public License as 8*2d543d20SAndroid Build Coastguard Worker# published by the Free Software Foundation; either version 2 of 9*2d543d20SAndroid Build Coastguard Worker# the License, or (at your option) any later version. 10*2d543d20SAndroid Build Coastguard Worker# 11*2d543d20SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful, 12*2d543d20SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of 13*2d543d20SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*2d543d20SAndroid Build Coastguard Worker# GNU General Public License for more details. 15*2d543d20SAndroid Build Coastguard Worker# 16*2d543d20SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License 17*2d543d20SAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software 18*2d543d20SAndroid Build Coastguard Worker# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19*2d543d20SAndroid Build Coastguard Worker# 02111-1307 USA 20*2d543d20SAndroid Build Coastguard Worker# 21*2d543d20SAndroid Build Coastguard Worker# 22*2d543d20SAndroid Build Coastguard Worker 23*2d543d20SAndroid Build Coastguard Workerimport pwd 24*2d543d20SAndroid Build Coastguard Workerimport grp 25*2d543d20SAndroid Build Coastguard Workerimport selinux 26*2d543d20SAndroid Build Coastguard Workerimport os 27*2d543d20SAndroid Build Coastguard Workerimport re 28*2d543d20SAndroid Build Coastguard Workerimport sys 29*2d543d20SAndroid Build Coastguard Workerimport stat 30*2d543d20SAndroid Build Coastguard Workerimport socket 31*2d543d20SAndroid Build Coastguard Workerfrom semanage import * 32*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-python" 33*2d543d20SAndroid Build Coastguard Workerimport sepolicy 34*2d543d20SAndroid Build Coastguard Workerfrom setools.policyrep import SELinuxPolicy 35*2d543d20SAndroid Build Coastguard Workerfrom setools.typequery import TypeQuery 36*2d543d20SAndroid Build Coastguard Workerimport ipaddress 37*2d543d20SAndroid Build Coastguard Worker 38*2d543d20SAndroid Build Coastguard Workertry: 39*2d543d20SAndroid Build Coastguard Worker import gettext 40*2d543d20SAndroid Build Coastguard Worker kwargs = {} 41*2d543d20SAndroid Build Coastguard Worker if sys.version_info < (3,): 42*2d543d20SAndroid Build Coastguard Worker kwargs['unicode'] = True 43*2d543d20SAndroid Build Coastguard Worker t = gettext.translation(PROGNAME, 44*2d543d20SAndroid Build Coastguard Worker localedir="/usr/share/locale", 45*2d543d20SAndroid Build Coastguard Worker **kwargs, 46*2d543d20SAndroid Build Coastguard Worker fallback=True) 47*2d543d20SAndroid Build Coastguard Worker _ = t.gettext 48*2d543d20SAndroid Build Coastguard Workerexcept: 49*2d543d20SAndroid Build Coastguard Worker try: 50*2d543d20SAndroid Build Coastguard Worker import builtins 51*2d543d20SAndroid Build Coastguard Worker builtins.__dict__['_'] = str 52*2d543d20SAndroid Build Coastguard Worker except ImportError: 53*2d543d20SAndroid Build Coastguard Worker import __builtin__ 54*2d543d20SAndroid Build Coastguard Worker __builtin__.__dict__['_'] = unicode 55*2d543d20SAndroid Build Coastguard Worker 56*2d543d20SAndroid Build Coastguard Workerimport syslog 57*2d543d20SAndroid Build Coastguard Worker 58*2d543d20SAndroid Build Coastguard Workerfile_types = {} 59*2d543d20SAndroid Build Coastguard Workerfile_types[""] = SEMANAGE_FCONTEXT_ALL 60*2d543d20SAndroid Build Coastguard Workerfile_types["all files"] = SEMANAGE_FCONTEXT_ALL 61*2d543d20SAndroid Build Coastguard Workerfile_types["a"] = SEMANAGE_FCONTEXT_ALL 62*2d543d20SAndroid Build Coastguard Workerfile_types["regular file"] = SEMANAGE_FCONTEXT_REG 63*2d543d20SAndroid Build Coastguard Workerfile_types["--"] = SEMANAGE_FCONTEXT_REG 64*2d543d20SAndroid Build Coastguard Workerfile_types["f"] = SEMANAGE_FCONTEXT_REG 65*2d543d20SAndroid Build Coastguard Workerfile_types["-d"] = SEMANAGE_FCONTEXT_DIR 66*2d543d20SAndroid Build Coastguard Workerfile_types["directory"] = SEMANAGE_FCONTEXT_DIR 67*2d543d20SAndroid Build Coastguard Workerfile_types["d"] = SEMANAGE_FCONTEXT_DIR 68*2d543d20SAndroid Build Coastguard Workerfile_types["-c"] = SEMANAGE_FCONTEXT_CHAR 69*2d543d20SAndroid Build Coastguard Workerfile_types["character device"] = SEMANAGE_FCONTEXT_CHAR 70*2d543d20SAndroid Build Coastguard Workerfile_types["c"] = SEMANAGE_FCONTEXT_CHAR 71*2d543d20SAndroid Build Coastguard Workerfile_types["-b"] = SEMANAGE_FCONTEXT_BLOCK 72*2d543d20SAndroid Build Coastguard Workerfile_types["block device"] = SEMANAGE_FCONTEXT_BLOCK 73*2d543d20SAndroid Build Coastguard Workerfile_types["b"] = SEMANAGE_FCONTEXT_BLOCK 74*2d543d20SAndroid Build Coastguard Workerfile_types["-s"] = SEMANAGE_FCONTEXT_SOCK 75*2d543d20SAndroid Build Coastguard Workerfile_types["socket"] = SEMANAGE_FCONTEXT_SOCK 76*2d543d20SAndroid Build Coastguard Workerfile_types["s"] = SEMANAGE_FCONTEXT_SOCK 77*2d543d20SAndroid Build Coastguard Workerfile_types["-l"] = SEMANAGE_FCONTEXT_LINK 78*2d543d20SAndroid Build Coastguard Workerfile_types["l"] = SEMANAGE_FCONTEXT_LINK 79*2d543d20SAndroid Build Coastguard Workerfile_types["symbolic link"] = SEMANAGE_FCONTEXT_LINK 80*2d543d20SAndroid Build Coastguard Workerfile_types["p"] = SEMANAGE_FCONTEXT_PIPE 81*2d543d20SAndroid Build Coastguard Workerfile_types["-p"] = SEMANAGE_FCONTEXT_PIPE 82*2d543d20SAndroid Build Coastguard Workerfile_types["named pipe"] = SEMANAGE_FCONTEXT_PIPE 83*2d543d20SAndroid Build Coastguard Worker 84*2d543d20SAndroid Build Coastguard Workerfile_type_str_to_option = {"all files": "a", 85*2d543d20SAndroid Build Coastguard Worker "regular file": "f", 86*2d543d20SAndroid Build Coastguard Worker "directory": "d", 87*2d543d20SAndroid Build Coastguard Worker "character device": "c", 88*2d543d20SAndroid Build Coastguard Worker "block device": "b", 89*2d543d20SAndroid Build Coastguard Worker "socket": "s", 90*2d543d20SAndroid Build Coastguard Worker "symbolic link": "l", 91*2d543d20SAndroid Build Coastguard Worker "named pipe": "p"} 92*2d543d20SAndroid Build Coastguard Worker 93*2d543d20SAndroid Build Coastguard Workerftype_to_audit = {"": "any", 94*2d543d20SAndroid Build Coastguard Worker "a" : "any", 95*2d543d20SAndroid Build Coastguard Worker "b": "block", 96*2d543d20SAndroid Build Coastguard Worker "c": "char", 97*2d543d20SAndroid Build Coastguard Worker "d": "dir", 98*2d543d20SAndroid Build Coastguard Worker "f": "file", 99*2d543d20SAndroid Build Coastguard Worker "l": "symlink", 100*2d543d20SAndroid Build Coastguard Worker "p": "pipe", 101*2d543d20SAndroid Build Coastguard Worker "s": "socket"} 102*2d543d20SAndroid Build Coastguard Worker 103*2d543d20SAndroid Build Coastguard Workertry: 104*2d543d20SAndroid Build Coastguard Worker import audit 105*2d543d20SAndroid Build Coastguard Worker #test if audit module is enabled 106*2d543d20SAndroid Build Coastguard Worker audit.audit_close(audit.audit_open()) 107*2d543d20SAndroid Build Coastguard Worker 108*2d543d20SAndroid Build Coastguard Worker class logger: 109*2d543d20SAndroid Build Coastguard Worker 110*2d543d20SAndroid Build Coastguard Worker def __init__(self): 111*2d543d20SAndroid Build Coastguard Worker self.audit_fd = audit.audit_open() 112*2d543d20SAndroid Build Coastguard Worker self.log_list = [] 113*2d543d20SAndroid Build Coastguard Worker self.log_change_list = [] 114*2d543d20SAndroid Build Coastguard Worker 115*2d543d20SAndroid Build Coastguard Worker def log(self, msg, name="", sename="", serole="", serange="", oldsename="", oldserole="", oldserange=""): 116*2d543d20SAndroid Build Coastguard Worker 117*2d543d20SAndroid Build Coastguard Worker sep = "-" 118*2d543d20SAndroid Build Coastguard Worker if sename != oldsename: 119*2d543d20SAndroid Build Coastguard Worker msg += sep + "sename" 120*2d543d20SAndroid Build Coastguard Worker sep = "," 121*2d543d20SAndroid Build Coastguard Worker if serole != oldserole: 122*2d543d20SAndroid Build Coastguard Worker msg += sep + "role" 123*2d543d20SAndroid Build Coastguard Worker sep = "," 124*2d543d20SAndroid Build Coastguard Worker if serange != oldserange: 125*2d543d20SAndroid Build Coastguard Worker msg += sep + "range" 126*2d543d20SAndroid Build Coastguard Worker sep = "," 127*2d543d20SAndroid Build Coastguard Worker 128*2d543d20SAndroid Build Coastguard Worker self.log_list.append([self.audit_fd, audit.AUDIT_ROLE_ASSIGN, sys.argv[0], str(msg), name, 0, sename, serole, serange, oldsename, oldserole, oldserange, "", "", ""]) 129*2d543d20SAndroid Build Coastguard Worker 130*2d543d20SAndroid Build Coastguard Worker def log_remove(self, msg, name="", sename="", serole="", serange="", oldsename="", oldserole="", oldserange=""): 131*2d543d20SAndroid Build Coastguard Worker self.log_list.append([self.audit_fd, audit.AUDIT_ROLE_REMOVE, sys.argv[0], str(msg), name, 0, sename, serole, serange, oldsename, oldserole, oldserange, "", "", ""]) 132*2d543d20SAndroid Build Coastguard Worker 133*2d543d20SAndroid Build Coastguard Worker def log_change(self, msg): 134*2d543d20SAndroid Build Coastguard Worker self.log_change_list.append([self.audit_fd, audit.AUDIT_USER_MAC_CONFIG_CHANGE, str(msg), "semanage", "", "", ""]) 135*2d543d20SAndroid Build Coastguard Worker 136*2d543d20SAndroid Build Coastguard Worker def commit(self, success): 137*2d543d20SAndroid Build Coastguard Worker for l in self.log_list: 138*2d543d20SAndroid Build Coastguard Worker audit.audit_log_semanage_message(*(l + [success])) 139*2d543d20SAndroid Build Coastguard Worker for l in self.log_change_list: 140*2d543d20SAndroid Build Coastguard Worker audit.audit_log_user_comm_message(*(l + [success])) 141*2d543d20SAndroid Build Coastguard Worker 142*2d543d20SAndroid Build Coastguard Worker self.log_list = [] 143*2d543d20SAndroid Build Coastguard Worker self.log_change_list = [] 144*2d543d20SAndroid Build Coastguard Workerexcept (OSError, ImportError): 145*2d543d20SAndroid Build Coastguard Worker class logger: 146*2d543d20SAndroid Build Coastguard Worker 147*2d543d20SAndroid Build Coastguard Worker def __init__(self): 148*2d543d20SAndroid Build Coastguard Worker self.log_list = [] 149*2d543d20SAndroid Build Coastguard Worker 150*2d543d20SAndroid Build Coastguard Worker def log(self, msg, name="", sename="", serole="", serange="", oldsename="", oldserole="", oldserange=""): 151*2d543d20SAndroid Build Coastguard Worker message = " %s name=%s" % (msg, name) 152*2d543d20SAndroid Build Coastguard Worker if sename != "": 153*2d543d20SAndroid Build Coastguard Worker message += " sename=" + sename 154*2d543d20SAndroid Build Coastguard Worker if oldsename != "": 155*2d543d20SAndroid Build Coastguard Worker message += " oldsename=" + oldsename 156*2d543d20SAndroid Build Coastguard Worker if serole != "": 157*2d543d20SAndroid Build Coastguard Worker message += " role=" + serole 158*2d543d20SAndroid Build Coastguard Worker if oldserole != "": 159*2d543d20SAndroid Build Coastguard Worker message += " old_role=" + oldserole 160*2d543d20SAndroid Build Coastguard Worker if serange != "" and serange is not None: 161*2d543d20SAndroid Build Coastguard Worker message += " MLSRange=" + serange 162*2d543d20SAndroid Build Coastguard Worker if oldserange != "" and oldserange is not None: 163*2d543d20SAndroid Build Coastguard Worker message += " old_MLSRange=" + oldserange 164*2d543d20SAndroid Build Coastguard Worker self.log_list.append(message) 165*2d543d20SAndroid Build Coastguard Worker 166*2d543d20SAndroid Build Coastguard Worker def log_remove(self, msg, name="", sename="", serole="", serange="", oldsename="", oldserole="", oldserange=""): 167*2d543d20SAndroid Build Coastguard Worker self.log(msg, name, sename, serole, serange, oldsename, oldserole, oldserange) 168*2d543d20SAndroid Build Coastguard Worker 169*2d543d20SAndroid Build Coastguard Worker def log_change(self, msg): 170*2d543d20SAndroid Build Coastguard Worker self.log_list.append(" %s" % msg) 171*2d543d20SAndroid Build Coastguard Worker 172*2d543d20SAndroid Build Coastguard Worker def commit(self, success): 173*2d543d20SAndroid Build Coastguard Worker if success == 1: 174*2d543d20SAndroid Build Coastguard Worker message = "Successful: " 175*2d543d20SAndroid Build Coastguard Worker else: 176*2d543d20SAndroid Build Coastguard Worker message = "Failed: " 177*2d543d20SAndroid Build Coastguard Worker for l in self.log_list: 178*2d543d20SAndroid Build Coastguard Worker syslog.syslog(syslog.LOG_INFO, message + l) 179*2d543d20SAndroid Build Coastguard Worker 180*2d543d20SAndroid Build Coastguard Worker 181*2d543d20SAndroid Build Coastguard Workerclass nulllogger: 182*2d543d20SAndroid Build Coastguard Worker 183*2d543d20SAndroid Build Coastguard Worker def log(self, msg, name="", sename="", serole="", serange="", oldsename="", oldserole="", oldserange=""): 184*2d543d20SAndroid Build Coastguard Worker pass 185*2d543d20SAndroid Build Coastguard Worker 186*2d543d20SAndroid Build Coastguard Worker def log_remove(self, msg, name="", sename="", serole="", serange="", oldsename="", oldserole="", oldserange=""): 187*2d543d20SAndroid Build Coastguard Worker pass 188*2d543d20SAndroid Build Coastguard Worker 189*2d543d20SAndroid Build Coastguard Worker def log_change(self, msg): 190*2d543d20SAndroid Build Coastguard Worker pass 191*2d543d20SAndroid Build Coastguard Worker 192*2d543d20SAndroid Build Coastguard Worker def commit(self, success): 193*2d543d20SAndroid Build Coastguard Worker pass 194*2d543d20SAndroid Build Coastguard Worker 195*2d543d20SAndroid Build Coastguard Worker 196*2d543d20SAndroid Build Coastguard Workerdef validate_level(raw): 197*2d543d20SAndroid Build Coastguard Worker sensitivity = "s[0-9]*" 198*2d543d20SAndroid Build Coastguard Worker category = "c[0-9]*" 199*2d543d20SAndroid Build Coastguard Worker cat_range = category + r"(\." + category + ")?" 200*2d543d20SAndroid Build Coastguard Worker categories = cat_range + r"(\," + cat_range + ")*" 201*2d543d20SAndroid Build Coastguard Worker reg = sensitivity + "(-" + sensitivity + ")?" + "(:" + categories + ")?" 202*2d543d20SAndroid Build Coastguard Worker return re.search("^" + reg + "$", raw) 203*2d543d20SAndroid Build Coastguard Worker 204*2d543d20SAndroid Build Coastguard Worker 205*2d543d20SAndroid Build Coastguard Workerdef translate(raw, prepend=1): 206*2d543d20SAndroid Build Coastguard Worker filler = "a:b:c:" 207*2d543d20SAndroid Build Coastguard Worker if prepend == 1: 208*2d543d20SAndroid Build Coastguard Worker context = "%s%s" % (filler, raw) 209*2d543d20SAndroid Build Coastguard Worker else: 210*2d543d20SAndroid Build Coastguard Worker context = raw 211*2d543d20SAndroid Build Coastguard Worker (rc, trans) = selinux.selinux_raw_to_trans_context(context) 212*2d543d20SAndroid Build Coastguard Worker if rc != 0: 213*2d543d20SAndroid Build Coastguard Worker return raw 214*2d543d20SAndroid Build Coastguard Worker if prepend: 215*2d543d20SAndroid Build Coastguard Worker trans = trans[len(filler):] 216*2d543d20SAndroid Build Coastguard Worker if trans == "": 217*2d543d20SAndroid Build Coastguard Worker return raw 218*2d543d20SAndroid Build Coastguard Worker else: 219*2d543d20SAndroid Build Coastguard Worker return trans 220*2d543d20SAndroid Build Coastguard Worker 221*2d543d20SAndroid Build Coastguard Worker 222*2d543d20SAndroid Build Coastguard Workerdef untranslate(trans, prepend=1): 223*2d543d20SAndroid Build Coastguard Worker filler = "a:b:c:" 224*2d543d20SAndroid Build Coastguard Worker if prepend == 1: 225*2d543d20SAndroid Build Coastguard Worker context = "%s%s" % (filler, trans) 226*2d543d20SAndroid Build Coastguard Worker else: 227*2d543d20SAndroid Build Coastguard Worker context = trans 228*2d543d20SAndroid Build Coastguard Worker 229*2d543d20SAndroid Build Coastguard Worker (rc, raw) = selinux.selinux_trans_to_raw_context(context) 230*2d543d20SAndroid Build Coastguard Worker if rc != 0: 231*2d543d20SAndroid Build Coastguard Worker return trans 232*2d543d20SAndroid Build Coastguard Worker if prepend: 233*2d543d20SAndroid Build Coastguard Worker raw = raw[len(filler):] 234*2d543d20SAndroid Build Coastguard Worker if raw == "": 235*2d543d20SAndroid Build Coastguard Worker return trans 236*2d543d20SAndroid Build Coastguard Worker else: 237*2d543d20SAndroid Build Coastguard Worker return raw 238*2d543d20SAndroid Build Coastguard Worker 239*2d543d20SAndroid Build Coastguard Worker 240*2d543d20SAndroid Build Coastguard Workerclass semanageRecords: 241*2d543d20SAndroid Build Coastguard Worker transaction = False 242*2d543d20SAndroid Build Coastguard Worker handle = None 243*2d543d20SAndroid Build Coastguard Worker store = None 244*2d543d20SAndroid Build Coastguard Worker args = None 245*2d543d20SAndroid Build Coastguard Worker 246*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 247*2d543d20SAndroid Build Coastguard Worker global handle 248*2d543d20SAndroid Build Coastguard Worker if args: 249*2d543d20SAndroid Build Coastguard Worker # legacy code - args was store originally 250*2d543d20SAndroid Build Coastguard Worker if isinstance(args, str): 251*2d543d20SAndroid Build Coastguard Worker self.store = args 252*2d543d20SAndroid Build Coastguard Worker else: 253*2d543d20SAndroid Build Coastguard Worker self.args = args 254*2d543d20SAndroid Build Coastguard Worker self.noreload = getattr(args, "noreload", False) 255*2d543d20SAndroid Build Coastguard Worker if not self.store: 256*2d543d20SAndroid Build Coastguard Worker self.store = getattr(args, "store", "") 257*2d543d20SAndroid Build Coastguard Worker 258*2d543d20SAndroid Build Coastguard Worker self.sh = self.get_handle(self.store) 259*2d543d20SAndroid Build Coastguard Worker 260*2d543d20SAndroid Build Coastguard Worker rc, localstore = selinux.selinux_getpolicytype() 261*2d543d20SAndroid Build Coastguard Worker if self.store == "" or self.store == localstore: 262*2d543d20SAndroid Build Coastguard Worker self.mylog = logger() 263*2d543d20SAndroid Build Coastguard Worker else: 264*2d543d20SAndroid Build Coastguard Worker sepolicy.load_store_policy(self.store) 265*2d543d20SAndroid Build Coastguard Worker selinux.selinux_set_policy_root("%s%s" % (selinux.selinux_path(), self.store)) 266*2d543d20SAndroid Build Coastguard Worker self.mylog = nulllogger() 267*2d543d20SAndroid Build Coastguard Worker 268*2d543d20SAndroid Build Coastguard Worker def set_reload(self, load): 269*2d543d20SAndroid Build Coastguard Worker self.noreload = not load 270*2d543d20SAndroid Build Coastguard Worker 271*2d543d20SAndroid Build Coastguard Worker def get_handle(self, store): 272*2d543d20SAndroid Build Coastguard Worker global is_mls_enabled 273*2d543d20SAndroid Build Coastguard Worker 274*2d543d20SAndroid Build Coastguard Worker if semanageRecords.handle: 275*2d543d20SAndroid Build Coastguard Worker return semanageRecords.handle 276*2d543d20SAndroid Build Coastguard Worker 277*2d543d20SAndroid Build Coastguard Worker handle = semanage_handle_create() 278*2d543d20SAndroid Build Coastguard Worker if not handle: 279*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create semanage handle")) 280*2d543d20SAndroid Build Coastguard Worker 281*2d543d20SAndroid Build Coastguard Worker if not semanageRecords.transaction and store != "": 282*2d543d20SAndroid Build Coastguard Worker semanage_select_store(handle, store, SEMANAGE_CON_DIRECT) 283*2d543d20SAndroid Build Coastguard Worker semanageRecords.store = store 284*2d543d20SAndroid Build Coastguard Worker 285*2d543d20SAndroid Build Coastguard Worker if not semanage_is_managed(handle): 286*2d543d20SAndroid Build Coastguard Worker semanage_handle_destroy(handle) 287*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("SELinux policy is not managed or store cannot be accessed.")) 288*2d543d20SAndroid Build Coastguard Worker 289*2d543d20SAndroid Build Coastguard Worker rc = semanage_access_check(handle) 290*2d543d20SAndroid Build Coastguard Worker if rc < SEMANAGE_CAN_READ: 291*2d543d20SAndroid Build Coastguard Worker semanage_handle_destroy(handle) 292*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Cannot read policy store.")) 293*2d543d20SAndroid Build Coastguard Worker 294*2d543d20SAndroid Build Coastguard Worker rc = semanage_connect(handle) 295*2d543d20SAndroid Build Coastguard Worker if rc < 0: 296*2d543d20SAndroid Build Coastguard Worker semanage_handle_destroy(handle) 297*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not establish semanage connection")) 298*2d543d20SAndroid Build Coastguard Worker 299*2d543d20SAndroid Build Coastguard Worker is_mls_enabled = semanage_mls_enabled(handle) 300*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled < 0: 301*2d543d20SAndroid Build Coastguard Worker semanage_handle_destroy(handle) 302*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not test MLS enabled status")) 303*2d543d20SAndroid Build Coastguard Worker 304*2d543d20SAndroid Build Coastguard Worker semanageRecords.handle = handle 305*2d543d20SAndroid Build Coastguard Worker return semanageRecords.handle 306*2d543d20SAndroid Build Coastguard Worker 307*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 308*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Not yet implemented")) 309*2d543d20SAndroid Build Coastguard Worker 310*2d543d20SAndroid Build Coastguard Worker def start(self): 311*2d543d20SAndroid Build Coastguard Worker if semanageRecords.transaction: 312*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Semanage transaction already in progress")) 313*2d543d20SAndroid Build Coastguard Worker self.begin() 314*2d543d20SAndroid Build Coastguard Worker semanageRecords.transaction = True 315*2d543d20SAndroid Build Coastguard Worker 316*2d543d20SAndroid Build Coastguard Worker def begin(self): 317*2d543d20SAndroid Build Coastguard Worker if semanageRecords.transaction: 318*2d543d20SAndroid Build Coastguard Worker return 319*2d543d20SAndroid Build Coastguard Worker rc = semanage_begin_transaction(self.sh) 320*2d543d20SAndroid Build Coastguard Worker if rc < 0: 321*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not start semanage transaction")) 322*2d543d20SAndroid Build Coastguard Worker 323*2d543d20SAndroid Build Coastguard Worker def customized(self): 324*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Not yet implemented")) 325*2d543d20SAndroid Build Coastguard Worker 326*2d543d20SAndroid Build Coastguard Worker def commit(self): 327*2d543d20SAndroid Build Coastguard Worker if semanageRecords.transaction: 328*2d543d20SAndroid Build Coastguard Worker return 329*2d543d20SAndroid Build Coastguard Worker 330*2d543d20SAndroid Build Coastguard Worker if self.noreload: 331*2d543d20SAndroid Build Coastguard Worker semanage_set_reload(self.sh, 0) 332*2d543d20SAndroid Build Coastguard Worker rc = semanage_commit(self.sh) 333*2d543d20SAndroid Build Coastguard Worker if rc < 0: 334*2d543d20SAndroid Build Coastguard Worker self.mylog.commit(0) 335*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not commit semanage transaction")) 336*2d543d20SAndroid Build Coastguard Worker self.mylog.commit(1) 337*2d543d20SAndroid Build Coastguard Worker 338*2d543d20SAndroid Build Coastguard Worker def finish(self): 339*2d543d20SAndroid Build Coastguard Worker if not semanageRecords.transaction: 340*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Semanage transaction not in progress")) 341*2d543d20SAndroid Build Coastguard Worker semanageRecords.transaction = False 342*2d543d20SAndroid Build Coastguard Worker self.commit() 343*2d543d20SAndroid Build Coastguard Worker 344*2d543d20SAndroid Build Coastguard Worker 345*2d543d20SAndroid Build Coastguard Workerclass moduleRecords(semanageRecords): 346*2d543d20SAndroid Build Coastguard Worker 347*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 348*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 349*2d543d20SAndroid Build Coastguard Worker 350*2d543d20SAndroid Build Coastguard Worker def get_all(self): 351*2d543d20SAndroid Build Coastguard Worker l = [] 352*2d543d20SAndroid Build Coastguard Worker (rc, mlist, number) = semanage_module_list_all(self.sh) 353*2d543d20SAndroid Build Coastguard Worker if rc < 0: 354*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list SELinux modules")) 355*2d543d20SAndroid Build Coastguard Worker 356*2d543d20SAndroid Build Coastguard Worker for i in range(number): 357*2d543d20SAndroid Build Coastguard Worker mod = semanage_module_list_nth(mlist, i) 358*2d543d20SAndroid Build Coastguard Worker 359*2d543d20SAndroid Build Coastguard Worker rc, name = semanage_module_info_get_name(self.sh, mod) 360*2d543d20SAndroid Build Coastguard Worker if rc < 0: 361*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not get module name")) 362*2d543d20SAndroid Build Coastguard Worker 363*2d543d20SAndroid Build Coastguard Worker rc, enabled = semanage_module_info_get_enabled(self.sh, mod) 364*2d543d20SAndroid Build Coastguard Worker if rc < 0: 365*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not get module enabled")) 366*2d543d20SAndroid Build Coastguard Worker 367*2d543d20SAndroid Build Coastguard Worker rc, priority = semanage_module_info_get_priority(self.sh, mod) 368*2d543d20SAndroid Build Coastguard Worker if rc < 0: 369*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not get module priority")) 370*2d543d20SAndroid Build Coastguard Worker 371*2d543d20SAndroid Build Coastguard Worker rc, lang_ext = semanage_module_info_get_lang_ext(self.sh, mod) 372*2d543d20SAndroid Build Coastguard Worker if rc < 0: 373*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not get module lang_ext")) 374*2d543d20SAndroid Build Coastguard Worker 375*2d543d20SAndroid Build Coastguard Worker l.append((name, enabled, priority, lang_ext)) 376*2d543d20SAndroid Build Coastguard Worker 377*2d543d20SAndroid Build Coastguard Worker # sort the list so they are in name order, but with higher priorities coming first 378*2d543d20SAndroid Build Coastguard Worker l.sort(key=lambda t: t[3], reverse=True) 379*2d543d20SAndroid Build Coastguard Worker l.sort(key=lambda t: t[0]) 380*2d543d20SAndroid Build Coastguard Worker return l 381*2d543d20SAndroid Build Coastguard Worker 382*2d543d20SAndroid Build Coastguard Worker def customized(self): 383*2d543d20SAndroid Build Coastguard Worker all = self.get_all() 384*2d543d20SAndroid Build Coastguard Worker if len(all) == 0: 385*2d543d20SAndroid Build Coastguard Worker return [] 386*2d543d20SAndroid Build Coastguard Worker return ["-d %s" % x[0] for x in [t for t in all if t[1] == 0]] 387*2d543d20SAndroid Build Coastguard Worker 388*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 389*2d543d20SAndroid Build Coastguard Worker all = self.get_all() 390*2d543d20SAndroid Build Coastguard Worker if len(all) == 0: 391*2d543d20SAndroid Build Coastguard Worker return 392*2d543d20SAndroid Build Coastguard Worker 393*2d543d20SAndroid Build Coastguard Worker if heading: 394*2d543d20SAndroid Build Coastguard Worker print("\n%-25s %-9s %s\n" % (_("Module Name"), _("Priority"), _("Language"))) 395*2d543d20SAndroid Build Coastguard Worker for t in all: 396*2d543d20SAndroid Build Coastguard Worker if t[1] == 0: 397*2d543d20SAndroid Build Coastguard Worker disabled = _("Disabled") 398*2d543d20SAndroid Build Coastguard Worker else: 399*2d543d20SAndroid Build Coastguard Worker if locallist: 400*2d543d20SAndroid Build Coastguard Worker continue 401*2d543d20SAndroid Build Coastguard Worker disabled = "" 402*2d543d20SAndroid Build Coastguard Worker print("%-25s %-9s %-5s %s" % (t[0], t[2], t[3], disabled)) 403*2d543d20SAndroid Build Coastguard Worker 404*2d543d20SAndroid Build Coastguard Worker def add(self, file, priority): 405*2d543d20SAndroid Build Coastguard Worker if not os.path.exists(file): 406*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Module does not exist: %s ") % file) 407*2d543d20SAndroid Build Coastguard Worker 408*2d543d20SAndroid Build Coastguard Worker rc = semanage_set_default_priority(self.sh, priority) 409*2d543d20SAndroid Build Coastguard Worker if rc < 0: 410*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Invalid priority %d (needs to be between 1 and 999)") % priority) 411*2d543d20SAndroid Build Coastguard Worker 412*2d543d20SAndroid Build Coastguard Worker rc = semanage_module_install_file(self.sh, file) 413*2d543d20SAndroid Build Coastguard Worker if rc >= 0: 414*2d543d20SAndroid Build Coastguard Worker self.commit() 415*2d543d20SAndroid Build Coastguard Worker 416*2d543d20SAndroid Build Coastguard Worker def set_enabled(self, module, enable): 417*2d543d20SAndroid Build Coastguard Worker for m in module.split(): 418*2d543d20SAndroid Build Coastguard Worker rc, key = semanage_module_key_create(self.sh) 419*2d543d20SAndroid Build Coastguard Worker if rc < 0: 420*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create module key")) 421*2d543d20SAndroid Build Coastguard Worker 422*2d543d20SAndroid Build Coastguard Worker rc = semanage_module_key_set_name(self.sh, key, m) 423*2d543d20SAndroid Build Coastguard Worker if rc < 0: 424*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set module key name")) 425*2d543d20SAndroid Build Coastguard Worker 426*2d543d20SAndroid Build Coastguard Worker rc = semanage_module_set_enabled(self.sh, key, enable) 427*2d543d20SAndroid Build Coastguard Worker if rc < 0: 428*2d543d20SAndroid Build Coastguard Worker if enable: 429*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not enable module %s") % m) 430*2d543d20SAndroid Build Coastguard Worker else: 431*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not disable module %s") % m) 432*2d543d20SAndroid Build Coastguard Worker self.commit() 433*2d543d20SAndroid Build Coastguard Worker 434*2d543d20SAndroid Build Coastguard Worker def delete(self, module, priority): 435*2d543d20SAndroid Build Coastguard Worker rc = semanage_set_default_priority(self.sh, priority) 436*2d543d20SAndroid Build Coastguard Worker if rc < 0: 437*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Invalid priority %d (needs to be between 1 and 999)") % priority) 438*2d543d20SAndroid Build Coastguard Worker 439*2d543d20SAndroid Build Coastguard Worker for m in module.split(): 440*2d543d20SAndroid Build Coastguard Worker rc = semanage_module_remove(self.sh, m) 441*2d543d20SAndroid Build Coastguard Worker if rc < 0 and rc != -2: 442*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not remove module %s (remove failed)") % m) 443*2d543d20SAndroid Build Coastguard Worker 444*2d543d20SAndroid Build Coastguard Worker self.commit() 445*2d543d20SAndroid Build Coastguard Worker 446*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 447*2d543d20SAndroid Build Coastguard Worker l = [x[0] for x in [t for t in self.get_all() if t[1] == 0]] 448*2d543d20SAndroid Build Coastguard Worker for m in l: 449*2d543d20SAndroid Build Coastguard Worker self.set_enabled(m, True) 450*2d543d20SAndroid Build Coastguard Worker 451*2d543d20SAndroid Build Coastguard Worker 452*2d543d20SAndroid Build Coastguard Workerclass dontauditClass(semanageRecords): 453*2d543d20SAndroid Build Coastguard Worker 454*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 455*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 456*2d543d20SAndroid Build Coastguard Worker 457*2d543d20SAndroid Build Coastguard Worker def toggle(self, dontaudit): 458*2d543d20SAndroid Build Coastguard Worker if dontaudit not in ["on", "off"]: 459*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("dontaudit requires either 'on' or 'off'")) 460*2d543d20SAndroid Build Coastguard Worker self.begin() 461*2d543d20SAndroid Build Coastguard Worker semanage_set_disable_dontaudit(self.sh, dontaudit == "off") 462*2d543d20SAndroid Build Coastguard Worker self.commit() 463*2d543d20SAndroid Build Coastguard Worker 464*2d543d20SAndroid Build Coastguard Worker 465*2d543d20SAndroid Build Coastguard Workerclass permissiveRecords(semanageRecords): 466*2d543d20SAndroid Build Coastguard Worker 467*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 468*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 469*2d543d20SAndroid Build Coastguard Worker 470*2d543d20SAndroid Build Coastguard Worker def get_all(self): 471*2d543d20SAndroid Build Coastguard Worker l = [] 472*2d543d20SAndroid Build Coastguard Worker (rc, mlist, number) = semanage_module_list(self.sh) 473*2d543d20SAndroid Build Coastguard Worker if rc < 0: 474*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list SELinux modules")) 475*2d543d20SAndroid Build Coastguard Worker 476*2d543d20SAndroid Build Coastguard Worker for i in range(number): 477*2d543d20SAndroid Build Coastguard Worker mod = semanage_module_list_nth(mlist, i) 478*2d543d20SAndroid Build Coastguard Worker name = semanage_module_get_name(mod) 479*2d543d20SAndroid Build Coastguard Worker if name and name.startswith("permissive_"): 480*2d543d20SAndroid Build Coastguard Worker l.append(name.split("permissive_")[1]) 481*2d543d20SAndroid Build Coastguard Worker return l 482*2d543d20SAndroid Build Coastguard Worker 483*2d543d20SAndroid Build Coastguard Worker def customized(self): 484*2d543d20SAndroid Build Coastguard Worker return ["-a %s" % x for x in sorted(self.get_all())] 485*2d543d20SAndroid Build Coastguard Worker 486*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 487*2d543d20SAndroid Build Coastguard Worker all = [y["name"] for y in [x for x in sepolicy.info(sepolicy.TYPE) if x["permissive"]]] 488*2d543d20SAndroid Build Coastguard Worker if len(all) == 0: 489*2d543d20SAndroid Build Coastguard Worker return 490*2d543d20SAndroid Build Coastguard Worker 491*2d543d20SAndroid Build Coastguard Worker if heading: 492*2d543d20SAndroid Build Coastguard Worker print("\n%-25s\n" % (_("Builtin Permissive Types"))) 493*2d543d20SAndroid Build Coastguard Worker customized = self.get_all() 494*2d543d20SAndroid Build Coastguard Worker for t in all: 495*2d543d20SAndroid Build Coastguard Worker if t not in customized: 496*2d543d20SAndroid Build Coastguard Worker print(t) 497*2d543d20SAndroid Build Coastguard Worker 498*2d543d20SAndroid Build Coastguard Worker if len(customized) == 0: 499*2d543d20SAndroid Build Coastguard Worker return 500*2d543d20SAndroid Build Coastguard Worker 501*2d543d20SAndroid Build Coastguard Worker if heading: 502*2d543d20SAndroid Build Coastguard Worker print("\n%-25s\n" % (_("Customized Permissive Types"))) 503*2d543d20SAndroid Build Coastguard Worker for t in customized: 504*2d543d20SAndroid Build Coastguard Worker print(t) 505*2d543d20SAndroid Build Coastguard Worker 506*2d543d20SAndroid Build Coastguard Worker def add(self, type): 507*2d543d20SAndroid Build Coastguard Worker name = "permissive_%s" % type 508*2d543d20SAndroid Build Coastguard Worker modtxt = "(typepermissive %s)" % type 509*2d543d20SAndroid Build Coastguard Worker 510*2d543d20SAndroid Build Coastguard Worker rc = semanage_module_install(self.sh, modtxt, len(modtxt), name, "cil") 511*2d543d20SAndroid Build Coastguard Worker if rc >= 0: 512*2d543d20SAndroid Build Coastguard Worker self.commit() 513*2d543d20SAndroid Build Coastguard Worker 514*2d543d20SAndroid Build Coastguard Worker if rc < 0: 515*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set permissive domain %s (module installation failed)") % name) 516*2d543d20SAndroid Build Coastguard Worker 517*2d543d20SAndroid Build Coastguard Worker def delete(self, name): 518*2d543d20SAndroid Build Coastguard Worker for n in name.split(): 519*2d543d20SAndroid Build Coastguard Worker rc = semanage_module_remove(self.sh, "permissive_%s" % n) 520*2d543d20SAndroid Build Coastguard Worker if rc < 0: 521*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not remove permissive domain %s (remove failed)") % name) 522*2d543d20SAndroid Build Coastguard Worker 523*2d543d20SAndroid Build Coastguard Worker self.commit() 524*2d543d20SAndroid Build Coastguard Worker 525*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 526*2d543d20SAndroid Build Coastguard Worker l = self.get_all() 527*2d543d20SAndroid Build Coastguard Worker if len(l) > 0: 528*2d543d20SAndroid Build Coastguard Worker all = " ".join(l) 529*2d543d20SAndroid Build Coastguard Worker self.delete(all) 530*2d543d20SAndroid Build Coastguard Worker 531*2d543d20SAndroid Build Coastguard Worker 532*2d543d20SAndroid Build Coastguard Workerclass loginRecords(semanageRecords): 533*2d543d20SAndroid Build Coastguard Worker 534*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 535*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 536*2d543d20SAndroid Build Coastguard Worker self.oldsename = None 537*2d543d20SAndroid Build Coastguard Worker self.oldserange = None 538*2d543d20SAndroid Build Coastguard Worker self.sename = None 539*2d543d20SAndroid Build Coastguard Worker self.serange = None 540*2d543d20SAndroid Build Coastguard Worker 541*2d543d20SAndroid Build Coastguard Worker def __add(self, name, sename, serange): 542*2d543d20SAndroid Build Coastguard Worker rec, self.oldsename, self.oldserange = selinux.getseuserbyname(name) 543*2d543d20SAndroid Build Coastguard Worker if sename == "": 544*2d543d20SAndroid Build Coastguard Worker sename = "user_u" 545*2d543d20SAndroid Build Coastguard Worker 546*2d543d20SAndroid Build Coastguard Worker userrec = seluserRecords(self.args) 547*2d543d20SAndroid Build Coastguard Worker range, (rc, oldserole) = userrec.get(self.oldsename) 548*2d543d20SAndroid Build Coastguard Worker range, (rc, serole) = userrec.get(sename) 549*2d543d20SAndroid Build Coastguard Worker 550*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 551*2d543d20SAndroid Build Coastguard Worker if serange != "": 552*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 553*2d543d20SAndroid Build Coastguard Worker else: 554*2d543d20SAndroid Build Coastguard Worker serange = range 555*2d543d20SAndroid Build Coastguard Worker 556*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_seuser_key_create(self.sh, name) 557*2d543d20SAndroid Build Coastguard Worker if rc < 0: 558*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 559*2d543d20SAndroid Build Coastguard Worker 560*2d543d20SAndroid Build Coastguard Worker if name[0] == '%': 561*2d543d20SAndroid Build Coastguard Worker try: 562*2d543d20SAndroid Build Coastguard Worker grp.getgrnam(name[1:]) 563*2d543d20SAndroid Build Coastguard Worker except: 564*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Linux Group %s does not exist") % name[1:]) 565*2d543d20SAndroid Build Coastguard Worker else: 566*2d543d20SAndroid Build Coastguard Worker try: 567*2d543d20SAndroid Build Coastguard Worker pwd.getpwnam(name) 568*2d543d20SAndroid Build Coastguard Worker except: 569*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Linux User %s does not exist") % name) 570*2d543d20SAndroid Build Coastguard Worker 571*2d543d20SAndroid Build Coastguard Worker (rc, u) = semanage_seuser_create(self.sh) 572*2d543d20SAndroid Build Coastguard Worker if rc < 0: 573*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create login mapping for %s") % name) 574*2d543d20SAndroid Build Coastguard Worker 575*2d543d20SAndroid Build Coastguard Worker rc = semanage_seuser_set_name(self.sh, u, name) 576*2d543d20SAndroid Build Coastguard Worker if rc < 0: 577*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set name for %s") % name) 578*2d543d20SAndroid Build Coastguard Worker 579*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 580*2d543d20SAndroid Build Coastguard Worker rc = semanage_seuser_set_mlsrange(self.sh, u, serange) 581*2d543d20SAndroid Build Coastguard Worker if rc < 0: 582*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set MLS range for %s") % name) 583*2d543d20SAndroid Build Coastguard Worker 584*2d543d20SAndroid Build Coastguard Worker rc = semanage_seuser_set_sename(self.sh, u, sename) 585*2d543d20SAndroid Build Coastguard Worker if rc < 0: 586*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set SELinux user for %s") % name) 587*2d543d20SAndroid Build Coastguard Worker 588*2d543d20SAndroid Build Coastguard Worker rc = semanage_seuser_modify_local(self.sh, k, u) 589*2d543d20SAndroid Build Coastguard Worker if rc < 0: 590*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add login mapping for %s") % name) 591*2d543d20SAndroid Build Coastguard Worker 592*2d543d20SAndroid Build Coastguard Worker semanage_seuser_key_free(k) 593*2d543d20SAndroid Build Coastguard Worker semanage_seuser_free(u) 594*2d543d20SAndroid Build Coastguard Worker 595*2d543d20SAndroid Build Coastguard Worker def add(self, name, sename, serange): 596*2d543d20SAndroid Build Coastguard Worker try: 597*2d543d20SAndroid Build Coastguard Worker self.begin() 598*2d543d20SAndroid Build Coastguard Worker # Add a new mapping, or modify an existing one 599*2d543d20SAndroid Build Coastguard Worker if self.__exists(name): 600*2d543d20SAndroid Build Coastguard Worker print(_("Login mapping for %s is already defined, modifying instead") % name) 601*2d543d20SAndroid Build Coastguard Worker self.__modify(name, sename, serange) 602*2d543d20SAndroid Build Coastguard Worker else: 603*2d543d20SAndroid Build Coastguard Worker self.__add(name, sename, serange) 604*2d543d20SAndroid Build Coastguard Worker self.commit() 605*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 606*2d543d20SAndroid Build Coastguard Worker raise error 607*2d543d20SAndroid Build Coastguard Worker 608*2d543d20SAndroid Build Coastguard Worker # check if login mapping for given user exists 609*2d543d20SAndroid Build Coastguard Worker def __exists(self, name): 610*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_seuser_key_create(self.sh, name) 611*2d543d20SAndroid Build Coastguard Worker if rc < 0: 612*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 613*2d543d20SAndroid Build Coastguard Worker 614*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_seuser_exists(self.sh, k) 615*2d543d20SAndroid Build Coastguard Worker if rc < 0: 616*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if login mapping for %s is defined") % name) 617*2d543d20SAndroid Build Coastguard Worker semanage_seuser_key_free(k) 618*2d543d20SAndroid Build Coastguard Worker 619*2d543d20SAndroid Build Coastguard Worker return exists 620*2d543d20SAndroid Build Coastguard Worker 621*2d543d20SAndroid Build Coastguard Worker def __modify(self, name, sename="", serange=""): 622*2d543d20SAndroid Build Coastguard Worker rec, self.oldsename, self.oldserange = selinux.getseuserbyname(name) 623*2d543d20SAndroid Build Coastguard Worker if sename == "" and serange == "": 624*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires seuser or serange")) 625*2d543d20SAndroid Build Coastguard Worker 626*2d543d20SAndroid Build Coastguard Worker userrec = seluserRecords(self.args) 627*2d543d20SAndroid Build Coastguard Worker range, (rc, oldserole) = userrec.get(self.oldsename) 628*2d543d20SAndroid Build Coastguard Worker 629*2d543d20SAndroid Build Coastguard Worker if sename != "": 630*2d543d20SAndroid Build Coastguard Worker range, (rc, serole) = userrec.get(sename) 631*2d543d20SAndroid Build Coastguard Worker else: 632*2d543d20SAndroid Build Coastguard Worker serole = oldserole 633*2d543d20SAndroid Build Coastguard Worker 634*2d543d20SAndroid Build Coastguard Worker if serange != "": 635*2d543d20SAndroid Build Coastguard Worker self.serange = serange 636*2d543d20SAndroid Build Coastguard Worker else: 637*2d543d20SAndroid Build Coastguard Worker self.serange = range 638*2d543d20SAndroid Build Coastguard Worker 639*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_seuser_key_create(self.sh, name) 640*2d543d20SAndroid Build Coastguard Worker if rc < 0: 641*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 642*2d543d20SAndroid Build Coastguard Worker 643*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_seuser_exists(self.sh, k) 644*2d543d20SAndroid Build Coastguard Worker if rc < 0: 645*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if login mapping for %s is defined") % name) 646*2d543d20SAndroid Build Coastguard Worker if not exists: 647*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Login mapping for %s is not defined") % name) 648*2d543d20SAndroid Build Coastguard Worker 649*2d543d20SAndroid Build Coastguard Worker (rc, u) = semanage_seuser_query(self.sh, k) 650*2d543d20SAndroid Build Coastguard Worker if rc < 0: 651*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query seuser for %s") % name) 652*2d543d20SAndroid Build Coastguard Worker 653*2d543d20SAndroid Build Coastguard Worker self.oldserange = semanage_seuser_get_mlsrange(u) 654*2d543d20SAndroid Build Coastguard Worker self.oldsename = semanage_seuser_get_sename(u) 655*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 656*2d543d20SAndroid Build Coastguard Worker semanage_seuser_set_mlsrange(self.sh, u, untranslate(serange)) 657*2d543d20SAndroid Build Coastguard Worker 658*2d543d20SAndroid Build Coastguard Worker if sename != "": 659*2d543d20SAndroid Build Coastguard Worker semanage_seuser_set_sename(self.sh, u, sename) 660*2d543d20SAndroid Build Coastguard Worker self.sename = sename 661*2d543d20SAndroid Build Coastguard Worker else: 662*2d543d20SAndroid Build Coastguard Worker self.sename = self.oldsename 663*2d543d20SAndroid Build Coastguard Worker 664*2d543d20SAndroid Build Coastguard Worker rc = semanage_seuser_modify_local(self.sh, k, u) 665*2d543d20SAndroid Build Coastguard Worker if rc < 0: 666*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify login mapping for %s") % name) 667*2d543d20SAndroid Build Coastguard Worker 668*2d543d20SAndroid Build Coastguard Worker semanage_seuser_key_free(k) 669*2d543d20SAndroid Build Coastguard Worker semanage_seuser_free(u) 670*2d543d20SAndroid Build Coastguard Worker 671*2d543d20SAndroid Build Coastguard Worker def modify(self, name, sename="", serange=""): 672*2d543d20SAndroid Build Coastguard Worker try: 673*2d543d20SAndroid Build Coastguard Worker self.begin() 674*2d543d20SAndroid Build Coastguard Worker self.__modify(name, sename, serange) 675*2d543d20SAndroid Build Coastguard Worker self.commit() 676*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 677*2d543d20SAndroid Build Coastguard Worker raise error 678*2d543d20SAndroid Build Coastguard Worker 679*2d543d20SAndroid Build Coastguard Worker def __delete(self, name): 680*2d543d20SAndroid Build Coastguard Worker rec, self.oldsename, self.oldserange = selinux.getseuserbyname(name) 681*2d543d20SAndroid Build Coastguard Worker userrec = seluserRecords(self.args) 682*2d543d20SAndroid Build Coastguard Worker range, (rc, oldserole) = userrec.get(self.oldsename) 683*2d543d20SAndroid Build Coastguard Worker 684*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_seuser_key_create(self.sh, name) 685*2d543d20SAndroid Build Coastguard Worker if rc < 0: 686*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 687*2d543d20SAndroid Build Coastguard Worker 688*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_seuser_exists(self.sh, k) 689*2d543d20SAndroid Build Coastguard Worker if rc < 0: 690*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if login mapping for %s is defined") % name) 691*2d543d20SAndroid Build Coastguard Worker if not exists: 692*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Login mapping for %s is not defined") % name) 693*2d543d20SAndroid Build Coastguard Worker 694*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_seuser_exists_local(self.sh, k) 695*2d543d20SAndroid Build Coastguard Worker if rc < 0: 696*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if login mapping for %s is defined") % name) 697*2d543d20SAndroid Build Coastguard Worker if not exists: 698*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Login mapping for %s is defined in policy, cannot be deleted") % name) 699*2d543d20SAndroid Build Coastguard Worker 700*2d543d20SAndroid Build Coastguard Worker rc = semanage_seuser_del_local(self.sh, k) 701*2d543d20SAndroid Build Coastguard Worker if rc < 0: 702*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete login mapping for %s") % name) 703*2d543d20SAndroid Build Coastguard Worker 704*2d543d20SAndroid Build Coastguard Worker semanage_seuser_key_free(k) 705*2d543d20SAndroid Build Coastguard Worker 706*2d543d20SAndroid Build Coastguard Worker rec, self.sename, self.serange = selinux.getseuserbyname("__default__") 707*2d543d20SAndroid Build Coastguard Worker range, (rc, serole) = userrec.get(self.sename) 708*2d543d20SAndroid Build Coastguard Worker 709*2d543d20SAndroid Build Coastguard Worker def delete(self, name): 710*2d543d20SAndroid Build Coastguard Worker try: 711*2d543d20SAndroid Build Coastguard Worker self.begin() 712*2d543d20SAndroid Build Coastguard Worker self.__delete(name) 713*2d543d20SAndroid Build Coastguard Worker self.commit() 714*2d543d20SAndroid Build Coastguard Worker 715*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 716*2d543d20SAndroid Build Coastguard Worker raise error 717*2d543d20SAndroid Build Coastguard Worker 718*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 719*2d543d20SAndroid Build Coastguard Worker (rc, ulist) = semanage_seuser_list_local(self.sh) 720*2d543d20SAndroid Build Coastguard Worker if rc < 0: 721*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list login mappings")) 722*2d543d20SAndroid Build Coastguard Worker 723*2d543d20SAndroid Build Coastguard Worker try: 724*2d543d20SAndroid Build Coastguard Worker self.begin() 725*2d543d20SAndroid Build Coastguard Worker for u in ulist: 726*2d543d20SAndroid Build Coastguard Worker self.__delete(semanage_seuser_get_name(u)) 727*2d543d20SAndroid Build Coastguard Worker self.commit() 728*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 729*2d543d20SAndroid Build Coastguard Worker raise error 730*2d543d20SAndroid Build Coastguard Worker 731*2d543d20SAndroid Build Coastguard Worker def get_all_logins(self): 732*2d543d20SAndroid Build Coastguard Worker ddict = {} 733*2d543d20SAndroid Build Coastguard Worker self.logins_path = selinux.selinux_policy_root() + "/logins" 734*2d543d20SAndroid Build Coastguard Worker for path, dirs, files in os.walk(self.logins_path): 735*2d543d20SAndroid Build Coastguard Worker if path == self.logins_path: 736*2d543d20SAndroid Build Coastguard Worker for name in files: 737*2d543d20SAndroid Build Coastguard Worker try: 738*2d543d20SAndroid Build Coastguard Worker fd = open(path + "/" + name) 739*2d543d20SAndroid Build Coastguard Worker rec = fd.read().rstrip().split(":") 740*2d543d20SAndroid Build Coastguard Worker fd.close() 741*2d543d20SAndroid Build Coastguard Worker ddict[name] = (rec[1], rec[2], rec[0]) 742*2d543d20SAndroid Build Coastguard Worker except IndexError: 743*2d543d20SAndroid Build Coastguard Worker pass 744*2d543d20SAndroid Build Coastguard Worker return ddict 745*2d543d20SAndroid Build Coastguard Worker 746*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 747*2d543d20SAndroid Build Coastguard Worker ddict = {} 748*2d543d20SAndroid Build Coastguard Worker if locallist: 749*2d543d20SAndroid Build Coastguard Worker (rc, self.ulist) = semanage_seuser_list_local(self.sh) 750*2d543d20SAndroid Build Coastguard Worker else: 751*2d543d20SAndroid Build Coastguard Worker (rc, self.ulist) = semanage_seuser_list(self.sh) 752*2d543d20SAndroid Build Coastguard Worker if rc < 0: 753*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list login mappings")) 754*2d543d20SAndroid Build Coastguard Worker 755*2d543d20SAndroid Build Coastguard Worker for u in self.ulist: 756*2d543d20SAndroid Build Coastguard Worker name = semanage_seuser_get_name(u) 757*2d543d20SAndroid Build Coastguard Worker ddict[name] = (semanage_seuser_get_sename(u), semanage_seuser_get_mlsrange(u), "*") 758*2d543d20SAndroid Build Coastguard Worker return ddict 759*2d543d20SAndroid Build Coastguard Worker 760*2d543d20SAndroid Build Coastguard Worker def customized(self): 761*2d543d20SAndroid Build Coastguard Worker l = [] 762*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 763*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 764*2d543d20SAndroid Build Coastguard Worker if ddict[k][1]: 765*2d543d20SAndroid Build Coastguard Worker l.append("-a -s %s -r '%s' %s" % (ddict[k][0], ddict[k][1], k)) 766*2d543d20SAndroid Build Coastguard Worker else: 767*2d543d20SAndroid Build Coastguard Worker l.append("-a -s %s %s" % (ddict[k][0], k)) 768*2d543d20SAndroid Build Coastguard Worker return l 769*2d543d20SAndroid Build Coastguard Worker 770*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 771*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(locallist) 772*2d543d20SAndroid Build Coastguard Worker ldict = self.get_all_logins() 773*2d543d20SAndroid Build Coastguard Worker lkeys = sorted(ldict.keys()) 774*2d543d20SAndroid Build Coastguard Worker keys = sorted(ddict.keys()) 775*2d543d20SAndroid Build Coastguard Worker if len(keys) == 0 and len(lkeys) == 0: 776*2d543d20SAndroid Build Coastguard Worker return 777*2d543d20SAndroid Build Coastguard Worker 778*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 779*2d543d20SAndroid Build Coastguard Worker if heading: 780*2d543d20SAndroid Build Coastguard Worker print("\n%-20s %-20s %-20s %s\n" % (_("Login Name"), _("SELinux User"), _("MLS/MCS Range"), _("Service"))) 781*2d543d20SAndroid Build Coastguard Worker for k in keys: 782*2d543d20SAndroid Build Coastguard Worker u = ddict[k] 783*2d543d20SAndroid Build Coastguard Worker print("%-20s %-20s %-20s %s" % (k, u[0], translate(u[1]), u[2])) 784*2d543d20SAndroid Build Coastguard Worker if len(lkeys): 785*2d543d20SAndroid Build Coastguard Worker print("\nLocal customization in %s" % self.logins_path) 786*2d543d20SAndroid Build Coastguard Worker 787*2d543d20SAndroid Build Coastguard Worker for k in lkeys: 788*2d543d20SAndroid Build Coastguard Worker u = ldict[k] 789*2d543d20SAndroid Build Coastguard Worker print("%-20s %-20s %-20s %s" % (k, u[0], translate(u[1]), u[2])) 790*2d543d20SAndroid Build Coastguard Worker else: 791*2d543d20SAndroid Build Coastguard Worker if heading: 792*2d543d20SAndroid Build Coastguard Worker print("\n%-25s %-25s\n" % (_("Login Name"), _("SELinux User"))) 793*2d543d20SAndroid Build Coastguard Worker for k in keys: 794*2d543d20SAndroid Build Coastguard Worker print("%-25s %-25s" % (k, ddict[k][0])) 795*2d543d20SAndroid Build Coastguard Worker 796*2d543d20SAndroid Build Coastguard Worker 797*2d543d20SAndroid Build Coastguard Workerclass seluserRecords(semanageRecords): 798*2d543d20SAndroid Build Coastguard Worker 799*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 800*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 801*2d543d20SAndroid Build Coastguard Worker 802*2d543d20SAndroid Build Coastguard Worker def get(self, name): 803*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_user_key_create(self.sh, name) 804*2d543d20SAndroid Build Coastguard Worker if rc < 0: 805*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 806*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_user_exists(self.sh, k) 807*2d543d20SAndroid Build Coastguard Worker if rc < 0: 808*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if SELinux user %s is defined") % name) 809*2d543d20SAndroid Build Coastguard Worker (rc, u) = semanage_user_query(self.sh, k) 810*2d543d20SAndroid Build Coastguard Worker if rc < 0: 811*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query user for %s") % name) 812*2d543d20SAndroid Build Coastguard Worker serange = semanage_user_get_mlsrange(u) 813*2d543d20SAndroid Build Coastguard Worker serole = semanage_user_get_roles(self.sh, u) 814*2d543d20SAndroid Build Coastguard Worker semanage_user_key_free(k) 815*2d543d20SAndroid Build Coastguard Worker semanage_user_free(u) 816*2d543d20SAndroid Build Coastguard Worker return serange, serole 817*2d543d20SAndroid Build Coastguard Worker 818*2d543d20SAndroid Build Coastguard Worker def __add(self, name, roles, selevel, serange, prefix): 819*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 820*2d543d20SAndroid Build Coastguard Worker if serange == "": 821*2d543d20SAndroid Build Coastguard Worker serange = "s0" 822*2d543d20SAndroid Build Coastguard Worker else: 823*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 824*2d543d20SAndroid Build Coastguard Worker 825*2d543d20SAndroid Build Coastguard Worker if selevel == "": 826*2d543d20SAndroid Build Coastguard Worker selevel = "s0" 827*2d543d20SAndroid Build Coastguard Worker else: 828*2d543d20SAndroid Build Coastguard Worker selevel = untranslate(selevel) 829*2d543d20SAndroid Build Coastguard Worker 830*2d543d20SAndroid Build Coastguard Worker if len(roles) < 1: 831*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("You must add at least one role for %s") % name) 832*2d543d20SAndroid Build Coastguard Worker 833*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_user_key_create(self.sh, name) 834*2d543d20SAndroid Build Coastguard Worker if rc < 0: 835*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 836*2d543d20SAndroid Build Coastguard Worker 837*2d543d20SAndroid Build Coastguard Worker (rc, u) = semanage_user_create(self.sh) 838*2d543d20SAndroid Build Coastguard Worker if rc < 0: 839*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create SELinux user for %s") % name) 840*2d543d20SAndroid Build Coastguard Worker 841*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_set_name(self.sh, u, name) 842*2d543d20SAndroid Build Coastguard Worker if rc < 0: 843*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set name for %s") % name) 844*2d543d20SAndroid Build Coastguard Worker 845*2d543d20SAndroid Build Coastguard Worker for r in roles: 846*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_add_role(self.sh, u, r) 847*2d543d20SAndroid Build Coastguard Worker if rc < 0: 848*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add role {role} for {name}").format(role=r, name=name)) 849*2d543d20SAndroid Build Coastguard Worker 850*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 851*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_set_mlsrange(self.sh, u, serange) 852*2d543d20SAndroid Build Coastguard Worker if rc < 0: 853*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set MLS range for %s") % name) 854*2d543d20SAndroid Build Coastguard Worker 855*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_set_mlslevel(self.sh, u, selevel) 856*2d543d20SAndroid Build Coastguard Worker if rc < 0: 857*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set MLS level for %s") % name) 858*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_set_prefix(self.sh, u, prefix) 859*2d543d20SAndroid Build Coastguard Worker if rc < 0: 860*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add prefix {prefix} for {role}").format(role=r, prefix=prefix)) 861*2d543d20SAndroid Build Coastguard Worker (rc, key) = semanage_user_key_extract(self.sh, u) 862*2d543d20SAndroid Build Coastguard Worker if rc < 0: 863*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not extract key for %s") % name) 864*2d543d20SAndroid Build Coastguard Worker 865*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_modify_local(self.sh, k, u) 866*2d543d20SAndroid Build Coastguard Worker if rc < 0: 867*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add SELinux user %s") % name) 868*2d543d20SAndroid Build Coastguard Worker 869*2d543d20SAndroid Build Coastguard Worker semanage_user_key_free(k) 870*2d543d20SAndroid Build Coastguard Worker semanage_user_free(u) 871*2d543d20SAndroid Build Coastguard Worker self.mylog.log("seuser", sename=name, serole=",".join(roles), serange=serange) 872*2d543d20SAndroid Build Coastguard Worker 873*2d543d20SAndroid Build Coastguard Worker def add(self, name, roles, selevel, serange, prefix): 874*2d543d20SAndroid Build Coastguard Worker try: 875*2d543d20SAndroid Build Coastguard Worker self.begin() 876*2d543d20SAndroid Build Coastguard Worker if self.__exists(name): 877*2d543d20SAndroid Build Coastguard Worker print(_("SELinux user %s is already defined, modifying instead") % name) 878*2d543d20SAndroid Build Coastguard Worker self.__modify(name, roles, selevel, serange, prefix) 879*2d543d20SAndroid Build Coastguard Worker else: 880*2d543d20SAndroid Build Coastguard Worker self.__add(name, roles, selevel, serange, prefix) 881*2d543d20SAndroid Build Coastguard Worker self.commit() 882*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 883*2d543d20SAndroid Build Coastguard Worker self.mylog.commit(0) 884*2d543d20SAndroid Build Coastguard Worker raise error 885*2d543d20SAndroid Build Coastguard Worker 886*2d543d20SAndroid Build Coastguard Worker def __exists(self, name): 887*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_user_key_create(self.sh, name) 888*2d543d20SAndroid Build Coastguard Worker if rc < 0: 889*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 890*2d543d20SAndroid Build Coastguard Worker 891*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_user_exists(self.sh, k) 892*2d543d20SAndroid Build Coastguard Worker if rc < 0: 893*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if SELinux user %s is defined") % name) 894*2d543d20SAndroid Build Coastguard Worker semanage_user_key_free(k) 895*2d543d20SAndroid Build Coastguard Worker 896*2d543d20SAndroid Build Coastguard Worker return exists 897*2d543d20SAndroid Build Coastguard Worker 898*2d543d20SAndroid Build Coastguard Worker def __modify(self, name, roles=[], selevel="", serange="", prefix=""): 899*2d543d20SAndroid Build Coastguard Worker oldserole = "" 900*2d543d20SAndroid Build Coastguard Worker oldserange = "" 901*2d543d20SAndroid Build Coastguard Worker newroles = " ".join(roles) 902*2d543d20SAndroid Build Coastguard Worker if prefix == "" and len(roles) == 0 and serange == "" and selevel == "": 903*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 904*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires prefix, roles, level or range")) 905*2d543d20SAndroid Build Coastguard Worker else: 906*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires prefix or roles")) 907*2d543d20SAndroid Build Coastguard Worker 908*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_user_key_create(self.sh, name) 909*2d543d20SAndroid Build Coastguard Worker if rc < 0: 910*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 911*2d543d20SAndroid Build Coastguard Worker 912*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_user_exists(self.sh, k) 913*2d543d20SAndroid Build Coastguard Worker if rc < 0: 914*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if SELinux user %s is defined") % name) 915*2d543d20SAndroid Build Coastguard Worker if not exists: 916*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("SELinux user %s is not defined") % name) 917*2d543d20SAndroid Build Coastguard Worker 918*2d543d20SAndroid Build Coastguard Worker (rc, u) = semanage_user_query(self.sh, k) 919*2d543d20SAndroid Build Coastguard Worker if rc < 0: 920*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query user for %s") % name) 921*2d543d20SAndroid Build Coastguard Worker 922*2d543d20SAndroid Build Coastguard Worker oldserange = semanage_user_get_mlsrange(u) 923*2d543d20SAndroid Build Coastguard Worker (rc, rlist) = semanage_user_get_roles(self.sh, u) 924*2d543d20SAndroid Build Coastguard Worker if rc >= 0: 925*2d543d20SAndroid Build Coastguard Worker oldserole = " ".join(rlist) 926*2d543d20SAndroid Build Coastguard Worker 927*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 928*2d543d20SAndroid Build Coastguard Worker semanage_user_set_mlsrange(self.sh, u, untranslate(serange)) 929*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (selevel != ""): 930*2d543d20SAndroid Build Coastguard Worker semanage_user_set_mlslevel(self.sh, u, untranslate(selevel)) 931*2d543d20SAndroid Build Coastguard Worker 932*2d543d20SAndroid Build Coastguard Worker if prefix != "": 933*2d543d20SAndroid Build Coastguard Worker semanage_user_set_prefix(self.sh, u, prefix) 934*2d543d20SAndroid Build Coastguard Worker 935*2d543d20SAndroid Build Coastguard Worker if len(roles) != 0: 936*2d543d20SAndroid Build Coastguard Worker for r in rlist: 937*2d543d20SAndroid Build Coastguard Worker if r not in roles: 938*2d543d20SAndroid Build Coastguard Worker semanage_user_del_role(u, r) 939*2d543d20SAndroid Build Coastguard Worker for r in roles: 940*2d543d20SAndroid Build Coastguard Worker if r not in rlist: 941*2d543d20SAndroid Build Coastguard Worker semanage_user_add_role(self.sh, u, r) 942*2d543d20SAndroid Build Coastguard Worker 943*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_modify_local(self.sh, k, u) 944*2d543d20SAndroid Build Coastguard Worker if rc < 0: 945*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify SELinux user %s") % name) 946*2d543d20SAndroid Build Coastguard Worker 947*2d543d20SAndroid Build Coastguard Worker semanage_user_key_free(k) 948*2d543d20SAndroid Build Coastguard Worker semanage_user_free(u) 949*2d543d20SAndroid Build Coastguard Worker 950*2d543d20SAndroid Build Coastguard Worker role = ",".join(newroles.split()) 951*2d543d20SAndroid Build Coastguard Worker oldserole = ",".join(oldserole.split()) 952*2d543d20SAndroid Build Coastguard Worker self.mylog.log("seuser", sename=name, oldsename=name, serole=role, serange=serange, oldserole=oldserole, oldserange=oldserange) 953*2d543d20SAndroid Build Coastguard Worker 954*2d543d20SAndroid Build Coastguard Worker def modify(self, name, roles=[], selevel="", serange="", prefix=""): 955*2d543d20SAndroid Build Coastguard Worker try: 956*2d543d20SAndroid Build Coastguard Worker self.begin() 957*2d543d20SAndroid Build Coastguard Worker self.__modify(name, roles, selevel, serange, prefix) 958*2d543d20SAndroid Build Coastguard Worker self.commit() 959*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 960*2d543d20SAndroid Build Coastguard Worker self.mylog.commit(0) 961*2d543d20SAndroid Build Coastguard Worker raise error 962*2d543d20SAndroid Build Coastguard Worker 963*2d543d20SAndroid Build Coastguard Worker def __delete(self, name): 964*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_user_key_create(self.sh, name) 965*2d543d20SAndroid Build Coastguard Worker if rc < 0: 966*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 967*2d543d20SAndroid Build Coastguard Worker 968*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_user_exists(self.sh, k) 969*2d543d20SAndroid Build Coastguard Worker if rc < 0: 970*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if SELinux user %s is defined") % name) 971*2d543d20SAndroid Build Coastguard Worker if not exists: 972*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("SELinux user %s is not defined") % name) 973*2d543d20SAndroid Build Coastguard Worker 974*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_user_exists_local(self.sh, k) 975*2d543d20SAndroid Build Coastguard Worker if rc < 0: 976*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if SELinux user %s is defined") % name) 977*2d543d20SAndroid Build Coastguard Worker if not exists: 978*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("SELinux user %s is defined in policy, cannot be deleted") % name) 979*2d543d20SAndroid Build Coastguard Worker 980*2d543d20SAndroid Build Coastguard Worker (rc, u) = semanage_user_query(self.sh, k) 981*2d543d20SAndroid Build Coastguard Worker if rc < 0: 982*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query user for %s") % name) 983*2d543d20SAndroid Build Coastguard Worker oldserange = semanage_user_get_mlsrange(u) 984*2d543d20SAndroid Build Coastguard Worker (rc, rlist) = semanage_user_get_roles(self.sh, u) 985*2d543d20SAndroid Build Coastguard Worker oldserole = ",".join(rlist) 986*2d543d20SAndroid Build Coastguard Worker 987*2d543d20SAndroid Build Coastguard Worker rc = semanage_user_del_local(self.sh, k) 988*2d543d20SAndroid Build Coastguard Worker if rc < 0: 989*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete SELinux user %s") % name) 990*2d543d20SAndroid Build Coastguard Worker 991*2d543d20SAndroid Build Coastguard Worker semanage_user_key_free(k) 992*2d543d20SAndroid Build Coastguard Worker semanage_user_free(u) 993*2d543d20SAndroid Build Coastguard Worker 994*2d543d20SAndroid Build Coastguard Worker self.mylog.log_remove("seuser", oldsename=name, oldserange=oldserange, oldserole=oldserole) 995*2d543d20SAndroid Build Coastguard Worker 996*2d543d20SAndroid Build Coastguard Worker def delete(self, name): 997*2d543d20SAndroid Build Coastguard Worker try: 998*2d543d20SAndroid Build Coastguard Worker self.begin() 999*2d543d20SAndroid Build Coastguard Worker self.__delete(name) 1000*2d543d20SAndroid Build Coastguard Worker self.commit() 1001*2d543d20SAndroid Build Coastguard Worker 1002*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 1003*2d543d20SAndroid Build Coastguard Worker self.mylog.commit(0) 1004*2d543d20SAndroid Build Coastguard Worker raise error 1005*2d543d20SAndroid Build Coastguard Worker 1006*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 1007*2d543d20SAndroid Build Coastguard Worker (rc, ulist) = semanage_user_list_local(self.sh) 1008*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1009*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list login mappings")) 1010*2d543d20SAndroid Build Coastguard Worker 1011*2d543d20SAndroid Build Coastguard Worker try: 1012*2d543d20SAndroid Build Coastguard Worker self.begin() 1013*2d543d20SAndroid Build Coastguard Worker for u in ulist: 1014*2d543d20SAndroid Build Coastguard Worker self.__delete(semanage_user_get_name(u)) 1015*2d543d20SAndroid Build Coastguard Worker self.commit() 1016*2d543d20SAndroid Build Coastguard Worker except ValueError as error: 1017*2d543d20SAndroid Build Coastguard Worker self.mylog.commit(0) 1018*2d543d20SAndroid Build Coastguard Worker raise error 1019*2d543d20SAndroid Build Coastguard Worker 1020*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 1021*2d543d20SAndroid Build Coastguard Worker ddict = {} 1022*2d543d20SAndroid Build Coastguard Worker if locallist: 1023*2d543d20SAndroid Build Coastguard Worker (rc, self.ulist) = semanage_user_list_local(self.sh) 1024*2d543d20SAndroid Build Coastguard Worker else: 1025*2d543d20SAndroid Build Coastguard Worker (rc, self.ulist) = semanage_user_list(self.sh) 1026*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1027*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list SELinux users")) 1028*2d543d20SAndroid Build Coastguard Worker 1029*2d543d20SAndroid Build Coastguard Worker for u in self.ulist: 1030*2d543d20SAndroid Build Coastguard Worker name = semanage_user_get_name(u) 1031*2d543d20SAndroid Build Coastguard Worker (rc, rlist) = semanage_user_get_roles(self.sh, u) 1032*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1033*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list roles for user %s") % name) 1034*2d543d20SAndroid Build Coastguard Worker 1035*2d543d20SAndroid Build Coastguard Worker roles = " ".join(rlist) 1036*2d543d20SAndroid Build Coastguard Worker ddict[semanage_user_get_name(u)] = (semanage_user_get_prefix(u), semanage_user_get_mlslevel(u), semanage_user_get_mlsrange(u), roles) 1037*2d543d20SAndroid Build Coastguard Worker 1038*2d543d20SAndroid Build Coastguard Worker return ddict 1039*2d543d20SAndroid Build Coastguard Worker 1040*2d543d20SAndroid Build Coastguard Worker def customized(self): 1041*2d543d20SAndroid Build Coastguard Worker l = [] 1042*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 1043*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 1044*2d543d20SAndroid Build Coastguard Worker if ddict[k][1] or ddict[k][2]: 1045*2d543d20SAndroid Build Coastguard Worker l.append("-a -L %s -r %s -R '%s' %s" % (ddict[k][1], ddict[k][2], ddict[k][3], k)) 1046*2d543d20SAndroid Build Coastguard Worker else: 1047*2d543d20SAndroid Build Coastguard Worker l.append("-a -R '%s' %s" % (ddict[k][3], k)) 1048*2d543d20SAndroid Build Coastguard Worker return l 1049*2d543d20SAndroid Build Coastguard Worker 1050*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 1051*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(locallist) 1052*2d543d20SAndroid Build Coastguard Worker if len(ddict) == 0: 1053*2d543d20SAndroid Build Coastguard Worker return 1054*2d543d20SAndroid Build Coastguard Worker keys = sorted(ddict.keys()) 1055*2d543d20SAndroid Build Coastguard Worker 1056*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1057*2d543d20SAndroid Build Coastguard Worker if heading: 1058*2d543d20SAndroid Build Coastguard Worker print("\n%-15s %-10s %-10s %-30s" % ("", _("Labeling"), _("MLS/"), _("MLS/"))) 1059*2d543d20SAndroid Build Coastguard Worker print("%-15s %-10s %-10s %-30s %s\n" % (_("SELinux User"), _("Prefix"), _("MCS Level"), _("MCS Range"), _("SELinux Roles"))) 1060*2d543d20SAndroid Build Coastguard Worker for k in keys: 1061*2d543d20SAndroid Build Coastguard Worker print("%-15s %-10s %-10s %-30s %s" % (k, ddict[k][0], translate(ddict[k][1]), translate(ddict[k][2]), ddict[k][3])) 1062*2d543d20SAndroid Build Coastguard Worker else: 1063*2d543d20SAndroid Build Coastguard Worker if heading: 1064*2d543d20SAndroid Build Coastguard Worker print("%-15s %s\n" % (_("SELinux User"), _("SELinux Roles"))) 1065*2d543d20SAndroid Build Coastguard Worker for k in keys: 1066*2d543d20SAndroid Build Coastguard Worker print("%-15s %s" % (k, ddict[k][3])) 1067*2d543d20SAndroid Build Coastguard Worker 1068*2d543d20SAndroid Build Coastguard Worker 1069*2d543d20SAndroid Build Coastguard Workerclass portRecords(semanageRecords): 1070*2d543d20SAndroid Build Coastguard Worker 1071*2d543d20SAndroid Build Coastguard Worker valid_types = [] 1072*2d543d20SAndroid Build Coastguard Worker 1073*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 1074*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 1075*2d543d20SAndroid Build Coastguard Worker try: 1076*2d543d20SAndroid Build Coastguard Worker self.valid_types = list(list(sepolicy.info(sepolicy.ATTRIBUTE, "port_type"))[0]["types"]) 1077*2d543d20SAndroid Build Coastguard Worker except RuntimeError: 1078*2d543d20SAndroid Build Coastguard Worker pass 1079*2d543d20SAndroid Build Coastguard Worker 1080*2d543d20SAndroid Build Coastguard Worker def __genkey(self, port, proto): 1081*2d543d20SAndroid Build Coastguard Worker protocols = {"tcp": SEMANAGE_PROTO_TCP, 1082*2d543d20SAndroid Build Coastguard Worker "udp": SEMANAGE_PROTO_UDP, 1083*2d543d20SAndroid Build Coastguard Worker "sctp": SEMANAGE_PROTO_SCTP, 1084*2d543d20SAndroid Build Coastguard Worker "dccp": SEMANAGE_PROTO_DCCP} 1085*2d543d20SAndroid Build Coastguard Worker 1086*2d543d20SAndroid Build Coastguard Worker if proto in protocols.keys(): 1087*2d543d20SAndroid Build Coastguard Worker proto_d = protocols[proto] 1088*2d543d20SAndroid Build Coastguard Worker else: 1089*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Protocol has to be one of udp, tcp, dccp or sctp")) 1090*2d543d20SAndroid Build Coastguard Worker if port == "": 1091*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Port is required")) 1092*2d543d20SAndroid Build Coastguard Worker 1093*2d543d20SAndroid Build Coastguard Worker if isinstance(port, str): 1094*2d543d20SAndroid Build Coastguard Worker ports = port.split('-', 1) 1095*2d543d20SAndroid Build Coastguard Worker else: 1096*2d543d20SAndroid Build Coastguard Worker ports = (port,) 1097*2d543d20SAndroid Build Coastguard Worker 1098*2d543d20SAndroid Build Coastguard Worker if len(ports) == 1: 1099*2d543d20SAndroid Build Coastguard Worker high = low = int(ports[0]) 1100*2d543d20SAndroid Build Coastguard Worker else: 1101*2d543d20SAndroid Build Coastguard Worker low = int(ports[0]) 1102*2d543d20SAndroid Build Coastguard Worker high = int(ports[1]) 1103*2d543d20SAndroid Build Coastguard Worker 1104*2d543d20SAndroid Build Coastguard Worker if high > 65535: 1105*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Invalid Port")) 1106*2d543d20SAndroid Build Coastguard Worker 1107*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_port_key_create(self.sh, low, high, proto_d) 1108*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1109*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for {proto}/{port}").format(proto=proto, port=port)) 1110*2d543d20SAndroid Build Coastguard Worker return (k, proto_d, low, high) 1111*2d543d20SAndroid Build Coastguard Worker 1112*2d543d20SAndroid Build Coastguard Worker def __add(self, port, proto, serange, type): 1113*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1114*2d543d20SAndroid Build Coastguard Worker if serange == "": 1115*2d543d20SAndroid Build Coastguard Worker serange = "s0" 1116*2d543d20SAndroid Build Coastguard Worker else: 1117*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 1118*2d543d20SAndroid Build Coastguard Worker 1119*2d543d20SAndroid Build Coastguard Worker if type == "": 1120*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type is required")) 1121*2d543d20SAndroid Build Coastguard Worker 1122*2d543d20SAndroid Build Coastguard Worker type = sepolicy.get_real_type_name(type) 1123*2d543d20SAndroid Build Coastguard Worker 1124*2d543d20SAndroid Build Coastguard Worker if type not in self.valid_types: 1125*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a port type") % type) 1126*2d543d20SAndroid Build Coastguard Worker 1127*2d543d20SAndroid Build Coastguard Worker (k, proto_d, low, high) = self.__genkey(port, proto) 1128*2d543d20SAndroid Build Coastguard Worker 1129*2d543d20SAndroid Build Coastguard Worker (rc, p) = semanage_port_create(self.sh) 1130*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1131*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create port for {proto}/{port}").format(proto=proto, port=port)) 1132*2d543d20SAndroid Build Coastguard Worker 1133*2d543d20SAndroid Build Coastguard Worker semanage_port_set_proto(p, proto_d) 1134*2d543d20SAndroid Build Coastguard Worker semanage_port_set_range(p, low, high) 1135*2d543d20SAndroid Build Coastguard Worker (rc, con) = semanage_context_create(self.sh) 1136*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1137*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create context for {proto}/{port}").format(proto=proto, port=port)) 1138*2d543d20SAndroid Build Coastguard Worker 1139*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_user(self.sh, con, "system_u") 1140*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1141*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set user in port context for {proto}/{port}").format(proto=proto, port=port)) 1142*2d543d20SAndroid Build Coastguard Worker 1143*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_role(self.sh, con, "object_r") 1144*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1145*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set role in port context for {proto}/{port}").format(proto=proto, port=port)) 1146*2d543d20SAndroid Build Coastguard Worker 1147*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_type(self.sh, con, type) 1148*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1149*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set type in port context for {proto}/{port}").format(proto=proto, port=port)) 1150*2d543d20SAndroid Build Coastguard Worker 1151*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 1152*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_mls(self.sh, con, serange) 1153*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1154*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mls fields in port context for {proto}/{port}").format(proto=proto, port=port)) 1155*2d543d20SAndroid Build Coastguard Worker 1156*2d543d20SAndroid Build Coastguard Worker rc = semanage_port_set_con(self.sh, p, con) 1157*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1158*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set port context for {proto}/{port}").format(proto=proto, port=port)) 1159*2d543d20SAndroid Build Coastguard Worker 1160*2d543d20SAndroid Build Coastguard Worker rc = semanage_port_modify_local(self.sh, k, p) 1161*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1162*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add port {proto}/{port}").format(proto=proto, port=port)) 1163*2d543d20SAndroid Build Coastguard Worker 1164*2d543d20SAndroid Build Coastguard Worker semanage_context_free(con) 1165*2d543d20SAndroid Build Coastguard Worker semanage_port_key_free(k) 1166*2d543d20SAndroid Build Coastguard Worker semanage_port_free(p) 1167*2d543d20SAndroid Build Coastguard Worker 1168*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=port op=add lport=%s proto=%s tcontext=%s:%s:%s:%s" % (port, socket.getprotobyname(proto), "system_u", "object_r", type, serange)) 1169*2d543d20SAndroid Build Coastguard Worker 1170*2d543d20SAndroid Build Coastguard Worker def add(self, port, proto, serange, type): 1171*2d543d20SAndroid Build Coastguard Worker self.begin() 1172*2d543d20SAndroid Build Coastguard Worker if self.__exists(port, proto): 1173*2d543d20SAndroid Build Coastguard Worker print(_("Port {proto}/{port} already defined, modifying instead").format(proto=proto, port=port)) 1174*2d543d20SAndroid Build Coastguard Worker self.__modify(port, proto, serange, type) 1175*2d543d20SAndroid Build Coastguard Worker else: 1176*2d543d20SAndroid Build Coastguard Worker self.__add(port, proto, serange, type) 1177*2d543d20SAndroid Build Coastguard Worker self.commit() 1178*2d543d20SAndroid Build Coastguard Worker 1179*2d543d20SAndroid Build Coastguard Worker def __exists(self, port, proto): 1180*2d543d20SAndroid Build Coastguard Worker (k, proto_d, low, high) = self.__genkey(port, proto) 1181*2d543d20SAndroid Build Coastguard Worker 1182*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_port_exists(self.sh, k) 1183*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1184*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) 1185*2d543d20SAndroid Build Coastguard Worker semanage_port_key_free(k) 1186*2d543d20SAndroid Build Coastguard Worker 1187*2d543d20SAndroid Build Coastguard Worker return exists 1188*2d543d20SAndroid Build Coastguard Worker 1189*2d543d20SAndroid Build Coastguard Worker def __modify(self, port, proto, serange, setype): 1190*2d543d20SAndroid Build Coastguard Worker if serange == "" and setype == "": 1191*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1192*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype or serange")) 1193*2d543d20SAndroid Build Coastguard Worker else: 1194*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype")) 1195*2d543d20SAndroid Build Coastguard Worker 1196*2d543d20SAndroid Build Coastguard Worker setype = sepolicy.get_real_type_name(setype) 1197*2d543d20SAndroid Build Coastguard Worker if setype and setype not in self.valid_types: 1198*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a port type") % setype) 1199*2d543d20SAndroid Build Coastguard Worker 1200*2d543d20SAndroid Build Coastguard Worker (k, proto_d, low, high) = self.__genkey(port, proto) 1201*2d543d20SAndroid Build Coastguard Worker 1202*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_port_exists(self.sh, k) 1203*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1204*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) 1205*2d543d20SAndroid Build Coastguard Worker if not exists: 1206*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Port {proto}/{port} is not defined").format(proto=proto, port=port)) 1207*2d543d20SAndroid Build Coastguard Worker 1208*2d543d20SAndroid Build Coastguard Worker (rc, p) = semanage_port_query(self.sh, k) 1209*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1210*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query port {proto}/{port}").format(proto=proto, port=port)) 1211*2d543d20SAndroid Build Coastguard Worker 1212*2d543d20SAndroid Build Coastguard Worker con = semanage_port_get_con(p) 1213*2d543d20SAndroid Build Coastguard Worker 1214*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1215*2d543d20SAndroid Build Coastguard Worker if serange == "": 1216*2d543d20SAndroid Build Coastguard Worker serange = "s0" 1217*2d543d20SAndroid Build Coastguard Worker else: 1218*2d543d20SAndroid Build Coastguard Worker semanage_context_set_mls(self.sh, con, untranslate(serange)) 1219*2d543d20SAndroid Build Coastguard Worker if setype != "": 1220*2d543d20SAndroid Build Coastguard Worker semanage_context_set_type(self.sh, con, setype) 1221*2d543d20SAndroid Build Coastguard Worker 1222*2d543d20SAndroid Build Coastguard Worker rc = semanage_port_modify_local(self.sh, k, p) 1223*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1224*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify port {proto}/{port}").format(proto=proto, port=port)) 1225*2d543d20SAndroid Build Coastguard Worker 1226*2d543d20SAndroid Build Coastguard Worker semanage_port_key_free(k) 1227*2d543d20SAndroid Build Coastguard Worker semanage_port_free(p) 1228*2d543d20SAndroid Build Coastguard Worker 1229*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=port op=modify lport=%s proto=%s tcontext=%s:%s:%s:%s" % (port, socket.getprotobyname(proto), "system_u", "object_r", setype, serange)) 1230*2d543d20SAndroid Build Coastguard Worker 1231*2d543d20SAndroid Build Coastguard Worker def modify(self, port, proto, serange, setype): 1232*2d543d20SAndroid Build Coastguard Worker self.begin() 1233*2d543d20SAndroid Build Coastguard Worker self.__modify(port, proto, serange, setype) 1234*2d543d20SAndroid Build Coastguard Worker self.commit() 1235*2d543d20SAndroid Build Coastguard Worker 1236*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 1237*2d543d20SAndroid Build Coastguard Worker (rc, plist) = semanage_port_list_local(self.sh) 1238*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1239*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list the ports")) 1240*2d543d20SAndroid Build Coastguard Worker 1241*2d543d20SAndroid Build Coastguard Worker self.begin() 1242*2d543d20SAndroid Build Coastguard Worker 1243*2d543d20SAndroid Build Coastguard Worker for port in plist: 1244*2d543d20SAndroid Build Coastguard Worker proto = semanage_port_get_proto(port) 1245*2d543d20SAndroid Build Coastguard Worker proto_str = semanage_port_get_proto_str(proto) 1246*2d543d20SAndroid Build Coastguard Worker low = semanage_port_get_low(port) 1247*2d543d20SAndroid Build Coastguard Worker high = semanage_port_get_high(port) 1248*2d543d20SAndroid Build Coastguard Worker port_str = "%s-%s" % (low, high) 1249*2d543d20SAndroid Build Coastguard Worker 1250*2d543d20SAndroid Build Coastguard Worker (k, proto_d, low, high) = self.__genkey(port_str, proto_str) 1251*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1252*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % port_str) 1253*2d543d20SAndroid Build Coastguard Worker 1254*2d543d20SAndroid Build Coastguard Worker rc = semanage_port_del_local(self.sh, k) 1255*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1256*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete the port %s") % port_str) 1257*2d543d20SAndroid Build Coastguard Worker semanage_port_key_free(k) 1258*2d543d20SAndroid Build Coastguard Worker 1259*2d543d20SAndroid Build Coastguard Worker if low == high: 1260*2d543d20SAndroid Build Coastguard Worker port_str = low 1261*2d543d20SAndroid Build Coastguard Worker 1262*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=port op=delete lport=%s proto=%s" % (port_str, socket.getprotobyname(proto_str))) 1263*2d543d20SAndroid Build Coastguard Worker 1264*2d543d20SAndroid Build Coastguard Worker self.commit() 1265*2d543d20SAndroid Build Coastguard Worker 1266*2d543d20SAndroid Build Coastguard Worker def __delete(self, port, proto): 1267*2d543d20SAndroid Build Coastguard Worker (k, proto_d, low, high) = self.__genkey(port, proto) 1268*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_port_exists(self.sh, k) 1269*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1270*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) 1271*2d543d20SAndroid Build Coastguard Worker if not exists: 1272*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Port {proto}/{port} is not defined").format(proto=proto, port=port)) 1273*2d543d20SAndroid Build Coastguard Worker 1274*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_port_exists_local(self.sh, k) 1275*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1276*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) 1277*2d543d20SAndroid Build Coastguard Worker if not exists: 1278*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Port {proto}/{port} is defined in policy, cannot be deleted").format(proto=proto, port=port)) 1279*2d543d20SAndroid Build Coastguard Worker 1280*2d543d20SAndroid Build Coastguard Worker rc = semanage_port_del_local(self.sh, k) 1281*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1282*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete port {proto}/{port}").format(proto=proto, port=port)) 1283*2d543d20SAndroid Build Coastguard Worker 1284*2d543d20SAndroid Build Coastguard Worker semanage_port_key_free(k) 1285*2d543d20SAndroid Build Coastguard Worker 1286*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=port op=delete lport=%s proto=%s" % (port, socket.getprotobyname(proto))) 1287*2d543d20SAndroid Build Coastguard Worker 1288*2d543d20SAndroid Build Coastguard Worker def delete(self, port, proto): 1289*2d543d20SAndroid Build Coastguard Worker self.begin() 1290*2d543d20SAndroid Build Coastguard Worker self.__delete(port, proto) 1291*2d543d20SAndroid Build Coastguard Worker self.commit() 1292*2d543d20SAndroid Build Coastguard Worker 1293*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 1294*2d543d20SAndroid Build Coastguard Worker ddict = {} 1295*2d543d20SAndroid Build Coastguard Worker if locallist: 1296*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_port_list_local(self.sh) 1297*2d543d20SAndroid Build Coastguard Worker else: 1298*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_port_list(self.sh) 1299*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1300*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list ports")) 1301*2d543d20SAndroid Build Coastguard Worker 1302*2d543d20SAndroid Build Coastguard Worker for port in self.plist: 1303*2d543d20SAndroid Build Coastguard Worker con = semanage_port_get_con(port) 1304*2d543d20SAndroid Build Coastguard Worker ctype = semanage_context_get_type(con) 1305*2d543d20SAndroid Build Coastguard Worker level = semanage_context_get_mls(con) 1306*2d543d20SAndroid Build Coastguard Worker proto = semanage_port_get_proto(port) 1307*2d543d20SAndroid Build Coastguard Worker proto_str = semanage_port_get_proto_str(proto) 1308*2d543d20SAndroid Build Coastguard Worker low = semanage_port_get_low(port) 1309*2d543d20SAndroid Build Coastguard Worker high = semanage_port_get_high(port) 1310*2d543d20SAndroid Build Coastguard Worker ddict[(low, high, proto_str)] = (ctype, level) 1311*2d543d20SAndroid Build Coastguard Worker return ddict 1312*2d543d20SAndroid Build Coastguard Worker 1313*2d543d20SAndroid Build Coastguard Worker def get_all_by_type(self, locallist=0): 1314*2d543d20SAndroid Build Coastguard Worker ddict = {} 1315*2d543d20SAndroid Build Coastguard Worker if locallist: 1316*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_port_list_local(self.sh) 1317*2d543d20SAndroid Build Coastguard Worker else: 1318*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_port_list(self.sh) 1319*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1320*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list ports")) 1321*2d543d20SAndroid Build Coastguard Worker 1322*2d543d20SAndroid Build Coastguard Worker for port in self.plist: 1323*2d543d20SAndroid Build Coastguard Worker con = semanage_port_get_con(port) 1324*2d543d20SAndroid Build Coastguard Worker ctype = semanage_context_get_type(con) 1325*2d543d20SAndroid Build Coastguard Worker proto = semanage_port_get_proto(port) 1326*2d543d20SAndroid Build Coastguard Worker proto_str = semanage_port_get_proto_str(proto) 1327*2d543d20SAndroid Build Coastguard Worker low = semanage_port_get_low(port) 1328*2d543d20SAndroid Build Coastguard Worker high = semanage_port_get_high(port) 1329*2d543d20SAndroid Build Coastguard Worker if (ctype, proto_str) not in ddict.keys(): 1330*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, proto_str)] = [] 1331*2d543d20SAndroid Build Coastguard Worker if low == high: 1332*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, proto_str)].append("%d" % low) 1333*2d543d20SAndroid Build Coastguard Worker else: 1334*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, proto_str)].append("%d-%d" % (low, high)) 1335*2d543d20SAndroid Build Coastguard Worker return ddict 1336*2d543d20SAndroid Build Coastguard Worker 1337*2d543d20SAndroid Build Coastguard Worker def customized(self): 1338*2d543d20SAndroid Build Coastguard Worker l = [] 1339*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 1340*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 1341*2d543d20SAndroid Build Coastguard Worker port = k[0] if k[0] == k[1] else "%s-%s" % (k[0], k[1]) 1342*2d543d20SAndroid Build Coastguard Worker if ddict[k][1]: 1343*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s -r '%s' -p %s %s" % (ddict[k][0], ddict[k][1], k[2], port)) 1344*2d543d20SAndroid Build Coastguard Worker else: 1345*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s -p %s %s" % (ddict[k][0], k[2], port)) 1346*2d543d20SAndroid Build Coastguard Worker return l 1347*2d543d20SAndroid Build Coastguard Worker 1348*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 1349*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all_by_type(locallist) 1350*2d543d20SAndroid Build Coastguard Worker if len(ddict) == 0: 1351*2d543d20SAndroid Build Coastguard Worker return 1352*2d543d20SAndroid Build Coastguard Worker keys = sorted(ddict.keys()) 1353*2d543d20SAndroid Build Coastguard Worker 1354*2d543d20SAndroid Build Coastguard Worker if heading: 1355*2d543d20SAndroid Build Coastguard Worker print("%-30s %-8s %s\n" % (_("SELinux Port Type"), _("Proto"), _("Port Number"))) 1356*2d543d20SAndroid Build Coastguard Worker for i in keys: 1357*2d543d20SAndroid Build Coastguard Worker rec = "%-30s %-8s " % i 1358*2d543d20SAndroid Build Coastguard Worker rec += "%s" % ddict[i][0] 1359*2d543d20SAndroid Build Coastguard Worker for p in ddict[i][1:]: 1360*2d543d20SAndroid Build Coastguard Worker rec += ", %s" % p 1361*2d543d20SAndroid Build Coastguard Worker print(rec) 1362*2d543d20SAndroid Build Coastguard Worker 1363*2d543d20SAndroid Build Coastguard Workerclass ibpkeyRecords(semanageRecords): 1364*2d543d20SAndroid Build Coastguard Worker 1365*2d543d20SAndroid Build Coastguard Worker valid_types = [] 1366*2d543d20SAndroid Build Coastguard Worker 1367*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 1368*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 1369*2d543d20SAndroid Build Coastguard Worker try: 1370*2d543d20SAndroid Build Coastguard Worker q = TypeQuery(SELinuxPolicy(sepolicy.get_store_policy(self.store)), attrs=["ibpkey_type"]) 1371*2d543d20SAndroid Build Coastguard Worker self.valid_types = sorted(str(t) for t in q.results()) 1372*2d543d20SAndroid Build Coastguard Worker except: 1373*2d543d20SAndroid Build Coastguard Worker pass 1374*2d543d20SAndroid Build Coastguard Worker 1375*2d543d20SAndroid Build Coastguard Worker def __genkey(self, pkey, subnet_prefix): 1376*2d543d20SAndroid Build Coastguard Worker if subnet_prefix == "": 1377*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Subnet Prefix is required")) 1378*2d543d20SAndroid Build Coastguard Worker 1379*2d543d20SAndroid Build Coastguard Worker pkeys = pkey.split("-") 1380*2d543d20SAndroid Build Coastguard Worker if len(pkeys) == 1: 1381*2d543d20SAndroid Build Coastguard Worker high = low = int(pkeys[0], 0) 1382*2d543d20SAndroid Build Coastguard Worker else: 1383*2d543d20SAndroid Build Coastguard Worker low = int(pkeys[0], 0) 1384*2d543d20SAndroid Build Coastguard Worker high = int(pkeys[1], 0) 1385*2d543d20SAndroid Build Coastguard Worker 1386*2d543d20SAndroid Build Coastguard Worker if high > 65535: 1387*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Invalid Pkey")) 1388*2d543d20SAndroid Build Coastguard Worker 1389*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_ibpkey_key_create(self.sh, subnet_prefix, low, high) 1390*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1391*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1392*2d543d20SAndroid Build Coastguard Worker return (k, subnet_prefix, low, high) 1393*2d543d20SAndroid Build Coastguard Worker 1394*2d543d20SAndroid Build Coastguard Worker def __add(self, pkey, subnet_prefix, serange, type): 1395*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1396*2d543d20SAndroid Build Coastguard Worker if serange == "": 1397*2d543d20SAndroid Build Coastguard Worker serange = "s0" 1398*2d543d20SAndroid Build Coastguard Worker else: 1399*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 1400*2d543d20SAndroid Build Coastguard Worker 1401*2d543d20SAndroid Build Coastguard Worker if type == "": 1402*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type is required")) 1403*2d543d20SAndroid Build Coastguard Worker 1404*2d543d20SAndroid Build Coastguard Worker type = sepolicy.get_real_type_name(type) 1405*2d543d20SAndroid Build Coastguard Worker 1406*2d543d20SAndroid Build Coastguard Worker if type not in self.valid_types: 1407*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a ibpkey type") % type) 1408*2d543d20SAndroid Build Coastguard Worker 1409*2d543d20SAndroid Build Coastguard Worker (k, subnet_prefix, low, high) = self.__genkey(pkey, subnet_prefix) 1410*2d543d20SAndroid Build Coastguard Worker 1411*2d543d20SAndroid Build Coastguard Worker (rc, p) = semanage_ibpkey_create(self.sh) 1412*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1413*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create ibpkey for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1414*2d543d20SAndroid Build Coastguard Worker 1415*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_set_subnet_prefix(self.sh, p, subnet_prefix) 1416*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_set_range(p, low, high) 1417*2d543d20SAndroid Build Coastguard Worker (rc, con) = semanage_context_create(self.sh) 1418*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1419*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1420*2d543d20SAndroid Build Coastguard Worker 1421*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_user(self.sh, con, "system_u") 1422*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1423*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set user in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1424*2d543d20SAndroid Build Coastguard Worker 1425*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_role(self.sh, con, "object_r") 1426*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1427*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set role in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1428*2d543d20SAndroid Build Coastguard Worker 1429*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_type(self.sh, con, type) 1430*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1431*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set type in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1432*2d543d20SAndroid Build Coastguard Worker 1433*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 1434*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_mls(self.sh, con, serange) 1435*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1436*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mls fields in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1437*2d543d20SAndroid Build Coastguard Worker 1438*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibpkey_set_con(self.sh, p, con) 1439*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1440*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1441*2d543d20SAndroid Build Coastguard Worker 1442*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibpkey_modify_local(self.sh, k, p) 1443*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1444*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1445*2d543d20SAndroid Build Coastguard Worker 1446*2d543d20SAndroid Build Coastguard Worker semanage_context_free(con) 1447*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_key_free(k) 1448*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_free(p) 1449*2d543d20SAndroid Build Coastguard Worker 1450*2d543d20SAndroid Build Coastguard Worker def add(self, pkey, subnet_prefix, serange, type): 1451*2d543d20SAndroid Build Coastguard Worker self.begin() 1452*2d543d20SAndroid Build Coastguard Worker if self.__exists(pkey, subnet_prefix): 1453*2d543d20SAndroid Build Coastguard Worker print(_("ibpkey {subnet_prefix}/{pkey} already defined, modifying instead").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1454*2d543d20SAndroid Build Coastguard Worker self.__modify(pkey, subnet_prefix, serange, type) 1455*2d543d20SAndroid Build Coastguard Worker else: 1456*2d543d20SAndroid Build Coastguard Worker self.__add(pkey, subnet_prefix, serange, type) 1457*2d543d20SAndroid Build Coastguard Worker self.commit() 1458*2d543d20SAndroid Build Coastguard Worker 1459*2d543d20SAndroid Build Coastguard Worker def __exists(self, pkey, subnet_prefix): 1460*2d543d20SAndroid Build Coastguard Worker (k, subnet_prefix, low, high) = self.__genkey(pkey, subnet_prefix) 1461*2d543d20SAndroid Build Coastguard Worker 1462*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibpkey_exists(self.sh, k) 1463*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1464*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").formnat(subnet_prefix=subnet_prefix, pkey=pkey)) 1465*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_key_free(k) 1466*2d543d20SAndroid Build Coastguard Worker 1467*2d543d20SAndroid Build Coastguard Worker return exists 1468*2d543d20SAndroid Build Coastguard Worker 1469*2d543d20SAndroid Build Coastguard Worker def __modify(self, pkey, subnet_prefix, serange, setype): 1470*2d543d20SAndroid Build Coastguard Worker if serange == "" and setype == "": 1471*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1472*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype or serange")) 1473*2d543d20SAndroid Build Coastguard Worker else: 1474*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype")) 1475*2d543d20SAndroid Build Coastguard Worker 1476*2d543d20SAndroid Build Coastguard Worker setype = sepolicy.get_real_type_name(setype) 1477*2d543d20SAndroid Build Coastguard Worker 1478*2d543d20SAndroid Build Coastguard Worker if setype and setype not in self.valid_types: 1479*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a ibpkey type") % setype) 1480*2d543d20SAndroid Build Coastguard Worker 1481*2d543d20SAndroid Build Coastguard Worker (k, subnet_prefix, low, high) = self.__genkey(pkey, subnet_prefix) 1482*2d543d20SAndroid Build Coastguard Worker 1483*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibpkey_exists(self.sh, k) 1484*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1485*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1486*2d543d20SAndroid Build Coastguard Worker if not exists: 1487*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("ibpkey {subnet_prefix}/{pkey} is not defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1488*2d543d20SAndroid Build Coastguard Worker 1489*2d543d20SAndroid Build Coastguard Worker (rc, p) = semanage_ibpkey_query(self.sh, k) 1490*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1491*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1492*2d543d20SAndroid Build Coastguard Worker 1493*2d543d20SAndroid Build Coastguard Worker con = semanage_ibpkey_get_con(p) 1494*2d543d20SAndroid Build Coastguard Worker 1495*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 1496*2d543d20SAndroid Build Coastguard Worker semanage_context_set_mls(self.sh, con, untranslate(serange)) 1497*2d543d20SAndroid Build Coastguard Worker if setype != "": 1498*2d543d20SAndroid Build Coastguard Worker semanage_context_set_type(self.sh, con, setype) 1499*2d543d20SAndroid Build Coastguard Worker 1500*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibpkey_modify_local(self.sh, k, p) 1501*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1502*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1503*2d543d20SAndroid Build Coastguard Worker 1504*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_key_free(k) 1505*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_free(p) 1506*2d543d20SAndroid Build Coastguard Worker 1507*2d543d20SAndroid Build Coastguard Worker def modify(self, pkey, subnet_prefix, serange, setype): 1508*2d543d20SAndroid Build Coastguard Worker self.begin() 1509*2d543d20SAndroid Build Coastguard Worker self.__modify(pkey, subnet_prefix, serange, setype) 1510*2d543d20SAndroid Build Coastguard Worker self.commit() 1511*2d543d20SAndroid Build Coastguard Worker 1512*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 1513*2d543d20SAndroid Build Coastguard Worker (rc, plist) = semanage_ibpkey_list_local(self.sh) 1514*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1515*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list the ibpkeys")) 1516*2d543d20SAndroid Build Coastguard Worker 1517*2d543d20SAndroid Build Coastguard Worker self.begin() 1518*2d543d20SAndroid Build Coastguard Worker 1519*2d543d20SAndroid Build Coastguard Worker for ibpkey in plist: 1520*2d543d20SAndroid Build Coastguard Worker (rc, subnet_prefix) = semanage_ibpkey_get_subnet_prefix(self.sh, ibpkey) 1521*2d543d20SAndroid Build Coastguard Worker low = semanage_ibpkey_get_low(ibpkey) 1522*2d543d20SAndroid Build Coastguard Worker high = semanage_ibpkey_get_high(ibpkey) 1523*2d543d20SAndroid Build Coastguard Worker pkey_str = "%s-%s" % (low, high) 1524*2d543d20SAndroid Build Coastguard Worker (k, subnet_prefix, low, high) = self.__genkey(pkey_str, subnet_prefix) 1525*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1526*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % pkey_str) 1527*2d543d20SAndroid Build Coastguard Worker 1528*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibpkey_del_local(self.sh, k) 1529*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1530*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete the ibpkey %s") % pkey_str) 1531*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_key_free(k) 1532*2d543d20SAndroid Build Coastguard Worker 1533*2d543d20SAndroid Build Coastguard Worker self.commit() 1534*2d543d20SAndroid Build Coastguard Worker 1535*2d543d20SAndroid Build Coastguard Worker def __delete(self, pkey, subnet_prefix): 1536*2d543d20SAndroid Build Coastguard Worker (k, subnet_prefix, low, high) = self.__genkey(pkey, subnet_prefix) 1537*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibpkey_exists(self.sh, k) 1538*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1539*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1540*2d543d20SAndroid Build Coastguard Worker if not exists: 1541*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("ibpkey {subnet_prefix}/{pkey} is not defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1542*2d543d20SAndroid Build Coastguard Worker 1543*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibpkey_exists_local(self.sh, k) 1544*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1545*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1546*2d543d20SAndroid Build Coastguard Worker if not exists: 1547*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("ibpkey {subnet_prefix}/{pkey} is defined in policy, cannot be deleted").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1548*2d543d20SAndroid Build Coastguard Worker 1549*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibpkey_del_local(self.sh, k) 1550*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1551*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) 1552*2d543d20SAndroid Build Coastguard Worker 1553*2d543d20SAndroid Build Coastguard Worker semanage_ibpkey_key_free(k) 1554*2d543d20SAndroid Build Coastguard Worker 1555*2d543d20SAndroid Build Coastguard Worker def delete(self, pkey, subnet_prefix): 1556*2d543d20SAndroid Build Coastguard Worker self.begin() 1557*2d543d20SAndroid Build Coastguard Worker self.__delete(pkey, subnet_prefix) 1558*2d543d20SAndroid Build Coastguard Worker self.commit() 1559*2d543d20SAndroid Build Coastguard Worker 1560*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 1561*2d543d20SAndroid Build Coastguard Worker ddict = {} 1562*2d543d20SAndroid Build Coastguard Worker if locallist: 1563*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibpkey_list_local(self.sh) 1564*2d543d20SAndroid Build Coastguard Worker else: 1565*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibpkey_list(self.sh) 1566*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1567*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list ibpkeys")) 1568*2d543d20SAndroid Build Coastguard Worker 1569*2d543d20SAndroid Build Coastguard Worker for ibpkey in self.plist: 1570*2d543d20SAndroid Build Coastguard Worker con = semanage_ibpkey_get_con(ibpkey) 1571*2d543d20SAndroid Build Coastguard Worker ctype = semanage_context_get_type(con) 1572*2d543d20SAndroid Build Coastguard Worker if ctype == "reserved_ibpkey_t": 1573*2d543d20SAndroid Build Coastguard Worker continue 1574*2d543d20SAndroid Build Coastguard Worker level = semanage_context_get_mls(con) 1575*2d543d20SAndroid Build Coastguard Worker (rc, subnet_prefix) = semanage_ibpkey_get_subnet_prefix(self.sh, ibpkey) 1576*2d543d20SAndroid Build Coastguard Worker low = semanage_ibpkey_get_low(ibpkey) 1577*2d543d20SAndroid Build Coastguard Worker high = semanage_ibpkey_get_high(ibpkey) 1578*2d543d20SAndroid Build Coastguard Worker ddict[(low, high, subnet_prefix)] = (ctype, level) 1579*2d543d20SAndroid Build Coastguard Worker return ddict 1580*2d543d20SAndroid Build Coastguard Worker 1581*2d543d20SAndroid Build Coastguard Worker def get_all_by_type(self, locallist=0): 1582*2d543d20SAndroid Build Coastguard Worker ddict = {} 1583*2d543d20SAndroid Build Coastguard Worker if locallist: 1584*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibpkey_list_local(self.sh) 1585*2d543d20SAndroid Build Coastguard Worker else: 1586*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibpkey_list(self.sh) 1587*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1588*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list ibpkeys")) 1589*2d543d20SAndroid Build Coastguard Worker 1590*2d543d20SAndroid Build Coastguard Worker for ibpkey in self.plist: 1591*2d543d20SAndroid Build Coastguard Worker con = semanage_ibpkey_get_con(ibpkey) 1592*2d543d20SAndroid Build Coastguard Worker ctype = semanage_context_get_type(con) 1593*2d543d20SAndroid Build Coastguard Worker (rc, subnet_prefix) = semanage_ibpkey_get_subnet_prefix(self.sh, ibpkey) 1594*2d543d20SAndroid Build Coastguard Worker low = semanage_ibpkey_get_low(ibpkey) 1595*2d543d20SAndroid Build Coastguard Worker high = semanage_ibpkey_get_high(ibpkey) 1596*2d543d20SAndroid Build Coastguard Worker if (ctype, subnet_prefix) not in ddict.keys(): 1597*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, subnet_prefix)] = [] 1598*2d543d20SAndroid Build Coastguard Worker if low == high: 1599*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, subnet_prefix)].append("0x%x" % low) 1600*2d543d20SAndroid Build Coastguard Worker else: 1601*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, subnet_prefix)].append("0x%x-0x%x" % (low, high)) 1602*2d543d20SAndroid Build Coastguard Worker return ddict 1603*2d543d20SAndroid Build Coastguard Worker 1604*2d543d20SAndroid Build Coastguard Worker def customized(self): 1605*2d543d20SAndroid Build Coastguard Worker l = [] 1606*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 1607*2d543d20SAndroid Build Coastguard Worker 1608*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 1609*2d543d20SAndroid Build Coastguard Worker port = k[0] if k[0] == k[1] else "%s-%s" % (k[0], k[1]) 1610*2d543d20SAndroid Build Coastguard Worker if ddict[k][1]: 1611*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s -r '%s' -x %s %s" % (ddict[k][0], ddict[k][1], k[2], port)) 1612*2d543d20SAndroid Build Coastguard Worker else: 1613*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s -x %s %s" % (ddict[k][0], k[2], port)) 1614*2d543d20SAndroid Build Coastguard Worker return l 1615*2d543d20SAndroid Build Coastguard Worker 1616*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 1617*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all_by_type(locallist) 1618*2d543d20SAndroid Build Coastguard Worker keys = ddict.keys() 1619*2d543d20SAndroid Build Coastguard Worker if len(keys) == 0: 1620*2d543d20SAndroid Build Coastguard Worker return 1621*2d543d20SAndroid Build Coastguard Worker 1622*2d543d20SAndroid Build Coastguard Worker if heading: 1623*2d543d20SAndroid Build Coastguard Worker print("%-30s %-18s %s\n" % (_("SELinux IB Pkey Type"), _("Subnet_Prefix"), _("Pkey Number"))) 1624*2d543d20SAndroid Build Coastguard Worker for i in sorted(keys): 1625*2d543d20SAndroid Build Coastguard Worker rec = "%-30s %-18s " % i 1626*2d543d20SAndroid Build Coastguard Worker rec += "%s" % ddict[i][0] 1627*2d543d20SAndroid Build Coastguard Worker for p in ddict[i][1:]: 1628*2d543d20SAndroid Build Coastguard Worker rec += ", %s" % p 1629*2d543d20SAndroid Build Coastguard Worker print(rec) 1630*2d543d20SAndroid Build Coastguard Worker 1631*2d543d20SAndroid Build Coastguard Workerclass ibendportRecords(semanageRecords): 1632*2d543d20SAndroid Build Coastguard Worker 1633*2d543d20SAndroid Build Coastguard Worker valid_types = [] 1634*2d543d20SAndroid Build Coastguard Worker 1635*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 1636*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 1637*2d543d20SAndroid Build Coastguard Worker try: 1638*2d543d20SAndroid Build Coastguard Worker q = TypeQuery(SELinuxPolicy(sepolicy.get_store_policy(self.store)), attrs=["ibendport_type"]) 1639*2d543d20SAndroid Build Coastguard Worker self.valid_types = set(str(t) for t in q.results()) 1640*2d543d20SAndroid Build Coastguard Worker except: 1641*2d543d20SAndroid Build Coastguard Worker pass 1642*2d543d20SAndroid Build Coastguard Worker 1643*2d543d20SAndroid Build Coastguard Worker def __genkey(self, ibendport, ibdev_name): 1644*2d543d20SAndroid Build Coastguard Worker if ibdev_name == "": 1645*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("IB device name is required")) 1646*2d543d20SAndroid Build Coastguard Worker 1647*2d543d20SAndroid Build Coastguard Worker port = int(ibendport) 1648*2d543d20SAndroid Build Coastguard Worker 1649*2d543d20SAndroid Build Coastguard Worker if port > 255 or port < 1: 1650*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Invalid Port Number")) 1651*2d543d20SAndroid Build Coastguard Worker 1652*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_ibendport_key_create(self.sh, ibdev_name, port) 1653*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1654*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1655*2d543d20SAndroid Build Coastguard Worker return (k, ibdev_name, port) 1656*2d543d20SAndroid Build Coastguard Worker 1657*2d543d20SAndroid Build Coastguard Worker def __add(self, ibendport, ibdev_name, serange, type): 1658*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1659*2d543d20SAndroid Build Coastguard Worker if serange == "": 1660*2d543d20SAndroid Build Coastguard Worker serange = "s0" 1661*2d543d20SAndroid Build Coastguard Worker else: 1662*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 1663*2d543d20SAndroid Build Coastguard Worker 1664*2d543d20SAndroid Build Coastguard Worker if type == "": 1665*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type is required")) 1666*2d543d20SAndroid Build Coastguard Worker 1667*2d543d20SAndroid Build Coastguard Worker type = sepolicy.get_real_type_name(type) 1668*2d543d20SAndroid Build Coastguard Worker 1669*2d543d20SAndroid Build Coastguard Worker if type not in self.valid_types: 1670*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be an ibendport type") % type) 1671*2d543d20SAndroid Build Coastguard Worker (k, ibendport, port) = self.__genkey(ibendport, ibdev_name) 1672*2d543d20SAndroid Build Coastguard Worker 1673*2d543d20SAndroid Build Coastguard Worker (rc, p) = semanage_ibendport_create(self.sh) 1674*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1675*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create ibendport for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1676*2d543d20SAndroid Build Coastguard Worker 1677*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_set_ibdev_name(self.sh, p, ibdev_name) 1678*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_set_port(p, port) 1679*2d543d20SAndroid Build Coastguard Worker (rc, con) = semanage_context_create(self.sh) 1680*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1681*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create context for {ibendport}/{port}").format(ibdev_name=ibdev_name, port=port)) 1682*2d543d20SAndroid Build Coastguard Worker 1683*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_user(self.sh, con, "system_u") 1684*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1685*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set user in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1686*2d543d20SAndroid Build Coastguard Worker 1687*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_role(self.sh, con, "object_r") 1688*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1689*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set role in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1690*2d543d20SAndroid Build Coastguard Worker 1691*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_type(self.sh, con, type) 1692*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1693*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set type in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1694*2d543d20SAndroid Build Coastguard Worker 1695*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 1696*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_mls(self.sh, con, serange) 1697*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1698*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mls fields in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1699*2d543d20SAndroid Build Coastguard Worker 1700*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibendport_set_con(self.sh, p, con) 1701*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1702*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1703*2d543d20SAndroid Build Coastguard Worker 1704*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibendport_modify_local(self.sh, k, p) 1705*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1706*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add ibendport {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1707*2d543d20SAndroid Build Coastguard Worker 1708*2d543d20SAndroid Build Coastguard Worker semanage_context_free(con) 1709*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_key_free(k) 1710*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_free(p) 1711*2d543d20SAndroid Build Coastguard Worker 1712*2d543d20SAndroid Build Coastguard Worker def add(self, ibendport, ibdev_name, serange, type): 1713*2d543d20SAndroid Build Coastguard Worker self.begin() 1714*2d543d20SAndroid Build Coastguard Worker if self.__exists(ibendport, ibdev_name): 1715*2d543d20SAndroid Build Coastguard Worker print(_("ibendport {ibdev_name}/{port} already defined, modifying instead").format(ibdev_name=ibdev_name, port=port)) 1716*2d543d20SAndroid Build Coastguard Worker self.__modify(ibendport, ibdev_name, serange, type) 1717*2d543d20SAndroid Build Coastguard Worker else: 1718*2d543d20SAndroid Build Coastguard Worker self.__add(ibendport, ibdev_name, serange, type) 1719*2d543d20SAndroid Build Coastguard Worker self.commit() 1720*2d543d20SAndroid Build Coastguard Worker 1721*2d543d20SAndroid Build Coastguard Worker def __exists(self, ibendport, ibdev_name): 1722*2d543d20SAndroid Build Coastguard Worker (k, ibendport, port) = self.__genkey(ibendport, ibdev_name) 1723*2d543d20SAndroid Build Coastguard Worker 1724*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibendport_exists(self.sh, k) 1725*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1726*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibendport {ibdev_name}/{port} is defined").format(ibdev_name=ibdev_name, port=port)) 1727*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_key_free(k) 1728*2d543d20SAndroid Build Coastguard Worker 1729*2d543d20SAndroid Build Coastguard Worker return exists 1730*2d543d20SAndroid Build Coastguard Worker 1731*2d543d20SAndroid Build Coastguard Worker def __modify(self, ibendport, ibdev_name, serange, setype): 1732*2d543d20SAndroid Build Coastguard Worker if serange == "" and setype == "": 1733*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1734*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype or serange")) 1735*2d543d20SAndroid Build Coastguard Worker else: 1736*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype")) 1737*2d543d20SAndroid Build Coastguard Worker 1738*2d543d20SAndroid Build Coastguard Worker setype = sepolicy.get_real_type_name(setype) 1739*2d543d20SAndroid Build Coastguard Worker 1740*2d543d20SAndroid Build Coastguard Worker if setype and setype not in self.valid_types: 1741*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be an ibendport type") % setype) 1742*2d543d20SAndroid Build Coastguard Worker 1743*2d543d20SAndroid Build Coastguard Worker (k, ibdev_name, port) = self.__genkey(ibendport, ibdev_name) 1744*2d543d20SAndroid Build Coastguard Worker 1745*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibendport_exists(self.sh, k) 1746*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1747*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibendport {ibdev_name}/{ibendport} is defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1748*2d543d20SAndroid Build Coastguard Worker if not exists: 1749*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("ibendport {ibdev_name}/{ibendport} is not defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1750*2d543d20SAndroid Build Coastguard Worker 1751*2d543d20SAndroid Build Coastguard Worker (rc, p) = semanage_ibendport_query(self.sh, k) 1752*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1753*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1754*2d543d20SAndroid Build Coastguard Worker 1755*2d543d20SAndroid Build Coastguard Worker con = semanage_ibendport_get_con(p) 1756*2d543d20SAndroid Build Coastguard Worker 1757*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 1758*2d543d20SAndroid Build Coastguard Worker semanage_context_set_mls(self.sh, con, untranslate(serange)) 1759*2d543d20SAndroid Build Coastguard Worker if setype != "": 1760*2d543d20SAndroid Build Coastguard Worker semanage_context_set_type(self.sh, con, setype) 1761*2d543d20SAndroid Build Coastguard Worker 1762*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibendport_modify_local(self.sh, k, p) 1763*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1764*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1765*2d543d20SAndroid Build Coastguard Worker 1766*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_key_free(k) 1767*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_free(p) 1768*2d543d20SAndroid Build Coastguard Worker 1769*2d543d20SAndroid Build Coastguard Worker def modify(self, ibendport, ibdev_name, serange, setype): 1770*2d543d20SAndroid Build Coastguard Worker self.begin() 1771*2d543d20SAndroid Build Coastguard Worker self.__modify(ibendport, ibdev_name, serange, setype) 1772*2d543d20SAndroid Build Coastguard Worker self.commit() 1773*2d543d20SAndroid Build Coastguard Worker 1774*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 1775*2d543d20SAndroid Build Coastguard Worker (rc, plist) = semanage_ibendport_list_local(self.sh) 1776*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1777*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list the ibendports")) 1778*2d543d20SAndroid Build Coastguard Worker 1779*2d543d20SAndroid Build Coastguard Worker self.begin() 1780*2d543d20SAndroid Build Coastguard Worker 1781*2d543d20SAndroid Build Coastguard Worker for ibendport in plist: 1782*2d543d20SAndroid Build Coastguard Worker (rc, ibdev_name) = semanage_ibendport_get_ibdev_name(self.sh, ibendport) 1783*2d543d20SAndroid Build Coastguard Worker port = semanage_ibendport_get_port(ibendport) 1784*2d543d20SAndroid Build Coastguard Worker (k, ibdev_name, port) = self.__genkey(str(port), ibdev_name) 1785*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1786*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1787*2d543d20SAndroid Build Coastguard Worker 1788*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibendport_del_local(self.sh, k) 1789*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1790*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete the ibendport {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) 1791*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_key_free(k) 1792*2d543d20SAndroid Build Coastguard Worker 1793*2d543d20SAndroid Build Coastguard Worker self.commit() 1794*2d543d20SAndroid Build Coastguard Worker 1795*2d543d20SAndroid Build Coastguard Worker def __delete(self, ibendport, ibdev_name): 1796*2d543d20SAndroid Build Coastguard Worker (k, ibdev_name, port) = self.__genkey(ibendport, ibdev_name) 1797*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibendport_exists(self.sh, k) 1798*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1799*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibendport {ibdev_name}/{ibendport} is defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1800*2d543d20SAndroid Build Coastguard Worker if not exists: 1801*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("ibendport {ibdev_name}/{ibendport} is not defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1802*2d543d20SAndroid Build Coastguard Worker 1803*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_ibendport_exists_local(self.sh, k) 1804*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1805*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if ibendport {ibdev_name}/{ibendport} is defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1806*2d543d20SAndroid Build Coastguard Worker if not exists: 1807*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("ibendport {ibdev_name}/{ibendport} is defined in policy, cannot be deleted").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1808*2d543d20SAndroid Build Coastguard Worker 1809*2d543d20SAndroid Build Coastguard Worker rc = semanage_ibendport_del_local(self.sh, k) 1810*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1811*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) 1812*2d543d20SAndroid Build Coastguard Worker 1813*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_key_free(k) 1814*2d543d20SAndroid Build Coastguard Worker 1815*2d543d20SAndroid Build Coastguard Worker def delete(self, ibendport, ibdev_name): 1816*2d543d20SAndroid Build Coastguard Worker self.begin() 1817*2d543d20SAndroid Build Coastguard Worker self.__delete(ibendport, ibdev_name) 1818*2d543d20SAndroid Build Coastguard Worker self.commit() 1819*2d543d20SAndroid Build Coastguard Worker 1820*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 1821*2d543d20SAndroid Build Coastguard Worker ddict = {} 1822*2d543d20SAndroid Build Coastguard Worker if locallist: 1823*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibendport_list_local(self.sh) 1824*2d543d20SAndroid Build Coastguard Worker else: 1825*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibendport_list(self.sh) 1826*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1827*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list ibendports")) 1828*2d543d20SAndroid Build Coastguard Worker 1829*2d543d20SAndroid Build Coastguard Worker for ibendport in self.plist: 1830*2d543d20SAndroid Build Coastguard Worker con = semanage_ibendport_get_con(ibendport) 1831*2d543d20SAndroid Build Coastguard Worker ctype = semanage_context_get_type(con) 1832*2d543d20SAndroid Build Coastguard Worker if ctype == "reserved_ibendport_t": 1833*2d543d20SAndroid Build Coastguard Worker continue 1834*2d543d20SAndroid Build Coastguard Worker level = semanage_context_get_mls(con) 1835*2d543d20SAndroid Build Coastguard Worker (rc, ibdev_name) = semanage_ibendport_get_ibdev_name(self.sh, ibendport) 1836*2d543d20SAndroid Build Coastguard Worker port = semanage_ibendport_get_port(ibendport) 1837*2d543d20SAndroid Build Coastguard Worker ddict[(port, ibdev_name)] = (ctype, level) 1838*2d543d20SAndroid Build Coastguard Worker return ddict 1839*2d543d20SAndroid Build Coastguard Worker 1840*2d543d20SAndroid Build Coastguard Worker def get_all_by_type(self, locallist=0): 1841*2d543d20SAndroid Build Coastguard Worker ddict = {} 1842*2d543d20SAndroid Build Coastguard Worker if locallist: 1843*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibendport_list_local(self.sh) 1844*2d543d20SAndroid Build Coastguard Worker else: 1845*2d543d20SAndroid Build Coastguard Worker (rc, self.plist) = semanage_ibendport_list(self.sh) 1846*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1847*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list ibendports")) 1848*2d543d20SAndroid Build Coastguard Worker 1849*2d543d20SAndroid Build Coastguard Worker for ibendport in self.plist: 1850*2d543d20SAndroid Build Coastguard Worker con = semanage_ibendport_get_con(ibendport) 1851*2d543d20SAndroid Build Coastguard Worker ctype = semanage_context_get_type(con) 1852*2d543d20SAndroid Build Coastguard Worker (rc, ibdev_name) = semanage_ibendport_get_ibdev_name(self.sh, ibendport) 1853*2d543d20SAndroid Build Coastguard Worker port = semanage_ibendport_get_port(ibendport) 1854*2d543d20SAndroid Build Coastguard Worker if (ctype, ibdev_name) not in ddict.keys(): 1855*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, ibdev_name)] = [] 1856*2d543d20SAndroid Build Coastguard Worker ddict[(ctype, ibdev_name)].append("0x%x" % port) 1857*2d543d20SAndroid Build Coastguard Worker return ddict 1858*2d543d20SAndroid Build Coastguard Worker 1859*2d543d20SAndroid Build Coastguard Worker def customized(self): 1860*2d543d20SAndroid Build Coastguard Worker l = [] 1861*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 1862*2d543d20SAndroid Build Coastguard Worker 1863*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 1864*2d543d20SAndroid Build Coastguard Worker if ddict[k][1]: 1865*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s -r '%s' -z %s %s" % (ddict[k][0], ddict[k][1], k[1], k[0])) 1866*2d543d20SAndroid Build Coastguard Worker else: 1867*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s -z %s %s" % (ddict[k][0], k[1], k[0])) 1868*2d543d20SAndroid Build Coastguard Worker return l 1869*2d543d20SAndroid Build Coastguard Worker 1870*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 1871*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all_by_type(locallist) 1872*2d543d20SAndroid Build Coastguard Worker keys = ddict.keys() 1873*2d543d20SAndroid Build Coastguard Worker if len(keys) == 0: 1874*2d543d20SAndroid Build Coastguard Worker return 1875*2d543d20SAndroid Build Coastguard Worker 1876*2d543d20SAndroid Build Coastguard Worker if heading: 1877*2d543d20SAndroid Build Coastguard Worker print("%-30s %-18s %s\n" % (_("SELinux IB End Port Type"), _("IB Device Name"), _("Port Number"))) 1878*2d543d20SAndroid Build Coastguard Worker for i in sorted(keys): 1879*2d543d20SAndroid Build Coastguard Worker rec = "%-30s %-18s " % i 1880*2d543d20SAndroid Build Coastguard Worker rec += "%s" % ddict[i][0] 1881*2d543d20SAndroid Build Coastguard Worker for p in ddict[i][1:]: 1882*2d543d20SAndroid Build Coastguard Worker rec += ", %s" % p 1883*2d543d20SAndroid Build Coastguard Worker print(rec) 1884*2d543d20SAndroid Build Coastguard Worker 1885*2d543d20SAndroid Build Coastguard Workerclass nodeRecords(semanageRecords): 1886*2d543d20SAndroid Build Coastguard Worker 1887*2d543d20SAndroid Build Coastguard Worker valid_types = [] 1888*2d543d20SAndroid Build Coastguard Worker 1889*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 1890*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 1891*2d543d20SAndroid Build Coastguard Worker self.protocol = ["ipv4", "ipv6"] 1892*2d543d20SAndroid Build Coastguard Worker try: 1893*2d543d20SAndroid Build Coastguard Worker self.valid_types = list(list(sepolicy.info(sepolicy.ATTRIBUTE, "node_type"))[0]["types"]) 1894*2d543d20SAndroid Build Coastguard Worker except RuntimeError: 1895*2d543d20SAndroid Build Coastguard Worker pass 1896*2d543d20SAndroid Build Coastguard Worker 1897*2d543d20SAndroid Build Coastguard Worker def validate(self, addr, mask, protocol): 1898*2d543d20SAndroid Build Coastguard Worker newaddr = addr 1899*2d543d20SAndroid Build Coastguard Worker newmask = mask 1900*2d543d20SAndroid Build Coastguard Worker newprotocol = "" 1901*2d543d20SAndroid Build Coastguard Worker 1902*2d543d20SAndroid Build Coastguard Worker if addr == "": 1903*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Node Address is required")) 1904*2d543d20SAndroid Build Coastguard Worker 1905*2d543d20SAndroid Build Coastguard Worker # verify that (addr, mask) is either a IP address (without a mask) or a valid network mask 1906*2d543d20SAndroid Build Coastguard Worker if len(mask) == 0 or mask[0] == "/": 1907*2d543d20SAndroid Build Coastguard Worker i = ipaddress.ip_network(addr + mask) 1908*2d543d20SAndroid Build Coastguard Worker newaddr = str(i.network_address) 1909*2d543d20SAndroid Build Coastguard Worker newmask = str(i.netmask) 1910*2d543d20SAndroid Build Coastguard Worker protocol = "ipv%d" % i.version 1911*2d543d20SAndroid Build Coastguard Worker 1912*2d543d20SAndroid Build Coastguard Worker try: 1913*2d543d20SAndroid Build Coastguard Worker newprotocol = self.protocol.index(protocol) 1914*2d543d20SAndroid Build Coastguard Worker except: 1915*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Unknown or missing protocol")) 1916*2d543d20SAndroid Build Coastguard Worker 1917*2d543d20SAndroid Build Coastguard Worker try: 1918*2d543d20SAndroid Build Coastguard Worker audit_protocol = socket.getprotobyname(protocol) 1919*2d543d20SAndroid Build Coastguard Worker except: 1920*2d543d20SAndroid Build Coastguard Worker # Entry for "ipv4" not found in /etc/protocols on (at 1921*2d543d20SAndroid Build Coastguard Worker # least) Debian? To ensure audit log compatibility, let's 1922*2d543d20SAndroid Build Coastguard Worker # use the same numeric value as Fedora: 4, which is 1923*2d543d20SAndroid Build Coastguard Worker # actually understood by kernel as IP over IP. 1924*2d543d20SAndroid Build Coastguard Worker if (protocol == "ipv4"): 1925*2d543d20SAndroid Build Coastguard Worker audit_protocol = socket.IPPROTO_IPIP 1926*2d543d20SAndroid Build Coastguard Worker else: 1927*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Unknown or missing protocol")) 1928*2d543d20SAndroid Build Coastguard Worker 1929*2d543d20SAndroid Build Coastguard Worker return newaddr, newmask, newprotocol, audit_protocol 1930*2d543d20SAndroid Build Coastguard Worker 1931*2d543d20SAndroid Build Coastguard Worker def __add(self, addr, mask, proto, serange, ctype): 1932*2d543d20SAndroid Build Coastguard Worker addr, mask, proto, audit_proto = self.validate(addr, mask, proto) 1933*2d543d20SAndroid Build Coastguard Worker 1934*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 1935*2d543d20SAndroid Build Coastguard Worker if serange == "": 1936*2d543d20SAndroid Build Coastguard Worker serange = "s0" 1937*2d543d20SAndroid Build Coastguard Worker else: 1938*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 1939*2d543d20SAndroid Build Coastguard Worker 1940*2d543d20SAndroid Build Coastguard Worker if ctype == "": 1941*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("SELinux node type is required")) 1942*2d543d20SAndroid Build Coastguard Worker 1943*2d543d20SAndroid Build Coastguard Worker ctype = sepolicy.get_real_type_name(ctype) 1944*2d543d20SAndroid Build Coastguard Worker 1945*2d543d20SAndroid Build Coastguard Worker if ctype not in self.valid_types: 1946*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a node type") % ctype) 1947*2d543d20SAndroid Build Coastguard Worker 1948*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_node_key_create(self.sh, addr, mask, proto) 1949*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1950*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % addr) 1951*2d543d20SAndroid Build Coastguard Worker 1952*2d543d20SAndroid Build Coastguard Worker (rc, node) = semanage_node_create(self.sh) 1953*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1954*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create addr for %s") % addr) 1955*2d543d20SAndroid Build Coastguard Worker semanage_node_set_proto(node, proto) 1956*2d543d20SAndroid Build Coastguard Worker 1957*2d543d20SAndroid Build Coastguard Worker rc = semanage_node_set_addr(self.sh, node, proto, addr) 1958*2d543d20SAndroid Build Coastguard Worker (rc, con) = semanage_context_create(self.sh) 1959*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1960*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create context for %s") % addr) 1961*2d543d20SAndroid Build Coastguard Worker 1962*2d543d20SAndroid Build Coastguard Worker rc = semanage_node_set_mask(self.sh, node, proto, mask) 1963*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1964*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mask for %s") % addr) 1965*2d543d20SAndroid Build Coastguard Worker 1966*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_user(self.sh, con, "system_u") 1967*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1968*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set user in addr context for %s") % addr) 1969*2d543d20SAndroid Build Coastguard Worker 1970*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_role(self.sh, con, "object_r") 1971*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1972*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set role in addr context for %s") % addr) 1973*2d543d20SAndroid Build Coastguard Worker 1974*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_type(self.sh, con, ctype) 1975*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1976*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set type in addr context for %s") % addr) 1977*2d543d20SAndroid Build Coastguard Worker 1978*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 1979*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_mls(self.sh, con, serange) 1980*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1981*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mls fields in addr context for %s") % addr) 1982*2d543d20SAndroid Build Coastguard Worker 1983*2d543d20SAndroid Build Coastguard Worker rc = semanage_node_set_con(self.sh, node, con) 1984*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1985*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set addr context for %s") % addr) 1986*2d543d20SAndroid Build Coastguard Worker 1987*2d543d20SAndroid Build Coastguard Worker rc = semanage_node_modify_local(self.sh, k, node) 1988*2d543d20SAndroid Build Coastguard Worker if rc < 0: 1989*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add addr %s") % addr) 1990*2d543d20SAndroid Build Coastguard Worker 1991*2d543d20SAndroid Build Coastguard Worker semanage_context_free(con) 1992*2d543d20SAndroid Build Coastguard Worker semanage_node_key_free(k) 1993*2d543d20SAndroid Build Coastguard Worker semanage_node_free(node) 1994*2d543d20SAndroid Build Coastguard Worker 1995*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=node op=add laddr=%s netmask=%s proto=%s tcontext=%s:%s:%s:%s" % (addr, mask, audit_proto, "system_u", "object_r", ctype, serange)) 1996*2d543d20SAndroid Build Coastguard Worker 1997*2d543d20SAndroid Build Coastguard Worker def add(self, addr, mask, proto, serange, ctype): 1998*2d543d20SAndroid Build Coastguard Worker self.begin() 1999*2d543d20SAndroid Build Coastguard Worker if self.__exists(addr, mask, proto): 2000*2d543d20SAndroid Build Coastguard Worker print(_("Addr %s already defined, modifying instead") % addr) 2001*2d543d20SAndroid Build Coastguard Worker self.__modify(addr, mask, proto, serange, ctype) 2002*2d543d20SAndroid Build Coastguard Worker else: 2003*2d543d20SAndroid Build Coastguard Worker self.__add(addr, mask, proto, serange, ctype) 2004*2d543d20SAndroid Build Coastguard Worker self.commit() 2005*2d543d20SAndroid Build Coastguard Worker 2006*2d543d20SAndroid Build Coastguard Worker def __exists(self, addr, mask, proto): 2007*2d543d20SAndroid Build Coastguard Worker addr, mask, proto, audit_proto = self.validate(addr, mask, proto) 2008*2d543d20SAndroid Build Coastguard Worker 2009*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_node_key_create(self.sh, addr, mask, proto) 2010*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2011*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % addr) 2012*2d543d20SAndroid Build Coastguard Worker 2013*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_node_exists(self.sh, k) 2014*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2015*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if addr %s is defined") % addr) 2016*2d543d20SAndroid Build Coastguard Worker semanage_node_key_free(k) 2017*2d543d20SAndroid Build Coastguard Worker 2018*2d543d20SAndroid Build Coastguard Worker return exists 2019*2d543d20SAndroid Build Coastguard Worker 2020*2d543d20SAndroid Build Coastguard Worker def __modify(self, addr, mask, proto, serange, setype): 2021*2d543d20SAndroid Build Coastguard Worker addr, mask, proto, audit_proto = self.validate(addr, mask, proto) 2022*2d543d20SAndroid Build Coastguard Worker 2023*2d543d20SAndroid Build Coastguard Worker if serange == "" and setype == "": 2024*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype or serange")) 2025*2d543d20SAndroid Build Coastguard Worker 2026*2d543d20SAndroid Build Coastguard Worker setype = sepolicy.get_real_type_name(setype) 2027*2d543d20SAndroid Build Coastguard Worker 2028*2d543d20SAndroid Build Coastguard Worker if setype and setype not in self.valid_types: 2029*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a node type") % setype) 2030*2d543d20SAndroid Build Coastguard Worker 2031*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_node_key_create(self.sh, addr, mask, proto) 2032*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2033*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % addr) 2034*2d543d20SAndroid Build Coastguard Worker 2035*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_node_exists(self.sh, k) 2036*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2037*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if addr %s is defined") % addr) 2038*2d543d20SAndroid Build Coastguard Worker if not exists: 2039*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Addr %s is not defined") % addr) 2040*2d543d20SAndroid Build Coastguard Worker 2041*2d543d20SAndroid Build Coastguard Worker (rc, node) = semanage_node_query(self.sh, k) 2042*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2043*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query addr %s") % addr) 2044*2d543d20SAndroid Build Coastguard Worker 2045*2d543d20SAndroid Build Coastguard Worker con = semanage_node_get_con(node) 2046*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 2047*2d543d20SAndroid Build Coastguard Worker semanage_context_set_mls(self.sh, con, untranslate(serange)) 2048*2d543d20SAndroid Build Coastguard Worker if setype != "": 2049*2d543d20SAndroid Build Coastguard Worker semanage_context_set_type(self.sh, con, setype) 2050*2d543d20SAndroid Build Coastguard Worker 2051*2d543d20SAndroid Build Coastguard Worker rc = semanage_node_modify_local(self.sh, k, node) 2052*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2053*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify addr %s") % addr) 2054*2d543d20SAndroid Build Coastguard Worker 2055*2d543d20SAndroid Build Coastguard Worker semanage_node_key_free(k) 2056*2d543d20SAndroid Build Coastguard Worker semanage_node_free(node) 2057*2d543d20SAndroid Build Coastguard Worker 2058*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=node op=modify laddr=%s netmask=%s proto=%s tcontext=%s:%s:%s:%s" % (addr, mask, audit_proto, "system_u", "object_r", setype, serange)) 2059*2d543d20SAndroid Build Coastguard Worker 2060*2d543d20SAndroid Build Coastguard Worker def modify(self, addr, mask, proto, serange, setype): 2061*2d543d20SAndroid Build Coastguard Worker self.begin() 2062*2d543d20SAndroid Build Coastguard Worker self.__modify(addr, mask, proto, serange, setype) 2063*2d543d20SAndroid Build Coastguard Worker self.commit() 2064*2d543d20SAndroid Build Coastguard Worker 2065*2d543d20SAndroid Build Coastguard Worker def __delete(self, addr, mask, proto): 2066*2d543d20SAndroid Build Coastguard Worker addr, mask, proto, audit_proto = self.validate(addr, mask, proto) 2067*2d543d20SAndroid Build Coastguard Worker 2068*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_node_key_create(self.sh, addr, mask, proto) 2069*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2070*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % addr) 2071*2d543d20SAndroid Build Coastguard Worker 2072*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_node_exists(self.sh, k) 2073*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2074*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if addr %s is defined") % addr) 2075*2d543d20SAndroid Build Coastguard Worker if not exists: 2076*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Addr %s is not defined") % addr) 2077*2d543d20SAndroid Build Coastguard Worker 2078*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_node_exists_local(self.sh, k) 2079*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2080*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if addr %s is defined") % addr) 2081*2d543d20SAndroid Build Coastguard Worker if not exists: 2082*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Addr %s is defined in policy, cannot be deleted") % addr) 2083*2d543d20SAndroid Build Coastguard Worker 2084*2d543d20SAndroid Build Coastguard Worker rc = semanage_node_del_local(self.sh, k) 2085*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2086*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete addr %s") % addr) 2087*2d543d20SAndroid Build Coastguard Worker 2088*2d543d20SAndroid Build Coastguard Worker semanage_node_key_free(k) 2089*2d543d20SAndroid Build Coastguard Worker 2090*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=node op=delete laddr=%s netmask=%s proto=%s" % (addr, mask, audit_proto)) 2091*2d543d20SAndroid Build Coastguard Worker 2092*2d543d20SAndroid Build Coastguard Worker def delete(self, addr, mask, proto): 2093*2d543d20SAndroid Build Coastguard Worker self.begin() 2094*2d543d20SAndroid Build Coastguard Worker self.__delete(addr, mask, proto) 2095*2d543d20SAndroid Build Coastguard Worker self.commit() 2096*2d543d20SAndroid Build Coastguard Worker 2097*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 2098*2d543d20SAndroid Build Coastguard Worker (rc, nlist) = semanage_node_list_local(self.sh) 2099*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2100*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not deleteall node mappings")) 2101*2d543d20SAndroid Build Coastguard Worker 2102*2d543d20SAndroid Build Coastguard Worker self.begin() 2103*2d543d20SAndroid Build Coastguard Worker for node in nlist: 2104*2d543d20SAndroid Build Coastguard Worker self.__delete(semanage_node_get_addr(self.sh, node)[1], semanage_node_get_mask(self.sh, node)[1], self.protocol[semanage_node_get_proto(node)]) 2105*2d543d20SAndroid Build Coastguard Worker self.commit() 2106*2d543d20SAndroid Build Coastguard Worker 2107*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 2108*2d543d20SAndroid Build Coastguard Worker ddict = {} 2109*2d543d20SAndroid Build Coastguard Worker if locallist: 2110*2d543d20SAndroid Build Coastguard Worker (rc, self.ilist) = semanage_node_list_local(self.sh) 2111*2d543d20SAndroid Build Coastguard Worker else: 2112*2d543d20SAndroid Build Coastguard Worker (rc, self.ilist) = semanage_node_list(self.sh) 2113*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2114*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list addrs")) 2115*2d543d20SAndroid Build Coastguard Worker 2116*2d543d20SAndroid Build Coastguard Worker for node in self.ilist: 2117*2d543d20SAndroid Build Coastguard Worker con = semanage_node_get_con(node) 2118*2d543d20SAndroid Build Coastguard Worker addr = semanage_node_get_addr(self.sh, node) 2119*2d543d20SAndroid Build Coastguard Worker mask = semanage_node_get_mask(self.sh, node) 2120*2d543d20SAndroid Build Coastguard Worker proto = self.protocol[semanage_node_get_proto(node)] 2121*2d543d20SAndroid Build Coastguard Worker ddict[(addr[1], mask[1], proto)] = (semanage_context_get_user(con), semanage_context_get_role(con), semanage_context_get_type(con), semanage_context_get_mls(con)) 2122*2d543d20SAndroid Build Coastguard Worker 2123*2d543d20SAndroid Build Coastguard Worker return ddict 2124*2d543d20SAndroid Build Coastguard Worker 2125*2d543d20SAndroid Build Coastguard Worker def customized(self): 2126*2d543d20SAndroid Build Coastguard Worker l = [] 2127*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 2128*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 2129*2d543d20SAndroid Build Coastguard Worker if ddict[k][3]: 2130*2d543d20SAndroid Build Coastguard Worker l.append("-a -M %s -p %s -t %s -r '%s' %s" % (k[1], k[2], ddict[k][2], ddict[k][3], k[0])) 2131*2d543d20SAndroid Build Coastguard Worker else: 2132*2d543d20SAndroid Build Coastguard Worker l.append("-a -M %s -p %s -t %s %s" % (k[1], k[2], ddict[k][2], k[0])) 2133*2d543d20SAndroid Build Coastguard Worker return l 2134*2d543d20SAndroid Build Coastguard Worker 2135*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 2136*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(locallist) 2137*2d543d20SAndroid Build Coastguard Worker if len(ddict) == 0: 2138*2d543d20SAndroid Build Coastguard Worker return 2139*2d543d20SAndroid Build Coastguard Worker keys = sorted(ddict.keys()) 2140*2d543d20SAndroid Build Coastguard Worker 2141*2d543d20SAndroid Build Coastguard Worker if heading: 2142*2d543d20SAndroid Build Coastguard Worker print("%-18s %-18s %-5s %-5s\n" % ("IP Address", "Netmask", "Protocol", "Context")) 2143*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled: 2144*2d543d20SAndroid Build Coastguard Worker for k in keys: 2145*2d543d20SAndroid Build Coastguard Worker val = '' 2146*2d543d20SAndroid Build Coastguard Worker for fields in k: 2147*2d543d20SAndroid Build Coastguard Worker val = val + '\t' + str(fields) 2148*2d543d20SAndroid Build Coastguard Worker print("%-18s %-18s %-5s %s:%s:%s:%s " % (k[0], k[1], k[2], ddict[k][0], ddict[k][1], ddict[k][2], translate(ddict[k][3], False))) 2149*2d543d20SAndroid Build Coastguard Worker else: 2150*2d543d20SAndroid Build Coastguard Worker for k in keys: 2151*2d543d20SAndroid Build Coastguard Worker print("%-18s %-18s %-5s %s:%s:%s " % (k[0], k[1], k[2], ddict[k][0], ddict[k][1], ddict[k][2])) 2152*2d543d20SAndroid Build Coastguard Worker 2153*2d543d20SAndroid Build Coastguard Worker 2154*2d543d20SAndroid Build Coastguard Workerclass interfaceRecords(semanageRecords): 2155*2d543d20SAndroid Build Coastguard Worker 2156*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 2157*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 2158*2d543d20SAndroid Build Coastguard Worker 2159*2d543d20SAndroid Build Coastguard Worker def __add(self, interface, serange, ctype): 2160*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 2161*2d543d20SAndroid Build Coastguard Worker if serange == "": 2162*2d543d20SAndroid Build Coastguard Worker serange = "s0" 2163*2d543d20SAndroid Build Coastguard Worker else: 2164*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 2165*2d543d20SAndroid Build Coastguard Worker 2166*2d543d20SAndroid Build Coastguard Worker if ctype == "": 2167*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("SELinux Type is required")) 2168*2d543d20SAndroid Build Coastguard Worker 2169*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_iface_key_create(self.sh, interface) 2170*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2171*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % interface) 2172*2d543d20SAndroid Build Coastguard Worker 2173*2d543d20SAndroid Build Coastguard Worker (rc, iface) = semanage_iface_create(self.sh) 2174*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2175*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create interface for %s") % interface) 2176*2d543d20SAndroid Build Coastguard Worker 2177*2d543d20SAndroid Build Coastguard Worker rc = semanage_iface_set_name(self.sh, iface, interface) 2178*2d543d20SAndroid Build Coastguard Worker (rc, con) = semanage_context_create(self.sh) 2179*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2180*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create context for %s") % interface) 2181*2d543d20SAndroid Build Coastguard Worker 2182*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_user(self.sh, con, "system_u") 2183*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2184*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set user in interface context for %s") % interface) 2185*2d543d20SAndroid Build Coastguard Worker 2186*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_role(self.sh, con, "object_r") 2187*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2188*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set role in interface context for %s") % interface) 2189*2d543d20SAndroid Build Coastguard Worker 2190*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_type(self.sh, con, ctype) 2191*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2192*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set type in interface context for %s") % interface) 2193*2d543d20SAndroid Build Coastguard Worker 2194*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 2195*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_mls(self.sh, con, serange) 2196*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2197*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mls fields in interface context for %s") % interface) 2198*2d543d20SAndroid Build Coastguard Worker 2199*2d543d20SAndroid Build Coastguard Worker rc = semanage_iface_set_ifcon(self.sh, iface, con) 2200*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2201*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set interface context for %s") % interface) 2202*2d543d20SAndroid Build Coastguard Worker 2203*2d543d20SAndroid Build Coastguard Worker rc = semanage_iface_set_msgcon(self.sh, iface, con) 2204*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2205*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set message context for %s") % interface) 2206*2d543d20SAndroid Build Coastguard Worker 2207*2d543d20SAndroid Build Coastguard Worker rc = semanage_iface_modify_local(self.sh, k, iface) 2208*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2209*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add interface %s") % interface) 2210*2d543d20SAndroid Build Coastguard Worker 2211*2d543d20SAndroid Build Coastguard Worker semanage_context_free(con) 2212*2d543d20SAndroid Build Coastguard Worker semanage_iface_key_free(k) 2213*2d543d20SAndroid Build Coastguard Worker semanage_iface_free(iface) 2214*2d543d20SAndroid Build Coastguard Worker 2215*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=interface op=add netif=%s tcontext=%s:%s:%s:%s" % (interface, "system_u", "object_r", ctype, serange)) 2216*2d543d20SAndroid Build Coastguard Worker 2217*2d543d20SAndroid Build Coastguard Worker def add(self, interface, serange, ctype): 2218*2d543d20SAndroid Build Coastguard Worker self.begin() 2219*2d543d20SAndroid Build Coastguard Worker if self.__exists(interface): 2220*2d543d20SAndroid Build Coastguard Worker print(_("Interface %s already defined, modifying instead") % interface) 2221*2d543d20SAndroid Build Coastguard Worker self.__modify(interface, serange, ctype) 2222*2d543d20SAndroid Build Coastguard Worker else: 2223*2d543d20SAndroid Build Coastguard Worker self.__add(interface, serange, ctype) 2224*2d543d20SAndroid Build Coastguard Worker self.commit() 2225*2d543d20SAndroid Build Coastguard Worker 2226*2d543d20SAndroid Build Coastguard Worker def __exists(self, interface): 2227*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_iface_key_create(self.sh, interface) 2228*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2229*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % interface) 2230*2d543d20SAndroid Build Coastguard Worker 2231*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_iface_exists(self.sh, k) 2232*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2233*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if interface %s is defined") % interface) 2234*2d543d20SAndroid Build Coastguard Worker semanage_iface_key_free(k) 2235*2d543d20SAndroid Build Coastguard Worker 2236*2d543d20SAndroid Build Coastguard Worker return exists 2237*2d543d20SAndroid Build Coastguard Worker 2238*2d543d20SAndroid Build Coastguard Worker def __modify(self, interface, serange, setype): 2239*2d543d20SAndroid Build Coastguard Worker if serange == "" and setype == "": 2240*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype or serange")) 2241*2d543d20SAndroid Build Coastguard Worker 2242*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_iface_key_create(self.sh, interface) 2243*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2244*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % interface) 2245*2d543d20SAndroid Build Coastguard Worker 2246*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_iface_exists(self.sh, k) 2247*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2248*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if interface %s is defined") % interface) 2249*2d543d20SAndroid Build Coastguard Worker if not exists: 2250*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Interface %s is not defined") % interface) 2251*2d543d20SAndroid Build Coastguard Worker 2252*2d543d20SAndroid Build Coastguard Worker (rc, iface) = semanage_iface_query(self.sh, k) 2253*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2254*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query interface %s") % interface) 2255*2d543d20SAndroid Build Coastguard Worker 2256*2d543d20SAndroid Build Coastguard Worker con = semanage_iface_get_ifcon(iface) 2257*2d543d20SAndroid Build Coastguard Worker 2258*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 2259*2d543d20SAndroid Build Coastguard Worker semanage_context_set_mls(self.sh, con, untranslate(serange)) 2260*2d543d20SAndroid Build Coastguard Worker if setype != "": 2261*2d543d20SAndroid Build Coastguard Worker semanage_context_set_type(self.sh, con, setype) 2262*2d543d20SAndroid Build Coastguard Worker 2263*2d543d20SAndroid Build Coastguard Worker rc = semanage_iface_modify_local(self.sh, k, iface) 2264*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2265*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify interface %s") % interface) 2266*2d543d20SAndroid Build Coastguard Worker 2267*2d543d20SAndroid Build Coastguard Worker semanage_iface_key_free(k) 2268*2d543d20SAndroid Build Coastguard Worker semanage_iface_free(iface) 2269*2d543d20SAndroid Build Coastguard Worker 2270*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=interface op=modify netif=%s tcontext=%s:%s:%s:%s" % (interface, "system_u", "object_r", setype, serange)) 2271*2d543d20SAndroid Build Coastguard Worker 2272*2d543d20SAndroid Build Coastguard Worker def modify(self, interface, serange, setype): 2273*2d543d20SAndroid Build Coastguard Worker self.begin() 2274*2d543d20SAndroid Build Coastguard Worker self.__modify(interface, serange, setype) 2275*2d543d20SAndroid Build Coastguard Worker self.commit() 2276*2d543d20SAndroid Build Coastguard Worker 2277*2d543d20SAndroid Build Coastguard Worker def __delete(self, interface): 2278*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_iface_key_create(self.sh, interface) 2279*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2280*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % interface) 2281*2d543d20SAndroid Build Coastguard Worker 2282*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_iface_exists(self.sh, k) 2283*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2284*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if interface %s is defined") % interface) 2285*2d543d20SAndroid Build Coastguard Worker if not exists: 2286*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Interface %s is not defined") % interface) 2287*2d543d20SAndroid Build Coastguard Worker 2288*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_iface_exists_local(self.sh, k) 2289*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2290*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if interface %s is defined") % interface) 2291*2d543d20SAndroid Build Coastguard Worker if not exists: 2292*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Interface %s is defined in policy, cannot be deleted") % interface) 2293*2d543d20SAndroid Build Coastguard Worker 2294*2d543d20SAndroid Build Coastguard Worker rc = semanage_iface_del_local(self.sh, k) 2295*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2296*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete interface %s") % interface) 2297*2d543d20SAndroid Build Coastguard Worker 2298*2d543d20SAndroid Build Coastguard Worker semanage_iface_key_free(k) 2299*2d543d20SAndroid Build Coastguard Worker 2300*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=interface op=delete netif=%s" % interface) 2301*2d543d20SAndroid Build Coastguard Worker 2302*2d543d20SAndroid Build Coastguard Worker def delete(self, interface): 2303*2d543d20SAndroid Build Coastguard Worker self.begin() 2304*2d543d20SAndroid Build Coastguard Worker self.__delete(interface) 2305*2d543d20SAndroid Build Coastguard Worker self.commit() 2306*2d543d20SAndroid Build Coastguard Worker 2307*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 2308*2d543d20SAndroid Build Coastguard Worker (rc, ulist) = semanage_iface_list_local(self.sh) 2309*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2310*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete all interface mappings")) 2311*2d543d20SAndroid Build Coastguard Worker 2312*2d543d20SAndroid Build Coastguard Worker self.begin() 2313*2d543d20SAndroid Build Coastguard Worker for i in ulist: 2314*2d543d20SAndroid Build Coastguard Worker self.__delete(semanage_iface_get_name(i)) 2315*2d543d20SAndroid Build Coastguard Worker self.commit() 2316*2d543d20SAndroid Build Coastguard Worker 2317*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 2318*2d543d20SAndroid Build Coastguard Worker ddict = {} 2319*2d543d20SAndroid Build Coastguard Worker if locallist: 2320*2d543d20SAndroid Build Coastguard Worker (rc, self.ilist) = semanage_iface_list_local(self.sh) 2321*2d543d20SAndroid Build Coastguard Worker else: 2322*2d543d20SAndroid Build Coastguard Worker (rc, self.ilist) = semanage_iface_list(self.sh) 2323*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2324*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list interfaces")) 2325*2d543d20SAndroid Build Coastguard Worker 2326*2d543d20SAndroid Build Coastguard Worker for interface in self.ilist: 2327*2d543d20SAndroid Build Coastguard Worker con = semanage_iface_get_ifcon(interface) 2328*2d543d20SAndroid Build Coastguard Worker ddict[semanage_iface_get_name(interface)] = (semanage_context_get_user(con), semanage_context_get_role(con), semanage_context_get_type(con), semanage_context_get_mls(con)) 2329*2d543d20SAndroid Build Coastguard Worker 2330*2d543d20SAndroid Build Coastguard Worker return ddict 2331*2d543d20SAndroid Build Coastguard Worker 2332*2d543d20SAndroid Build Coastguard Worker def customized(self): 2333*2d543d20SAndroid Build Coastguard Worker l = [] 2334*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 2335*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 2336*2d543d20SAndroid Build Coastguard Worker if ddict[k][3]: 2337*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s -r '%s' %s" % (ddict[k][2], ddict[k][3], k)) 2338*2d543d20SAndroid Build Coastguard Worker else: 2339*2d543d20SAndroid Build Coastguard Worker l.append("-a -t %s %s" % (ddict[k][2], k)) 2340*2d543d20SAndroid Build Coastguard Worker return l 2341*2d543d20SAndroid Build Coastguard Worker 2342*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 2343*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(locallist) 2344*2d543d20SAndroid Build Coastguard Worker if len(ddict) == 0: 2345*2d543d20SAndroid Build Coastguard Worker return 2346*2d543d20SAndroid Build Coastguard Worker keys = sorted(ddict.keys()) 2347*2d543d20SAndroid Build Coastguard Worker 2348*2d543d20SAndroid Build Coastguard Worker if heading: 2349*2d543d20SAndroid Build Coastguard Worker print("%-30s %s\n" % (_("SELinux Interface"), _("Context"))) 2350*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled: 2351*2d543d20SAndroid Build Coastguard Worker for k in keys: 2352*2d543d20SAndroid Build Coastguard Worker print("%-30s %s:%s:%s:%s " % (k, ddict[k][0], ddict[k][1], ddict[k][2], translate(ddict[k][3], False))) 2353*2d543d20SAndroid Build Coastguard Worker else: 2354*2d543d20SAndroid Build Coastguard Worker for k in keys: 2355*2d543d20SAndroid Build Coastguard Worker print("%-30s %s:%s:%s " % (k, ddict[k][0], ddict[k][1], ddict[k][2])) 2356*2d543d20SAndroid Build Coastguard Worker 2357*2d543d20SAndroid Build Coastguard Worker 2358*2d543d20SAndroid Build Coastguard Workerclass fcontextRecords(semanageRecords): 2359*2d543d20SAndroid Build Coastguard Worker 2360*2d543d20SAndroid Build Coastguard Worker valid_types = [] 2361*2d543d20SAndroid Build Coastguard Worker 2362*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 2363*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 2364*2d543d20SAndroid Build Coastguard Worker try: 2365*2d543d20SAndroid Build Coastguard Worker self.valid_types = list(list(sepolicy.info(sepolicy.ATTRIBUTE, "file_type"))[0]["types"]) 2366*2d543d20SAndroid Build Coastguard Worker self.valid_types += list(list(sepolicy.info(sepolicy.ATTRIBUTE, "device_node"))[0]["types"]) 2367*2d543d20SAndroid Build Coastguard Worker except RuntimeError: 2368*2d543d20SAndroid Build Coastguard Worker pass 2369*2d543d20SAndroid Build Coastguard Worker 2370*2d543d20SAndroid Build Coastguard Worker self.equiv = {} 2371*2d543d20SAndroid Build Coastguard Worker self.equiv_dist = {} 2372*2d543d20SAndroid Build Coastguard Worker self.equal_ind = False 2373*2d543d20SAndroid Build Coastguard Worker try: 2374*2d543d20SAndroid Build Coastguard Worker fd = open(selinux.selinux_file_context_subs_path(), "r") 2375*2d543d20SAndroid Build Coastguard Worker for i in fd.readlines(): 2376*2d543d20SAndroid Build Coastguard Worker i = i.strip() 2377*2d543d20SAndroid Build Coastguard Worker if len(i) == 0: 2378*2d543d20SAndroid Build Coastguard Worker continue 2379*2d543d20SAndroid Build Coastguard Worker if i.startswith("#"): 2380*2d543d20SAndroid Build Coastguard Worker continue 2381*2d543d20SAndroid Build Coastguard Worker target, substitute = i.split() 2382*2d543d20SAndroid Build Coastguard Worker self.equiv[target] = substitute 2383*2d543d20SAndroid Build Coastguard Worker fd.close() 2384*2d543d20SAndroid Build Coastguard Worker except IOError: 2385*2d543d20SAndroid Build Coastguard Worker pass 2386*2d543d20SAndroid Build Coastguard Worker try: 2387*2d543d20SAndroid Build Coastguard Worker fd = open(selinux.selinux_file_context_subs_dist_path(), "r") 2388*2d543d20SAndroid Build Coastguard Worker for i in fd.readlines(): 2389*2d543d20SAndroid Build Coastguard Worker i = i.strip() 2390*2d543d20SAndroid Build Coastguard Worker if len(i) == 0: 2391*2d543d20SAndroid Build Coastguard Worker continue 2392*2d543d20SAndroid Build Coastguard Worker if i.startswith("#"): 2393*2d543d20SAndroid Build Coastguard Worker continue 2394*2d543d20SAndroid Build Coastguard Worker target, substitute = i.split() 2395*2d543d20SAndroid Build Coastguard Worker self.equiv_dist[target] = substitute 2396*2d543d20SAndroid Build Coastguard Worker fd.close() 2397*2d543d20SAndroid Build Coastguard Worker except IOError: 2398*2d543d20SAndroid Build Coastguard Worker pass 2399*2d543d20SAndroid Build Coastguard Worker 2400*2d543d20SAndroid Build Coastguard Worker def commit(self): 2401*2d543d20SAndroid Build Coastguard Worker if self.equal_ind: 2402*2d543d20SAndroid Build Coastguard Worker subs_file = selinux.selinux_file_context_subs_path() 2403*2d543d20SAndroid Build Coastguard Worker tmpfile = "%s.tmp" % subs_file 2404*2d543d20SAndroid Build Coastguard Worker fd = open(tmpfile, "w") 2405*2d543d20SAndroid Build Coastguard Worker for target in self.equiv.keys(): 2406*2d543d20SAndroid Build Coastguard Worker fd.write("%s %s\n" % (target, self.equiv[target])) 2407*2d543d20SAndroid Build Coastguard Worker fd.close() 2408*2d543d20SAndroid Build Coastguard Worker try: 2409*2d543d20SAndroid Build Coastguard Worker os.chmod(tmpfile, os.stat(subs_file)[stat.ST_MODE]) 2410*2d543d20SAndroid Build Coastguard Worker except: 2411*2d543d20SAndroid Build Coastguard Worker pass 2412*2d543d20SAndroid Build Coastguard Worker os.rename(tmpfile, subs_file) 2413*2d543d20SAndroid Build Coastguard Worker self.equal_ind = False 2414*2d543d20SAndroid Build Coastguard Worker semanageRecords.commit(self) 2415*2d543d20SAndroid Build Coastguard Worker 2416*2d543d20SAndroid Build Coastguard Worker def add_equal(self, target, substitute): 2417*2d543d20SAndroid Build Coastguard Worker self.begin() 2418*2d543d20SAndroid Build Coastguard Worker if target != "/" and target[-1] == "/": 2419*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Target %s is not valid. Target is not allowed to end with '/'") % target) 2420*2d543d20SAndroid Build Coastguard Worker 2421*2d543d20SAndroid Build Coastguard Worker if substitute != "/" and substitute[-1] == "/": 2422*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Substitute %s is not valid. Substitute is not allowed to end with '/'") % substitute) 2423*2d543d20SAndroid Build Coastguard Worker 2424*2d543d20SAndroid Build Coastguard Worker if target in self.equiv.keys(): 2425*2d543d20SAndroid Build Coastguard Worker print(_("Equivalence class for %s already exists, modifying instead") % target) 2426*2d543d20SAndroid Build Coastguard Worker self.equiv[target] = substitute 2427*2d543d20SAndroid Build Coastguard Worker self.equal_ind = True 2428*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=modify-equal %s %s" % (audit.audit_encode_nv_string("sglob", target, 0), audit.audit_encode_nv_string("tglob", substitute, 0))) 2429*2d543d20SAndroid Build Coastguard Worker self.commit() 2430*2d543d20SAndroid Build Coastguard Worker return 2431*2d543d20SAndroid Build Coastguard Worker 2432*2d543d20SAndroid Build Coastguard Worker self.validate(target) 2433*2d543d20SAndroid Build Coastguard Worker 2434*2d543d20SAndroid Build Coastguard Worker for fdict in (self.equiv, self.equiv_dist): 2435*2d543d20SAndroid Build Coastguard Worker for i in fdict: 2436*2d543d20SAndroid Build Coastguard Worker if i.startswith(target + "/"): 2437*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("File spec %s conflicts with equivalency rule '%s %s'") % (target, i, fdict[i])) 2438*2d543d20SAndroid Build Coastguard Worker 2439*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=add-equal %s %s" % (audit.audit_encode_nv_string("sglob", target, 0), audit.audit_encode_nv_string("tglob", substitute, 0))) 2440*2d543d20SAndroid Build Coastguard Worker 2441*2d543d20SAndroid Build Coastguard Worker self.equiv[target] = substitute 2442*2d543d20SAndroid Build Coastguard Worker self.equal_ind = True 2443*2d543d20SAndroid Build Coastguard Worker self.commit() 2444*2d543d20SAndroid Build Coastguard Worker 2445*2d543d20SAndroid Build Coastguard Worker def modify_equal(self, target, substitute): 2446*2d543d20SAndroid Build Coastguard Worker self.begin() 2447*2d543d20SAndroid Build Coastguard Worker if target not in self.equiv.keys(): 2448*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Equivalence class for %s does not exist") % target) 2449*2d543d20SAndroid Build Coastguard Worker self.equiv[target] = substitute 2450*2d543d20SAndroid Build Coastguard Worker self.equal_ind = True 2451*2d543d20SAndroid Build Coastguard Worker 2452*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=modify-equal %s %s" % (audit.audit_encode_nv_string("sglob", target, 0), audit.audit_encode_nv_string("tglob", substitute, 0))) 2453*2d543d20SAndroid Build Coastguard Worker 2454*2d543d20SAndroid Build Coastguard Worker self.commit() 2455*2d543d20SAndroid Build Coastguard Worker 2456*2d543d20SAndroid Build Coastguard Worker def createcon(self, target, seuser="system_u"): 2457*2d543d20SAndroid Build Coastguard Worker (rc, con) = semanage_context_create(self.sh) 2458*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2459*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create context for %s") % target) 2460*2d543d20SAndroid Build Coastguard Worker if seuser == "": 2461*2d543d20SAndroid Build Coastguard Worker seuser = "system_u" 2462*2d543d20SAndroid Build Coastguard Worker 2463*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_user(self.sh, con, seuser) 2464*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2465*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set user in file context for %s") % target) 2466*2d543d20SAndroid Build Coastguard Worker 2467*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_role(self.sh, con, "object_r") 2468*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2469*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set role in file context for %s") % target) 2470*2d543d20SAndroid Build Coastguard Worker 2471*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 2472*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_mls(self.sh, con, "s0") 2473*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2474*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mls fields in file context for %s") % target) 2475*2d543d20SAndroid Build Coastguard Worker 2476*2d543d20SAndroid Build Coastguard Worker return con 2477*2d543d20SAndroid Build Coastguard Worker 2478*2d543d20SAndroid Build Coastguard Worker def validate(self, target): 2479*2d543d20SAndroid Build Coastguard Worker if target == "" or target.find("\n") >= 0: 2480*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Invalid file specification")) 2481*2d543d20SAndroid Build Coastguard Worker if target.find(" ") != -1: 2482*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("File specification can not include spaces")) 2483*2d543d20SAndroid Build Coastguard Worker for fdict in (self.equiv, self.equiv_dist): 2484*2d543d20SAndroid Build Coastguard Worker for i in fdict: 2485*2d543d20SAndroid Build Coastguard Worker if target.startswith(i + "/"): 2486*2d543d20SAndroid Build Coastguard Worker t = re.sub(i, fdict[i], target) 2487*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("File spec %s conflicts with equivalency rule '%s %s'; Try adding '%s' instead") % (target, i, fdict[i], t)) 2488*2d543d20SAndroid Build Coastguard Worker 2489*2d543d20SAndroid Build Coastguard Worker def __add(self, target, type, ftype="", serange="", seuser="system_u"): 2490*2d543d20SAndroid Build Coastguard Worker self.validate(target) 2491*2d543d20SAndroid Build Coastguard Worker 2492*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled == 1: 2493*2d543d20SAndroid Build Coastguard Worker serange = untranslate(serange) 2494*2d543d20SAndroid Build Coastguard Worker 2495*2d543d20SAndroid Build Coastguard Worker if type == "": 2496*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("SELinux Type is required")) 2497*2d543d20SAndroid Build Coastguard Worker 2498*2d543d20SAndroid Build Coastguard Worker if type != "<<none>>": 2499*2d543d20SAndroid Build Coastguard Worker type = sepolicy.get_real_type_name(type) 2500*2d543d20SAndroid Build Coastguard Worker if type not in self.valid_types: 2501*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a file or device type") % type) 2502*2d543d20SAndroid Build Coastguard Worker 2503*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_fcontext_key_create(self.sh, target, file_types[ftype]) 2504*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2505*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % target) 2506*2d543d20SAndroid Build Coastguard Worker 2507*2d543d20SAndroid Build Coastguard Worker (rc, fcontext) = semanage_fcontext_create(self.sh) 2508*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2509*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create file context for %s") % target) 2510*2d543d20SAndroid Build Coastguard Worker 2511*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_set_expr(self.sh, fcontext, target) 2512*2d543d20SAndroid Build Coastguard Worker if type != "<<none>>": 2513*2d543d20SAndroid Build Coastguard Worker con = self.createcon(target, seuser) 2514*2d543d20SAndroid Build Coastguard Worker 2515*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_type(self.sh, con, type) 2516*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2517*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set type in file context for %s") % target) 2518*2d543d20SAndroid Build Coastguard Worker 2519*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 2520*2d543d20SAndroid Build Coastguard Worker rc = semanage_context_set_mls(self.sh, con, serange) 2521*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2522*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set mls fields in file context for %s") % target) 2523*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_set_con(self.sh, fcontext, con) 2524*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2525*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set file context for %s") % target) 2526*2d543d20SAndroid Build Coastguard Worker 2527*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_set_type(fcontext, file_types[ftype]) 2528*2d543d20SAndroid Build Coastguard Worker 2529*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_modify_local(self.sh, k, fcontext) 2530*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2531*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not add file context for %s") % target) 2532*2d543d20SAndroid Build Coastguard Worker 2533*2d543d20SAndroid Build Coastguard Worker if type != "<<none>>": 2534*2d543d20SAndroid Build Coastguard Worker semanage_context_free(con) 2535*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_key_free(k) 2536*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_free(fcontext) 2537*2d543d20SAndroid Build Coastguard Worker 2538*2d543d20SAndroid Build Coastguard Worker if not seuser: 2539*2d543d20SAndroid Build Coastguard Worker seuser = "system_u" 2540*2d543d20SAndroid Build Coastguard Worker 2541*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=add %s ftype=%s tcontext=%s:%s:%s:%s" % (audit.audit_encode_nv_string("tglob", target, 0), ftype_to_audit[ftype], seuser, "object_r", type, serange)) 2542*2d543d20SAndroid Build Coastguard Worker 2543*2d543d20SAndroid Build Coastguard Worker def add(self, target, type, ftype="", serange="", seuser="system_u"): 2544*2d543d20SAndroid Build Coastguard Worker self.begin() 2545*2d543d20SAndroid Build Coastguard Worker if self.__exists(target, ftype): 2546*2d543d20SAndroid Build Coastguard Worker print(_("File context for %s already defined, modifying instead") % target) 2547*2d543d20SAndroid Build Coastguard Worker self.__modify(target, type, ftype, serange, seuser) 2548*2d543d20SAndroid Build Coastguard Worker else: 2549*2d543d20SAndroid Build Coastguard Worker self.__add(target, type, ftype, serange, seuser) 2550*2d543d20SAndroid Build Coastguard Worker self.commit() 2551*2d543d20SAndroid Build Coastguard Worker 2552*2d543d20SAndroid Build Coastguard Worker def __exists(self, target, ftype): 2553*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_fcontext_key_create(self.sh, target, file_types[ftype]) 2554*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2555*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create key for %s") % target) 2556*2d543d20SAndroid Build Coastguard Worker 2557*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_fcontext_exists(self.sh, k) 2558*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2559*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if file context for %s is defined") % target) 2560*2d543d20SAndroid Build Coastguard Worker 2561*2d543d20SAndroid Build Coastguard Worker if not exists: 2562*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_fcontext_exists_local(self.sh, k) 2563*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2564*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if file context for %s is defined") % target) 2565*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_key_free(k) 2566*2d543d20SAndroid Build Coastguard Worker 2567*2d543d20SAndroid Build Coastguard Worker return exists 2568*2d543d20SAndroid Build Coastguard Worker 2569*2d543d20SAndroid Build Coastguard Worker def __modify(self, target, setype, ftype, serange, seuser): 2570*2d543d20SAndroid Build Coastguard Worker if serange == "" and setype == "" and seuser == "": 2571*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Requires setype, serange or seuser")) 2572*2d543d20SAndroid Build Coastguard Worker if setype not in ["", "<<none>>"]: 2573*2d543d20SAndroid Build Coastguard Worker setype = sepolicy.get_real_type_name(setype) 2574*2d543d20SAndroid Build Coastguard Worker if setype not in self.valid_types: 2575*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Type %s is invalid, must be a file or device type") % setype) 2576*2d543d20SAndroid Build Coastguard Worker 2577*2d543d20SAndroid Build Coastguard Worker self.validate(target) 2578*2d543d20SAndroid Build Coastguard Worker 2579*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_fcontext_key_create(self.sh, target, file_types[ftype]) 2580*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2581*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % target) 2582*2d543d20SAndroid Build Coastguard Worker 2583*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_fcontext_exists(self.sh, k) 2584*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2585*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if file context for %s is defined") % target) 2586*2d543d20SAndroid Build Coastguard Worker if exists: 2587*2d543d20SAndroid Build Coastguard Worker try: 2588*2d543d20SAndroid Build Coastguard Worker (rc, fcontext) = semanage_fcontext_query(self.sh, k) 2589*2d543d20SAndroid Build Coastguard Worker except OSError: 2590*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query file context for %s") % target) 2591*2d543d20SAndroid Build Coastguard Worker else: 2592*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_fcontext_exists_local(self.sh, k) 2593*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2594*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if file context for %s is defined") % target) 2595*2d543d20SAndroid Build Coastguard Worker if not exists: 2596*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("File context for %s is not defined") % target) 2597*2d543d20SAndroid Build Coastguard Worker try: 2598*2d543d20SAndroid Build Coastguard Worker (rc, fcontext) = semanage_fcontext_query_local(self.sh, k) 2599*2d543d20SAndroid Build Coastguard Worker except OSError: 2600*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query file context for %s") % target) 2601*2d543d20SAndroid Build Coastguard Worker 2602*2d543d20SAndroid Build Coastguard Worker if setype != "<<none>>": 2603*2d543d20SAndroid Build Coastguard Worker con = semanage_fcontext_get_con(fcontext) 2604*2d543d20SAndroid Build Coastguard Worker 2605*2d543d20SAndroid Build Coastguard Worker if con is None: 2606*2d543d20SAndroid Build Coastguard Worker con = self.createcon(target) 2607*2d543d20SAndroid Build Coastguard Worker 2608*2d543d20SAndroid Build Coastguard Worker if (is_mls_enabled == 1) and (serange != ""): 2609*2d543d20SAndroid Build Coastguard Worker semanage_context_set_mls(self.sh, con, untranslate(serange)) 2610*2d543d20SAndroid Build Coastguard Worker if seuser != "": 2611*2d543d20SAndroid Build Coastguard Worker semanage_context_set_user(self.sh, con, seuser) 2612*2d543d20SAndroid Build Coastguard Worker 2613*2d543d20SAndroid Build Coastguard Worker if setype != "": 2614*2d543d20SAndroid Build Coastguard Worker semanage_context_set_type(self.sh, con, setype) 2615*2d543d20SAndroid Build Coastguard Worker 2616*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_set_con(self.sh, fcontext, con) 2617*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2618*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set file context for %s") % target) 2619*2d543d20SAndroid Build Coastguard Worker else: 2620*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_set_con(self.sh, fcontext, None) 2621*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2622*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set file context for %s") % target) 2623*2d543d20SAndroid Build Coastguard Worker 2624*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_modify_local(self.sh, k, fcontext) 2625*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2626*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify file context for %s") % target) 2627*2d543d20SAndroid Build Coastguard Worker 2628*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_key_free(k) 2629*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_free(fcontext) 2630*2d543d20SAndroid Build Coastguard Worker 2631*2d543d20SAndroid Build Coastguard Worker if not seuser: 2632*2d543d20SAndroid Build Coastguard Worker seuser = "system_u" 2633*2d543d20SAndroid Build Coastguard Worker 2634*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=modify %s ftype=%s tcontext=%s:%s:%s:%s" % (audit.audit_encode_nv_string("tglob", target, 0), ftype_to_audit[ftype], seuser, "object_r", setype, serange)) 2635*2d543d20SAndroid Build Coastguard Worker 2636*2d543d20SAndroid Build Coastguard Worker def modify(self, target, setype, ftype, serange, seuser): 2637*2d543d20SAndroid Build Coastguard Worker self.begin() 2638*2d543d20SAndroid Build Coastguard Worker self.__modify(target, setype, ftype, serange, seuser) 2639*2d543d20SAndroid Build Coastguard Worker self.commit() 2640*2d543d20SAndroid Build Coastguard Worker 2641*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 2642*2d543d20SAndroid Build Coastguard Worker (rc, flist) = semanage_fcontext_list_local(self.sh) 2643*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2644*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list the file contexts")) 2645*2d543d20SAndroid Build Coastguard Worker 2646*2d543d20SAndroid Build Coastguard Worker self.begin() 2647*2d543d20SAndroid Build Coastguard Worker 2648*2d543d20SAndroid Build Coastguard Worker for fcontext in flist: 2649*2d543d20SAndroid Build Coastguard Worker target = semanage_fcontext_get_expr(fcontext) 2650*2d543d20SAndroid Build Coastguard Worker ftype = semanage_fcontext_get_type(fcontext) 2651*2d543d20SAndroid Build Coastguard Worker ftype_str = semanage_fcontext_get_type_str(ftype) 2652*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_fcontext_key_create(self.sh, target, file_types[ftype_str]) 2653*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2654*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % target) 2655*2d543d20SAndroid Build Coastguard Worker 2656*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_del_local(self.sh, k) 2657*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2658*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete the file context %s") % target) 2659*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_key_free(k) 2660*2d543d20SAndroid Build Coastguard Worker 2661*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=delete %s ftype=%s" % (audit.audit_encode_nv_string("tglob", target, 0), ftype_to_audit[file_type_str_to_option[ftype_str]])) 2662*2d543d20SAndroid Build Coastguard Worker 2663*2d543d20SAndroid Build Coastguard Worker self.equiv = {} 2664*2d543d20SAndroid Build Coastguard Worker self.equal_ind = True 2665*2d543d20SAndroid Build Coastguard Worker self.commit() 2666*2d543d20SAndroid Build Coastguard Worker 2667*2d543d20SAndroid Build Coastguard Worker def __delete(self, target, ftype): 2668*2d543d20SAndroid Build Coastguard Worker if target in self.equiv.keys(): 2669*2d543d20SAndroid Build Coastguard Worker self.equiv.pop(target) 2670*2d543d20SAndroid Build Coastguard Worker self.equal_ind = True 2671*2d543d20SAndroid Build Coastguard Worker 2672*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=delete-equal %s" % (audit.audit_encode_nv_string("tglob", target, 0))) 2673*2d543d20SAndroid Build Coastguard Worker 2674*2d543d20SAndroid Build Coastguard Worker return 2675*2d543d20SAndroid Build Coastguard Worker 2676*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_fcontext_key_create(self.sh, target, file_types[ftype]) 2677*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2678*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % target) 2679*2d543d20SAndroid Build Coastguard Worker 2680*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_fcontext_exists_local(self.sh, k) 2681*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2682*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if file context for %s is defined") % target) 2683*2d543d20SAndroid Build Coastguard Worker if not exists: 2684*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_fcontext_exists(self.sh, k) 2685*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2686*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if file context for %s is defined") % target) 2687*2d543d20SAndroid Build Coastguard Worker if exists: 2688*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("File context for %s is defined in policy, cannot be deleted") % target) 2689*2d543d20SAndroid Build Coastguard Worker else: 2690*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("File context for %s is not defined") % target) 2691*2d543d20SAndroid Build Coastguard Worker 2692*2d543d20SAndroid Build Coastguard Worker rc = semanage_fcontext_del_local(self.sh, k) 2693*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2694*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete file context for %s") % target) 2695*2d543d20SAndroid Build Coastguard Worker 2696*2d543d20SAndroid Build Coastguard Worker semanage_fcontext_key_free(k) 2697*2d543d20SAndroid Build Coastguard Worker 2698*2d543d20SAndroid Build Coastguard Worker self.mylog.log_change("resrc=fcontext op=delete %s ftype=%s" % (audit.audit_encode_nv_string("tglob", target, 0), ftype_to_audit[ftype])) 2699*2d543d20SAndroid Build Coastguard Worker 2700*2d543d20SAndroid Build Coastguard Worker def delete(self, target, ftype): 2701*2d543d20SAndroid Build Coastguard Worker self.begin() 2702*2d543d20SAndroid Build Coastguard Worker self.__delete(target, ftype) 2703*2d543d20SAndroid Build Coastguard Worker self.commit() 2704*2d543d20SAndroid Build Coastguard Worker 2705*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 2706*2d543d20SAndroid Build Coastguard Worker if locallist: 2707*2d543d20SAndroid Build Coastguard Worker (rc, self.flist) = semanage_fcontext_list_local(self.sh) 2708*2d543d20SAndroid Build Coastguard Worker else: 2709*2d543d20SAndroid Build Coastguard Worker (rc, self.flist) = semanage_fcontext_list(self.sh) 2710*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2711*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list file contexts")) 2712*2d543d20SAndroid Build Coastguard Worker 2713*2d543d20SAndroid Build Coastguard Worker (rc, fchomedirs) = semanage_fcontext_list_homedirs(self.sh) 2714*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2715*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list file contexts for home directories")) 2716*2d543d20SAndroid Build Coastguard Worker 2717*2d543d20SAndroid Build Coastguard Worker (rc, fclocal) = semanage_fcontext_list_local(self.sh) 2718*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2719*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list local file contexts")) 2720*2d543d20SAndroid Build Coastguard Worker 2721*2d543d20SAndroid Build Coastguard Worker self.flist += fchomedirs 2722*2d543d20SAndroid Build Coastguard Worker self.flist += fclocal 2723*2d543d20SAndroid Build Coastguard Worker 2724*2d543d20SAndroid Build Coastguard Worker ddict = {} 2725*2d543d20SAndroid Build Coastguard Worker for fcontext in self.flist: 2726*2d543d20SAndroid Build Coastguard Worker expr = semanage_fcontext_get_expr(fcontext) 2727*2d543d20SAndroid Build Coastguard Worker ftype = semanage_fcontext_get_type(fcontext) 2728*2d543d20SAndroid Build Coastguard Worker ftype_str = semanage_fcontext_get_type_str(ftype) 2729*2d543d20SAndroid Build Coastguard Worker con = semanage_fcontext_get_con(fcontext) 2730*2d543d20SAndroid Build Coastguard Worker if con: 2731*2d543d20SAndroid Build Coastguard Worker ddict[(expr, ftype_str)] = (semanage_context_get_user(con), semanage_context_get_role(con), semanage_context_get_type(con), semanage_context_get_mls(con)) 2732*2d543d20SAndroid Build Coastguard Worker else: 2733*2d543d20SAndroid Build Coastguard Worker ddict[(expr, ftype_str)] = con 2734*2d543d20SAndroid Build Coastguard Worker 2735*2d543d20SAndroid Build Coastguard Worker return ddict 2736*2d543d20SAndroid Build Coastguard Worker 2737*2d543d20SAndroid Build Coastguard Worker def customized(self): 2738*2d543d20SAndroid Build Coastguard Worker l = [] 2739*2d543d20SAndroid Build Coastguard Worker fcon_dict = self.get_all(True) 2740*2d543d20SAndroid Build Coastguard Worker for k in fcon_dict.keys(): 2741*2d543d20SAndroid Build Coastguard Worker if fcon_dict[k]: 2742*2d543d20SAndroid Build Coastguard Worker if fcon_dict[k][3]: 2743*2d543d20SAndroid Build Coastguard Worker l.append("-a -f %s -t %s -r '%s' '%s'" % (file_type_str_to_option[k[1]], fcon_dict[k][2], fcon_dict[k][3], k[0])) 2744*2d543d20SAndroid Build Coastguard Worker else: 2745*2d543d20SAndroid Build Coastguard Worker l.append("-a -f %s -t %s '%s'" % (file_type_str_to_option[k[1]], fcon_dict[k][2], k[0])) 2746*2d543d20SAndroid Build Coastguard Worker 2747*2d543d20SAndroid Build Coastguard Worker if len(self.equiv): 2748*2d543d20SAndroid Build Coastguard Worker for target in self.equiv.keys(): 2749*2d543d20SAndroid Build Coastguard Worker l.append("-a -e %s %s" % (self.equiv[target], target)) 2750*2d543d20SAndroid Build Coastguard Worker return l 2751*2d543d20SAndroid Build Coastguard Worker 2752*2d543d20SAndroid Build Coastguard Worker def list(self, heading=1, locallist=0): 2753*2d543d20SAndroid Build Coastguard Worker fcon_dict = self.get_all(locallist) 2754*2d543d20SAndroid Build Coastguard Worker if len(fcon_dict) != 0: 2755*2d543d20SAndroid Build Coastguard Worker if heading: 2756*2d543d20SAndroid Build Coastguard Worker print("%-50s %-18s %s\n" % (_("SELinux fcontext"), _("type"), _("Context"))) 2757*2d543d20SAndroid Build Coastguard Worker # do not sort local customizations since they are evaluated based on the order they where added in 2758*2d543d20SAndroid Build Coastguard Worker if locallist: 2759*2d543d20SAndroid Build Coastguard Worker fkeys = fcon_dict.keys() 2760*2d543d20SAndroid Build Coastguard Worker else: 2761*2d543d20SAndroid Build Coastguard Worker fkeys = sorted(fcon_dict.keys()) 2762*2d543d20SAndroid Build Coastguard Worker for k in fkeys: 2763*2d543d20SAndroid Build Coastguard Worker if fcon_dict[k]: 2764*2d543d20SAndroid Build Coastguard Worker if is_mls_enabled: 2765*2d543d20SAndroid Build Coastguard Worker print("%-50s %-18s %s:%s:%s:%s " % (k[0], k[1], fcon_dict[k][0], fcon_dict[k][1], fcon_dict[k][2], translate(fcon_dict[k][3], False))) 2766*2d543d20SAndroid Build Coastguard Worker else: 2767*2d543d20SAndroid Build Coastguard Worker print("%-50s %-18s %s:%s:%s " % (k[0], k[1], fcon_dict[k][0], fcon_dict[k][1], fcon_dict[k][2])) 2768*2d543d20SAndroid Build Coastguard Worker else: 2769*2d543d20SAndroid Build Coastguard Worker print("%-50s %-18s <<None>>" % (k[0], k[1])) 2770*2d543d20SAndroid Build Coastguard Worker 2771*2d543d20SAndroid Build Coastguard Worker if len(self.equiv_dist): 2772*2d543d20SAndroid Build Coastguard Worker if not locallist: 2773*2d543d20SAndroid Build Coastguard Worker if heading: 2774*2d543d20SAndroid Build Coastguard Worker print(_("\nSELinux Distribution fcontext Equivalence \n")) 2775*2d543d20SAndroid Build Coastguard Worker for target in self.equiv_dist.keys(): 2776*2d543d20SAndroid Build Coastguard Worker print("%s = %s" % (target, self.equiv_dist[target])) 2777*2d543d20SAndroid Build Coastguard Worker if len(self.equiv): 2778*2d543d20SAndroid Build Coastguard Worker if heading: 2779*2d543d20SAndroid Build Coastguard Worker print(_("\nSELinux Local fcontext Equivalence \n")) 2780*2d543d20SAndroid Build Coastguard Worker 2781*2d543d20SAndroid Build Coastguard Worker for target in self.equiv.keys(): 2782*2d543d20SAndroid Build Coastguard Worker print("%s = %s" % (target, self.equiv[target])) 2783*2d543d20SAndroid Build Coastguard Worker 2784*2d543d20SAndroid Build Coastguard Worker 2785*2d543d20SAndroid Build Coastguard Workerclass booleanRecords(semanageRecords): 2786*2d543d20SAndroid Build Coastguard Worker 2787*2d543d20SAndroid Build Coastguard Worker def __init__(self, args = None): 2788*2d543d20SAndroid Build Coastguard Worker semanageRecords.__init__(self, args) 2789*2d543d20SAndroid Build Coastguard Worker self.dict = {} 2790*2d543d20SAndroid Build Coastguard Worker self.dict["TRUE"] = 1 2791*2d543d20SAndroid Build Coastguard Worker self.dict["FALSE"] = 0 2792*2d543d20SAndroid Build Coastguard Worker self.dict["ON"] = 1 2793*2d543d20SAndroid Build Coastguard Worker self.dict["OFF"] = 0 2794*2d543d20SAndroid Build Coastguard Worker self.dict["1"] = 1 2795*2d543d20SAndroid Build Coastguard Worker self.dict["0"] = 0 2796*2d543d20SAndroid Build Coastguard Worker 2797*2d543d20SAndroid Build Coastguard Worker try: 2798*2d543d20SAndroid Build Coastguard Worker rc, self.current_booleans = selinux.security_get_boolean_names() 2799*2d543d20SAndroid Build Coastguard Worker rc, ptype = selinux.selinux_getpolicytype() 2800*2d543d20SAndroid Build Coastguard Worker except: 2801*2d543d20SAndroid Build Coastguard Worker self.current_booleans = [] 2802*2d543d20SAndroid Build Coastguard Worker ptype = None 2803*2d543d20SAndroid Build Coastguard Worker 2804*2d543d20SAndroid Build Coastguard Worker if self.store == "" or self.store == ptype: 2805*2d543d20SAndroid Build Coastguard Worker self.modify_local = True 2806*2d543d20SAndroid Build Coastguard Worker else: 2807*2d543d20SAndroid Build Coastguard Worker self.modify_local = False 2808*2d543d20SAndroid Build Coastguard Worker 2809*2d543d20SAndroid Build Coastguard Worker def __mod(self, name, value): 2810*2d543d20SAndroid Build Coastguard Worker name = selinux.selinux_boolean_sub(name) 2811*2d543d20SAndroid Build Coastguard Worker 2812*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_bool_key_create(self.sh, name) 2813*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2814*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 2815*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_bool_exists(self.sh, k) 2816*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2817*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if boolean %s is defined") % name) 2818*2d543d20SAndroid Build Coastguard Worker if not exists: 2819*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Boolean %s is not defined") % name) 2820*2d543d20SAndroid Build Coastguard Worker 2821*2d543d20SAndroid Build Coastguard Worker (rc, b) = semanage_bool_query(self.sh, k) 2822*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2823*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not query file context %s") % name) 2824*2d543d20SAndroid Build Coastguard Worker 2825*2d543d20SAndroid Build Coastguard Worker if value.upper() in self.dict: 2826*2d543d20SAndroid Build Coastguard Worker semanage_bool_set_value(b, self.dict[value.upper()]) 2827*2d543d20SAndroid Build Coastguard Worker else: 2828*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("You must specify one of the following values: %s") % ", ".join(self.dict.keys())) 2829*2d543d20SAndroid Build Coastguard Worker 2830*2d543d20SAndroid Build Coastguard Worker if self.modify_local and name in self.current_booleans: 2831*2d543d20SAndroid Build Coastguard Worker rc = semanage_bool_set_active(self.sh, k, b) 2832*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2833*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not set active value of boolean %s") % name) 2834*2d543d20SAndroid Build Coastguard Worker rc = semanage_bool_modify_local(self.sh, k, b) 2835*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2836*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not modify boolean %s") % name) 2837*2d543d20SAndroid Build Coastguard Worker semanage_bool_key_free(k) 2838*2d543d20SAndroid Build Coastguard Worker semanage_bool_free(b) 2839*2d543d20SAndroid Build Coastguard Worker 2840*2d543d20SAndroid Build Coastguard Worker def modify(self, name, value=None, use_file=False): 2841*2d543d20SAndroid Build Coastguard Worker self.begin() 2842*2d543d20SAndroid Build Coastguard Worker if use_file: 2843*2d543d20SAndroid Build Coastguard Worker fd = open(name) 2844*2d543d20SAndroid Build Coastguard Worker for b in fd.read().split("\n"): 2845*2d543d20SAndroid Build Coastguard Worker b = b.strip() 2846*2d543d20SAndroid Build Coastguard Worker if len(b) == 0: 2847*2d543d20SAndroid Build Coastguard Worker continue 2848*2d543d20SAndroid Build Coastguard Worker 2849*2d543d20SAndroid Build Coastguard Worker try: 2850*2d543d20SAndroid Build Coastguard Worker boolname, val = b.split("=") 2851*2d543d20SAndroid Build Coastguard Worker except ValueError: 2852*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Bad format {filename}: Record {record}").format(filename=name, record=b)) 2853*2d543d20SAndroid Build Coastguard Worker self.__mod(boolname.strip(), val.strip()) 2854*2d543d20SAndroid Build Coastguard Worker fd.close() 2855*2d543d20SAndroid Build Coastguard Worker else: 2856*2d543d20SAndroid Build Coastguard Worker self.__mod(name, value) 2857*2d543d20SAndroid Build Coastguard Worker 2858*2d543d20SAndroid Build Coastguard Worker self.commit() 2859*2d543d20SAndroid Build Coastguard Worker 2860*2d543d20SAndroid Build Coastguard Worker def __delete(self, name): 2861*2d543d20SAndroid Build Coastguard Worker name = selinux.selinux_boolean_sub(name) 2862*2d543d20SAndroid Build Coastguard Worker 2863*2d543d20SAndroid Build Coastguard Worker (rc, k) = semanage_bool_key_create(self.sh, name) 2864*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2865*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not create a key for %s") % name) 2866*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_bool_exists(self.sh, k) 2867*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2868*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if boolean %s is defined") % name) 2869*2d543d20SAndroid Build Coastguard Worker if not exists: 2870*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Boolean %s is not defined") % name) 2871*2d543d20SAndroid Build Coastguard Worker 2872*2d543d20SAndroid Build Coastguard Worker (rc, exists) = semanage_bool_exists_local(self.sh, k) 2873*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2874*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not check if boolean %s is defined") % name) 2875*2d543d20SAndroid Build Coastguard Worker if not exists: 2876*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Boolean %s is defined in policy, cannot be deleted") % name) 2877*2d543d20SAndroid Build Coastguard Worker 2878*2d543d20SAndroid Build Coastguard Worker rc = semanage_bool_del_local(self.sh, k) 2879*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2880*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not delete boolean %s") % name) 2881*2d543d20SAndroid Build Coastguard Worker 2882*2d543d20SAndroid Build Coastguard Worker semanage_bool_key_free(k) 2883*2d543d20SAndroid Build Coastguard Worker 2884*2d543d20SAndroid Build Coastguard Worker def delete(self, name): 2885*2d543d20SAndroid Build Coastguard Worker self.begin() 2886*2d543d20SAndroid Build Coastguard Worker self.__delete(name) 2887*2d543d20SAndroid Build Coastguard Worker self.commit() 2888*2d543d20SAndroid Build Coastguard Worker 2889*2d543d20SAndroid Build Coastguard Worker def deleteall(self): 2890*2d543d20SAndroid Build Coastguard Worker (rc, self.blist) = semanage_bool_list_local(self.sh) 2891*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2892*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list booleans")) 2893*2d543d20SAndroid Build Coastguard Worker 2894*2d543d20SAndroid Build Coastguard Worker self.begin() 2895*2d543d20SAndroid Build Coastguard Worker 2896*2d543d20SAndroid Build Coastguard Worker for boolean in self.blist: 2897*2d543d20SAndroid Build Coastguard Worker name = semanage_bool_get_name(boolean) 2898*2d543d20SAndroid Build Coastguard Worker self.__delete(name) 2899*2d543d20SAndroid Build Coastguard Worker 2900*2d543d20SAndroid Build Coastguard Worker self.commit() 2901*2d543d20SAndroid Build Coastguard Worker 2902*2d543d20SAndroid Build Coastguard Worker def get_all(self, locallist=0): 2903*2d543d20SAndroid Build Coastguard Worker ddict = {} 2904*2d543d20SAndroid Build Coastguard Worker if locallist: 2905*2d543d20SAndroid Build Coastguard Worker (rc, self.blist) = semanage_bool_list_local(self.sh) 2906*2d543d20SAndroid Build Coastguard Worker else: 2907*2d543d20SAndroid Build Coastguard Worker (rc, self.blist) = semanage_bool_list(self.sh) 2908*2d543d20SAndroid Build Coastguard Worker if rc < 0: 2909*2d543d20SAndroid Build Coastguard Worker raise ValueError(_("Could not list booleans")) 2910*2d543d20SAndroid Build Coastguard Worker 2911*2d543d20SAndroid Build Coastguard Worker for boolean in self.blist: 2912*2d543d20SAndroid Build Coastguard Worker value = [] 2913*2d543d20SAndroid Build Coastguard Worker name = semanage_bool_get_name(boolean) 2914*2d543d20SAndroid Build Coastguard Worker value.append(semanage_bool_get_value(boolean)) 2915*2d543d20SAndroid Build Coastguard Worker if self.modify_local and name in self.current_booleans: 2916*2d543d20SAndroid Build Coastguard Worker value.append(selinux.security_get_boolean_pending(name)) 2917*2d543d20SAndroid Build Coastguard Worker value.append(selinux.security_get_boolean_active(name)) 2918*2d543d20SAndroid Build Coastguard Worker else: 2919*2d543d20SAndroid Build Coastguard Worker value.append(value[0]) 2920*2d543d20SAndroid Build Coastguard Worker value.append(value[0]) 2921*2d543d20SAndroid Build Coastguard Worker ddict[name] = value 2922*2d543d20SAndroid Build Coastguard Worker 2923*2d543d20SAndroid Build Coastguard Worker return ddict 2924*2d543d20SAndroid Build Coastguard Worker 2925*2d543d20SAndroid Build Coastguard Worker def get_desc(self, name): 2926*2d543d20SAndroid Build Coastguard Worker name = selinux.selinux_boolean_sub(name) 2927*2d543d20SAndroid Build Coastguard Worker return sepolicy.boolean_desc(name) 2928*2d543d20SAndroid Build Coastguard Worker 2929*2d543d20SAndroid Build Coastguard Worker def get_category(self, name): 2930*2d543d20SAndroid Build Coastguard Worker name = selinux.selinux_boolean_sub(name) 2931*2d543d20SAndroid Build Coastguard Worker return sepolicy.boolean_category(name) 2932*2d543d20SAndroid Build Coastguard Worker 2933*2d543d20SAndroid Build Coastguard Worker def customized(self): 2934*2d543d20SAndroid Build Coastguard Worker l = [] 2935*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(True) 2936*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 2937*2d543d20SAndroid Build Coastguard Worker if ddict[k]: 2938*2d543d20SAndroid Build Coastguard Worker l.append("-m -%s %s" % (ddict[k][2], k)) 2939*2d543d20SAndroid Build Coastguard Worker return l 2940*2d543d20SAndroid Build Coastguard Worker 2941*2d543d20SAndroid Build Coastguard Worker def list(self, heading=True, locallist=False, use_file=False): 2942*2d543d20SAndroid Build Coastguard Worker on_off = (_("off"), _("on")) 2943*2d543d20SAndroid Build Coastguard Worker if use_file: 2944*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(locallist) 2945*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 2946*2d543d20SAndroid Build Coastguard Worker if ddict[k]: 2947*2d543d20SAndroid Build Coastguard Worker print("%s=%s" % (k, ddict[k][2])) 2948*2d543d20SAndroid Build Coastguard Worker return 2949*2d543d20SAndroid Build Coastguard Worker ddict = self.get_all(locallist) 2950*2d543d20SAndroid Build Coastguard Worker if len(ddict) == 0: 2951*2d543d20SAndroid Build Coastguard Worker return 2952*2d543d20SAndroid Build Coastguard Worker 2953*2d543d20SAndroid Build Coastguard Worker if heading: 2954*2d543d20SAndroid Build Coastguard Worker print("%-30s %s %s %s\n" % (_("SELinux boolean"), _("State"), _("Default"), _("Description"))) 2955*2d543d20SAndroid Build Coastguard Worker for k in sorted(ddict.keys()): 2956*2d543d20SAndroid Build Coastguard Worker if ddict[k]: 2957*2d543d20SAndroid Build Coastguard Worker print("%-30s (%-5s,%5s) %s" % (k, on_off[ddict[k][2]], on_off[ddict[k][0]], self.get_desc(k))) 2958