From e55764700cbbdf607aa86ea3e62da0104b75cc12 Mon Sep 17 00:00:00 2001 From: Chris PeBenito Date: Sat, 7 Mar 2015 09:39:01 -0500 Subject: [PATCH] Refactor MLS-related objects. Drop the "MLS" prepended to category, sensitivity, level, and range objects. --- seinfo | 14 +++++----- setools/__init__.py | 2 +- .../{mlscategoryquery.py => categoryquery.py} | 4 +-- setools/policyrep/__init__.py | 22 +++++++-------- setools/policyrep/mls.py | 28 +++++++++---------- tests/__init__.py | 1 + ...scategoryquery.conf => categoryquery.conf} | 0 .../{mlscategoryquery.py => categoryquery.py} | 18 ++++++------ 8 files changed, 45 insertions(+), 44 deletions(-) rename setools/{mlscategoryquery.py => categoryquery.py} (96%) rename tests/{mlscategoryquery.conf => categoryquery.conf} (100%) rename tests/{mlscategoryquery.py => categoryquery.py} (78%) diff --git a/seinfo b/seinfo index c276307..029c89a 100755 --- a/seinfo +++ b/seinfo @@ -82,6 +82,13 @@ try: q = setools.boolquery.BoolQuery(p) components.append(("Booleans", q)) + if args.mlscatsquery or args.all: + if isinstance(args.mlscatsquery, str): + q = setools.categoryquery.CategoryQuery(p, name=args.mlscatsquery) + else: + q = setools.categoryquery.CategoryQuery(p) + components.append(("Categories", q)) + if args.classquery or args.all: if isinstance(args.classquery, str): q = setools.objclassquery.ObjClassQuery(p, name=args.classquery) @@ -110,13 +117,6 @@ try: q = setools.initsidquery.InitialSIDQuery(p) components.append(("Initial SIDs", q)) - if args.mlscatsquery or args.all: - if isinstance(args.mlscatsquery, str): - q = setools.mlscategoryquery.MLSCategoryQuery(p, name=args.mlscatsquery) - else: - q = setools.mlscategoryquery.MLSCategoryQuery(p) - components.append(("Categories", q)) - if args.netifconquery or args.all: if isinstance(args.netifconquery, str): q = setools.netifconquery.NetifconQuery(p, name=args.netifconquery) diff --git a/setools/__init__.py b/setools/__init__.py index 12443d6..2ea8d15 100644 --- a/setools/__init__.py +++ b/setools/__init__.py @@ -28,8 +28,8 @@ from . import policyrep from .policyrep import SELinuxPolicy, InvalidPolicy # Component Queries +from . import categoryquery from . import commonquery -from . import mlscategoryquery from . import objclassquery from . import typequery from . import rolequery diff --git a/setools/mlscategoryquery.py b/setools/categoryquery.py similarity index 96% rename from setools/mlscategoryquery.py rename to setools/categoryquery.py index 753377d..25e4bdb 100644 --- a/setools/mlscategoryquery.py +++ b/setools/categoryquery.py @@ -21,7 +21,7 @@ import re from . import compquery -class MLSCategoryQuery(compquery.ComponentQuery): +class CategoryQuery(compquery.ComponentQuery): """Query MLS Categories""" @@ -45,7 +45,7 @@ class MLSCategoryQuery(compquery.ComponentQuery): def results(self): """Generator which yields all matching categories.""" - for cat in self.policy.mlscategories(): + for cat in self.policy.categories(): if self.name and not self._match_regex( cat, self.name_cmp, diff --git a/setools/policyrep/__init__.py b/setools/policyrep/__init__.py index c2ad594..d944d35 100644 --- a/setools/policyrep/__init__.py +++ b/setools/policyrep/__init__.py @@ -323,6 +323,16 @@ class SELinuxPolicy(object): # libqpol unfortunately iterates over attributes and aliases pass + def categories(self): + """Generator which yields all MLS categories.""" + + for cat in self.policy.cat_iter(): + try: + yield mls.category_factory(self.policy, cat) + except TypeError: + # libqpol unfortunately iterates over aliases too + pass + def classes(self): """Generator which yields all object classes.""" @@ -347,17 +357,7 @@ class SELinuxPolicy(object): # where a class has no default_* settings. pass - def mlscategories(self): - """Generator which yields all MLS categories.""" - - for cat in self.policy.cat_iter(): - try: - yield mls.category_factory(self.policy, cat) - except TypeError: - # libqpol unfortunately iterates over aliases too - pass - - def mlslevels(self): + def levels(self): """Generator which yields all level declarations.""" for level in self.policy.level_iter(): diff --git a/setools/policyrep/mls.py b/setools/policyrep/mls.py index 55ac866..88896f0 100644 --- a/setools/policyrep/mls.py +++ b/setools/policyrep/mls.py @@ -80,16 +80,16 @@ def category_factory(policy, symbol): if symbol.isalias(policy): raise TypeError("{0} is an alias".format(symbol.name(policy))) - return MLSCategory(policy, symbol) + return Category(policy, symbol) def sensitivity_factory(policy, symbol): """Factory function for creating MLS sensitivity objects.""" if isinstance(symbol, qpol.qpol_level_t): - return MLSSensitivity(policy, symbol) + return Sensitivity(policy, symbol) try: - return MLSSensitivity(policy, qpol.qpol_level_t(policy, symbol)) + return Sensitivity(policy, qpol.qpol_level_t(policy, symbol)) except ValueError: raise InvalidSensitivity("{0} is not a valid sensitivity".format(symbol)) @@ -100,7 +100,7 @@ def level_factory(policy, symbol): in contexts of labeling statements) """ if isinstance(symbol, qpol.qpol_mls_level_t): - return MLSLevel(policy, symbol) + return Level(policy, symbol) sens_split = symbol.split(":") @@ -141,7 +141,7 @@ def level_factory(policy, symbol): "{0} is invalid (one or more categories are not associated with the sensitivity)". format(symbol)) - return MLSLevel(policy, policy_level) + return Level(policy, policy_level) def level_decl_factory(policy, symbol): @@ -151,10 +151,10 @@ def level_decl_factory(policy, symbol): """ if isinstance(symbol, qpol.qpol_level_t): - return MLSLevelDecl(policy, symbol) + return LevelDecl(policy, symbol) try: - return MLSLevelDecl(policy, qpol.qpol_level_t(policy, symbol)) + return LevelDecl(policy, qpol.qpol_level_t(policy, symbol)) except ValueError: raise InvalidLevel("{0} is not a valid sensitivity".format(symbol)) @@ -162,7 +162,7 @@ def level_decl_factory(policy, symbol): def range_factory(policy, symbol): """Factory function for creating MLS range objects.""" if isinstance(symbol, qpol.qpol_mls_range_t): - return MLSRange(policy, symbol) + return Range(policy, symbol) # build range: levels = symbol.split("-") @@ -188,10 +188,10 @@ def range_factory(policy, symbol): raise InvalidRange("{0} is not a valid range ({1} is not dominated by {2})". format(symbol, low, high)) - return MLSRange(policy, policy_range) + return Range(policy, policy_range) -class MLSCategory(symbol.PolicySymbol): +class Category(symbol.PolicySymbol): """An MLS category.""" @@ -226,7 +226,7 @@ class MLSCategory(symbol.PolicySymbol): return stmt -class MLSSensitivity(symbol.PolicySymbol): +class Sensitivity(symbol.PolicySymbol): """An MLS sensitivity""" @@ -339,7 +339,7 @@ class BaseMLSLevel(symbol.PolicySymbol): yield category_factory(self.policy, cat) -class MLSLevelDecl(BaseMLSLevel): +class LevelDecl(BaseMLSLevel): """ The declaration statement for MLS levels, e.g: @@ -358,7 +358,7 @@ class MLSLevelDecl(BaseMLSLevel): return "level {0};".format(self) -class MLSLevel(BaseMLSLevel): +class Level(BaseMLSLevel): """An MLS level used in contexts.""" @@ -371,7 +371,7 @@ class MLSLevel(BaseMLSLevel): return sensitivity_factory(self.policy, self.qpol_symbol.sens_name(self.policy)) -class MLSRange(symbol.PolicySymbol): +class Range(symbol.PolicySymbol): """An MLS range""" diff --git a/tests/__init__.py b/tests/__init__.py index cef8a69..06d0626 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -16,6 +16,7 @@ # along with SETools. If not, see . # from . import boolquery +from . import categoryquery from . import commonquery from . import dta from . import fsusequery diff --git a/tests/mlscategoryquery.conf b/tests/categoryquery.conf similarity index 100% rename from tests/mlscategoryquery.conf rename to tests/categoryquery.conf diff --git a/tests/mlscategoryquery.py b/tests/categoryquery.py similarity index 78% rename from tests/mlscategoryquery.py rename to tests/categoryquery.py index fcfbce1..b24025c 100644 --- a/tests/mlscategoryquery.py +++ b/tests/categoryquery.py @@ -18,48 +18,48 @@ import unittest from setools import SELinuxPolicy -from setools.mlscategoryquery import MLSCategoryQuery +from setools.categoryquery import CategoryQuery -class MLSCategoryQueryTest(unittest.TestCase): +class CategoryQueryTest(unittest.TestCase): def setUp(self): - self.p = SELinuxPolicy("tests/mlscategoryquery.conf") + self.p = SELinuxPolicy("tests/categoryquery.conf") def test_000_unset(self): """MLS category query with no criteria.""" # query with no parameters gets all categories. - allcats = sorted(str(c) for c in self.p.mlscategories()) + allcats = sorted(str(c) for c in self.p.categories()) - q = MLSCategoryQuery(self.p) + q = CategoryQuery(self.p) qcats = sorted(str(c) for c in q.results()) self.assertListEqual(allcats, qcats) def test_001_name_exact(self): """MLS category query with exact name match.""" - q = MLSCategoryQuery(self.p, name="test1") + q = CategoryQuery(self.p, name="test1") cats = sorted(str(c) for c in q.results()) self.assertListEqual(["test1"], cats) def test_002_name_regex(self): """MLS category query with regex name match.""" - q = MLSCategoryQuery(self.p, name="test2(a|b)", name_regex=True) + q = CategoryQuery(self.p, name="test2(a|b)", name_regex=True) cats = sorted(str(c) for c in q.results()) self.assertListEqual(["test2a", "test2b"], cats) def test_010_alias_exact(self): """MLS category query with exact alias match.""" - q = MLSCategoryQuery(self.p, alias="test10a") + q = CategoryQuery(self.p, alias="test10a") cats = sorted(str(t) for t in q.results()) self.assertListEqual(["test10c1"], cats) def test_011_alias_regex(self): """MLS category query with regex alias match.""" - q = MLSCategoryQuery(self.p, alias="test11(a|b)", alias_regex=True) + q = CategoryQuery(self.p, alias="test11(a|b)", alias_regex=True) cats = sorted(str(t) for t in q.results()) self.assertListEqual(["test11c1", "test11c2"], cats)