xref: /aosp_15_r20/external/selinux/python/sepolgen/tests/test_access.py (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker# Authors: Karl MacMillan <[email protected]>
2*2d543d20SAndroid Build Coastguard Worker#
3*2d543d20SAndroid Build Coastguard Worker# Copyright (C) 2006 Red Hat
4*2d543d20SAndroid Build Coastguard Worker# see file 'COPYING' for use and warranty information
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; version 2 only
9*2d543d20SAndroid Build Coastguard Worker#
10*2d543d20SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful,
11*2d543d20SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of
12*2d543d20SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*2d543d20SAndroid Build Coastguard Worker# GNU General Public License for more details.
14*2d543d20SAndroid Build Coastguard Worker#
15*2d543d20SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License
16*2d543d20SAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software
17*2d543d20SAndroid Build Coastguard Worker# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18*2d543d20SAndroid Build Coastguard Worker#
19*2d543d20SAndroid Build Coastguard Worker
20*2d543d20SAndroid Build Coastguard Workerimport unittest
21*2d543d20SAndroid Build Coastguard Workerimport sepolgen.refpolicy as refpolicy
22*2d543d20SAndroid Build Coastguard Workerimport sepolgen.refparser as refparser
23*2d543d20SAndroid Build Coastguard Workerimport sepolgen.policygen as policygen
24*2d543d20SAndroid Build Coastguard Workerimport sepolgen.access as access
25*2d543d20SAndroid Build Coastguard Worker
26*2d543d20SAndroid Build Coastguard Workerclass TestAccessVector(unittest.TestCase):
27*2d543d20SAndroid Build Coastguard Worker    def test_init(self):
28*2d543d20SAndroid Build Coastguard Worker        # Default construction
29*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector()
30*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.src_type, None)
31*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.tgt_type, None)
32*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.obj_class, None)
33*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(isinstance(a.perms, refpolicy.IdSet))
34*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(isinstance(a.audit_msgs, type([])))
35*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(isinstance(a.xperms, type({})))
36*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(a.audit_msgs), 0)
37*2d543d20SAndroid Build Coastguard Worker
38*2d543d20SAndroid Build Coastguard Worker        # Construction from a list
39*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector()
40*2d543d20SAndroid Build Coastguard Worker        a.src_type = "foo"
41*2d543d20SAndroid Build Coastguard Worker        a.tgt_type = "bar"
42*2d543d20SAndroid Build Coastguard Worker        a.obj_class = "file"
43*2d543d20SAndroid Build Coastguard Worker        a.perms.update(["read", "write"])
44*2d543d20SAndroid Build Coastguard Worker
45*2d543d20SAndroid Build Coastguard Worker        l = access.AccessVector(['foo', 'bar', 'file', 'read', 'write'])
46*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.src_type, l.src_type)
47*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.tgt_type, l.tgt_type)
48*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.obj_class, l.obj_class)
49*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.perms, l.perms)
50*2d543d20SAndroid Build Coastguard Worker
51*2d543d20SAndroid Build Coastguard Worker    def test_from_list(self):
52*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector()
53*2d543d20SAndroid Build Coastguard Worker        a.src_type = "foo"
54*2d543d20SAndroid Build Coastguard Worker        a.tgt_type = "bar"
55*2d543d20SAndroid Build Coastguard Worker        a.obj_class = "file"
56*2d543d20SAndroid Build Coastguard Worker        a.perms.update(["read", "write"])
57*2d543d20SAndroid Build Coastguard Worker
58*2d543d20SAndroid Build Coastguard Worker        l = access.AccessVector()
59*2d543d20SAndroid Build Coastguard Worker        l.from_list(['foo', 'bar', 'file', 'read', 'write'])
60*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.src_type, l.src_type)
61*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.tgt_type, l.tgt_type)
62*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.obj_class, l.obj_class)
63*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.perms, l.perms)
64*2d543d20SAndroid Build Coastguard Worker
65*2d543d20SAndroid Build Coastguard Worker        l2 = access.AccessVector()
66*2d543d20SAndroid Build Coastguard Worker        with self.assertRaises(ValueError):
67*2d543d20SAndroid Build Coastguard Worker            l2.from_list(['foo', 'bar', 'file'])
68*2d543d20SAndroid Build Coastguard Worker
69*2d543d20SAndroid Build Coastguard Worker    def test_to_list(self):
70*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector()
71*2d543d20SAndroid Build Coastguard Worker        a.src_type = "foo"
72*2d543d20SAndroid Build Coastguard Worker        a.tgt_type = "bar"
73*2d543d20SAndroid Build Coastguard Worker        a.obj_class = "file"
74*2d543d20SAndroid Build Coastguard Worker        a.perms.update(["read", "write"])
75*2d543d20SAndroid Build Coastguard Worker
76*2d543d20SAndroid Build Coastguard Worker        l = a.to_list()
77*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(l[0], "foo")
78*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(l[1], "bar")
79*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(l[2], "file")
80*2d543d20SAndroid Build Coastguard Worker        perms = l[3:]
81*2d543d20SAndroid Build Coastguard Worker        perms.sort()
82*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(perms[0], "read")
83*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(perms[1], "write")
84*2d543d20SAndroid Build Coastguard Worker
85*2d543d20SAndroid Build Coastguard Worker    def test_to_string(self):
86*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector()
87*2d543d20SAndroid Build Coastguard Worker        a.src_type = "foo"
88*2d543d20SAndroid Build Coastguard Worker        a.tgt_type = "bar"
89*2d543d20SAndroid Build Coastguard Worker        a.obj_class = "file"
90*2d543d20SAndroid Build Coastguard Worker        a.perms.update(["read", "write"])
91*2d543d20SAndroid Build Coastguard Worker
92*2d543d20SAndroid Build Coastguard Worker        first, second = str(a).split(':')
93*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(first, "allow foo bar")
94*2d543d20SAndroid Build Coastguard Worker        second = second.split(' ')
95*2d543d20SAndroid Build Coastguard Worker        second.sort()
96*2d543d20SAndroid Build Coastguard Worker        expected = "file { read write };".split(' ')
97*2d543d20SAndroid Build Coastguard Worker        expected.sort()
98*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(second, expected)
99*2d543d20SAndroid Build Coastguard Worker
100*2d543d20SAndroid Build Coastguard Worker        first, second = a.to_string().split(':')
101*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(first, "allow foo bar")
102*2d543d20SAndroid Build Coastguard Worker        second = second.split(' ')
103*2d543d20SAndroid Build Coastguard Worker        second.sort()
104*2d543d20SAndroid Build Coastguard Worker        expected = "file { read write };".split(' ')
105*2d543d20SAndroid Build Coastguard Worker        expected.sort()
106*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(second, expected)
107*2d543d20SAndroid Build Coastguard Worker
108*2d543d20SAndroid Build Coastguard Worker    def test_cmp(self):
109*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector()
110*2d543d20SAndroid Build Coastguard Worker        a.src_type = "foo"
111*2d543d20SAndroid Build Coastguard Worker        a.tgt_type = "bar"
112*2d543d20SAndroid Build Coastguard Worker        a.obj_class = "file"
113*2d543d20SAndroid Build Coastguard Worker        a.perms.update(["read", "write"])
114*2d543d20SAndroid Build Coastguard Worker
115*2d543d20SAndroid Build Coastguard Worker        b = access.AccessVector()
116*2d543d20SAndroid Build Coastguard Worker        b.src_type = "foo"
117*2d543d20SAndroid Build Coastguard Worker        b.tgt_type = "bar"
118*2d543d20SAndroid Build Coastguard Worker        b.obj_class = "file"
119*2d543d20SAndroid Build Coastguard Worker        b.perms.update(["read", "write"])
120*2d543d20SAndroid Build Coastguard Worker
121*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a, b)
122*2d543d20SAndroid Build Coastguard Worker
123*2d543d20SAndroid Build Coastguard Worker        # Source Type
124*2d543d20SAndroid Build Coastguard Worker        b.src_type = "baz"
125*2d543d20SAndroid Build Coastguard Worker        self.assertNotEqual(a, b)
126*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(a > b)
127*2d543d20SAndroid Build Coastguard Worker
128*2d543d20SAndroid Build Coastguard Worker        b.src_type = "gaz"
129*2d543d20SAndroid Build Coastguard Worker        self.assertNotEqual(a, b)
130*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(a < b)
131*2d543d20SAndroid Build Coastguard Worker
132*2d543d20SAndroid Build Coastguard Worker        # Target Type
133*2d543d20SAndroid Build Coastguard Worker        b.src_type = "foo"
134*2d543d20SAndroid Build Coastguard Worker        b.tgt_type = "aar"
135*2d543d20SAndroid Build Coastguard Worker        self.assertNotEqual(a, b)
136*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(a > b)
137*2d543d20SAndroid Build Coastguard Worker
138*2d543d20SAndroid Build Coastguard Worker        b.tgt_type = "gaz"
139*2d543d20SAndroid Build Coastguard Worker        self.assertNotEqual(a, b)
140*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(a < b)
141*2d543d20SAndroid Build Coastguard Worker
142*2d543d20SAndroid Build Coastguard Worker        # Perms
143*2d543d20SAndroid Build Coastguard Worker        b.tgt_type = "bar"
144*2d543d20SAndroid Build Coastguard Worker        b.perms = refpolicy.IdSet(["read"])
145*2d543d20SAndroid Build Coastguard Worker        self.assertNotEqual(a, b)
146*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(a > b)
147*2d543d20SAndroid Build Coastguard Worker
148*2d543d20SAndroid Build Coastguard Worker        b.perms = refpolicy.IdSet(["read", "write", "append"])
149*2d543d20SAndroid Build Coastguard Worker        self.assertNotEqual(a, b)
150*2d543d20SAndroid Build Coastguard Worker
151*2d543d20SAndroid Build Coastguard Worker        b.perms = refpolicy.IdSet(["read", "append"])
152*2d543d20SAndroid Build Coastguard Worker        self.assertNotEqual(a, b)
153*2d543d20SAndroid Build Coastguard Worker
154*2d543d20SAndroid Build Coastguard Worker    def test_merge_noxperm(self):
155*2d543d20SAndroid Build Coastguard Worker        """Test merging two AVs without xperms"""
156*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector(["foo", "bar", "file", "read", "write"])
157*2d543d20SAndroid Build Coastguard Worker        b = access.AccessVector(["foo", "bar", "file", "append"])
158*2d543d20SAndroid Build Coastguard Worker
159*2d543d20SAndroid Build Coastguard Worker        a.merge(b)
160*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(sorted(list(a.perms)), ["append", "read", "write"])
161*2d543d20SAndroid Build Coastguard Worker
162*2d543d20SAndroid Build Coastguard Worker    def text_merge_xperm1(self):
163*2d543d20SAndroid Build Coastguard Worker        """Test merging AV that contains xperms with AV that does not"""
164*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector(["foo", "bar", "file", "read"])
165*2d543d20SAndroid Build Coastguard Worker        b = access.AccessVector(["foo", "bar", "file", "read"])
166*2d543d20SAndroid Build Coastguard Worker        xp = refpolicy.XpermSet()
167*2d543d20SAndroid Build Coastguard Worker        xp.add(42)
168*2d543d20SAndroid Build Coastguard Worker        xp.add(12345)
169*2d543d20SAndroid Build Coastguard Worker        b.xperms = {"ioctl": xp}
170*2d543d20SAndroid Build Coastguard Worker
171*2d543d20SAndroid Build Coastguard Worker        a.merge(b)
172*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(sorted(list(a.perms)), ["append", "read", "write"])
173*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(list(a.xperms.keys()), ["ioctl"])
174*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x2a 0x3039 }")
175*2d543d20SAndroid Build Coastguard Worker
176*2d543d20SAndroid Build Coastguard Worker    def text_merge_xperm2(self):
177*2d543d20SAndroid Build Coastguard Worker        """Test merging AV that does not contain xperms with AV that does"""
178*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector(["foo", "bar", "file", "read"])
179*2d543d20SAndroid Build Coastguard Worker        xp = refpolicy.XpermSet()
180*2d543d20SAndroid Build Coastguard Worker        xp.add(42)
181*2d543d20SAndroid Build Coastguard Worker        xp.add(12345)
182*2d543d20SAndroid Build Coastguard Worker        a.xperms = {"ioctl": xp}
183*2d543d20SAndroid Build Coastguard Worker        b = access.AccessVector(["foo", "bar", "file", "read"])
184*2d543d20SAndroid Build Coastguard Worker
185*2d543d20SAndroid Build Coastguard Worker        a.merge(b)
186*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(sorted(list(a.perms)), ["append", "read", "write"])
187*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(list(a.xperms.keys()), ["ioctl"])
188*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x2a 0x3039 }")
189*2d543d20SAndroid Build Coastguard Worker
190*2d543d20SAndroid Build Coastguard Worker    def test_merge_xperm_diff_op(self):
191*2d543d20SAndroid Build Coastguard Worker        """Test merging two AVs that contain xperms with different operation"""
192*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector(["foo", "bar", "file", "read"])
193*2d543d20SAndroid Build Coastguard Worker        xp1 = refpolicy.XpermSet()
194*2d543d20SAndroid Build Coastguard Worker        xp1.add(23)
195*2d543d20SAndroid Build Coastguard Worker        a.xperms = {"asdf": xp1}
196*2d543d20SAndroid Build Coastguard Worker
197*2d543d20SAndroid Build Coastguard Worker        b = access.AccessVector(["foo", "bar", "file", "read"])
198*2d543d20SAndroid Build Coastguard Worker        xp2 = refpolicy.XpermSet()
199*2d543d20SAndroid Build Coastguard Worker        xp2.add(42)
200*2d543d20SAndroid Build Coastguard Worker        xp2.add(12345)
201*2d543d20SAndroid Build Coastguard Worker        b.xperms = {"ioctl": xp2}
202*2d543d20SAndroid Build Coastguard Worker
203*2d543d20SAndroid Build Coastguard Worker        a.merge(b)
204*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(list(a.perms), ["read"])
205*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(sorted(list(a.xperms.keys())), ["asdf", "ioctl"])
206*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.xperms["asdf"].to_string(), "0x17")
207*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x2a 0x3039 }")
208*2d543d20SAndroid Build Coastguard Worker
209*2d543d20SAndroid Build Coastguard Worker    def test_merge_xperm_same_op(self):
210*2d543d20SAndroid Build Coastguard Worker        """Test merging two AVs that contain xperms with same operation"""
211*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVector(["foo", "bar", "file", "read"])
212*2d543d20SAndroid Build Coastguard Worker        xp1 = refpolicy.XpermSet()
213*2d543d20SAndroid Build Coastguard Worker        xp1.add(23)
214*2d543d20SAndroid Build Coastguard Worker        a.xperms = {"ioctl": xp1}
215*2d543d20SAndroid Build Coastguard Worker
216*2d543d20SAndroid Build Coastguard Worker        b = access.AccessVector(["foo", "bar", "file", "read"])
217*2d543d20SAndroid Build Coastguard Worker        xp2 = refpolicy.XpermSet()
218*2d543d20SAndroid Build Coastguard Worker        xp2.add(42)
219*2d543d20SAndroid Build Coastguard Worker        xp2.add(12345)
220*2d543d20SAndroid Build Coastguard Worker        b.xperms = {"ioctl": xp2}
221*2d543d20SAndroid Build Coastguard Worker
222*2d543d20SAndroid Build Coastguard Worker        a.merge(b)
223*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(list(a.perms), ["read"])
224*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(list(a.xperms.keys()), ["ioctl"])
225*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(a.xperms["ioctl"].to_string(), "{ 0x17 0x2a 0x3039 }")
226*2d543d20SAndroid Build Coastguard Worker
227*2d543d20SAndroid Build Coastguard Workerclass TestUtilFunctions(unittest.TestCase):
228*2d543d20SAndroid Build Coastguard Worker    def test_is_idparam(self):
229*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(access.is_idparam("$1"))
230*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(access.is_idparam("$2"))
231*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(access.is_idparam("$123"))
232*2d543d20SAndroid Build Coastguard Worker        self.assertFalse(access.is_idparam("$123.23"))
233*2d543d20SAndroid Build Coastguard Worker        self.assertFalse(access.is_idparam("$A"))
234*2d543d20SAndroid Build Coastguard Worker
235*2d543d20SAndroid Build Coastguard Worker    def test_avrule_to_access_vectors(self):
236*2d543d20SAndroid Build Coastguard Worker        rule = refpolicy.AVRule()
237*2d543d20SAndroid Build Coastguard Worker        rule.src_types.add("foo")
238*2d543d20SAndroid Build Coastguard Worker        rule.src_types.add("baz")
239*2d543d20SAndroid Build Coastguard Worker        rule.tgt_types.add("bar")
240*2d543d20SAndroid Build Coastguard Worker        rule.tgt_types.add("what")
241*2d543d20SAndroid Build Coastguard Worker        rule.obj_classes.add("file")
242*2d543d20SAndroid Build Coastguard Worker        rule.obj_classes.add("dir")
243*2d543d20SAndroid Build Coastguard Worker        rule.perms.add("read")
244*2d543d20SAndroid Build Coastguard Worker        rule.perms.add("write")
245*2d543d20SAndroid Build Coastguard Worker
246*2d543d20SAndroid Build Coastguard Worker        avs = access.avrule_to_access_vectors(rule)
247*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(avs), 8)
248*2d543d20SAndroid Build Coastguard Worker        comps = [("foo", "what", "dir"),
249*2d543d20SAndroid Build Coastguard Worker                 ("foo", "what", "file"),
250*2d543d20SAndroid Build Coastguard Worker                 ("foo", "bar", "dir"),
251*2d543d20SAndroid Build Coastguard Worker                 ("foo", "bar", "file"),
252*2d543d20SAndroid Build Coastguard Worker                 ("baz", "what", "dir"),
253*2d543d20SAndroid Build Coastguard Worker                 ("baz", "what", "file"),
254*2d543d20SAndroid Build Coastguard Worker                 ("baz", "bar", "dir"),
255*2d543d20SAndroid Build Coastguard Worker                 ("baz", "bar", "file")]
256*2d543d20SAndroid Build Coastguard Worker        status = [False] * 8
257*2d543d20SAndroid Build Coastguard Worker        for av in access.avrule_to_access_vectors(rule):
258*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(av.perms, refpolicy.IdSet(["read", "write"]))
259*2d543d20SAndroid Build Coastguard Worker            for i in range(len(comps)):
260*2d543d20SAndroid Build Coastguard Worker                if comps[i][0] == av.src_type and \
261*2d543d20SAndroid Build Coastguard Worker                   comps[i][1] == av.tgt_type and \
262*2d543d20SAndroid Build Coastguard Worker                   comps[i][2] == av.obj_class:
263*2d543d20SAndroid Build Coastguard Worker                    status[i] = True
264*2d543d20SAndroid Build Coastguard Worker
265*2d543d20SAndroid Build Coastguard Worker        for s in status:
266*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(s, True)
267*2d543d20SAndroid Build Coastguard Worker
268*2d543d20SAndroid Build Coastguard Worker
269*2d543d20SAndroid Build Coastguard Workerclass TestAccessVectorSet(unittest.TestCase):
270*2d543d20SAndroid Build Coastguard Worker    def setUp(self):
271*2d543d20SAndroid Build Coastguard Worker        rule = refpolicy.AVRule()
272*2d543d20SAndroid Build Coastguard Worker        rule.src_types.add("foo")
273*2d543d20SAndroid Build Coastguard Worker        rule.src_types.add("baz")
274*2d543d20SAndroid Build Coastguard Worker        rule.tgt_types.add("bar")
275*2d543d20SAndroid Build Coastguard Worker        rule.tgt_types.add("what")
276*2d543d20SAndroid Build Coastguard Worker        rule.obj_classes.add("file")
277*2d543d20SAndroid Build Coastguard Worker        rule.obj_classes.add("dir")
278*2d543d20SAndroid Build Coastguard Worker        rule.perms.add("read")
279*2d543d20SAndroid Build Coastguard Worker        rule.perms.add("write")
280*2d543d20SAndroid Build Coastguard Worker
281*2d543d20SAndroid Build Coastguard Worker        s = access.AccessVectorSet()
282*2d543d20SAndroid Build Coastguard Worker        avs = access.avrule_to_access_vectors(rule)
283*2d543d20SAndroid Build Coastguard Worker        for av in avs:
284*2d543d20SAndroid Build Coastguard Worker            s.add_av(av)
285*2d543d20SAndroid Build Coastguard Worker        self.s = s
286*2d543d20SAndroid Build Coastguard Worker
287*2d543d20SAndroid Build Coastguard Worker    def test_init(self):
288*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVectorSet()
289*2d543d20SAndroid Build Coastguard Worker
290*2d543d20SAndroid Build Coastguard Worker    def test_iter(self):
291*2d543d20SAndroid Build Coastguard Worker        comps = [("foo", "what", "dir"),
292*2d543d20SAndroid Build Coastguard Worker                 ("foo", "what", "file"),
293*2d543d20SAndroid Build Coastguard Worker                 ("foo", "bar", "dir"),
294*2d543d20SAndroid Build Coastguard Worker                 ("foo", "bar", "file"),
295*2d543d20SAndroid Build Coastguard Worker                 ("baz", "what", "dir"),
296*2d543d20SAndroid Build Coastguard Worker                 ("baz", "what", "file"),
297*2d543d20SAndroid Build Coastguard Worker                 ("baz", "bar", "dir"),
298*2d543d20SAndroid Build Coastguard Worker                 ("baz", "bar", "file")]
299*2d543d20SAndroid Build Coastguard Worker        status = [False] * 8
300*2d543d20SAndroid Build Coastguard Worker        for av in self.s:
301*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(av.perms, refpolicy.IdSet(["read", "write"]))
302*2d543d20SAndroid Build Coastguard Worker            for i in range(len(comps)):
303*2d543d20SAndroid Build Coastguard Worker                if comps[i][0] == av.src_type and \
304*2d543d20SAndroid Build Coastguard Worker                   comps[i][1] == av.tgt_type and \
305*2d543d20SAndroid Build Coastguard Worker                   comps[i][2] == av.obj_class:
306*2d543d20SAndroid Build Coastguard Worker                    status[i] = True
307*2d543d20SAndroid Build Coastguard Worker
308*2d543d20SAndroid Build Coastguard Worker        for s in status:
309*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(s, True)
310*2d543d20SAndroid Build Coastguard Worker
311*2d543d20SAndroid Build Coastguard Worker    def test_len(self):
312*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(self.s), 8)
313*2d543d20SAndroid Build Coastguard Worker
314*2d543d20SAndroid Build Coastguard Worker    def test_list(self):
315*2d543d20SAndroid Build Coastguard Worker        a = access.AccessVectorSet()
316*2d543d20SAndroid Build Coastguard Worker        a.add("$1", "foo", "file", refpolicy.IdSet(["read", "write"]))
317*2d543d20SAndroid Build Coastguard Worker        a.add("$1", "bar", "file", refpolicy.IdSet(["read", "write"]))
318*2d543d20SAndroid Build Coastguard Worker        a.add("what", "bar", "file", refpolicy.IdSet(["read", "write"]))
319*2d543d20SAndroid Build Coastguard Worker
320*2d543d20SAndroid Build Coastguard Worker        avl = a.to_list()
321*2d543d20SAndroid Build Coastguard Worker        avl.sort()
322*2d543d20SAndroid Build Coastguard Worker
323*2d543d20SAndroid Build Coastguard Worker        test_l = [['what','bar','file','read','write'],
324*2d543d20SAndroid Build Coastguard Worker                  ['$1','foo','file','read','write'],
325*2d543d20SAndroid Build Coastguard Worker                  ['$1','bar','file','read','write']]
326*2d543d20SAndroid Build Coastguard Worker        test_l.sort()
327*2d543d20SAndroid Build Coastguard Worker
328*2d543d20SAndroid Build Coastguard Worker        for a,b in zip(test_l, avl):
329*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(len(a), len(b))
330*2d543d20SAndroid Build Coastguard Worker            for x,y in list(zip(a,b))[:3]:
331*2d543d20SAndroid Build Coastguard Worker                self.assertEqual(x, y)
332*2d543d20SAndroid Build Coastguard Worker            perms1 = a[3:]
333*2d543d20SAndroid Build Coastguard Worker            perms2 = b[3:]
334*2d543d20SAndroid Build Coastguard Worker            perms1.sort()
335*2d543d20SAndroid Build Coastguard Worker            perms2.sort()
336*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(perms1, perms2)
337*2d543d20SAndroid Build Coastguard Worker
338*2d543d20SAndroid Build Coastguard Worker        b = access.AccessVectorSet()
339*2d543d20SAndroid Build Coastguard Worker        b.from_list(avl)
340*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(b), 3)
341*2d543d20SAndroid Build Coastguard Worker
342*2d543d20SAndroid Build Coastguard Worker    def test_add_av_first(self):
343*2d543d20SAndroid Build Coastguard Worker        """Test adding first AV to the AV set"""
344*2d543d20SAndroid Build Coastguard Worker        avs = access.AccessVectorSet()
345*2d543d20SAndroid Build Coastguard Worker        av = access.AccessVector(['foo', 'bar', 'file', 'read'])
346*2d543d20SAndroid Build Coastguard Worker
347*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av)
348*2d543d20SAndroid Build Coastguard Worker
349*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(avs.to_list(), [['foo', 'bar', 'file', 'read']])
350*2d543d20SAndroid Build Coastguard Worker
351*2d543d20SAndroid Build Coastguard Worker    def test_add_av_second(self):
352*2d543d20SAndroid Build Coastguard Worker        """Test adding second AV to the AV set with same source and target
353*2d543d20SAndroid Build Coastguard Worker        context and class"""
354*2d543d20SAndroid Build Coastguard Worker        avs = access.AccessVectorSet()
355*2d543d20SAndroid Build Coastguard Worker        av1 = access.AccessVector(['foo', 'bar', 'file', 'read'])
356*2d543d20SAndroid Build Coastguard Worker        av2 = access.AccessVector(['foo', 'bar', 'file', 'write'])
357*2d543d20SAndroid Build Coastguard Worker
358*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av1)
359*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av2)
360*2d543d20SAndroid Build Coastguard Worker
361*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(avs.to_list(), [['foo', 'bar', 'file', 'read',
362*2d543d20SAndroid Build Coastguard Worker                         'write']])
363*2d543d20SAndroid Build Coastguard Worker
364*2d543d20SAndroid Build Coastguard Worker    def test_add_av_with_msg(self):
365*2d543d20SAndroid Build Coastguard Worker        """Test adding audit message"""
366*2d543d20SAndroid Build Coastguard Worker        avs = access.AccessVectorSet()
367*2d543d20SAndroid Build Coastguard Worker        av = access.AccessVector(['foo', 'bar', 'file', 'read'])
368*2d543d20SAndroid Build Coastguard Worker
369*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av, 'test message')
370*2d543d20SAndroid Build Coastguard Worker
371*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(avs.src['foo']['bar']['file', av.type].audit_msgs,
372*2d543d20SAndroid Build Coastguard Worker                         ['test message'])
373*2d543d20SAndroid Build Coastguard Worker
374*2d543d20SAndroid Build Coastguard Worker    def test_add(self):
375*2d543d20SAndroid Build Coastguard Worker        """Test adding AV to the set"""
376*2d543d20SAndroid Build Coastguard Worker        s = access.AccessVectorSet()
377*2d543d20SAndroid Build Coastguard Worker
378*2d543d20SAndroid Build Coastguard Worker        def test_add_av(av, audit_msg=None):
379*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(av.src_type, 'foo')
380*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(av.tgt_type, 'bar')
381*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(av.obj_class, 'file')
382*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(list(av.perms), ['read'])
383*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(av.data, 'test data')
384*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(av.type, 42)
385*2d543d20SAndroid Build Coastguard Worker            self.assertEqual(audit_msg, 'test message')
386*2d543d20SAndroid Build Coastguard Worker
387*2d543d20SAndroid Build Coastguard Worker        s.add_av = test_add_av
388*2d543d20SAndroid Build Coastguard Worker
389*2d543d20SAndroid Build Coastguard Worker        s.add("foo", "bar", "file", refpolicy.IdSet(["read"]),
390*2d543d20SAndroid Build Coastguard Worker              audit_msg='test message', avc_type=42, data='test data')
391