xref: /aosp_15_r20/external/selinux/python/sepolgen/tests/test_policygen.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.policygen as policygen
22*2d543d20SAndroid Build Coastguard Workerimport sepolgen.access as access
23*2d543d20SAndroid Build Coastguard Workerimport sepolgen.refpolicy as refpolicy
24*2d543d20SAndroid Build Coastguard Worker
25*2d543d20SAndroid Build Coastguard Workerclass TestPolicyGenerator(unittest.TestCase):
26*2d543d20SAndroid Build Coastguard Worker    def setUp(self):
27*2d543d20SAndroid Build Coastguard Worker        self.g = policygen.PolicyGenerator()
28*2d543d20SAndroid Build Coastguard Worker
29*2d543d20SAndroid Build Coastguard Worker    def test_init(self):
30*2d543d20SAndroid Build Coastguard Worker        """ Test that extended permission AV rules are not generated by
31*2d543d20SAndroid Build Coastguard Worker            default. """
32*2d543d20SAndroid Build Coastguard Worker        self.assertFalse(self.g.xperms)
33*2d543d20SAndroid Build Coastguard Worker
34*2d543d20SAndroid Build Coastguard Worker    def test_set_gen_xperms(self):
35*2d543d20SAndroid Build Coastguard Worker        """ Test turning on and off generating of extended permission
36*2d543d20SAndroid Build Coastguard Worker            AV rules. """
37*2d543d20SAndroid Build Coastguard Worker        self.g.set_gen_xperms(True)
38*2d543d20SAndroid Build Coastguard Worker        self.assertTrue(self.g.xperms)
39*2d543d20SAndroid Build Coastguard Worker        self.g.set_gen_xperms(False)
40*2d543d20SAndroid Build Coastguard Worker        self.assertFalse(self.g.xperms)
41*2d543d20SAndroid Build Coastguard Worker
42*2d543d20SAndroid Build Coastguard Worker    def test_av_rules(self):
43*2d543d20SAndroid Build Coastguard Worker        """ Test generating of AV rules from access vectors. """
44*2d543d20SAndroid Build Coastguard Worker        av1 = access.AccessVector(["test_src_t", "test_tgt_t", "file", "ioctl"])
45*2d543d20SAndroid Build Coastguard Worker        av2 = access.AccessVector(["test_src_t", "test_tgt_t", "file", "open"])
46*2d543d20SAndroid Build Coastguard Worker        av3 = access.AccessVector(["test_src_t", "test_tgt_t", "file", "read"])
47*2d543d20SAndroid Build Coastguard Worker
48*2d543d20SAndroid Build Coastguard Worker        avs = access.AccessVectorSet()
49*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av1)
50*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av2)
51*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av3)
52*2d543d20SAndroid Build Coastguard Worker
53*2d543d20SAndroid Build Coastguard Worker        self.g.add_access(avs)
54*2d543d20SAndroid Build Coastguard Worker
55*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(self.g.module.children), 1)
56*2d543d20SAndroid Build Coastguard Worker        r = self.g.module.children[0]
57*2d543d20SAndroid Build Coastguard Worker        self.assertIsInstance(r, refpolicy.AVRule)
58*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(r.to_string(),
59*2d543d20SAndroid Build Coastguard Worker            "allow test_src_t test_tgt_t:file { ioctl open read };")
60*2d543d20SAndroid Build Coastguard Worker
61*2d543d20SAndroid Build Coastguard Worker    def test_ext_av_rules(self):
62*2d543d20SAndroid Build Coastguard Worker        """ Test generating of extended permission AV rules from access
63*2d543d20SAndroid Build Coastguard Worker            vectors. """
64*2d543d20SAndroid Build Coastguard Worker        self.g.set_gen_xperms(True)
65*2d543d20SAndroid Build Coastguard Worker
66*2d543d20SAndroid Build Coastguard Worker        av1 = access.AccessVector(["test_src_t", "test_tgt_t", "file", "ioctl"])
67*2d543d20SAndroid Build Coastguard Worker        av1.xperms['ioctl'] = refpolicy.XpermSet()
68*2d543d20SAndroid Build Coastguard Worker        av1.xperms['ioctl'].add(42)
69*2d543d20SAndroid Build Coastguard Worker        av2 = access.AccessVector(["test_src_t", "test_tgt_t", "file", "ioctl"])
70*2d543d20SAndroid Build Coastguard Worker        av2.xperms['ioctl'] = refpolicy.XpermSet()
71*2d543d20SAndroid Build Coastguard Worker        av2.xperms['ioctl'].add(1234)
72*2d543d20SAndroid Build Coastguard Worker        av3 = access.AccessVector(["test_src_t", "test_tgt_t", "dir", "ioctl"])
73*2d543d20SAndroid Build Coastguard Worker        av3.xperms['ioctl'] = refpolicy.XpermSet()
74*2d543d20SAndroid Build Coastguard Worker        av3.xperms['ioctl'].add(2345)
75*2d543d20SAndroid Build Coastguard Worker
76*2d543d20SAndroid Build Coastguard Worker        avs = access.AccessVectorSet()
77*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av1)
78*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av2)
79*2d543d20SAndroid Build Coastguard Worker        avs.add_av(av3)
80*2d543d20SAndroid Build Coastguard Worker
81*2d543d20SAndroid Build Coastguard Worker        self.g.add_access(avs)
82*2d543d20SAndroid Build Coastguard Worker
83*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(len(self.g.module.children), 4)
84*2d543d20SAndroid Build Coastguard Worker
85*2d543d20SAndroid Build Coastguard Worker        # we cannot sort the rules, so find all rules manually
86*2d543d20SAndroid Build Coastguard Worker        av_rule1 = av_rule2 = av_ext_rule1 = av_ext_rule2 = None
87*2d543d20SAndroid Build Coastguard Worker
88*2d543d20SAndroid Build Coastguard Worker        for r in self.g.module.children:
89*2d543d20SAndroid Build Coastguard Worker            if isinstance(r, refpolicy.AVRule):
90*2d543d20SAndroid Build Coastguard Worker                if 'file' in r.obj_classes:
91*2d543d20SAndroid Build Coastguard Worker                    av_rule1 = r
92*2d543d20SAndroid Build Coastguard Worker                else:
93*2d543d20SAndroid Build Coastguard Worker                    av_rule2 = r
94*2d543d20SAndroid Build Coastguard Worker            elif isinstance(r, refpolicy.AVExtRule):
95*2d543d20SAndroid Build Coastguard Worker                if 'file' in r.obj_classes:
96*2d543d20SAndroid Build Coastguard Worker                    av_ext_rule1 = r
97*2d543d20SAndroid Build Coastguard Worker                else:
98*2d543d20SAndroid Build Coastguard Worker                    av_ext_rule2 = r
99*2d543d20SAndroid Build Coastguard Worker            else:
100*2d543d20SAndroid Build Coastguard Worker                self.fail("Unexpected rule type '%s'" % type(r))
101*2d543d20SAndroid Build Coastguard Worker
102*2d543d20SAndroid Build Coastguard Worker        # check that all rules are present
103*2d543d20SAndroid Build Coastguard Worker        self.assertNotIn(None, (av_rule1, av_rule2, av_ext_rule1, av_ext_rule2))
104*2d543d20SAndroid Build Coastguard Worker
105*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule1.rule_type, av_rule1.ALLOW)
106*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule1.src_types, {"test_src_t"})
107*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule1.tgt_types, {"test_tgt_t"})
108*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule1.obj_classes, {"file"})
109*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule1.perms, {"ioctl"})
110*2d543d20SAndroid Build Coastguard Worker
111*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule1.rule_type, av_ext_rule1.ALLOWXPERM)
112*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule1.src_types, {"test_src_t"})
113*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule1.tgt_types, {"test_tgt_t"})
114*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule1.obj_classes, {"file"})
115*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule1.operation, "ioctl")
116*2d543d20SAndroid Build Coastguard Worker        xp1 = refpolicy.XpermSet()
117*2d543d20SAndroid Build Coastguard Worker        xp1.add(42)
118*2d543d20SAndroid Build Coastguard Worker        xp1.add(1234)
119*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule1.xperms.ranges, xp1.ranges)
120*2d543d20SAndroid Build Coastguard Worker
121*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule2.rule_type, av_rule2.ALLOW)
122*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule2.src_types, {"test_src_t"})
123*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule2.tgt_types, {"test_tgt_t"})
124*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule2.obj_classes, {"dir"})
125*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_rule2.perms, {"ioctl"})
126*2d543d20SAndroid Build Coastguard Worker
127*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule2.rule_type, av_ext_rule2.ALLOWXPERM)
128*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule2.src_types, {"test_src_t"})
129*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule2.tgt_types, {"test_tgt_t"})
130*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule2.obj_classes, {"dir"})
131*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule2.operation, "ioctl")
132*2d543d20SAndroid Build Coastguard Worker        xp2 = refpolicy.XpermSet()
133*2d543d20SAndroid Build Coastguard Worker        xp2.add(2345)
134*2d543d20SAndroid Build Coastguard Worker        self.assertEqual(av_ext_rule2.xperms.ranges, xp2.ranges)
135*2d543d20SAndroid Build Coastguard Worker
136