1514af85b89fff54f079f239294c727e4d61319edDan Walsh## fcontextPage.py - show selinux mappings
2514af85b89fff54f079f239294c727e4d61319edDan Walsh## Copyright (C) 2006 Red Hat, Inc.
3514af85b89fff54f079f239294c727e4d61319edDan Walsh
4514af85b89fff54f079f239294c727e4d61319edDan Walsh## This program is free software; you can redistribute it and/or modify
5514af85b89fff54f079f239294c727e4d61319edDan Walsh## it under the terms of the GNU General Public License as published by
6514af85b89fff54f079f239294c727e4d61319edDan Walsh## the Free Software Foundation; either version 2 of the License, or
7514af85b89fff54f079f239294c727e4d61319edDan Walsh## (at your option) any later version.
8514af85b89fff54f079f239294c727e4d61319edDan Walsh
9514af85b89fff54f079f239294c727e4d61319edDan Walsh## This program is distributed in the hope that it will be useful,
10514af85b89fff54f079f239294c727e4d61319edDan Walsh## but WITHOUT ANY WARRANTY; without even the implied warranty of
11514af85b89fff54f079f239294c727e4d61319edDan Walsh## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12514af85b89fff54f079f239294c727e4d61319edDan Walsh## GNU General Public License for more details.
13514af85b89fff54f079f239294c727e4d61319edDan Walsh
14514af85b89fff54f079f239294c727e4d61319edDan Walsh## You should have received a copy of the GNU General Public License
15514af85b89fff54f079f239294c727e4d61319edDan Walsh## along with this program; if not, write to the Free Software
16514af85b89fff54f079f239294c727e4d61319edDan Walsh## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17514af85b89fff54f079f239294c727e4d61319edDan Walsh
18514af85b89fff54f079f239294c727e4d61319edDan Walsh## Author: Dan Walsh
19514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk
20514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk.glade
21514af85b89fff54f079f239294c727e4d61319edDan Walshimport os
22514af85b89fff54f079f239294c727e4d61319edDan Walshimport gobject
23514af85b89fff54f079f239294c727e4d61319edDan Walshimport seobject
24514af85b89fff54f079f239294c727e4d61319edDan Walshimport commands
25789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zamanfrom semanagePage import *
26514af85b89fff54f079f239294c727e4d61319edDan Walsh
27514af85b89fff54f079f239294c727e4d61319edDan WalshSPEC_COL = 0
28514af85b89fff54f079f239294c727e4d61319edDan WalshTYPE_COL = 1
29514af85b89fff54f079f239294c727e4d61319edDan WalshFTYPE_COL = 2
30514af85b89fff54f079f239294c727e4d61319edDan Walsh
31789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman
32514af85b89fff54f079f239294c727e4d61319edDan Walshclass context:
33789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman
34514af85b89fff54f079f239294c727e4d61319edDan Walsh    def __init__(self, scontext):
35514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.scontext = scontext
36789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        con = scontext.split(":")
37514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.type = con[0]
38514af85b89fff54f079f239294c727e4d61319edDan Walsh        if len(con) > 1:
39514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.mls = con[1]
40514af85b89fff54f079f239294c727e4d61319edDan Walsh        else:
41514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.mls = "s0"
42514af85b89fff54f079f239294c727e4d61319edDan Walsh
43514af85b89fff54f079f239294c727e4d61319edDan Walsh    def __str__(self):
44514af85b89fff54f079f239294c727e4d61319edDan Walsh        return self.scontext
45514af85b89fff54f079f239294c727e4d61319edDan Walsh
46514af85b89fff54f079f239294c727e4d61319edDan Walsh##
47514af85b89fff54f079f239294c727e4d61319edDan Walsh## I18N
48514af85b89fff54f079f239294c727e4d61319edDan Walsh##
49789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason ZamanPROGNAME = "policycoreutils"
50514af85b89fff54f079f239294c727e4d61319edDan Walsh
51514af85b89fff54f079f239294c727e4d61319edDan Walshimport gettext
52514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.bindtextdomain(PROGNAME, "/usr/share/locale")
53514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.textdomain(PROGNAME)
54514af85b89fff54f079f239294c727e4d61319edDan Walshtry:
55514af85b89fff54f079f239294c727e4d61319edDan Walsh    gettext.install(PROGNAME,
56514af85b89fff54f079f239294c727e4d61319edDan Walsh                    localedir="/usr/share/locale",
57514af85b89fff54f079f239294c727e4d61319edDan Walsh                    unicode=False,
58789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman                    codeset='utf-8')
59514af85b89fff54f079f239294c727e4d61319edDan Walshexcept IOError:
60514af85b89fff54f079f239294c727e4d61319edDan Walsh    import __builtin__
61514af85b89fff54f079f239294c727e4d61319edDan Walsh    __builtin__.__dict__['_'] = unicode
62514af85b89fff54f079f239294c727e4d61319edDan Walsh
63514af85b89fff54f079f239294c727e4d61319edDan Walsh
64514af85b89fff54f079f239294c727e4d61319edDan Walshclass fcontextPage(semanagePage):
65789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman
66514af85b89fff54f079f239294c727e4d61319edDan Walsh    def __init__(self, xml):
67514af85b89fff54f079f239294c727e4d61319edDan Walsh        semanagePage.__init__(self, xml, "fcontext", _("File Labeling"))
68514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextFilter = xml.get_widget("fcontextFilterEntry")
69514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextFilter.connect("focus_out_event", self.filter_changed)
70514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextFilter.connect("activate", self.filter_changed)
71514af85b89fff54f079f239294c727e4d61319edDan Walsh
72514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
73514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view = xml.get_widget("fcontextView")
74514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.set_model(self.store)
75514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.set_search_equal_func(self.search)
76514af85b89fff54f079f239294c727e4d61319edDan Walsh
77514af85b89fff54f079f239294c727e4d61319edDan Walsh        col = gtk.TreeViewColumn(_("File\nSpecification"), gtk.CellRendererText(), text=SPEC_COL)
78789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
79789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        col.set_fixed_width(250)
80514af85b89fff54f079f239294c727e4d61319edDan Walsh
81514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_sort_column_id(SPEC_COL)
82514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_resizable(True)
83514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.append_column(col)
84514af85b89fff54f079f239294c727e4d61319edDan Walsh        col = gtk.TreeViewColumn(_("Selinux\nFile Type"), gtk.CellRendererText(), text=TYPE_COL)
85514af85b89fff54f079f239294c727e4d61319edDan Walsh
86789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
87789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        col.set_fixed_width(250)
88514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_sort_column_id(TYPE_COL)
89514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_resizable(True)
90514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.append_column(col)
91514af85b89fff54f079f239294c727e4d61319edDan Walsh        col = gtk.TreeViewColumn(_("File\nType"), gtk.CellRendererText(), text=2)
92514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_sort_column_id(FTYPE_COL)
93514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_resizable(True)
94514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.append_column(col)
95514af85b89fff54f079f239294c727e4d61319edDan Walsh
96514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_sort_column_id(SPEC_COL, gtk.SORT_ASCENDING)
97514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.load()
98514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextEntry = xml.get_widget("fcontextEntry")
99514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextFileTypeCombo = xml.get_widget("fcontextFileTypeCombo")
100789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        liststore = self.fcontextFileTypeCombo.get_model()
101514af85b89fff54f079f239294c727e4d61319edDan Walsh        for k in seobject.file_types:
102789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman            if len(k) > 0 and k[0] != '-':
103789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman                iter = liststore.append()
104514af85b89fff54f079f239294c727e4d61319edDan Walsh                liststore.set_value(iter, 0, k)
105514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = liststore.get_iter_first()
106514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextFileTypeCombo.set_active_iter(iter)
107514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextTypeEntry = xml.get_widget("fcontextTypeEntry")
108514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextMLSEntry = xml.get_widget("fcontextMLSEntry")
109514af85b89fff54f079f239294c727e4d61319edDan Walsh
110514af85b89fff54f079f239294c727e4d61319edDan Walsh    def match(self, fcon_dict, k, filter):
111514af85b89fff54f079f239294c727e4d61319edDan Walsh        try:
112789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman            f = filter.lower()
113514af85b89fff54f079f239294c727e4d61319edDan Walsh            for con in k:
114789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman                k = con.lower()
115514af85b89fff54f079f239294c727e4d61319edDan Walsh                if k.find(f) >= 0:
116514af85b89fff54f079f239294c727e4d61319edDan Walsh                    return True
117514af85b89fff54f079f239294c727e4d61319edDan Walsh            for con in fcon_dict[k]:
118789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman                k = con.lower()
119514af85b89fff54f079f239294c727e4d61319edDan Walsh                if k.find(f) >= 0:
120514af85b89fff54f079f239294c727e4d61319edDan Walsh                    return True
121514af85b89fff54f079f239294c727e4d61319edDan Walsh        except:
122514af85b89fff54f079f239294c727e4d61319edDan Walsh            pass
123514af85b89fff54f079f239294c727e4d61319edDan Walsh        return False
124514af85b89fff54f079f239294c727e4d61319edDan Walsh
125514af85b89fff54f079f239294c727e4d61319edDan Walsh    def load(self, filter=""):
126789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        self.filter = filter
127789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        self.fcontext = seobject.fcontextRecords()
128514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.clear()
129789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        fcon_dict = self.fcontext.get_all(self.local)
130514af85b89fff54f079f239294c727e4d61319edDan Walsh        keys = fcon_dict.keys()
131514af85b89fff54f079f239294c727e4d61319edDan Walsh        keys.sort()
132514af85b89fff54f079f239294c727e4d61319edDan Walsh        for k in keys:
133514af85b89fff54f079f239294c727e4d61319edDan Walsh            if not self.match(fcon_dict, k, filter):
134514af85b89fff54f079f239294c727e4d61319edDan Walsh                continue
135789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman            iter = self.store.append()
136514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, SPEC_COL, k[0])
137514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, FTYPE_COL, k[1])
138514af85b89fff54f079f239294c727e4d61319edDan Walsh            if fcon_dict[k]:
139789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman                rec = "%s:%s" % (fcon_dict[k][2], seobject.translate(fcon_dict[k][3], False))
140514af85b89fff54f079f239294c727e4d61319edDan Walsh            else:
141789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman                rec = "<<None>>"
142514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, TYPE_COL, rec)
143789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        self.view.get_selection().select_path((0,))
144514af85b89fff54f079f239294c727e4d61319edDan Walsh
145514af85b89fff54f079f239294c727e4d61319edDan Walsh    def filter_changed(self, *arg):
146789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        filter = arg[0].get_text()
147514af85b89fff54f079f239294c727e4d61319edDan Walsh        if filter != self.filter:
148514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.load(filter)
149514af85b89fff54f079f239294c727e4d61319edDan Walsh
150514af85b89fff54f079f239294c727e4d61319edDan Walsh    def dialogInit(self):
151514af85b89fff54f079f239294c727e4d61319edDan Walsh        store, iter = self.view.get_selection().get_selected()
152514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextEntry.set_text(store.get_value(iter, SPEC_COL))
153514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextEntry.set_sensitive(False)
154514af85b89fff54f079f239294c727e4d61319edDan Walsh        scontext = store.get_value(iter, TYPE_COL)
155789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        scon = context(scontext)
156514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextTypeEntry.set_text(scon.type)
157514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextMLSEntry.set_text(scon.mls)
158789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        type = store.get_value(iter, FTYPE_COL)
159789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        liststore = self.fcontextFileTypeCombo.get_model()
160514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = liststore.get_iter_first()
161789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        while iter != None and liststore.get_value(iter, 0) != type:
162514af85b89fff54f079f239294c727e4d61319edDan Walsh            iter = liststore.iter_next(iter)
163514af85b89fff54f079f239294c727e4d61319edDan Walsh        if iter != None:
164514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.fcontextFileTypeCombo.set_active_iter(iter)
165514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextFileTypeCombo.set_sensitive(False)
166514af85b89fff54f079f239294c727e4d61319edDan Walsh
167514af85b89fff54f079f239294c727e4d61319edDan Walsh    def dialogClear(self):
168514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextEntry.set_text("")
169514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextEntry.set_sensitive(True)
170514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextFileTypeCombo.set_sensitive(True)
171514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextTypeEntry.set_text("")
172514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.fcontextMLSEntry.set_text("s0")
173514af85b89fff54f079f239294c727e4d61319edDan Walsh
174514af85b89fff54f079f239294c727e4d61319edDan Walsh    def delete(self):
175514af85b89fff54f079f239294c727e4d61319edDan Walsh        store, iter = self.view.get_selection().get_selected()
176514af85b89fff54f079f239294c727e4d61319edDan Walsh        try:
177789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman            fspec = store.get_value(iter, SPEC_COL)
178789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman            ftype = store.get_value(iter, FTYPE_COL)
179514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.wait()
180514af85b89fff54f079f239294c727e4d61319edDan Walsh            (rc, out) = commands.getstatusoutput("semanage fcontext -d -f '%s' '%s'" % (ftype, fspec))
181514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.ready()
182514af85b89fff54f079f239294c727e4d61319edDan Walsh
183514af85b89fff54f079f239294c727e4d61319edDan Walsh            if rc != 0:
184514af85b89fff54f079f239294c727e4d61319edDan Walsh                return self.error(out)
185514af85b89fff54f079f239294c727e4d61319edDan Walsh            store.remove(iter)
186789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman            self.view.get_selection().select_path((0,))
187514af85b89fff54f079f239294c727e4d61319edDan Walsh        except ValueError, e:
188514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.error(e.args[0])
189514af85b89fff54f079f239294c727e4d61319edDan Walsh
190514af85b89fff54f079f239294c727e4d61319edDan Walsh    def add(self):
191789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        ftype = ["", "--", "-d", "-c", "-b", "-s", "-l", "-p"]
192789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        fspec = self.fcontextEntry.get_text().strip()
193789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        type = self.fcontextTypeEntry.get_text().strip()
194789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        mls = self.fcontextMLSEntry.get_text().strip()
195789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        list_model = self.fcontextFileTypeCombo.get_model()
196514af85b89fff54f079f239294c727e4d61319edDan Walsh        active = self.fcontextFileTypeCombo.get_active()
197514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.wait()
198514af85b89fff54f079f239294c727e4d61319edDan Walsh        (rc, out) = commands.getstatusoutput("semanage fcontext -a -t %s -r %s -f '%s' '%s'" % (type, mls, ftype[active], fspec))
199514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ready()
200514af85b89fff54f079f239294c727e4d61319edDan Walsh        if rc != 0:
201514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.error(out)
202514af85b89fff54f079f239294c727e4d61319edDan Walsh            return False
203514af85b89fff54f079f239294c727e4d61319edDan Walsh
204789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        iter = self.store.append()
205514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, SPEC_COL, fspec)
206514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, FTYPE_COL, ftype)
207514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls))
208514af85b89fff54f079f239294c727e4d61319edDan Walsh
209514af85b89fff54f079f239294c727e4d61319edDan Walsh    def modify(self):
210789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        fspec = self.fcontextEntry.get_text().strip()
211789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        type = self.fcontextTypeEntry.get_text().strip()
212789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        mls = self.fcontextMLSEntry.get_text().strip()
213789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        list_model = self.fcontextFileTypeCombo.get_model()
214514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = self.fcontextFileTypeCombo.get_active_iter()
215789d0ebbf9fa448b09917ccd0adff91d72e9f5c1Jason Zaman        ftype = list_model.get_value(iter, 0)
216514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.wait()
217514af85b89fff54f079f239294c727e4d61319edDan Walsh        (rc, out) = commands.getstatusoutput("semanage fcontext -m -t %s -r %s -f '%s' '%s'" % (type, mls, ftype, fspec))
218514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ready()
219514af85b89fff54f079f239294c727e4d61319edDan Walsh        if rc != 0:
220514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.error(out)
221514af85b89fff54f079f239294c727e4d61319edDan Walsh            return False
222514af85b89fff54f079f239294c727e4d61319edDan Walsh
223514af85b89fff54f079f239294c727e4d61319edDan Walsh        store, iter = self.view.get_selection().get_selected()
224514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, SPEC_COL, fspec)
225514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, FTYPE_COL, ftype)
226514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, TYPE_COL, "%s:%s" % (type, mls))
227