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