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