xref: /aosp_15_r20/external/selinux/gui/fcontextPage.py (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker## fcontextPage.py - show selinux mappings
2*2d543d20SAndroid Build Coastguard Worker## Copyright (C) 2006 Red Hat, Inc.
3*2d543d20SAndroid Build Coastguard Worker
4*2d543d20SAndroid Build Coastguard Worker## This program is free software; you can redistribute it and/or modify
5*2d543d20SAndroid Build Coastguard Worker## it under the terms of the GNU General Public License as published by
6*2d543d20SAndroid Build Coastguard Worker## the Free Software Foundation; either version 2 of the License, or
7*2d543d20SAndroid Build Coastguard Worker## (at your option) any later version.
8*2d543d20SAndroid Build Coastguard Worker
9*2d543d20SAndroid Build Coastguard Worker## This program is distributed in the hope that it will be useful,
10*2d543d20SAndroid Build Coastguard Worker## but WITHOUT ANY WARRANTY; without even the implied warranty of
11*2d543d20SAndroid Build Coastguard Worker## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*2d543d20SAndroid Build Coastguard Worker## GNU General Public License for more details.
13*2d543d20SAndroid Build Coastguard Worker
14*2d543d20SAndroid Build Coastguard Worker## You should have received a copy of the GNU General Public License
15*2d543d20SAndroid Build Coastguard Worker## along with this program; if not, write to the Free Software
16*2d543d20SAndroid Build Coastguard Worker## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17*2d543d20SAndroid Build Coastguard Worker
18*2d543d20SAndroid Build Coastguard Worker## Author: Dan Walsh
19*2d543d20SAndroid Build Coastguard Workerfrom gi.repository import GObject, Gtk
20*2d543d20SAndroid Build Coastguard Workerimport seobject
21*2d543d20SAndroid Build Coastguard Workertry:
22*2d543d20SAndroid Build Coastguard Worker    from subprocess import getstatusoutput
23*2d543d20SAndroid Build Coastguard Workerexcept ImportError:
24*2d543d20SAndroid Build Coastguard Worker    from commands import getstatusoutput
25*2d543d20SAndroid Build Coastguard Worker
26*2d543d20SAndroid Build Coastguard Workerfrom semanagePage import *
27*2d543d20SAndroid Build Coastguard Worker
28*2d543d20SAndroid Build Coastguard WorkerSPEC_COL = 0
29*2d543d20SAndroid Build Coastguard WorkerTYPE_COL = 1
30*2d543d20SAndroid Build Coastguard WorkerFTYPE_COL = 2
31*2d543d20SAndroid Build Coastguard Worker
32*2d543d20SAndroid Build Coastguard Worker
33*2d543d20SAndroid Build Coastguard Workerclass context:
34*2d543d20SAndroid Build Coastguard Worker
35*2d543d20SAndroid Build Coastguard Worker    def __init__(self, scontext):
36*2d543d20SAndroid Build Coastguard Worker        self.scontext = scontext
37*2d543d20SAndroid Build Coastguard Worker        con = scontext.split(":")
38*2d543d20SAndroid Build Coastguard Worker        self.type = con[0]
39*2d543d20SAndroid Build Coastguard Worker        if len(con) > 1:
40*2d543d20SAndroid Build Coastguard Worker            self.mls = con[1]
41*2d543d20SAndroid Build Coastguard Worker        else:
42*2d543d20SAndroid Build Coastguard Worker            self.mls = "s0"
43*2d543d20SAndroid Build Coastguard Worker
44*2d543d20SAndroid Build Coastguard Worker    def __str__(self):
45*2d543d20SAndroid Build Coastguard Worker        return self.scontext
46*2d543d20SAndroid Build Coastguard Worker
47*2d543d20SAndroid Build Coastguard Worker##
48*2d543d20SAndroid Build Coastguard Worker## I18N
49*2d543d20SAndroid Build Coastguard Worker##
50*2d543d20SAndroid Build Coastguard WorkerPROGNAME = "selinux-gui"
51*2d543d20SAndroid Build Coastguard Workertry:
52*2d543d20SAndroid Build Coastguard Worker    import gettext
53*2d543d20SAndroid Build Coastguard Worker    kwargs = {}
54*2d543d20SAndroid Build Coastguard Worker    if sys.version_info < (3,):
55*2d543d20SAndroid Build Coastguard Worker        kwargs['unicode'] = True
56*2d543d20SAndroid Build Coastguard Worker    t = gettext.translation(PROGNAME,
57*2d543d20SAndroid Build Coastguard Worker                    localedir="/usr/share/locale",
58*2d543d20SAndroid Build Coastguard Worker                    **kwargs,
59*2d543d20SAndroid Build Coastguard Worker                    fallback=True)
60*2d543d20SAndroid Build Coastguard Worker    _ = t.gettext
61*2d543d20SAndroid Build Coastguard Workerexcept:
62*2d543d20SAndroid Build Coastguard Worker    try:
63*2d543d20SAndroid Build Coastguard Worker        import builtins
64*2d543d20SAndroid Build Coastguard Worker        builtins.__dict__['_'] = str
65*2d543d20SAndroid Build Coastguard Worker    except ImportError:
66*2d543d20SAndroid Build Coastguard Worker        import __builtin__
67*2d543d20SAndroid Build Coastguard Worker        __builtin__.__dict__['_'] = unicode
68*2d543d20SAndroid Build Coastguard Worker
69*2d543d20SAndroid Build Coastguard Worker
70*2d543d20SAndroid Build Coastguard Workerclass fcontextPage(semanagePage):
71*2d543d20SAndroid Build Coastguard Worker
72*2d543d20SAndroid Build Coastguard Worker    def __init__(self, xml):
73*2d543d20SAndroid Build Coastguard Worker        semanagePage.__init__(self, xml, "fcontext", _("File Labeling"))
74*2d543d20SAndroid Build Coastguard Worker        self.fcontextFilter = xml.get_object("fcontextFilterEntry")
75*2d543d20SAndroid Build Coastguard Worker        self.fcontextFilter.connect("focus_out_event", self.filter_changed)
76*2d543d20SAndroid Build Coastguard Worker        self.fcontextFilter.connect("activate", self.filter_changed)
77*2d543d20SAndroid Build Coastguard Worker
78*2d543d20SAndroid Build Coastguard Worker        self.store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING)
79*2d543d20SAndroid Build Coastguard Worker        self.view = xml.get_object("fcontextView")
80*2d543d20SAndroid Build Coastguard Worker        self.view.set_model(self.store)
81*2d543d20SAndroid Build Coastguard Worker        self.view.set_search_equal_func(self.search)
82*2d543d20SAndroid Build Coastguard Worker
83*2d543d20SAndroid Build Coastguard Worker        col = Gtk.TreeViewColumn(_("File\nSpecification"), Gtk.CellRendererText(), text=SPEC_COL)
84*2d543d20SAndroid Build Coastguard Worker        col.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
85*2d543d20SAndroid Build Coastguard Worker        col.set_fixed_width(250)
86*2d543d20SAndroid Build Coastguard Worker
87*2d543d20SAndroid Build Coastguard Worker        col.set_sort_column_id(SPEC_COL)
88*2d543d20SAndroid Build Coastguard Worker        col.set_resizable(True)
89*2d543d20SAndroid Build Coastguard Worker        self.view.append_column(col)
90*2d543d20SAndroid Build Coastguard Worker        col = Gtk.TreeViewColumn(_("Selinux\nFile Type"), Gtk.CellRendererText(), text=TYPE_COL)
91*2d543d20SAndroid Build Coastguard Worker
92*2d543d20SAndroid Build Coastguard Worker        col.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
93*2d543d20SAndroid Build Coastguard Worker        col.set_fixed_width(250)
94*2d543d20SAndroid Build Coastguard Worker        col.set_sort_column_id(TYPE_COL)
95*2d543d20SAndroid Build Coastguard Worker        col.set_resizable(True)
96*2d543d20SAndroid Build Coastguard Worker        self.view.append_column(col)
97*2d543d20SAndroid Build Coastguard Worker        col = Gtk.TreeViewColumn(_("File\nType"), Gtk.CellRendererText(), text=2)
98*2d543d20SAndroid Build Coastguard Worker        col.set_sort_column_id(FTYPE_COL)
99*2d543d20SAndroid Build Coastguard Worker        col.set_resizable(True)
100*2d543d20SAndroid Build Coastguard Worker        self.view.append_column(col)
101*2d543d20SAndroid Build Coastguard Worker
102*2d543d20SAndroid Build Coastguard Worker        self.store.set_sort_column_id(SPEC_COL, Gtk.SortType.ASCENDING)
103*2d543d20SAndroid Build Coastguard Worker        self.load()
104*2d543d20SAndroid Build Coastguard Worker        self.fcontextEntry = xml.get_object("fcontextEntry")
105*2d543d20SAndroid Build Coastguard Worker        self.fcontextFileTypeCombo = xml.get_object("fcontextFileTypeCombo")
106*2d543d20SAndroid Build Coastguard Worker        # Populate file type combo_box
107*2d543d20SAndroid Build Coastguard Worker        liststore = self.fcontextFileTypeCombo.get_model()
108*2d543d20SAndroid Build Coastguard Worker        for ftype in seobject.file_type_str_to_option.keys():
109*2d543d20SAndroid Build Coastguard Worker            iter = liststore.append()
110*2d543d20SAndroid Build Coastguard Worker            liststore.set_value(iter, 0, ftype)
111*2d543d20SAndroid Build Coastguard Worker        iter = liststore.get_iter_first()
112*2d543d20SAndroid Build Coastguard Worker        self.fcontextFileTypeCombo.set_active_iter(iter)
113*2d543d20SAndroid Build Coastguard Worker        self.fcontextTypeEntry = xml.get_object("fcontextTypeEntry")
114*2d543d20SAndroid Build Coastguard Worker        self.fcontextMLSEntry = xml.get_object("fcontextMLSEntry")
115*2d543d20SAndroid Build Coastguard Worker
116*2d543d20SAndroid Build Coastguard Worker    def match(self, fcon_dict, k, filter):
117*2d543d20SAndroid Build Coastguard Worker        try:
118*2d543d20SAndroid Build Coastguard Worker            f = filter.lower()
119*2d543d20SAndroid Build Coastguard Worker            for con in k:
120*2d543d20SAndroid Build Coastguard Worker                k = con.lower()
121*2d543d20SAndroid Build Coastguard Worker                if k.find(f) >= 0:
122*2d543d20SAndroid Build Coastguard Worker                    return True
123*2d543d20SAndroid Build Coastguard Worker            for con in fcon_dict[k]:
124*2d543d20SAndroid Build Coastguard Worker                k = con.lower()
125*2d543d20SAndroid Build Coastguard Worker                if k.find(f) >= 0:
126*2d543d20SAndroid Build Coastguard Worker                    return True
127*2d543d20SAndroid Build Coastguard Worker        except:
128*2d543d20SAndroid Build Coastguard Worker            pass
129*2d543d20SAndroid Build Coastguard Worker        return False
130*2d543d20SAndroid Build Coastguard Worker
131*2d543d20SAndroid Build Coastguard Worker    def load(self, filter=""):
132*2d543d20SAndroid Build Coastguard Worker        self.filter = filter
133*2d543d20SAndroid Build Coastguard Worker        self.fcontext = seobject.fcontextRecords()
134*2d543d20SAndroid Build Coastguard Worker        self.store.clear()
135*2d543d20SAndroid Build Coastguard Worker        fcon_dict = self.fcontext.get_all(self.local)
136*2d543d20SAndroid Build Coastguard Worker        if self.local:
137*2d543d20SAndroid Build Coastguard Worker            fkeys = fcon_dict.keys()
138*2d543d20SAndroid Build Coastguard Worker        else:
139*2d543d20SAndroid Build Coastguard Worker            fkeys = sorted(fcon_dict.keys())
140*2d543d20SAndroid Build Coastguard Worker        for k in fkeys:
141*2d543d20SAndroid Build Coastguard Worker            if not self.match(fcon_dict, k, filter):
142*2d543d20SAndroid Build Coastguard Worker                continue
143*2d543d20SAndroid Build Coastguard Worker            iter = self.store.append()
144*2d543d20SAndroid Build Coastguard Worker            self.store.set_value(iter, SPEC_COL, k[0])
145*2d543d20SAndroid Build Coastguard Worker            self.store.set_value(iter, FTYPE_COL, k[1])
146*2d543d20SAndroid Build Coastguard Worker            if fcon_dict[k]:
147*2d543d20SAndroid Build Coastguard Worker                rec = "%s:%s" % (fcon_dict[k][2], seobject.translate(fcon_dict[k][3], False))
148*2d543d20SAndroid Build Coastguard Worker            else:
149*2d543d20SAndroid Build Coastguard Worker                rec = "<<None>>"
150*2d543d20SAndroid Build Coastguard Worker            self.store.set_value(iter, TYPE_COL, rec)
151*2d543d20SAndroid Build Coastguard Worker        self.view.get_selection().select_path((0,))
152*2d543d20SAndroid Build Coastguard Worker
153*2d543d20SAndroid Build Coastguard Worker    def filter_changed(self, *arg):
154*2d543d20SAndroid Build Coastguard Worker        filter = arg[0].get_text()
155*2d543d20SAndroid Build Coastguard Worker        if filter != self.filter:
156*2d543d20SAndroid Build Coastguard Worker            self.load(filter)
157*2d543d20SAndroid Build Coastguard Worker
158*2d543d20SAndroid Build Coastguard Worker    def dialogInit(self):
159*2d543d20SAndroid Build Coastguard Worker        store, iter = self.view.get_selection().get_selected()
160*2d543d20SAndroid Build Coastguard Worker        self.fcontextEntry.set_text(store.get_value(iter, SPEC_COL))
161*2d543d20SAndroid Build Coastguard Worker        self.fcontextEntry.set_sensitive(False)
162*2d543d20SAndroid Build Coastguard Worker        scontext = store.get_value(iter, TYPE_COL)
163*2d543d20SAndroid Build Coastguard Worker        scon = context(scontext)
164*2d543d20SAndroid Build Coastguard Worker        self.fcontextTypeEntry.set_text(scon.type)
165*2d543d20SAndroid Build Coastguard Worker        self.fcontextMLSEntry.set_text(scon.mls)
166*2d543d20SAndroid Build Coastguard Worker        type = store.get_value(iter, FTYPE_COL)
167*2d543d20SAndroid Build Coastguard Worker        liststore = self.fcontextFileTypeCombo.get_model()
168*2d543d20SAndroid Build Coastguard Worker        iter = liststore.get_iter_first()
169*2d543d20SAndroid Build Coastguard Worker        while iter != None and liststore.get_value(iter, 0) != type:
170*2d543d20SAndroid Build Coastguard Worker            iter = liststore.iter_next(iter)
171*2d543d20SAndroid Build Coastguard Worker        if iter != None:
172*2d543d20SAndroid Build Coastguard Worker            self.fcontextFileTypeCombo.set_active_iter(iter)
173*2d543d20SAndroid Build Coastguard Worker        self.fcontextFileTypeCombo.set_sensitive(False)
174*2d543d20SAndroid Build Coastguard Worker
175*2d543d20SAndroid Build Coastguard Worker    def dialogClear(self):
176*2d543d20SAndroid Build Coastguard Worker        self.fcontextEntry.set_text("")
177*2d543d20SAndroid Build Coastguard Worker        self.fcontextEntry.set_sensitive(True)
178*2d543d20SAndroid Build Coastguard Worker        self.fcontextFileTypeCombo.set_sensitive(True)
179*2d543d20SAndroid Build Coastguard Worker        self.fcontextFileTypeCombo.set_active(0)
180*2d543d20SAndroid Build Coastguard Worker        self.fcontextTypeEntry.set_text("")
181*2d543d20SAndroid Build Coastguard Worker        self.fcontextMLSEntry.set_text("s0")
182*2d543d20SAndroid Build Coastguard Worker
183*2d543d20SAndroid Build Coastguard Worker    def delete(self):
184*2d543d20SAndroid Build Coastguard Worker        store, iter = self.view.get_selection().get_selected()
185*2d543d20SAndroid Build Coastguard Worker        try:
186*2d543d20SAndroid Build Coastguard Worker            fspec = store.get_value(iter, SPEC_COL)
187*2d543d20SAndroid Build Coastguard Worker            ftype = store.get_value(iter, FTYPE_COL)
188*2d543d20SAndroid Build Coastguard Worker            self.wait()
189*2d543d20SAndroid Build Coastguard Worker            (rc, out) = getstatusoutput("semanage fcontext -d -f '%s' '%s'" % (seobject.file_type_str_to_option[ftype], fspec))
190*2d543d20SAndroid Build Coastguard Worker            self.ready()
191*2d543d20SAndroid Build Coastguard Worker
192*2d543d20SAndroid Build Coastguard Worker            if rc != 0:
193*2d543d20SAndroid Build Coastguard Worker                return self.error(out)
194*2d543d20SAndroid Build Coastguard Worker            store.remove(iter)
195*2d543d20SAndroid Build Coastguard Worker            self.view.get_selection().select_path((0,))
196*2d543d20SAndroid Build Coastguard Worker        except ValueError as e:
197*2d543d20SAndroid Build Coastguard Worker            self.error(e.args[0])
198*2d543d20SAndroid Build Coastguard Worker
199*2d543d20SAndroid Build Coastguard Worker    def add(self):
200*2d543d20SAndroid Build Coastguard Worker        fspec = self.fcontextEntry.get_text().strip()
201*2d543d20SAndroid Build Coastguard Worker        type = self.fcontextTypeEntry.get_text().strip()
202*2d543d20SAndroid Build Coastguard Worker        mls = self.fcontextMLSEntry.get_text().strip()
203*2d543d20SAndroid Build Coastguard Worker        list_model = self.fcontextFileTypeCombo.get_model()
204*2d543d20SAndroid Build Coastguard Worker        it = self.fcontextFileTypeCombo.get_active_iter()
205*2d543d20SAndroid Build Coastguard Worker        ftype = list_model.get_value(it, 0)
206*2d543d20SAndroid Build Coastguard Worker        self.wait()
207*2d543d20SAndroid Build Coastguard Worker        (rc, out) = getstatusoutput("semanage fcontext -a -t %s -r %s -f '%s' '%s'" % (type, mls, seobject.file_type_str_to_option[ftype], fspec))
208*2d543d20SAndroid Build Coastguard Worker        self.ready()
209*2d543d20SAndroid Build Coastguard Worker        if rc != 0:
210*2d543d20SAndroid Build Coastguard Worker            self.error(out)
211*2d543d20SAndroid Build Coastguard Worker            return False
212*2d543d20SAndroid Build Coastguard Worker
213*2d543d20SAndroid Build Coastguard Worker        iter = self.store.append()
214*2d543d20SAndroid Build Coastguard Worker        self.store.set_value(iter, SPEC_COL, fspec)
215*2d543d20SAndroid Build Coastguard Worker        self.store.set_value(iter, FTYPE_COL, ftype)
216*2d543d20SAndroid Build Coastguard Worker        self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls))
217*2d543d20SAndroid Build Coastguard Worker
218*2d543d20SAndroid Build Coastguard Worker    def modify(self):
219*2d543d20SAndroid Build Coastguard Worker        fspec = self.fcontextEntry.get_text().strip()
220*2d543d20SAndroid Build Coastguard Worker        type = self.fcontextTypeEntry.get_text().strip()
221*2d543d20SAndroid Build Coastguard Worker        mls = self.fcontextMLSEntry.get_text().strip()
222*2d543d20SAndroid Build Coastguard Worker        list_model = self.fcontextFileTypeCombo.get_model()
223*2d543d20SAndroid Build Coastguard Worker        iter = self.fcontextFileTypeCombo.get_active_iter()
224*2d543d20SAndroid Build Coastguard Worker        ftype = list_model.get_value(iter, 0)
225*2d543d20SAndroid Build Coastguard Worker        self.wait()
226*2d543d20SAndroid Build Coastguard Worker        (rc, out) = getstatusoutput("semanage fcontext -m -t %s -r %s -f '%s' '%s'" % (type, mls, seobject.file_type_str_to_option[ftype], fspec))
227*2d543d20SAndroid Build Coastguard Worker        self.ready()
228*2d543d20SAndroid Build Coastguard Worker        if rc != 0:
229*2d543d20SAndroid Build Coastguard Worker            self.error(out)
230*2d543d20SAndroid Build Coastguard Worker            return False
231*2d543d20SAndroid Build Coastguard Worker
232*2d543d20SAndroid Build Coastguard Worker        store, iter = self.view.get_selection().get_selected()
233*2d543d20SAndroid Build Coastguard Worker        self.store.set_value(iter, SPEC_COL, fspec)
234*2d543d20SAndroid Build Coastguard Worker        self.store.set_value(iter, FTYPE_COL, ftype)
235*2d543d20SAndroid Build Coastguard Worker        self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls))
236