diff --git a/data/infoflow.ui b/data/infoflow.ui index 6288a19..57b3819 100644 --- a/data/infoflow.ui +++ b/data/infoflow.ui @@ -143,6 +143,20 @@ + + + + Edit... + + + + + + + Excluded Permissions: + + + diff --git a/setoolsgui/apol/infoflow.py b/setoolsgui/apol/infoflow.py index 73b0334..96418b7 100644 --- a/setoolsgui/apol/infoflow.py +++ b/setoolsgui/apol/infoflow.py @@ -18,15 +18,18 @@ # import logging +import copy from PyQt5.QtCore import pyqtSignal, Qt, QObject, QStringListModel, QThread from PyQt5.QtGui import QPalette, QTextCursor from PyQt5.QtWidgets import QCompleter, QHeaderView, QMessageBox, QProgressDialog, QScrollArea from setools import InfoFlowAnalysis +from setools.exception import UnmappedClass, UnmappedPermission from ..logtosignal import LogHandlerToSignal -from .excludetypes import ExcludeTypes from ..widget import SEToolsWidget +from .excludetypes import ExcludeTypes +from .permmapedit import PermissionMapEditor class InfoFlowAnalysisTab(SEToolsWidget, QScrollArea): @@ -39,7 +42,21 @@ class InfoFlowAnalysisTab(SEToolsWidget, QScrollArea): @perm_map.setter def perm_map(self, pmap): - self.query.perm_map = pmap + # copy permission map to keep enabled/disabled + # settings private to this map. + perm_map = copy.deepcopy(pmap) + + # transfer enabled/disabled settings from + # current permission map, to the new map + for classname in self.query.perm_map.classes(): + for mapping in self.query.perm_map.perms(classname): + try: + perm_map.mapping(classname, mapping.perm).enabled = mapping.enabled + except (UnmappedClass, UnmappedPermission): + pass + + # apply updated permission map + self.query.perm_map = perm_map def __init__(self, parent, policy, perm_map): super(InfoFlowAnalysisTab, self).__init__(parent) @@ -63,6 +80,9 @@ class InfoFlowAnalysisTab(SEToolsWidget, QScrollArea): self.error_msg = QMessageBox(self) self.error_msg.setStandardButtons(QMessageBox.Ok) + # set up perm map editor + self.permmap_editor = PermissionMapEditor(self, False) + # set up source/target autocompletion type_completion_list = [str(t) for t in self.policy.types()] type_completer_model = QStringListModel(self) @@ -119,6 +139,7 @@ class InfoFlowAnalysisTab(SEToolsWidget, QScrollArea): self.flows_out.toggled.connect(self.flows_out_toggled) self.min_perm_weight.valueChanged.connect(self.set_min_weight) self.exclude_types.clicked.connect(self.choose_excluded_types) + self.edit_permmap.clicked.connect(self.open_permmap_editor) # # Analysis mode @@ -194,6 +215,13 @@ class InfoFlowAnalysisTab(SEToolsWidget, QScrollArea): chooser = ExcludeTypes(self, self.policy) chooser.show() + def open_permmap_editor(self): + self.permmap_editor.show(self.perm_map) + + def apply_permmap(self, pmap): + # used only by permission map editor + self.query.perm_map = pmap + # # Results runner #