File: mlsrulequery.py

package info (click to toggle)
setools 4.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,600 kB
  • sloc: python: 24,485; makefile: 14
file content (142 lines) | stat: -rw-r--r-- 5,736 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# SPDX-License-Identifier: LGPL-2.1-only

from PyQt6 import QtWidgets
import setools

from . import criteria, models, tab


class MLSRuleQueryTab(tab.TableResultTabWidget[setools.MLSRuleQuery, setools.MLSRule]):

    """An MLS rule query."""

    section = tab.AnalysisSection.Rules
    tab_title = "Multi-Level Security (MLS) Rules"
    mlsonly = True

    def __init__(self, policy: "setools.SELinuxPolicy", /, *,
                 parent: QtWidgets.QWidget | None = None) -> None:

        super().__init__(setools.MLSRuleQuery(policy), enable_criteria=True, parent=parent)

        self.setWhatsThis("<b>Search Type Enforcement rules in a SELinux policy.</b>")

        #
        # Set up criteria widgets
        #
        rt = criteria.MLSRuleType("Rule Type", self.query,
                                  parent=self.criteria_frame)
        rt.setToolTip("The rule types for rule matching.")
        rt.setWhatsThis(
            """
            <p><b>Select rule types for rule matching.</b></p>

            <p>If a rule's has a one of the selected types, it will be returned.</p>
            """)

        src = criteria.TypeOrAttrName("Source Type/Attribute", self.query, "source",
                                      enable_regex=True,
                                      enable_indirect=True,
                                      parent=self.criteria_frame)
        src.setToolTip("The source type/attribute for rule matching.")
        src.setWhatsThis(
            """
            <p><b>Enter the source type/attribute for rule matching.</b></p>

            <p>The behavior differs if a type or attribute is entered.</p>

            <p>For types, if a rule has this type as the source, it will be
            returned.  If indirect is enabled, rules that have an attribute as
            a source will be returned if the attribute contains this type.</p>

            <p>For attributes, if a rule has this attribute as the source, it
            will be returned.  If indirect is enabled, rules that have a source
            type that is contained by this attribute will be returned.</p>

            <p>If regex is enabled, a regular expression is used for matching
            the type/attribute name instead of direct string comparison.</p>
            """)

        dst = criteria.TypeOrAttrName("Target Type/Attribute", self.query, "target",
                                      enable_regex=True,
                                      enable_indirect=True,
                                      parent=self.criteria_frame)
        dst.setToolTip("The target type/attribute for rule matching.")
        dst.setWhatsThis(
            """
            <p><b>Enter the target type/attribute for rule matching.</b></p>

            <p>The behavior differs if a type or attribute is entered.</p>

            <p>For types, if a rule has this type as the target, it will be
            returned.  If indirect is enabled, rules that have an attribute as
            a target will be returned if the attribute contains this type.</p>

            <p>For attributes, if a rule has this attribute as the target, it
            will be returned.  If indirect is enabled, rules that have a target
            type that is contained by this attribute will be returned.</p>

            <p>If regex is enabled, a regular expression is used for matching
            the type/attribute name instead of direct string comparison.</p>
            """)

        tclass = criteria.ObjClassList("Object Class", self.query, "tclass",
                                       parent=self.criteria_frame)
        tclass.setToolTip("The object class(es) for rule matching.")
        tclass.setWhatsThis(
            """
            <p><b>Select object classes for rule matching.</b></p>

            <p>A rule will be returned if its object class is one of the selected
            classes</p>
            """)

        dflt = criteria.MLSRangeName("Default Range",
                                     self.query,
                                     "default",
                                     parent=self.criteria_frame)
        dflt.setToolTip("The default range for rule matching.")
        dflt.setWhatsThis(
            """
            <p><b>Enter the default role for rule matching.</b></p>

            <p>If a rule has this range as the default, it will be returned.</p>
            """)

        # Add widgets to layout
        self.criteria_frame_layout.addWidget(rt, 0, 0, 1, 2)
        self.criteria_frame_layout.addWidget(src, 1, 0, 1, 1)
        self.criteria_frame_layout.addWidget(dst, 1, 1, 1, 1)
        self.criteria_frame_layout.addWidget(tclass, 2, 0, 1, 1)
        self.criteria_frame_layout.addWidget(dflt, 2, 1, 1, 1)
        self.criteria_frame_layout.addWidget(self.buttonBox, 3, 0, 1, 2)

        # Save widget references
        self.criteria = (rt, src, dst, tclass, dflt)

        # Set result table's model
        self.table_results_model = models.MLSRuleTable(self.table_results)


if __name__ == '__main__':
    import sys
    import logging
    import pprint
    import warnings

    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s|%(levelname)s|%(name)s|%(message)s')
    warnings.simplefilter("default")

    app = QtWidgets.QApplication(sys.argv)
    mw = QtWidgets.QMainWindow()
    widget = MLSRuleQueryTab(setools.SELinuxPolicy(), parent=mw)
    mw.setCentralWidget(widget)
    mw.resize(widget.size())
    whatsthis = QtWidgets.QWhatsThis.createAction(mw)
    mw.menuBar().addAction(whatsthis)  # type: ignore[union-attr]
    mw.setStatusBar(QtWidgets.QStatusBar(mw))
    mw.show()
    rc = app.exec()
    pprint.pprint(widget.save())
    sys.exit(rc)