mirror of
https://github.com/SELinuxProject/setools
synced 2025-04-17 04:35:28 +00:00
parent
c1ebfeb3e7
commit
c913989f8c
@ -19,6 +19,7 @@
|
|||||||
from .commons import CommonDifference
|
from .commons import CommonDifference
|
||||||
from .objclass import ObjClassDifference
|
from .objclass import ObjClassDifference
|
||||||
from .roles import RolesDifference
|
from .roles import RolesDifference
|
||||||
|
from .terules import TERulesDifference
|
||||||
from .types import TypesDifference
|
from .types import TypesDifference
|
||||||
|
|
||||||
__all__ = ['PolicyDifference']
|
__all__ = ['PolicyDifference']
|
||||||
@ -27,6 +28,7 @@ __all__ = ['PolicyDifference']
|
|||||||
class PolicyDifference(CommonDifference,
|
class PolicyDifference(CommonDifference,
|
||||||
ObjClassDifference,
|
ObjClassDifference,
|
||||||
RolesDifference,
|
RolesDifference,
|
||||||
|
TERulesDifference,
|
||||||
TypesDifference):
|
TypesDifference):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
432
setools/diff/terules.py
Normal file
432
setools/diff/terules.py
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
# Copyright 2015, Tresys Technology, LLC
|
||||||
|
#
|
||||||
|
# This file is part of SETools.
|
||||||
|
#
|
||||||
|
# SETools is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 2.1 of
|
||||||
|
# the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# SETools is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with SETools. If not, see
|
||||||
|
# <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
from ..policyrep.exception import RuleNotConditional, RuleUseError, TERuleNoFilename
|
||||||
|
|
||||||
|
from .conditional import ConditionalExprWrapper
|
||||||
|
from .descriptors import DiffResultDescriptor
|
||||||
|
from .difference import Difference, SymbolWrapper
|
||||||
|
|
||||||
|
|
||||||
|
modified_avrule_record = namedtuple("modified_avrule", ["rule",
|
||||||
|
"added_perms",
|
||||||
|
"removed_perms",
|
||||||
|
"matched_perms"])
|
||||||
|
|
||||||
|
modified_terule_record = namedtuple("modified_terule", ["rule", "added_default", "removed_default"])
|
||||||
|
|
||||||
|
|
||||||
|
class TERulesDifference(Difference):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Determine the difference in type enforcement rules
|
||||||
|
between two policies.
|
||||||
|
"""
|
||||||
|
|
||||||
|
added_allows = DiffResultDescriptor("diff_allows")
|
||||||
|
removed_allows = DiffResultDescriptor("diff_allows")
|
||||||
|
modified_allows = DiffResultDescriptor("diff_allows")
|
||||||
|
|
||||||
|
added_auditallows = DiffResultDescriptor("diff_auditallows")
|
||||||
|
removed_auditallows = DiffResultDescriptor("diff_auditallows")
|
||||||
|
modified_auditallows = DiffResultDescriptor("diff_auditallows")
|
||||||
|
|
||||||
|
added_neverallows = DiffResultDescriptor("diff_neverallows")
|
||||||
|
removed_neverallows = DiffResultDescriptor("diff_neverallows")
|
||||||
|
modified_neverallows = DiffResultDescriptor("diff_neverallows")
|
||||||
|
|
||||||
|
added_dontaudits = DiffResultDescriptor("diff_dontaudits")
|
||||||
|
removed_dontaudits = DiffResultDescriptor("diff_dontaudits")
|
||||||
|
modified_dontaudits = DiffResultDescriptor("diff_dontaudits")
|
||||||
|
|
||||||
|
added_type_transitions = DiffResultDescriptor("diff_type_transitions")
|
||||||
|
removed_type_transitions = DiffResultDescriptor("diff_type_transitions")
|
||||||
|
modified_type_transitions = DiffResultDescriptor("diff_type_transitions")
|
||||||
|
|
||||||
|
added_type_changes = DiffResultDescriptor("diff_type_changes")
|
||||||
|
removed_type_changes = DiffResultDescriptor("diff_type_changes")
|
||||||
|
modified_type_changes = DiffResultDescriptor("diff_type_changes")
|
||||||
|
|
||||||
|
added_type_members = DiffResultDescriptor("diff_type_members")
|
||||||
|
removed_type_members = DiffResultDescriptor("diff_type_members")
|
||||||
|
modified_type_members = DiffResultDescriptor("diff_type_members")
|
||||||
|
|
||||||
|
# Lists of rules for each policy
|
||||||
|
_left_allows = None
|
||||||
|
_right_allows = None
|
||||||
|
|
||||||
|
_left_auditallows = None
|
||||||
|
_right_auditallows = None
|
||||||
|
|
||||||
|
_left_neverallows = None
|
||||||
|
_right_neverallows = None
|
||||||
|
|
||||||
|
_left_dontaudits = None
|
||||||
|
_right_dontaudits = None
|
||||||
|
|
||||||
|
_left_type_transitions = None
|
||||||
|
_right_type_transitions = None
|
||||||
|
|
||||||
|
_left_type_changes = None
|
||||||
|
_right_type_changes = None
|
||||||
|
|
||||||
|
_left_type_members = None
|
||||||
|
_right_type_members = None
|
||||||
|
|
||||||
|
def diff_allows(self):
|
||||||
|
"""Generate the difference in allow rules between the policies."""
|
||||||
|
|
||||||
|
self.log.info(
|
||||||
|
"Generating allow differences from {0.left_policy} to {0.right_policy}".format(self))
|
||||||
|
|
||||||
|
if self._left_allows is None or self._right_allows is None:
|
||||||
|
self._create_rule_lists()
|
||||||
|
|
||||||
|
self.added_allows, self.removed_allows, self.modified_allows = self._diff_av_rules(
|
||||||
|
self._expand_generator(self._left_allows, AVRuleWrapper),
|
||||||
|
self._expand_generator(self._right_allows, AVRuleWrapper))
|
||||||
|
|
||||||
|
def diff_auditallows(self):
|
||||||
|
"""Generate the difference in auditallow rules between the policies."""
|
||||||
|
|
||||||
|
self.log.info(
|
||||||
|
"Generating auditallow differences from {0.left_policy} to {0.right_policy}".
|
||||||
|
format(self))
|
||||||
|
|
||||||
|
if self._left_auditallows is None or self._right_auditallows is None:
|
||||||
|
self._create_rule_lists()
|
||||||
|
|
||||||
|
self.added_auditallows, \
|
||||||
|
self.removed_auditallows, \
|
||||||
|
self.modified_auditallows = self._diff_av_rules(
|
||||||
|
self._expand_generator(self._left_auditallows, AVRuleWrapper),
|
||||||
|
self._expand_generator(self._right_auditallows, AVRuleWrapper))
|
||||||
|
|
||||||
|
def diff_neverallows(self):
|
||||||
|
"""Generate the difference in neverallow rules between the policies."""
|
||||||
|
|
||||||
|
self.log.info(
|
||||||
|
"Generating neverallow differences from {0.left_policy} to {0.right_policy}".
|
||||||
|
format(self))
|
||||||
|
|
||||||
|
if self._left_neverallows is None or self._right_neverallows is None:
|
||||||
|
self._create_rule_lists()
|
||||||
|
|
||||||
|
self.added_neverallows, \
|
||||||
|
self.removed_neverallows, \
|
||||||
|
self.modified_neverallows = self._diff_av_rules(
|
||||||
|
self._expand_generator(self._left_neverallows, AVRuleWrapper),
|
||||||
|
self._expand_generator(self._right_neverallows, AVRuleWrapper))
|
||||||
|
|
||||||
|
def diff_dontaudits(self):
|
||||||
|
"""Generate the difference in dontaudit rules between the policies."""
|
||||||
|
|
||||||
|
self.log.info(
|
||||||
|
"Generating dontaudit differences from {0.left_policy} to {0.right_policy}".
|
||||||
|
format(self))
|
||||||
|
|
||||||
|
if self._left_dontaudits is None or self._right_dontaudits is None:
|
||||||
|
self._create_rule_lists()
|
||||||
|
|
||||||
|
self.added_dontaudits, \
|
||||||
|
self.removed_dontaudits, \
|
||||||
|
self.modified_dontaudits = self._diff_av_rules(
|
||||||
|
self._expand_generator(self._left_dontaudits, AVRuleWrapper),
|
||||||
|
self._expand_generator(self._right_dontaudits, AVRuleWrapper))
|
||||||
|
|
||||||
|
def diff_type_transitions(self):
|
||||||
|
"""Generate the difference in type_transition rules between the policies."""
|
||||||
|
|
||||||
|
self.log.info(
|
||||||
|
"Generating type_transition differences from {0.left_policy} to {0.right_policy}".
|
||||||
|
format(self))
|
||||||
|
|
||||||
|
if self._left_type_transitions is None or self._right_type_transitions is None:
|
||||||
|
self._create_rule_lists()
|
||||||
|
|
||||||
|
self.added_type_transitions, \
|
||||||
|
self.removed_type_transitions, \
|
||||||
|
self.modified_type_transitions = self._diff_te_rules(
|
||||||
|
self._expand_generator(self._left_type_transitions, TERuleWrapper),
|
||||||
|
self._expand_generator(self._right_type_transitions, TERuleWrapper))
|
||||||
|
|
||||||
|
def diff_type_changes(self):
|
||||||
|
"""Generate the difference in type_change rules between the policies."""
|
||||||
|
|
||||||
|
self.log.info(
|
||||||
|
"Generating type_change differences from {0.left_policy} to {0.right_policy}".
|
||||||
|
format(self))
|
||||||
|
|
||||||
|
if self._left_type_changes is None or self._right_type_changes is None:
|
||||||
|
self._create_rule_lists()
|
||||||
|
|
||||||
|
self.added_type_changes, \
|
||||||
|
self.removed_type_changes, \
|
||||||
|
self.modified_type_changes = self._diff_te_rules(
|
||||||
|
self._expand_generator(self._left_type_changes, TERuleWrapper),
|
||||||
|
self._expand_generator(self._right_type_changes, TERuleWrapper))
|
||||||
|
|
||||||
|
def diff_type_members(self):
|
||||||
|
"""Generate the difference in type_member rules between the policies."""
|
||||||
|
|
||||||
|
self.log.info(
|
||||||
|
"Generating type_member differences from {0.left_policy} to {0.right_policy}".
|
||||||
|
format(self))
|
||||||
|
|
||||||
|
if self._left_type_members is None or self._right_type_members is None:
|
||||||
|
self._create_rule_lists()
|
||||||
|
|
||||||
|
self.added_type_members, \
|
||||||
|
self.removed_type_members, \
|
||||||
|
self.modified_type_members = self._diff_te_rules(
|
||||||
|
self._expand_generator(self._left_type_members, TERuleWrapper),
|
||||||
|
self._expand_generator(self._right_type_members, TERuleWrapper))
|
||||||
|
|
||||||
|
#
|
||||||
|
# Internal functions
|
||||||
|
#
|
||||||
|
def _create_rule_lists(self):
|
||||||
|
"""Create rule lists for both policies."""
|
||||||
|
|
||||||
|
self._left_allows = []
|
||||||
|
self._left_auditallows = []
|
||||||
|
self._left_neverallows = []
|
||||||
|
self._left_dontaudits = []
|
||||||
|
self._left_type_transitions = []
|
||||||
|
self._left_type_changes = []
|
||||||
|
self._left_type_members = []
|
||||||
|
for rule in self.left_policy.terules():
|
||||||
|
# do not expand yet, to keep memory
|
||||||
|
# use down as long as possible
|
||||||
|
if rule.ruletype == "allow":
|
||||||
|
self._left_allows.append(rule)
|
||||||
|
elif rule.ruletype == "auditallow":
|
||||||
|
self._left_auditallows.append(rule)
|
||||||
|
elif rule.ruletype == "neverallow":
|
||||||
|
self._left_neverallows.append(rule)
|
||||||
|
elif rule.ruletype == "dontaudit":
|
||||||
|
self._left_dontaudits.append(rule)
|
||||||
|
elif rule.ruletype == "type_transition":
|
||||||
|
self._left_type_transitions.append(rule)
|
||||||
|
elif rule.ruletype == "type_change":
|
||||||
|
self._left_type_changes.append(rule)
|
||||||
|
elif rule.ruletype == "type_member":
|
||||||
|
self._left_type_members.append(rule)
|
||||||
|
else:
|
||||||
|
raise TypeError("Unknown rule type: {0}".format(rule.ruletype))
|
||||||
|
|
||||||
|
self._right_allows = []
|
||||||
|
self._right_auditallows = []
|
||||||
|
self._right_neverallows = []
|
||||||
|
self._right_dontaudits = []
|
||||||
|
self._right_type_transitions = []
|
||||||
|
self._right_type_changes = []
|
||||||
|
self._right_type_members = []
|
||||||
|
for rule in self.right_policy.terules():
|
||||||
|
# do not expand yet, to keep memory
|
||||||
|
# use down as long as possible
|
||||||
|
if rule.ruletype == "allow":
|
||||||
|
self._right_allows.append(rule)
|
||||||
|
elif rule.ruletype == "auditallow":
|
||||||
|
self._right_auditallows.append(rule)
|
||||||
|
elif rule.ruletype == "neverallow":
|
||||||
|
self._right_neverallows.append(rule)
|
||||||
|
elif rule.ruletype == "dontaudit":
|
||||||
|
self._right_dontaudits.append(rule)
|
||||||
|
elif rule.ruletype == "type_transition":
|
||||||
|
self._right_type_transitions.append(rule)
|
||||||
|
elif rule.ruletype == "type_change":
|
||||||
|
self._right_type_changes.append(rule)
|
||||||
|
elif rule.ruletype == "type_member":
|
||||||
|
self._right_type_members.append(rule)
|
||||||
|
else:
|
||||||
|
raise TypeError("Unknown rule type: {0}".format(rule.ruletype))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _expand_generator(rule_list, Wrapper):
|
||||||
|
"""Generator that yields a wrapped, expanded rule list."""
|
||||||
|
# this is to delay creating any containers
|
||||||
|
# as long as possible, since rule lists
|
||||||
|
# are typically massive.
|
||||||
|
for unexpanded_rule in rule_list:
|
||||||
|
for expanded_rule in unexpanded_rule.expand():
|
||||||
|
yield Wrapper(expanded_rule)
|
||||||
|
|
||||||
|
def _diff_av_rules(self, left_list, right_list):
|
||||||
|
"""Common method for comparing access vector rules."""
|
||||||
|
added, removed, matched = self._set_diff(left_list, right_list)
|
||||||
|
|
||||||
|
modified = []
|
||||||
|
|
||||||
|
for left_rule, right_rule in matched:
|
||||||
|
# Criteria for modified rules
|
||||||
|
# 1. change to permissions
|
||||||
|
added_perms, removed_perms, matched_perms = self._set_diff(left_rule.perms,
|
||||||
|
right_rule.perms)
|
||||||
|
|
||||||
|
# the final set comprehension is to avoid having lists
|
||||||
|
# like [("perm1", "perm1"), ("perm2", "perm2")], as the
|
||||||
|
# matched_perms return from _set_diff is a set of tuples
|
||||||
|
if added_perms or removed_perms:
|
||||||
|
modified.append(modified_avrule_record(left_rule,
|
||||||
|
added_perms,
|
||||||
|
removed_perms,
|
||||||
|
set(p[0] for p in matched_perms)))
|
||||||
|
|
||||||
|
return added, removed, modified
|
||||||
|
|
||||||
|
def _diff_te_rules(self, left_list, right_list):
|
||||||
|
"""Common method for comparing type_* rules."""
|
||||||
|
added, removed, matched = self._set_diff(left_list, right_list)
|
||||||
|
|
||||||
|
modified = []
|
||||||
|
|
||||||
|
for left_rule, right_rule in matched:
|
||||||
|
# Criteria for modified rules
|
||||||
|
# 1. change to default type
|
||||||
|
if str(left_rule.default) != str(right_rule.default):
|
||||||
|
modified.append(modified_terule_record(left_rule,
|
||||||
|
right_rule.default,
|
||||||
|
left_rule.default))
|
||||||
|
|
||||||
|
return added, removed, modified
|
||||||
|
|
||||||
|
def _reset_diff(self):
|
||||||
|
"""Reset diff results on policy changes."""
|
||||||
|
self.log.debug("Resetting TE rule differences")
|
||||||
|
self.added_allows = None
|
||||||
|
self.removed_allows = None
|
||||||
|
self.modified_allows = None
|
||||||
|
self.added_auditallows = None
|
||||||
|
self.removed_auditallows = None
|
||||||
|
self.modified_auditallows = None
|
||||||
|
self.added_neverallows = None
|
||||||
|
self.removed_neverallows = None
|
||||||
|
self.modified_neverallows = None
|
||||||
|
self.added_dontaudits = None
|
||||||
|
self.removed_dontaudits = None
|
||||||
|
self.modified_dontaudits = None
|
||||||
|
self.added_type_transitions = None
|
||||||
|
self.removed_type_transitions = None
|
||||||
|
self.modified_type_transitions = None
|
||||||
|
self.added_type_changes = None
|
||||||
|
self.removed_type_changes = None
|
||||||
|
self.modified_type_changes = None
|
||||||
|
self.added_type_members = None
|
||||||
|
self.removed_type_members = None
|
||||||
|
self.modified_type_members = None
|
||||||
|
|
||||||
|
# Sets of rules for each policy
|
||||||
|
self._left_allows = None
|
||||||
|
self._right_allows = None
|
||||||
|
self._left_auditallows = None
|
||||||
|
self._right_auditallows = None
|
||||||
|
self._left_neverallows = None
|
||||||
|
self._right_neverallows = None
|
||||||
|
self._left_dontaudits = None
|
||||||
|
self._right_dontaudits = None
|
||||||
|
self._left_type_transitions = None
|
||||||
|
self._right_type_transitions = None
|
||||||
|
self._left_type_changes = None
|
||||||
|
self._right_type_changes = None
|
||||||
|
self._left_type_members = None
|
||||||
|
self._right_type_members = None
|
||||||
|
|
||||||
|
|
||||||
|
class AVRuleWrapper(object):
|
||||||
|
|
||||||
|
"""Wrap access vector rules to allow set operations."""
|
||||||
|
|
||||||
|
def __init__(self, rule):
|
||||||
|
self.origin = rule
|
||||||
|
self.ruletype = rule.ruletype
|
||||||
|
self.source = SymbolWrapper(rule.source)
|
||||||
|
self.target = SymbolWrapper(rule.target)
|
||||||
|
self.tclass = SymbolWrapper(rule.tclass)
|
||||||
|
self.key = hash(rule)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.conditional = ConditionalExprWrapper(rule.conditional)
|
||||||
|
self.conditional_block = rule.conditional_block
|
||||||
|
except RuleNotConditional:
|
||||||
|
self.conditional = None
|
||||||
|
self.conditional_block = None
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return self.key
|
||||||
|
|
||||||
|
def __lt__(self, other):
|
||||||
|
return self.origin < other.origin
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
# because TERuleDifference groups rules by ruletype,
|
||||||
|
# the ruletype always matches.
|
||||||
|
return self.source == other.source and \
|
||||||
|
self.target == other.target and \
|
||||||
|
self.tclass == other.tclass and \
|
||||||
|
self.conditional == other.conditional and \
|
||||||
|
self.conditional_block == other.conditional_block
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not self == other
|
||||||
|
|
||||||
|
|
||||||
|
class TERuleWrapper(object):
|
||||||
|
|
||||||
|
"""Wrap type_* rules to allow set operations."""
|
||||||
|
|
||||||
|
def __init__(self, rule):
|
||||||
|
self.origin = rule
|
||||||
|
self.ruletype = rule.ruletype
|
||||||
|
self.source = SymbolWrapper(rule.source)
|
||||||
|
self.target = SymbolWrapper(rule.target)
|
||||||
|
self.tclass = SymbolWrapper(rule.tclass)
|
||||||
|
self.key = hash(rule)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.conditional = ConditionalExprWrapper(rule.conditional)
|
||||||
|
self.conditional_block = rule.conditional_block
|
||||||
|
except RuleNotConditional:
|
||||||
|
self.conditional = None
|
||||||
|
self.conditional_block = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.filename = rule.filename
|
||||||
|
except (RuleUseError, TERuleNoFilename):
|
||||||
|
self.filename = None
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return self.key
|
||||||
|
|
||||||
|
def __lt__(self, other):
|
||||||
|
return self.origin < other.origin
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
# because TERuleDifference groups rules by ruletype,
|
||||||
|
# the ruletype always matches.
|
||||||
|
return self.source == other.source and \
|
||||||
|
self.target == other.target and \
|
||||||
|
self.tclass == other.tclass and \
|
||||||
|
self.conditional == other.conditional and \
|
||||||
|
self.conditional_block == other.conditional_block and \
|
||||||
|
self.filename == self.filename
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not self == other
|
614
tests/diff.py
614
tests/diff.py
@ -19,8 +19,10 @@ import unittest
|
|||||||
|
|
||||||
from setools import SELinuxPolicy, PolicyDifference
|
from setools import SELinuxPolicy, PolicyDifference
|
||||||
|
|
||||||
|
from .mixins import ValidateRule
|
||||||
|
|
||||||
class PolicyDifferenceTest(unittest.TestCase):
|
|
||||||
|
class PolicyDifferenceTest(ValidateRule, unittest.TestCase):
|
||||||
|
|
||||||
"""Policy difference tests."""
|
"""Policy difference tests."""
|
||||||
|
|
||||||
@ -208,6 +210,532 @@ class PolicyDifferenceTest(unittest.TestCase):
|
|||||||
self.assertSetEqual(set(["new_com"]),
|
self.assertSetEqual(set(["new_com"]),
|
||||||
self.diff.modified_classes["modified_change_common"].added_perms)
|
self.diff.modified_classes["modified_change_common"].added_perms)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Allow rules
|
||||||
|
#
|
||||||
|
def test_added_allow_rules(self):
|
||||||
|
"""Diff: added allow rules."""
|
||||||
|
rules = sorted(self.diff.added_allows)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# added rule with existing types
|
||||||
|
self.validate_rule(rules[0], "allow", "added_rule_source", "added_rule_target", "infoflow",
|
||||||
|
set(["med_w"]))
|
||||||
|
|
||||||
|
# added rule with new type
|
||||||
|
self.validate_rule(rules[1], "allow", "added_type", "added_type", "infoflow2",
|
||||||
|
set(["med_w"]))
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[2], "allow", "move_from_bool", "move_from_bool", "infoflow4",
|
||||||
|
set(["hi_r"]))
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[3], "allow", "move_to_bool", "move_to_bool", "infoflow4",
|
||||||
|
set(["hi_w"]), cond="move_to_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[4], "allow", "system", "switch_block", "infoflow6",
|
||||||
|
set(["hi_r"]), cond="switch_block_b", cond_block=False)
|
||||||
|
|
||||||
|
def test_removed_allow_rules(self):
|
||||||
|
"""Diff: removed allow rules."""
|
||||||
|
rules = sorted(self.diff.removed_allows)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[0], "allow", "move_from_bool", "move_from_bool", "infoflow4",
|
||||||
|
set(["hi_r"]), cond="move_from_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[1], "allow", "move_to_bool", "move_to_bool", "infoflow4",
|
||||||
|
set(["hi_w"]))
|
||||||
|
|
||||||
|
# removed rule with existing types
|
||||||
|
self.validate_rule(rules[2], "allow", "removed_rule_source", "removed_rule_target",
|
||||||
|
"infoflow", set(["hi_r"]))
|
||||||
|
|
||||||
|
# removed rule with new type
|
||||||
|
self.validate_rule(rules[3], "allow", "removed_type", "removed_type", "infoflow3",
|
||||||
|
set(["null"]))
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[4], "allow", "system", "switch_block", "infoflow6",
|
||||||
|
set(["hi_r"]), cond="switch_block_b", cond_block=True)
|
||||||
|
|
||||||
|
def test_modified_allow_rules(self):
|
||||||
|
"""Diff: modified allow rules."""
|
||||||
|
l = sorted(self.diff.modified_allows)
|
||||||
|
self.assertEqual(3, len(l))
|
||||||
|
|
||||||
|
# add permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[0]
|
||||||
|
self.assertEqual("allow", rule.ruletype)
|
||||||
|
self.assertEqual("modified_rule_add_perms", rule.source)
|
||||||
|
self.assertEqual("modified_rule_add_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["hi_w"]), added_perms)
|
||||||
|
self.assertFalse(removed_perms)
|
||||||
|
self.assertSetEqual(set(["hi_r"]), matched_perms)
|
||||||
|
|
||||||
|
# add and remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[1]
|
||||||
|
self.assertEqual("allow", rule.ruletype)
|
||||||
|
self.assertEqual("modified_rule_add_remove_perms", rule.source)
|
||||||
|
self.assertEqual("modified_rule_add_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow2", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["super_r"]), added_perms)
|
||||||
|
self.assertSetEqual(set(["super_w"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
# remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[2]
|
||||||
|
self.assertEqual("allow", rule.ruletype)
|
||||||
|
self.assertEqual("modified_rule_remove_perms", rule.source)
|
||||||
|
self.assertEqual("modified_rule_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertFalse(added_perms)
|
||||||
|
self.assertSetEqual(set(["low_r"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Auditallow rules
|
||||||
|
#
|
||||||
|
def test_added_auditallow_rules(self):
|
||||||
|
"""Diff: added auditallow rules."""
|
||||||
|
rules = sorted(self.diff.added_auditallows)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# added rule with existing types
|
||||||
|
self.validate_rule(rules[0], "auditallow", "aa_added_rule_source", "aa_added_rule_target",
|
||||||
|
"infoflow", set(["med_w"]))
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[1], "auditallow", "aa_move_from_bool", "aa_move_from_bool",
|
||||||
|
"infoflow4", set(["hi_r"]))
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[2], "auditallow", "aa_move_to_bool", "aa_move_to_bool",
|
||||||
|
"infoflow4", set(["hi_w"]), cond="aa_move_to_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# added rule with new type
|
||||||
|
self.validate_rule(rules[3], "auditallow", "added_type", "added_type", "infoflow7",
|
||||||
|
set(["super_none"]))
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[4], "auditallow", "system", "aa_switch_block", "infoflow6",
|
||||||
|
set(["hi_r"]), cond="aa_switch_block_b", cond_block=False)
|
||||||
|
|
||||||
|
def test_removed_auditallow_rules(self):
|
||||||
|
"""Diff: removed auditallow rules."""
|
||||||
|
rules = sorted(self.diff.removed_auditallows)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[0], "auditallow", "aa_move_from_bool", "aa_move_from_bool",
|
||||||
|
"infoflow4", set(["hi_r"]), cond="aa_move_from_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[1], "auditallow", "aa_move_to_bool", "aa_move_to_bool",
|
||||||
|
"infoflow4", set(["hi_w"]))
|
||||||
|
|
||||||
|
# removed rule with existing types
|
||||||
|
self.validate_rule(rules[2], "auditallow", "aa_removed_rule_source",
|
||||||
|
"aa_removed_rule_target", "infoflow", set(["hi_r"]))
|
||||||
|
|
||||||
|
# removed rule with new type
|
||||||
|
self.validate_rule(rules[3], "auditallow", "removed_type", "removed_type", "infoflow7",
|
||||||
|
set(["super_unmapped"]))
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[4], "auditallow", "system", "aa_switch_block", "infoflow6",
|
||||||
|
set(["hi_r"]), cond="aa_switch_block_b", cond_block=True)
|
||||||
|
|
||||||
|
def test_modified_auditallow_rules(self):
|
||||||
|
"""Diff: modified auditallow rules."""
|
||||||
|
l = sorted(self.diff.modified_auditallows)
|
||||||
|
self.assertEqual(3, len(l))
|
||||||
|
|
||||||
|
# add permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[0]
|
||||||
|
self.assertEqual("auditallow", rule.ruletype)
|
||||||
|
self.assertEqual("aa_modified_rule_add_perms", rule.source)
|
||||||
|
self.assertEqual("aa_modified_rule_add_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["hi_w"]), added_perms)
|
||||||
|
self.assertFalse(removed_perms)
|
||||||
|
self.assertSetEqual(set(["hi_r"]), matched_perms)
|
||||||
|
|
||||||
|
# add and remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[1]
|
||||||
|
self.assertEqual("auditallow", rule.ruletype)
|
||||||
|
self.assertEqual("aa_modified_rule_add_remove_perms", rule.source)
|
||||||
|
self.assertEqual("aa_modified_rule_add_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow2", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["super_r"]), added_perms)
|
||||||
|
self.assertSetEqual(set(["super_w"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
# remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[2]
|
||||||
|
self.assertEqual("auditallow", rule.ruletype)
|
||||||
|
self.assertEqual("aa_modified_rule_remove_perms", rule.source)
|
||||||
|
self.assertEqual("aa_modified_rule_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertFalse(added_perms)
|
||||||
|
self.assertSetEqual(set(["low_r"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Dontaudit rules
|
||||||
|
#
|
||||||
|
def test_added_dontaudit_rules(self):
|
||||||
|
"""Diff: added dontaudit rules."""
|
||||||
|
rules = sorted(self.diff.added_dontaudits)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# added rule with new type
|
||||||
|
self.validate_rule(rules[0], "dontaudit", "added_type", "added_type", "infoflow7",
|
||||||
|
set(["super_none"]))
|
||||||
|
|
||||||
|
# added rule with existing types
|
||||||
|
self.validate_rule(rules[1], "dontaudit", "da_added_rule_source", "da_added_rule_target",
|
||||||
|
"infoflow", set(["med_w"]))
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[2], "dontaudit", "da_move_from_bool", "da_move_from_bool",
|
||||||
|
"infoflow4", set(["hi_r"]))
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[3], "dontaudit", "da_move_to_bool", "da_move_to_bool",
|
||||||
|
"infoflow4", set(["hi_w"]), cond="da_move_to_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[4], "dontaudit", "system", "da_switch_block", "infoflow6",
|
||||||
|
set(["hi_r"]), cond="da_switch_block_b", cond_block=False)
|
||||||
|
|
||||||
|
def test_removed_dontaudit_rules(self):
|
||||||
|
"""Diff: removed dontaudit rules."""
|
||||||
|
rules = sorted(self.diff.removed_dontaudits)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[0], "dontaudit", "da_move_from_bool", "da_move_from_bool",
|
||||||
|
"infoflow4", set(["hi_r"]), cond="da_move_from_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[1], "dontaudit", "da_move_to_bool", "da_move_to_bool",
|
||||||
|
"infoflow4", set(["hi_w"]))
|
||||||
|
|
||||||
|
# removed rule with existing types
|
||||||
|
self.validate_rule(rules[2], "dontaudit", "da_removed_rule_source",
|
||||||
|
"da_removed_rule_target", "infoflow", set(["hi_r"]))
|
||||||
|
|
||||||
|
# removed rule with new type
|
||||||
|
self.validate_rule(rules[3], "dontaudit", "removed_type", "removed_type", "infoflow7",
|
||||||
|
set(["super_both"]))
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[4], "dontaudit", "system", "da_switch_block", "infoflow6",
|
||||||
|
set(["hi_r"]), cond="da_switch_block_b", cond_block=True)
|
||||||
|
|
||||||
|
def test_modified_dontaudit_rules(self):
|
||||||
|
"""Diff: modified dontaudit rules."""
|
||||||
|
l = sorted(self.diff.modified_dontaudits)
|
||||||
|
self.assertEqual(3, len(l))
|
||||||
|
|
||||||
|
# add permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[0]
|
||||||
|
self.assertEqual("dontaudit", rule.ruletype)
|
||||||
|
self.assertEqual("da_modified_rule_add_perms", rule.source)
|
||||||
|
self.assertEqual("da_modified_rule_add_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["hi_w"]), added_perms)
|
||||||
|
self.assertFalse(removed_perms)
|
||||||
|
self.assertSetEqual(set(["hi_r"]), matched_perms)
|
||||||
|
|
||||||
|
# add and remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[1]
|
||||||
|
self.assertEqual("dontaudit", rule.ruletype)
|
||||||
|
self.assertEqual("da_modified_rule_add_remove_perms", rule.source)
|
||||||
|
self.assertEqual("da_modified_rule_add_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow2", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["super_r"]), added_perms)
|
||||||
|
self.assertSetEqual(set(["super_w"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
# remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[2]
|
||||||
|
self.assertEqual("dontaudit", rule.ruletype)
|
||||||
|
self.assertEqual("da_modified_rule_remove_perms", rule.source)
|
||||||
|
self.assertEqual("da_modified_rule_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertFalse(added_perms)
|
||||||
|
self.assertSetEqual(set(["low_r"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Neverallow rules
|
||||||
|
#
|
||||||
|
def test_added_neverallow_rules(self):
|
||||||
|
"""Diff: added neverallow rules."""
|
||||||
|
rules = sorted(self.diff.added_neverallows)
|
||||||
|
self.assertEqual(2, len(rules))
|
||||||
|
|
||||||
|
# added rule with new type
|
||||||
|
self.validate_rule(rules[0], "neverallow", "added_type", "added_type", "added_class",
|
||||||
|
set(["new_class_perm"]))
|
||||||
|
|
||||||
|
# added rule with existing types
|
||||||
|
self.validate_rule(rules[1], "neverallow", "na_added_rule_source", "na_added_rule_target",
|
||||||
|
"infoflow", set(["med_w"]))
|
||||||
|
|
||||||
|
def test_removed_neverallow_rules(self):
|
||||||
|
"""Diff: removed neverallow rules."""
|
||||||
|
rules = sorted(self.diff.removed_neverallows)
|
||||||
|
self.assertEqual(2, len(rules))
|
||||||
|
|
||||||
|
# removed rule with existing types
|
||||||
|
self.validate_rule(rules[0], "neverallow", "na_removed_rule_source",
|
||||||
|
"na_removed_rule_target", "infoflow", set(["hi_r"]))
|
||||||
|
|
||||||
|
# removed rule with new type
|
||||||
|
self.validate_rule(rules[1], "neverallow", "removed_type", "removed_type", "removed_class",
|
||||||
|
set(["null_perm"]))
|
||||||
|
|
||||||
|
def test_modified_neverallow_rules(self):
|
||||||
|
"""Diff: modified neverallow rules."""
|
||||||
|
l = sorted(self.diff.modified_neverallows)
|
||||||
|
self.assertEqual(3, len(l))
|
||||||
|
|
||||||
|
# add permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[0]
|
||||||
|
self.assertEqual("neverallow", rule.ruletype)
|
||||||
|
self.assertEqual("na_modified_rule_add_perms", rule.source)
|
||||||
|
self.assertEqual("na_modified_rule_add_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["hi_w"]), added_perms)
|
||||||
|
self.assertFalse(removed_perms)
|
||||||
|
self.assertSetEqual(set(["hi_r"]), matched_perms)
|
||||||
|
|
||||||
|
# add and remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[1]
|
||||||
|
self.assertEqual("neverallow", rule.ruletype)
|
||||||
|
self.assertEqual("na_modified_rule_add_remove_perms", rule.source)
|
||||||
|
self.assertEqual("na_modified_rule_add_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow2", rule.tclass)
|
||||||
|
self.assertSetEqual(set(["super_r"]), added_perms)
|
||||||
|
self.assertSetEqual(set(["super_w"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
# remove permissions
|
||||||
|
rule, added_perms, removed_perms, matched_perms = l[2]
|
||||||
|
self.assertEqual("neverallow", rule.ruletype)
|
||||||
|
self.assertEqual("na_modified_rule_remove_perms", rule.source)
|
||||||
|
self.assertEqual("na_modified_rule_remove_perms", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertFalse(added_perms)
|
||||||
|
self.assertSetEqual(set(["low_r"]), removed_perms)
|
||||||
|
self.assertSetEqual(set(["low_w"]), matched_perms)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Type_transition rules
|
||||||
|
#
|
||||||
|
def test_added_type_transition_rules(self):
|
||||||
|
"""Diff: added type_transition rules."""
|
||||||
|
rules = sorted(self.diff.added_type_transitions)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# added rule with new type
|
||||||
|
self.validate_rule(rules[0], "type_transition", "added_type", "system", "infoflow4",
|
||||||
|
"system")
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[1], "type_transition", "system", "tt_switch_block", "infoflow6",
|
||||||
|
"system", cond="tt_switch_block_b", cond_block=False)
|
||||||
|
|
||||||
|
# added rule with existing types
|
||||||
|
self.validate_rule(rules[2], "type_transition", "tt_added_rule_source",
|
||||||
|
"tt_added_rule_target", "infoflow", "system")
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[3], "type_transition", "tt_move_from_bool", "system",
|
||||||
|
"infoflow4", "system")
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[4], "type_transition", "tt_move_to_bool", "system",
|
||||||
|
"infoflow3", "system", cond="tt_move_to_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
def test_removed_type_transition_rules(self):
|
||||||
|
"""Diff: removed type_transition rules."""
|
||||||
|
rules = sorted(self.diff.removed_type_transitions)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# removed rule with new type
|
||||||
|
self.validate_rule(rules[0], "type_transition", "removed_type", "system", "infoflow4",
|
||||||
|
"system")
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[1], "type_transition", "system", "tt_switch_block", "infoflow6",
|
||||||
|
"system", cond="tt_switch_block_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[2], "type_transition", "tt_move_from_bool", "system",
|
||||||
|
"infoflow4", "system", cond="tt_move_from_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[3], "type_transition", "tt_move_to_bool", "system",
|
||||||
|
"infoflow3", "system")
|
||||||
|
|
||||||
|
# removed rule with existing types
|
||||||
|
self.validate_rule(rules[4], "type_transition", "tt_removed_rule_source",
|
||||||
|
"tt_removed_rule_target", "infoflow", "system")
|
||||||
|
|
||||||
|
def test_modified_type_transition_rules(self):
|
||||||
|
"""Diff: modified type_transition rules."""
|
||||||
|
l = sorted(self.diff.modified_type_transitions)
|
||||||
|
self.assertEqual(1, len(l))
|
||||||
|
|
||||||
|
rule, added_default, removed_default = l[0]
|
||||||
|
self.assertEqual("type_transition", rule.ruletype)
|
||||||
|
self.assertEqual("tt_matched_source", rule.source)
|
||||||
|
self.assertEqual("system", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertEqual("tt_new_type", added_default)
|
||||||
|
self.assertEqual("tt_old_type", removed_default)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Type_change rules
|
||||||
|
#
|
||||||
|
def test_added_type_change_rules(self):
|
||||||
|
"""Diff: added type_change rules."""
|
||||||
|
rules = sorted(self.diff.added_type_changes)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# added rule with new type
|
||||||
|
self.validate_rule(rules[0], "type_change", "added_type", "system", "infoflow4",
|
||||||
|
"system")
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[1], "type_change", "system", "tc_switch_block", "infoflow6",
|
||||||
|
"system", cond="tc_switch_block_b", cond_block=False)
|
||||||
|
|
||||||
|
# added rule with existing types
|
||||||
|
self.validate_rule(rules[2], "type_change", "tc_added_rule_source",
|
||||||
|
"tc_added_rule_target", "infoflow", "system")
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[3], "type_change", "tc_move_from_bool", "system",
|
||||||
|
"infoflow4", "system")
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[4], "type_change", "tc_move_to_bool", "system",
|
||||||
|
"infoflow3", "system", cond="tc_move_to_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
def test_removed_type_change_rules(self):
|
||||||
|
"""Diff: removed type_change rules."""
|
||||||
|
rules = sorted(self.diff.removed_type_changes)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# removed rule with new type
|
||||||
|
self.validate_rule(rules[0], "type_change", "removed_type", "system", "infoflow4",
|
||||||
|
"system")
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[1], "type_change", "system", "tc_switch_block", "infoflow6",
|
||||||
|
"system", cond="tc_switch_block_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[2], "type_change", "tc_move_from_bool", "system",
|
||||||
|
"infoflow4", "system", cond="tc_move_from_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[3], "type_change", "tc_move_to_bool", "system",
|
||||||
|
"infoflow3", "system")
|
||||||
|
|
||||||
|
# removed rule with existing types
|
||||||
|
self.validate_rule(rules[4], "type_change", "tc_removed_rule_source",
|
||||||
|
"tc_removed_rule_target", "infoflow", "system")
|
||||||
|
|
||||||
|
def test_modified_type_change_rules(self):
|
||||||
|
"""Diff: modified type_change rules."""
|
||||||
|
l = sorted(self.diff.modified_type_changes)
|
||||||
|
self.assertEqual(1, len(l))
|
||||||
|
|
||||||
|
rule, added_default, removed_default = l[0]
|
||||||
|
self.assertEqual("type_change", rule.ruletype)
|
||||||
|
self.assertEqual("tc_matched_source", rule.source)
|
||||||
|
self.assertEqual("system", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertEqual("tc_new_type", added_default)
|
||||||
|
self.assertEqual("tc_old_type", removed_default)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Type_member rules
|
||||||
|
#
|
||||||
|
def test_added_type_member_rules(self):
|
||||||
|
"""Diff: added type_member rules."""
|
||||||
|
rules = sorted(self.diff.added_type_members)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# added rule with new type
|
||||||
|
self.validate_rule(rules[0], "type_member", "added_type", "system", "infoflow4",
|
||||||
|
"system")
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[1], "type_member", "system", "tm_switch_block", "infoflow6",
|
||||||
|
"system", cond="tm_switch_block_b", cond_block=False)
|
||||||
|
|
||||||
|
# added rule with existing types
|
||||||
|
self.validate_rule(rules[2], "type_member", "tm_added_rule_source",
|
||||||
|
"tm_added_rule_target", "infoflow", "system")
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[3], "type_member", "tm_move_from_bool", "system",
|
||||||
|
"infoflow4", "system")
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[4], "type_member", "tm_move_to_bool", "system",
|
||||||
|
"infoflow3", "system", cond="tm_move_to_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
def test_removed_type_member_rules(self):
|
||||||
|
"""Diff: removed type_member rules."""
|
||||||
|
rules = sorted(self.diff.removed_type_members)
|
||||||
|
self.assertEqual(5, len(rules))
|
||||||
|
|
||||||
|
# removed rule with new type
|
||||||
|
self.validate_rule(rules[0], "type_member", "removed_type", "system", "infoflow4",
|
||||||
|
"system")
|
||||||
|
|
||||||
|
# rule moved from one conditional block to another (true to false)
|
||||||
|
self.validate_rule(rules[1], "type_member", "system", "tm_switch_block", "infoflow6",
|
||||||
|
"system", cond="tm_switch_block_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved out of a conditional
|
||||||
|
self.validate_rule(rules[2], "type_member", "tm_move_from_bool", "system",
|
||||||
|
"infoflow4", "system", cond="tm_move_from_bool_b", cond_block=True)
|
||||||
|
|
||||||
|
# rule moved into a conditional
|
||||||
|
self.validate_rule(rules[3], "type_member", "tm_move_to_bool", "system",
|
||||||
|
"infoflow3", "system")
|
||||||
|
|
||||||
|
# removed rule with existing types
|
||||||
|
self.validate_rule(rules[4], "type_member", "tm_removed_rule_source",
|
||||||
|
"tm_removed_rule_target", "infoflow", "system")
|
||||||
|
|
||||||
|
def test_modified_type_member_rules(self):
|
||||||
|
"""Diff: modified type_member rules."""
|
||||||
|
l = sorted(self.diff.modified_type_members)
|
||||||
|
self.assertEqual(1, len(l))
|
||||||
|
|
||||||
|
rule, added_default, removed_default = l[0]
|
||||||
|
self.assertEqual("type_member", rule.ruletype)
|
||||||
|
self.assertEqual("tm_matched_source", rule.source)
|
||||||
|
self.assertEqual("system", rule.target)
|
||||||
|
self.assertEqual("infoflow", rule.tclass)
|
||||||
|
self.assertEqual("tm_new_type", added_default)
|
||||||
|
self.assertEqual("tm_old_type", removed_default)
|
||||||
|
|
||||||
|
|
||||||
class PolicyDifferenceTestNoDiff(unittest.TestCase):
|
class PolicyDifferenceTestNoDiff(unittest.TestCase):
|
||||||
|
|
||||||
@ -264,3 +792,87 @@ class PolicyDifferenceTestNoDiff(unittest.TestCase):
|
|||||||
def test_modified_classes(self):
|
def test_modified_classes(self):
|
||||||
"""NoDiff: no modified classes."""
|
"""NoDiff: no modified classes."""
|
||||||
self.assertFalse(self.diff.modified_classes)
|
self.assertFalse(self.diff.modified_classes)
|
||||||
|
|
||||||
|
def test_added_allows(self):
|
||||||
|
"""NoDiff: no added allow rules."""
|
||||||
|
self.assertFalse(self.diff.added_allows)
|
||||||
|
|
||||||
|
def test_removed_allows(self):
|
||||||
|
"""NoDiff: no removed allow rules."""
|
||||||
|
self.assertFalse(self.diff.removed_allows)
|
||||||
|
|
||||||
|
def test_modified_allows(self):
|
||||||
|
"""NoDiff: no modified allow rules."""
|
||||||
|
self.assertFalse(self.diff.modified_allows)
|
||||||
|
|
||||||
|
def test_added_auditallows(self):
|
||||||
|
"""NoDiff: no added auditallow rules."""
|
||||||
|
self.assertFalse(self.diff.added_auditallows)
|
||||||
|
|
||||||
|
def test_removed_auditallows(self):
|
||||||
|
"""NoDiff: no removed auditallow rules."""
|
||||||
|
self.assertFalse(self.diff.removed_auditallows)
|
||||||
|
|
||||||
|
def test_modified_auditallows(self):
|
||||||
|
"""NoDiff: no modified auditallow rules."""
|
||||||
|
self.assertFalse(self.diff.modified_auditallows)
|
||||||
|
|
||||||
|
def test_added_neverallows(self):
|
||||||
|
"""NoDiff: no added neverallow rules."""
|
||||||
|
self.assertFalse(self.diff.added_neverallows)
|
||||||
|
|
||||||
|
def test_removed_neverallows(self):
|
||||||
|
"""NoDiff: no removed neverallow rules."""
|
||||||
|
self.assertFalse(self.diff.removed_neverallows)
|
||||||
|
|
||||||
|
def test_modified_neverallows(self):
|
||||||
|
"""NoDiff: no modified neverallow rules."""
|
||||||
|
self.assertFalse(self.diff.modified_neverallows)
|
||||||
|
|
||||||
|
def test_added_dontaudits(self):
|
||||||
|
"""NoDiff: no added dontaudit rules."""
|
||||||
|
self.assertFalse(self.diff.added_dontaudits)
|
||||||
|
|
||||||
|
def test_removed_dontaudits(self):
|
||||||
|
"""NoDiff: no removed dontaudit rules."""
|
||||||
|
self.assertFalse(self.diff.removed_dontaudits)
|
||||||
|
|
||||||
|
def test_modified_dontaudits(self):
|
||||||
|
"""NoDiff: no modified dontaudit rules."""
|
||||||
|
self.assertFalse(self.diff.modified_dontaudits)
|
||||||
|
|
||||||
|
def test_added_type_transitions(self):
|
||||||
|
"""NoDiff: no added type_transition rules."""
|
||||||
|
self.assertFalse(self.diff.added_type_transitions)
|
||||||
|
|
||||||
|
def test_removed_type_transitions(self):
|
||||||
|
"""NoDiff: no removed type_transition rules."""
|
||||||
|
self.assertFalse(self.diff.removed_type_transitions)
|
||||||
|
|
||||||
|
def test_modified_type_transitions(self):
|
||||||
|
"""NoDiff: no modified type_transition rules."""
|
||||||
|
self.assertFalse(self.diff.modified_type_transitions)
|
||||||
|
|
||||||
|
def test_added_type_changes(self):
|
||||||
|
"""NoDiff: no added type_change rules."""
|
||||||
|
self.assertFalse(self.diff.added_type_changes)
|
||||||
|
|
||||||
|
def test_removed_type_changes(self):
|
||||||
|
"""NoDiff: no removed type_change rules."""
|
||||||
|
self.assertFalse(self.diff.removed_type_changes)
|
||||||
|
|
||||||
|
def test_modified_type_changes(self):
|
||||||
|
"""NoDiff: no modified type_change rules."""
|
||||||
|
self.assertFalse(self.diff.modified_type_changes)
|
||||||
|
|
||||||
|
def test_added_type_members(self):
|
||||||
|
"""NoDiff: no added type_member rules."""
|
||||||
|
self.assertFalse(self.diff.added_type_members)
|
||||||
|
|
||||||
|
def test_removed_type_members(self):
|
||||||
|
"""NoDiff: no removed type_member rules."""
|
||||||
|
self.assertFalse(self.diff.removed_type_members)
|
||||||
|
|
||||||
|
def test_modified_type_members(self):
|
||||||
|
"""NoDiff: no modified type_member rules."""
|
||||||
|
self.assertFalse(self.diff.modified_type_members)
|
||||||
|
@ -142,6 +142,350 @@ role modified_add_type;
|
|||||||
role modified_remove_type;
|
role modified_remove_type;
|
||||||
role modified_remove_type types { system };
|
role modified_remove_type types { system };
|
||||||
|
|
||||||
|
# Allow rule differences
|
||||||
|
type matched_source;
|
||||||
|
type matched_target;
|
||||||
|
allow matched_source matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type removed_rule_source;
|
||||||
|
type removed_rule_target;
|
||||||
|
allow removed_rule_source removed_rule_target:infoflow hi_r;
|
||||||
|
|
||||||
|
type added_rule_source;
|
||||||
|
type added_rule_target;
|
||||||
|
|
||||||
|
type modified_rule_add_perms;
|
||||||
|
allow modified_rule_add_perms self:infoflow hi_r;
|
||||||
|
|
||||||
|
type modified_rule_remove_perms;
|
||||||
|
allow modified_rule_remove_perms self:infoflow { low_r low_w };
|
||||||
|
|
||||||
|
type modified_rule_add_remove_perms;
|
||||||
|
allow modified_rule_add_remove_perms self:infoflow2 { low_w super_w };
|
||||||
|
|
||||||
|
allow removed_type self:infoflow3 null;
|
||||||
|
|
||||||
|
type move_to_bool;
|
||||||
|
bool move_to_bool_b false;
|
||||||
|
allow move_to_bool self:infoflow4 hi_w;
|
||||||
|
|
||||||
|
type move_from_bool;
|
||||||
|
bool move_from_bool_b false;
|
||||||
|
if (move_from_bool_b) {
|
||||||
|
allow move_from_bool self:infoflow4 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
type switch_block;
|
||||||
|
bool switch_block_b false;
|
||||||
|
if (switch_block_b) {
|
||||||
|
allow system switch_block:infoflow5 hi_r;
|
||||||
|
allow system switch_block:infoflow6 hi_r;
|
||||||
|
} else {
|
||||||
|
allow system switch_block:infoflow7 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute match_rule_by_attr;
|
||||||
|
type match_rule_by_attr_A_t, match_rule_by_attr;
|
||||||
|
type match_rule_by_attr_B_t, match_rule_by_attr;
|
||||||
|
allow match_rule_by_attr self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute unioned_perm_via_attr;
|
||||||
|
type unioned_perm_via_attr_A_t, unioned_perm_via_attr;
|
||||||
|
type unioned_perm_via_attr_B_t, unioned_perm_via_attr;
|
||||||
|
allow unioned_perm_via_attr self:infoflow2 super_w;
|
||||||
|
allow unioned_perm_via_attr_A_t self:infoflow2 super_r;
|
||||||
|
allow unioned_perm_via_attr_B_t self:infoflow2 hi_w;
|
||||||
|
|
||||||
|
# Auditallow rule differences
|
||||||
|
type aa_matched_source;
|
||||||
|
type aa_matched_target;
|
||||||
|
auditallow aa_matched_source aa_matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type aa_removed_rule_source;
|
||||||
|
type aa_removed_rule_target;
|
||||||
|
auditallow aa_removed_rule_source aa_removed_rule_target:infoflow hi_r;
|
||||||
|
|
||||||
|
type aa_added_rule_source;
|
||||||
|
type aa_added_rule_target;
|
||||||
|
|
||||||
|
type aa_modified_rule_add_perms;
|
||||||
|
auditallow aa_modified_rule_add_perms self:infoflow hi_r;
|
||||||
|
|
||||||
|
type aa_modified_rule_remove_perms;
|
||||||
|
auditallow aa_modified_rule_remove_perms self:infoflow { low_r low_w };
|
||||||
|
|
||||||
|
type aa_modified_rule_add_remove_perms;
|
||||||
|
auditallow aa_modified_rule_add_remove_perms self:infoflow2 { low_w super_w };
|
||||||
|
|
||||||
|
auditallow removed_type self:infoflow7 super_unmapped;
|
||||||
|
|
||||||
|
type aa_move_to_bool;
|
||||||
|
bool aa_move_to_bool_b false;
|
||||||
|
auditallow aa_move_to_bool self:infoflow4 hi_w;
|
||||||
|
|
||||||
|
type aa_move_from_bool;
|
||||||
|
bool aa_move_from_bool_b false;
|
||||||
|
if (aa_move_from_bool_b) {
|
||||||
|
auditallow aa_move_from_bool self:infoflow4 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
type aa_switch_block;
|
||||||
|
bool aa_switch_block_b false;
|
||||||
|
if (aa_switch_block_b) {
|
||||||
|
auditallow system aa_switch_block:infoflow5 hi_r;
|
||||||
|
auditallow system aa_switch_block:infoflow6 hi_r;
|
||||||
|
} else {
|
||||||
|
auditallow system aa_switch_block:infoflow7 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute aa_match_rule_by_attr;
|
||||||
|
type aa_match_rule_by_attr_A_t, aa_match_rule_by_attr;
|
||||||
|
type aa_match_rule_by_attr_B_t, aa_match_rule_by_attr;
|
||||||
|
auditallow aa_match_rule_by_attr self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute aa_unioned_perm_via_attr;
|
||||||
|
type aa_unioned_perm_via_attr_A_t, aa_unioned_perm_via_attr;
|
||||||
|
type aa_unioned_perm_via_attr_B_t, aa_unioned_perm_via_attr;
|
||||||
|
auditallow aa_unioned_perm_via_attr self:infoflow2 super_w;
|
||||||
|
auditallow aa_unioned_perm_via_attr_A_t self:infoflow2 super_r;
|
||||||
|
auditallow aa_unioned_perm_via_attr_B_t self:infoflow2 hi_w;
|
||||||
|
|
||||||
|
# Dontaudit rule differences
|
||||||
|
type da_matched_source;
|
||||||
|
type da_matched_target;
|
||||||
|
dontaudit da_matched_source da_matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type da_removed_rule_source;
|
||||||
|
type da_removed_rule_target;
|
||||||
|
dontaudit da_removed_rule_source da_removed_rule_target:infoflow hi_r;
|
||||||
|
|
||||||
|
type da_added_rule_source;
|
||||||
|
type da_added_rule_target;
|
||||||
|
|
||||||
|
type da_modified_rule_add_perms;
|
||||||
|
dontaudit da_modified_rule_add_perms self:infoflow hi_r;
|
||||||
|
|
||||||
|
type da_modified_rule_remove_perms;
|
||||||
|
dontaudit da_modified_rule_remove_perms self:infoflow { low_r low_w };
|
||||||
|
|
||||||
|
type da_modified_rule_add_remove_perms;
|
||||||
|
dontaudit da_modified_rule_add_remove_perms self:infoflow2 { low_w super_w };
|
||||||
|
|
||||||
|
dontaudit removed_type self:infoflow7 super_both;
|
||||||
|
|
||||||
|
type da_move_to_bool;
|
||||||
|
bool da_move_to_bool_b false;
|
||||||
|
dontaudit da_move_to_bool self:infoflow4 hi_w;
|
||||||
|
|
||||||
|
type da_move_from_bool;
|
||||||
|
bool da_move_from_bool_b false;
|
||||||
|
if (da_move_from_bool_b) {
|
||||||
|
dontaudit da_move_from_bool self:infoflow4 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
type da_switch_block;
|
||||||
|
bool da_switch_block_b false;
|
||||||
|
if (da_switch_block_b) {
|
||||||
|
dontaudit system da_switch_block:infoflow5 hi_r;
|
||||||
|
dontaudit system da_switch_block:infoflow6 hi_r;
|
||||||
|
} else {
|
||||||
|
dontaudit system da_switch_block:infoflow7 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute da_match_rule_by_attr;
|
||||||
|
type da_match_rule_by_attr_A_t, da_match_rule_by_attr;
|
||||||
|
type da_match_rule_by_attr_B_t, da_match_rule_by_attr;
|
||||||
|
dontaudit da_match_rule_by_attr self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute da_unioned_perm_via_attr;
|
||||||
|
type da_unioned_perm_via_attr_A_t, da_unioned_perm_via_attr;
|
||||||
|
type da_unioned_perm_via_attr_B_t, da_unioned_perm_via_attr;
|
||||||
|
dontaudit da_unioned_perm_via_attr self:infoflow2 super_w;
|
||||||
|
dontaudit da_unioned_perm_via_attr_A_t self:infoflow2 super_r;
|
||||||
|
dontaudit da_unioned_perm_via_attr_B_t self:infoflow2 hi_w;
|
||||||
|
|
||||||
|
# Neverallow rule differences
|
||||||
|
type na_matched_source;
|
||||||
|
type na_matched_target;
|
||||||
|
neverallow na_matched_source na_matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type na_removed_rule_source;
|
||||||
|
type na_removed_rule_target;
|
||||||
|
neverallow na_removed_rule_source na_removed_rule_target:infoflow hi_r;
|
||||||
|
|
||||||
|
type na_added_rule_source;
|
||||||
|
type na_added_rule_target;
|
||||||
|
|
||||||
|
type na_modified_rule_add_perms;
|
||||||
|
neverallow na_modified_rule_add_perms self:infoflow hi_r;
|
||||||
|
|
||||||
|
type na_modified_rule_remove_perms;
|
||||||
|
neverallow na_modified_rule_remove_perms self:infoflow { low_r low_w };
|
||||||
|
|
||||||
|
type na_modified_rule_add_remove_perms;
|
||||||
|
neverallow na_modified_rule_add_remove_perms self:infoflow2 { low_w super_w };
|
||||||
|
|
||||||
|
neverallow removed_type self:removed_class null_perm;
|
||||||
|
|
||||||
|
attribute na_match_rule_by_attr;
|
||||||
|
type na_match_rule_by_attr_A_t, na_match_rule_by_attr;
|
||||||
|
type na_match_rule_by_attr_B_t, na_match_rule_by_attr;
|
||||||
|
neverallow na_match_rule_by_attr self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute na_unioned_perm_via_attr;
|
||||||
|
type na_unioned_perm_via_attr_A_t, na_unioned_perm_via_attr;
|
||||||
|
type na_unioned_perm_via_attr_B_t, na_unioned_perm_via_attr;
|
||||||
|
neverallow na_unioned_perm_via_attr self:infoflow2 super_w;
|
||||||
|
neverallow na_unioned_perm_via_attr_A_t self:infoflow2 super_r;
|
||||||
|
neverallow na_unioned_perm_via_attr_B_t self:infoflow2 hi_w;
|
||||||
|
|
||||||
|
# type_transition rule differences
|
||||||
|
type tt_matched_source;
|
||||||
|
type tt_matched_target;
|
||||||
|
type_transition tt_matched_source tt_matched_target:infoflow system;
|
||||||
|
|
||||||
|
type tt_removed_rule_source;
|
||||||
|
type tt_removed_rule_target;
|
||||||
|
type_transition tt_removed_rule_source tt_removed_rule_target:infoflow system;
|
||||||
|
|
||||||
|
type tt_added_rule_source;
|
||||||
|
type tt_added_rule_target;
|
||||||
|
|
||||||
|
type tt_old_type;
|
||||||
|
type tt_new_type;
|
||||||
|
type_transition tt_matched_source system:infoflow tt_old_type;
|
||||||
|
|
||||||
|
type_transition removed_type system:infoflow4 system;
|
||||||
|
|
||||||
|
type tt_move_to_bool;
|
||||||
|
bool tt_move_to_bool_b false;
|
||||||
|
type_transition tt_move_to_bool system:infoflow3 system;
|
||||||
|
|
||||||
|
type tt_move_from_bool;
|
||||||
|
bool tt_move_from_bool_b false;
|
||||||
|
if (tt_move_from_bool_b) {
|
||||||
|
type_transition tt_move_from_bool system:infoflow4 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
type tt_switch_block;
|
||||||
|
bool tt_switch_block_b false;
|
||||||
|
if (tt_switch_block_b) {
|
||||||
|
type_transition system tt_switch_block:infoflow5 system;
|
||||||
|
type_transition system tt_switch_block:infoflow6 system;
|
||||||
|
} else {
|
||||||
|
type_transition system tt_switch_block:infoflow7 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute tt_match_rule_by_attr;
|
||||||
|
type tt_match_rule_by_attr_A_t, tt_match_rule_by_attr;
|
||||||
|
type tt_match_rule_by_attr_B_t, tt_match_rule_by_attr;
|
||||||
|
type_transition tt_match_rule_by_attr system:infoflow2 system;
|
||||||
|
|
||||||
|
attribute tt_unioned_perm_via_attr;
|
||||||
|
type tt_unioned_perm_via_attr_A_t, tt_unioned_perm_via_attr;
|
||||||
|
type tt_unioned_perm_via_attr_B_t, tt_unioned_perm_via_attr;
|
||||||
|
type_transition tt_unioned_perm_via_attr system:infoflow2 system;
|
||||||
|
type_transition tt_unioned_perm_via_attr_A_t system:infoflow2 system;
|
||||||
|
type_transition tt_unioned_perm_via_attr_B_t system:infoflow2 system;
|
||||||
|
|
||||||
|
# type_change rule differences
|
||||||
|
type tc_matched_source;
|
||||||
|
type tc_matched_target;
|
||||||
|
type_change tc_matched_source tc_matched_target:infoflow system;
|
||||||
|
|
||||||
|
type tc_removed_rule_source;
|
||||||
|
type tc_removed_rule_target;
|
||||||
|
type_change tc_removed_rule_source tc_removed_rule_target:infoflow system;
|
||||||
|
|
||||||
|
type tc_added_rule_source;
|
||||||
|
type tc_added_rule_target;
|
||||||
|
|
||||||
|
type tc_old_type;
|
||||||
|
type tc_new_type;
|
||||||
|
type_change tc_matched_source system:infoflow tc_old_type;
|
||||||
|
|
||||||
|
type_change removed_type system:infoflow4 system;
|
||||||
|
|
||||||
|
type tc_move_to_bool;
|
||||||
|
bool tc_move_to_bool_b false;
|
||||||
|
type_change tc_move_to_bool system:infoflow3 system;
|
||||||
|
|
||||||
|
type tc_move_from_bool;
|
||||||
|
bool tc_move_from_bool_b false;
|
||||||
|
if (tc_move_from_bool_b) {
|
||||||
|
type_change tc_move_from_bool system:infoflow4 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
type tc_switch_block;
|
||||||
|
bool tc_switch_block_b false;
|
||||||
|
if (tc_switch_block_b) {
|
||||||
|
type_change system tc_switch_block:infoflow5 system;
|
||||||
|
type_change system tc_switch_block:infoflow6 system;
|
||||||
|
} else {
|
||||||
|
type_change system tc_switch_block:infoflow7 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute tc_match_rule_by_attr;
|
||||||
|
type tc_match_rule_by_attr_A_t, tc_match_rule_by_attr;
|
||||||
|
type tc_match_rule_by_attr_B_t, tc_match_rule_by_attr;
|
||||||
|
type_change tc_match_rule_by_attr system:infoflow2 system;
|
||||||
|
|
||||||
|
attribute tc_unioned_perm_via_attr;
|
||||||
|
type tc_unioned_perm_via_attr_A_t, tc_unioned_perm_via_attr;
|
||||||
|
type tc_unioned_perm_via_attr_B_t, tc_unioned_perm_via_attr;
|
||||||
|
type_change tc_unioned_perm_via_attr system:infoflow2 system;
|
||||||
|
type_change tc_unioned_perm_via_attr_A_t system:infoflow2 system;
|
||||||
|
type_change tc_unioned_perm_via_attr_B_t system:infoflow2 system;
|
||||||
|
|
||||||
|
# type_member rule differences
|
||||||
|
type tm_matched_source;
|
||||||
|
type tm_matched_target;
|
||||||
|
type_member tm_matched_source tm_matched_target:infoflow system;
|
||||||
|
|
||||||
|
type tm_removed_rule_source;
|
||||||
|
type tm_removed_rule_target;
|
||||||
|
type_member tm_removed_rule_source tm_removed_rule_target:infoflow system;
|
||||||
|
|
||||||
|
type tm_added_rule_source;
|
||||||
|
type tm_added_rule_target;
|
||||||
|
|
||||||
|
type tm_old_type;
|
||||||
|
type tm_new_type;
|
||||||
|
type_member tm_matched_source system:infoflow tm_old_type;
|
||||||
|
|
||||||
|
type_member removed_type system:infoflow4 system;
|
||||||
|
|
||||||
|
type tm_move_to_bool;
|
||||||
|
bool tm_move_to_bool_b false;
|
||||||
|
type_member tm_move_to_bool system:infoflow3 system;
|
||||||
|
|
||||||
|
type tm_move_from_bool;
|
||||||
|
bool tm_move_from_bool_b false;
|
||||||
|
if (tm_move_from_bool_b) {
|
||||||
|
type_member tm_move_from_bool system:infoflow4 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
type tm_switch_block;
|
||||||
|
bool tm_switch_block_b false;
|
||||||
|
if (tm_switch_block_b) {
|
||||||
|
type_member system tm_switch_block:infoflow5 system;
|
||||||
|
type_member system tm_switch_block:infoflow6 system;
|
||||||
|
} else {
|
||||||
|
type_member system tm_switch_block:infoflow7 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute tm_match_rule_by_attr;
|
||||||
|
type tm_match_rule_by_attr_A_t, tm_match_rule_by_attr;
|
||||||
|
type tm_match_rule_by_attr_B_t, tm_match_rule_by_attr;
|
||||||
|
type_member tm_match_rule_by_attr system:infoflow2 system;
|
||||||
|
|
||||||
|
attribute tm_unioned_perm_via_attr;
|
||||||
|
type tm_unioned_perm_via_attr_A_t, tm_unioned_perm_via_attr;
|
||||||
|
type tm_unioned_perm_via_attr_B_t, tm_unioned_perm_via_attr;
|
||||||
|
type_member tm_unioned_perm_via_attr system:infoflow2 system;
|
||||||
|
type_member tm_unioned_perm_via_attr_A_t system:infoflow2 system;
|
||||||
|
type_member tm_unioned_perm_via_attr_B_t system:infoflow2 system;
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
#users
|
#users
|
||||||
|
@ -142,6 +142,350 @@ role modified_add_type types { system };
|
|||||||
|
|
||||||
role modified_remove_type;
|
role modified_remove_type;
|
||||||
|
|
||||||
|
# Allow rule differences
|
||||||
|
type matched_source;
|
||||||
|
type matched_target;
|
||||||
|
allow matched_source matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type removed_rule_source;
|
||||||
|
type removed_rule_target;
|
||||||
|
|
||||||
|
type added_rule_source;
|
||||||
|
type added_rule_target;
|
||||||
|
allow added_rule_source added_rule_target:infoflow med_w;
|
||||||
|
|
||||||
|
type modified_rule_add_perms;
|
||||||
|
allow modified_rule_add_perms self:infoflow { hi_r hi_w };
|
||||||
|
|
||||||
|
type modified_rule_remove_perms;
|
||||||
|
allow modified_rule_remove_perms self:infoflow low_w;
|
||||||
|
|
||||||
|
type modified_rule_add_remove_perms;
|
||||||
|
allow modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
|
||||||
|
|
||||||
|
allow added_type self:infoflow2 med_w;
|
||||||
|
|
||||||
|
type move_to_bool;
|
||||||
|
bool move_to_bool_b false;
|
||||||
|
if (move_to_bool_b) {
|
||||||
|
allow move_to_bool self:infoflow4 hi_w;
|
||||||
|
}
|
||||||
|
|
||||||
|
type move_from_bool;
|
||||||
|
bool move_from_bool_b false;
|
||||||
|
allow move_from_bool self:infoflow4 hi_r;
|
||||||
|
|
||||||
|
type switch_block;
|
||||||
|
bool switch_block_b false;
|
||||||
|
if (switch_block_b) {
|
||||||
|
allow system switch_block:infoflow5 hi_r;
|
||||||
|
} else {
|
||||||
|
allow system switch_block:infoflow6 hi_r;
|
||||||
|
allow system switch_block:infoflow7 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute match_rule_by_attr;
|
||||||
|
type match_rule_by_attr_A_t, match_rule_by_attr;
|
||||||
|
type match_rule_by_attr_B_t, match_rule_by_attr;
|
||||||
|
allow match_rule_by_attr_A_t self:infoflow2 super_w;
|
||||||
|
allow match_rule_by_attr_B_t self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute unioned_perm_via_attr;
|
||||||
|
type unioned_perm_via_attr_A_t, unioned_perm_via_attr;
|
||||||
|
type unioned_perm_via_attr_B_t, unioned_perm_via_attr;
|
||||||
|
allow unioned_perm_via_attr_A_t self:infoflow2 { super_w super_r };
|
||||||
|
allow unioned_perm_via_attr_B_t self:infoflow2 { super_w hi_w };
|
||||||
|
|
||||||
|
# Auditallow rule differences
|
||||||
|
type aa_matched_source;
|
||||||
|
type aa_matched_target;
|
||||||
|
auditallow aa_matched_source aa_matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type aa_removed_rule_source;
|
||||||
|
type aa_removed_rule_target;
|
||||||
|
|
||||||
|
type aa_added_rule_source;
|
||||||
|
type aa_added_rule_target;
|
||||||
|
auditallow aa_added_rule_source aa_added_rule_target:infoflow med_w;
|
||||||
|
|
||||||
|
type aa_modified_rule_add_perms;
|
||||||
|
auditallow aa_modified_rule_add_perms self:infoflow { hi_r hi_w };
|
||||||
|
|
||||||
|
type aa_modified_rule_remove_perms;
|
||||||
|
auditallow aa_modified_rule_remove_perms self:infoflow low_w;
|
||||||
|
|
||||||
|
type aa_modified_rule_add_remove_perms;
|
||||||
|
auditallow aa_modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
|
||||||
|
|
||||||
|
auditallow added_type self:infoflow7 super_none;
|
||||||
|
|
||||||
|
type aa_move_to_bool;
|
||||||
|
bool aa_move_to_bool_b false;
|
||||||
|
if (aa_move_to_bool_b) {
|
||||||
|
auditallow aa_move_to_bool self:infoflow4 hi_w;
|
||||||
|
}
|
||||||
|
|
||||||
|
type aa_move_from_bool;
|
||||||
|
bool aa_move_from_bool_b false;
|
||||||
|
auditallow aa_move_from_bool self:infoflow4 hi_r;
|
||||||
|
|
||||||
|
type aa_switch_block;
|
||||||
|
bool aa_switch_block_b false;
|
||||||
|
if (aa_switch_block_b) {
|
||||||
|
auditallow system aa_switch_block:infoflow5 hi_r;
|
||||||
|
} else {
|
||||||
|
auditallow system aa_switch_block:infoflow6 hi_r;
|
||||||
|
auditallow system aa_switch_block:infoflow7 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute aa_match_rule_by_attr;
|
||||||
|
type aa_match_rule_by_attr_A_t, aa_match_rule_by_attr;
|
||||||
|
type aa_match_rule_by_attr_B_t, aa_match_rule_by_attr;
|
||||||
|
auditallow aa_match_rule_by_attr_A_t self:infoflow2 super_w;
|
||||||
|
auditallow aa_match_rule_by_attr_B_t self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute aa_unioned_perm_via_attr;
|
||||||
|
type aa_unioned_perm_via_attr_A_t, aa_unioned_perm_via_attr;
|
||||||
|
type aa_unioned_perm_via_attr_B_t, aa_unioned_perm_via_attr;
|
||||||
|
auditallow aa_unioned_perm_via_attr_A_t self:infoflow2 { super_w super_r };
|
||||||
|
auditallow aa_unioned_perm_via_attr_B_t self:infoflow2 { super_w hi_w };
|
||||||
|
|
||||||
|
# Dontaudit rule differences
|
||||||
|
type da_matched_source;
|
||||||
|
type da_matched_target;
|
||||||
|
dontaudit da_matched_source da_matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type da_removed_rule_source;
|
||||||
|
type da_removed_rule_target;
|
||||||
|
|
||||||
|
type da_added_rule_source;
|
||||||
|
type da_added_rule_target;
|
||||||
|
dontaudit da_added_rule_source da_added_rule_target:infoflow med_w;
|
||||||
|
|
||||||
|
type da_modified_rule_add_perms;
|
||||||
|
dontaudit da_modified_rule_add_perms self:infoflow { hi_r hi_w };
|
||||||
|
|
||||||
|
type da_modified_rule_remove_perms;
|
||||||
|
dontaudit da_modified_rule_remove_perms self:infoflow low_w;
|
||||||
|
|
||||||
|
type da_modified_rule_add_remove_perms;
|
||||||
|
dontaudit da_modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
|
||||||
|
|
||||||
|
dontaudit added_type self:infoflow7 super_none;
|
||||||
|
|
||||||
|
type da_move_to_bool;
|
||||||
|
bool da_move_to_bool_b false;
|
||||||
|
if (da_move_to_bool_b) {
|
||||||
|
dontaudit da_move_to_bool self:infoflow4 hi_w;
|
||||||
|
}
|
||||||
|
|
||||||
|
type da_move_from_bool;
|
||||||
|
bool da_move_from_bool_b false;
|
||||||
|
dontaudit da_move_from_bool self:infoflow4 hi_r;
|
||||||
|
|
||||||
|
type da_switch_block;
|
||||||
|
bool da_switch_block_b false;
|
||||||
|
if (da_switch_block_b) {
|
||||||
|
dontaudit system da_switch_block:infoflow5 hi_r;
|
||||||
|
} else {
|
||||||
|
dontaudit system da_switch_block:infoflow6 hi_r;
|
||||||
|
dontaudit system da_switch_block:infoflow7 hi_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute da_match_rule_by_attr;
|
||||||
|
type da_match_rule_by_attr_A_t, da_match_rule_by_attr;
|
||||||
|
type da_match_rule_by_attr_B_t, da_match_rule_by_attr;
|
||||||
|
dontaudit da_match_rule_by_attr_A_t self:infoflow2 super_w;
|
||||||
|
dontaudit da_match_rule_by_attr_B_t self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute da_unioned_perm_via_attr;
|
||||||
|
type da_unioned_perm_via_attr_A_t, da_unioned_perm_via_attr;
|
||||||
|
type da_unioned_perm_via_attr_B_t, da_unioned_perm_via_attr;
|
||||||
|
dontaudit da_unioned_perm_via_attr_A_t self:infoflow2 { super_w super_r };
|
||||||
|
dontaudit da_unioned_perm_via_attr_B_t self:infoflow2 { super_w hi_w };
|
||||||
|
|
||||||
|
# Neverallow rule differences
|
||||||
|
type na_matched_source;
|
||||||
|
type na_matched_target;
|
||||||
|
neverallow na_matched_source na_matched_target:infoflow hi_w;
|
||||||
|
|
||||||
|
type na_removed_rule_source;
|
||||||
|
type na_removed_rule_target;
|
||||||
|
|
||||||
|
type na_added_rule_source;
|
||||||
|
type na_added_rule_target;
|
||||||
|
neverallow na_added_rule_source na_added_rule_target:infoflow med_w;
|
||||||
|
|
||||||
|
type na_modified_rule_add_perms;
|
||||||
|
neverallow na_modified_rule_add_perms self:infoflow { hi_r hi_w };
|
||||||
|
|
||||||
|
type na_modified_rule_remove_perms;
|
||||||
|
neverallow na_modified_rule_remove_perms self:infoflow low_w;
|
||||||
|
|
||||||
|
type na_modified_rule_add_remove_perms;
|
||||||
|
neverallow na_modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
|
||||||
|
|
||||||
|
neverallow added_type self:added_class new_class_perm;
|
||||||
|
|
||||||
|
attribute na_match_rule_by_attr;
|
||||||
|
type na_match_rule_by_attr_A_t, na_match_rule_by_attr;
|
||||||
|
type na_match_rule_by_attr_B_t, na_match_rule_by_attr;
|
||||||
|
neverallow na_match_rule_by_attr_A_t self:infoflow2 super_w;
|
||||||
|
neverallow na_match_rule_by_attr_B_t self:infoflow2 super_w;
|
||||||
|
|
||||||
|
attribute na_unioned_perm_via_attr;
|
||||||
|
type na_unioned_perm_via_attr_A_t, na_unioned_perm_via_attr;
|
||||||
|
type na_unioned_perm_via_attr_B_t, na_unioned_perm_via_attr;
|
||||||
|
neverallow na_unioned_perm_via_attr_A_t self:infoflow2 { super_w super_r };
|
||||||
|
neverallow na_unioned_perm_via_attr_B_t self:infoflow2 { super_w hi_w };
|
||||||
|
|
||||||
|
# type_transition rule differences
|
||||||
|
type tt_matched_source;
|
||||||
|
type tt_matched_target;
|
||||||
|
type_transition tt_matched_source tt_matched_target:infoflow system;
|
||||||
|
|
||||||
|
type tt_removed_rule_source;
|
||||||
|
type tt_removed_rule_target;
|
||||||
|
|
||||||
|
type tt_added_rule_source;
|
||||||
|
type tt_added_rule_target;
|
||||||
|
type_transition tt_added_rule_source tt_added_rule_target:infoflow system;
|
||||||
|
|
||||||
|
type tt_old_type;
|
||||||
|
type tt_new_type;
|
||||||
|
type_transition tt_matched_source system:infoflow tt_new_type;
|
||||||
|
|
||||||
|
type_transition added_type system:infoflow4 system;
|
||||||
|
|
||||||
|
type tt_move_to_bool;
|
||||||
|
bool tt_move_to_bool_b false;
|
||||||
|
if (tt_move_to_bool_b) {
|
||||||
|
type_transition tt_move_to_bool system:infoflow3 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
type tt_move_from_bool;
|
||||||
|
bool tt_move_from_bool_b false;
|
||||||
|
type_transition tt_move_from_bool system:infoflow4 system;
|
||||||
|
|
||||||
|
type tt_switch_block;
|
||||||
|
bool tt_switch_block_b false;
|
||||||
|
if (tt_switch_block_b) {
|
||||||
|
type_transition system tt_switch_block:infoflow5 system;
|
||||||
|
} else {
|
||||||
|
type_transition system tt_switch_block:infoflow6 system;
|
||||||
|
type_transition system tt_switch_block:infoflow7 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute tt_match_rule_by_attr;
|
||||||
|
type tt_match_rule_by_attr_A_t, tt_match_rule_by_attr;
|
||||||
|
type tt_match_rule_by_attr_B_t, tt_match_rule_by_attr;
|
||||||
|
type_transition tt_match_rule_by_attr system:infoflow2 system;
|
||||||
|
|
||||||
|
attribute tt_unioned_perm_via_attr;
|
||||||
|
type tt_unioned_perm_via_attr_A_t, tt_unioned_perm_via_attr;
|
||||||
|
type tt_unioned_perm_via_attr_B_t, tt_unioned_perm_via_attr;
|
||||||
|
type_transition tt_unioned_perm_via_attr system:infoflow2 system;
|
||||||
|
type_transition tt_unioned_perm_via_attr_A_t system:infoflow2 system;
|
||||||
|
type_transition tt_unioned_perm_via_attr_B_t system:infoflow2 system;
|
||||||
|
|
||||||
|
# type_change rule differences
|
||||||
|
type tc_matched_source;
|
||||||
|
type tc_matched_target;
|
||||||
|
type_change tc_matched_source tc_matched_target:infoflow system;
|
||||||
|
|
||||||
|
type tc_removed_rule_source;
|
||||||
|
type tc_removed_rule_target;
|
||||||
|
|
||||||
|
type tc_added_rule_source;
|
||||||
|
type tc_added_rule_target;
|
||||||
|
type_change tc_added_rule_source tc_added_rule_target:infoflow system;
|
||||||
|
|
||||||
|
type tc_old_type;
|
||||||
|
type tc_new_type;
|
||||||
|
type_change tc_matched_source system:infoflow tc_new_type;
|
||||||
|
|
||||||
|
type_change added_type system:infoflow4 system;
|
||||||
|
|
||||||
|
type tc_move_to_bool;
|
||||||
|
bool tc_move_to_bool_b false;
|
||||||
|
if (tc_move_to_bool_b) {
|
||||||
|
type_change tc_move_to_bool system:infoflow3 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
type tc_move_from_bool;
|
||||||
|
bool tc_move_from_bool_b false;
|
||||||
|
type_change tc_move_from_bool system:infoflow4 system;
|
||||||
|
|
||||||
|
type tc_switch_block;
|
||||||
|
bool tc_switch_block_b false;
|
||||||
|
if (tc_switch_block_b) {
|
||||||
|
type_change system tc_switch_block:infoflow5 system;
|
||||||
|
} else {
|
||||||
|
type_change system tc_switch_block:infoflow6 system;
|
||||||
|
type_change system tc_switch_block:infoflow7 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute tc_match_rule_by_attr;
|
||||||
|
type tc_match_rule_by_attr_A_t, tc_match_rule_by_attr;
|
||||||
|
type tc_match_rule_by_attr_B_t, tc_match_rule_by_attr;
|
||||||
|
type_change tc_match_rule_by_attr system:infoflow2 system;
|
||||||
|
|
||||||
|
attribute tc_unioned_perm_via_attr;
|
||||||
|
type tc_unioned_perm_via_attr_A_t, tc_unioned_perm_via_attr;
|
||||||
|
type tc_unioned_perm_via_attr_B_t, tc_unioned_perm_via_attr;
|
||||||
|
type_change tc_unioned_perm_via_attr system:infoflow2 system;
|
||||||
|
type_change tc_unioned_perm_via_attr_A_t system:infoflow2 system;
|
||||||
|
type_change tc_unioned_perm_via_attr_B_t system:infoflow2 system;
|
||||||
|
|
||||||
|
# type_member rule differences
|
||||||
|
type tm_matched_source;
|
||||||
|
type tm_matched_target;
|
||||||
|
type_member tm_matched_source tm_matched_target:infoflow system;
|
||||||
|
|
||||||
|
type tm_removed_rule_source;
|
||||||
|
type tm_removed_rule_target;
|
||||||
|
|
||||||
|
type tm_added_rule_source;
|
||||||
|
type tm_added_rule_target;
|
||||||
|
type_member tm_added_rule_source tm_added_rule_target:infoflow system;
|
||||||
|
|
||||||
|
type tm_old_type;
|
||||||
|
type tm_new_type;
|
||||||
|
type_member tm_matched_source system:infoflow tm_new_type;
|
||||||
|
|
||||||
|
type_member added_type system:infoflow4 system;
|
||||||
|
|
||||||
|
type tm_move_to_bool;
|
||||||
|
bool tm_move_to_bool_b false;
|
||||||
|
if (tm_move_to_bool_b) {
|
||||||
|
type_member tm_move_to_bool system:infoflow3 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
type tm_move_from_bool;
|
||||||
|
bool tm_move_from_bool_b false;
|
||||||
|
type_member tm_move_from_bool system:infoflow4 system;
|
||||||
|
|
||||||
|
type tm_switch_block;
|
||||||
|
bool tm_switch_block_b false;
|
||||||
|
if (tm_switch_block_b) {
|
||||||
|
type_member system tm_switch_block:infoflow5 system;
|
||||||
|
} else {
|
||||||
|
type_member system tm_switch_block:infoflow6 system;
|
||||||
|
type_member system tm_switch_block:infoflow7 system;
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute tm_match_rule_by_attr;
|
||||||
|
type tm_match_rule_by_attr_A_t, tm_match_rule_by_attr;
|
||||||
|
type tm_match_rule_by_attr_B_t, tm_match_rule_by_attr;
|
||||||
|
type_member tm_match_rule_by_attr system:infoflow2 system;
|
||||||
|
|
||||||
|
attribute tm_unioned_perm_via_attr;
|
||||||
|
type tm_unioned_perm_via_attr_A_t, tm_unioned_perm_via_attr;
|
||||||
|
type tm_unioned_perm_via_attr_B_t, tm_unioned_perm_via_attr;
|
||||||
|
type_member tm_unioned_perm_via_attr system:infoflow2 system;
|
||||||
|
type_member tm_unioned_perm_via_attr_A_t system:infoflow2 system;
|
||||||
|
type_member tm_unioned_perm_via_attr_B_t system:infoflow2 system;
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
#users
|
#users
|
||||||
|
@ -26,7 +26,8 @@ class ValidateRule(unittest.TestCase):
|
|||||||
|
|
||||||
"""Mixin for validating policy rules."""
|
"""Mixin for validating policy rules."""
|
||||||
|
|
||||||
def validate_rule(self, rule, ruletype, source, target, tclass, last_item, cond=None):
|
def validate_rule(self, rule, ruletype, source, target, tclass, last_item, cond=None,
|
||||||
|
cond_block=None):
|
||||||
"""Validate a rule."""
|
"""Validate a rule."""
|
||||||
self.assertEqual(ruletype, rule.ruletype)
|
self.assertEqual(ruletype, rule.ruletype)
|
||||||
self.assertEqual(source, rule.source)
|
self.assertEqual(source, rule.source)
|
||||||
@ -43,3 +44,6 @@ class ValidateRule(unittest.TestCase):
|
|||||||
self.assertEqual(cond, rule.conditional)
|
self.assertEqual(cond, rule.conditional)
|
||||||
else:
|
else:
|
||||||
self.assertRaises(RuleNotConditional, getattr, rule, "conditional")
|
self.assertRaises(RuleNotConditional, getattr, rule, "conditional")
|
||||||
|
|
||||||
|
if cond_block is not None:
|
||||||
|
self.assertEqual(cond_block, rule.conditional_block)
|
||||||
|
Loading…
Reference in New Issue
Block a user