xref: /aosp_15_r20/external/selinux/python/semanage/seobject.py (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
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