Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fa206 multi select #360

Merged
merged 46 commits into from
Jan 21, 2022
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
8d140d8
Initial commit with multi-select working
egbicker Nov 29, 2021
32731b4
Merge remote-tracking branch 'origin' into fa206-multi-select
egbicker Nov 29, 2021
b1ff6a7
Merge branch 'master' of github.com:ctc-oss/fapolicy-analyzer into fa…
egbicker Nov 30, 2021
63e086c
trust file multi-select functionality
egbicker Dec 1, 2021
474e4d8
policy rules multi select
egbicker Dec 3, 2021
71d8af1
merge
egbicker Dec 9, 2021
8321be8
ancillary and system multi-select performance updates
egbicker Dec 9, 2021
93550a5
subjec object update
egbicker Dec 9, 2021
0220ec1
Multi-select performance issues resolved
egbicker Dec 15, 2021
25d7454
Merge remote-tracking branch 'origin' into fa206-multi-select
egbicker Dec 15, 2021
7070b2d
test fixes
egbicker Dec 21, 2021
e1fbc0d
Merge remote-tracking branch 'origin' into fa206-multi-select
egbicker Dec 21, 2021
40acb92
tidying up for pr
egbicker Dec 21, 2021
6181d4b
linting
egbicker Dec 21, 2021
9ab7d41
Merge remote-tracking branch 'origin' into fa206-multi-select
egbicker Dec 22, 2021
221519c
PR fixes
egbicker Dec 22, 2021
d206d67
linting
egbicker Dec 22, 2021
d565a1e
fixing tests
egbicker Dec 22, 2021
7b71b16
making subject and user lists single select and object multi-select
egbicker Dec 27, 2021
ac40dfc
Updating for a single changelist with multiple entries
egbicker Dec 28, 2021
aa6a163
system trust selection logic
egbicker Dec 28, 2021
ac533f9
Multi select button activation logic
egbicker Dec 28, 2021
8af833b
Policy analysis trust/untrust pop up menu
egbicker Dec 29, 2021
4fceeb4
right click menu updates
egbicker Jan 3, 2022
18c5d90
Merge remote-tracking branch 'origin' into fa206-multi-select
egbicker Jan 3, 2022
ba813fc
multi-select right click menus
egbicker Jan 4, 2022
fbbc6a3
confirm change dialog
egbicker Jan 5, 2022
26a32c1
pop up confirmation
egbicker Jan 5, 2022
afcb180
header block
egbicker Jan 5, 2022
3338e52
Updating based on feedback
egbicker Jan 6, 2022
a3290ab
fixing tests
egbicker Jan 6, 2022
6012b2d
Merge remote-tracking branch 'origin' into fa206-multi-select
egbicker Jan 6, 2022
4c1b13a
Pop up confirm dialog updates
egbicker Jan 13, 2022
51c624c
adding tests for coverage
egbicker Jan 14, 2022
615acbe
linting
egbicker Jan 14, 2022
3cb41be
test update
egbicker Jan 17, 2022
6ea648a
conflict resolution
egbicker Jan 18, 2022
15261d8
test coverage
egbicker Jan 18, 2022
172563a
linting
egbicker Jan 18, 2022
934ca0e
Easy fixes from testing
dorschs57 Jan 19, 2022
c46aac0
updates based on comments
egbicker Jan 19, 2022
5152b35
fixing issues from PR
egbicker Jan 20, 2022
d601241
linting
egbicker Jan 20, 2022
6881878
Merge remote-tracking branch 'origin' into fa206-multi-select
egbicker Jan 21, 2022
48c55b2
fixed changeset calculation logic
dorschs57 Jan 21, 2022
ed26285
cleanup
dorschs57 Jan 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion fapolicy_analyzer/glade/searchable_list.glade
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,11 @@
<object class="GtkTreeView" id="treeView">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="rubber-banding">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
<object class="GtkTreeSelection" id="treeSelection">
<property name="mode">multiple</property>
</object>
</child>
</object>
</child>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def test_updates_trust_details(widget, mocker):
mocker.patch(
"ui.ancillary_trust_database_admin.fs.stat", return_value="stat for foo file"
)
trust = MagicMock(status="T", path="/tmp/foo", size=1, hash="abc", spec=Trust)
trust = [MagicMock(status="T", path="/tmp/foo", size=1, hash="abc", spec=Trust)]
widget.on_trust_selection_changed(trust)
widget.trustFileDetails.set_in_database_view.assert_called_with(
"File: /tmp/foo\nSize: 1\nSHA256: abc"
Expand All @@ -87,7 +87,7 @@ def test_updates_trust_details_for_deleted_files(widget, mocker):
mocker.patch(
"ui.ancillary_trust_database_admin.fs.stat", return_value="stat for foo file"
)
trust = MagicMock(path="/tmp/foo")
trust = [MagicMock(path="/tmp/foo")]
widget.on_trust_selection_changed(trust)
widget.trustFileDetails.set_in_database_view.assert_not_called()
widget.trustFileDetails.set_on_file_system_view.assert_called_with(
Expand Down Expand Up @@ -136,7 +136,7 @@ def test_on_trustBtn_clicked(widget, mock_dispatch, mocker):
mocker.patch(
"ui.ancillary_trust_database_admin.fs.stat", return_value="stat for foo file"
)
trust = MagicMock(path="/tmp/foo")
trust = [MagicMock(path="/tmp/foo")]
widget.on_trust_selection_changed(trust)
widget.get_object("trustBtn").clicked()
mock_dispatch.assert_called_with(
Expand Down Expand Up @@ -166,7 +166,7 @@ def test_on_untrustBtn_clicked(widget, mock_dispatch, mocker):
mocker.patch(
"ui.ancillary_trust_database_admin.fs.stat", return_value="stat for foo file"
)
trust = MagicMock(path="/tmp/foo")
trust = [MagicMock(path="/tmp/foo")]
widget.on_trust_selection_changed(trust)
widget.get_object("untrustBtn").clicked()
mock_dispatch.assert_called_with(
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/tests/test_object_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,4 +186,4 @@ def test_fires_file_selection_changed_event(widget):
widget.load_store([mockData])
view = widget.get_object("treeView")
view.get_selection().select_path(Gtk.TreePath.new_first())
mockHandler.assert_called_with(mockData)
mockHandler.assert_called_with([mockData])
2 changes: 1 addition & 1 deletion fapolicy_analyzer/tests/test_searchable_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def test_fires_selection_changed_event(widget):
widget.load_store(store)
view = widget.get_object("treeView")
view.get_selection().select_path(Gtk.TreePath.new_first())
mockHandler.assert_called_with(Contains("baz"))
mockHandler.assert_called_with([Contains("baz")])


def test_sorting(widget):
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/tests/test_subject_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ def test_fires_file_selection_changed_event(widget):
widget.load_store([mockData])
view = widget.get_object("treeView")
view.get_selection().select_path(Gtk.TreePath.new_first())
mockHandler.assert_called_with(mockData)
mockHandler.assert_called_with([mockData])


@pytest.mark.parametrize(
Expand Down
4 changes: 2 additions & 2 deletions fapolicy_analyzer/tests/test_system_trust_database_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def test_updates_trust_details(widget, mocker):
mocker.patch.object(widget.trustFileDetails, "set_on_file_system_view")
mocker.patch.object(widget.trustFileDetails, "set_trust_status")
mocker.patch("ui.ancillary_trust_database_admin.fs.sha", return_value="abc")
trust = MagicMock(status="T", path="/tmp/foo", size=1, hash="abc")
trust = [MagicMock(status="T", path="/tmp/foo", size=1, hash="abc")]
widget.on_trust_selection_changed(trust)
widget.trustFileDetails.set_in_database_view.assert_called_with(
"File: /tmp/foo\nSize: 1\nSHA256: abc"
Expand All @@ -101,7 +101,7 @@ def test_disables_add_button(widget):
def test_fires_file_added_to_ancillary_trust(widget):
handler = MagicMock()
widget.file_added_to_ancillary_trust += handler
widget.selectedFile = MagicMock(path="foo")
widget.selectedFile = [MagicMock(path="foo")]
addBtn = widget.get_object("addBtn")
addBtn.clicked()
handler.assert_called_with("foo")
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/tests/test_trust_file_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ def test_fires_trust_selection_changed(widget):
widget.trust_selection_changed += mockHandler
view = widget.get_object("treeView")
view.get_selection().select_path(Gtk.TreePath.new_first())
mockHandler.assert_called_with(_trust[0])
mockHandler.assert_called_with([_trust[0]])


def test_epoch_to_string():
Expand Down
13 changes: 8 additions & 5 deletions fapolicy_analyzer/ui/ancillary_trust_database_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,12 @@ def delete_trusted_files(self, *files):
changeset.del_trust(file)
self.__apply_changeset(changeset)

def on_trust_selection_changed(self, trust):
self.selectedFile = trust.path if trust else None
def on_trust_selection_changed(self, trusts):
self.selectedFile = [t.path for t in trusts] if trusts else None
trustBtn = self.get_object("trustBtn")
untrustBtn = self.get_object("untrustBtn")
if trust:
if trusts:
trust = trusts[-1]
status = getattr(trust, "status", "").lower()
trusted = status == "t"
trustBtn.set_sensitive(not trusted)
Expand Down Expand Up @@ -125,11 +126,13 @@ def on_files_added(self, files):

def on_trustBtn_clicked(self, *args):
if self.selectedFile:
self.add_trusted_files(self.selectedFile)
for sfile in self.selectedFile:
self.add_trusted_files(sfile)

def on_untrustBtn_clicked(self, *args):
if self.selectedFile:
self.delete_trusted_files(self.selectedFile)
for sfile in self.selectedFile:
self.delete_trusted_files(sfile)

def on_next_system(self, system):
changesets = system.get("changesets")
Expand Down
37 changes: 19 additions & 18 deletions fapolicy_analyzer/ui/policy_rules_admin_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,34 +324,35 @@ def on_next_system(self, system):
)

def on_user_selection_changed(self, secondaryAction, data):
uid = data[1] if data else None
if uid != self.selectedUser:
self.selectedUser = uid
self.selectedGroup = None
self.__populate_acl_details(uid, acl.getUserDetails)
secondaryAction()
uids = [datum[1] for datum in data] if data else [None]
for uid in uids:
if uid != self.selectedUser:
self.selectedUser = uid
self.selectedGroup = None
self.__populate_acl_details(uid, acl.getUserDetails)
secondaryAction()

def on_group_selection_changed(self, secondaryAction, data):
gid = data[1] if data else None
if gid != self.selectedGroup:
self.selectedGroup = gid
self.selectedUser = None
self.__populate_acl_details(gid, acl.getGroupDetails)
secondaryAction()
gids = [datum[1] for datum in data] if data else [None]
for gid in gids:
if gid != self.selectedGroup:
self.selectedGroup = gid
self.selectedUser = None
self.__populate_acl_details(gid, acl.getGroupDetails)
secondaryAction()

def on_subject_selection_changed(self, secondaryAction, data):
subject = data.file if data else None
if subject == self.selectedSubject:
fileObj = data[-1].file if data else None
if fileObj == self.selectedSubject:
return

self.selectedSubject = subject
self.selectedSubject = fileObj
subjectDetails = self.get_object("subjectDetails")
subjectDetails.get_buffer().set_text(fs.stat(subject) if subject else "")
subjectDetails.get_buffer().set_text(fs.stat(fileObj) if fileObj else "")
secondaryAction()

def on_object_selection_changed(self, data):
objectDetails = self.get_object("objectDetails")
objectDetails.get_buffer().set_text(fs.stat(data.file) if data else "")
objectDetails.get_buffer().set_text(fs.stat(data) if data else "")

def on_switcher_button_clicked(self, switcher):
switcher.set_as_secondary()
Expand Down
5 changes: 2 additions & 3 deletions fapolicy_analyzer/ui/searchable_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ def apply_prev_sort(model):

sortableModel = apply_prev_sort(Gtk.TreeModelSort(model=self.treeViewFilter))
self.treeView.set_model(sortableModel)

self.treeView.get_selection().connect("changed", self.on_view_selection_changed)
self._update_tree_count(self.__get_tree_count())
self.set_loading(False)
Expand Down Expand Up @@ -114,8 +113,8 @@ def get_action_buttons(self):
return self.get_object("actionButtons").get_children()

def on_view_selection_changed(self, selection):
model, treeiter = selection.get_selected()
data = model[treeiter] if model and treeiter else []
model, treeiter = selection.get_selected_rows()
data = [model[i] for i in treeiter] if model and treeiter else []
self.selection_changed(data)

def on_search_changed(self, search):
Expand Down
4 changes: 2 additions & 2 deletions fapolicy_analyzer/ui/subject_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,8 @@ def __color(self, access):
)

def __handle_selection_changed(self, data):
fileObj = data[3] if data else None
self.file_selection_changed(fileObj)
fileObjs = [datum[3] for datum in data] if data else None
self.file_selection_changed(fileObjs)

def __show_reconciliation_dialog(self, subject):
def find_db_trust(subject):
Expand Down
10 changes: 6 additions & 4 deletions fapolicy_analyzer/ui/system_trust_database_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,11 @@ def on_next_system(self, system):
self._trust = trustState.trust
self.trustFileList.load_trust(self._trust)

def on_trust_selection_changed(self, trust):
self.selectedFile = trust
def on_trust_selection_changed(self, trusts):
self.selectedFile = trusts
addBtn = self.get_object("addBtn")
if trust:
if trusts:
trust = trusts[-1]
status = trust.status.lower()
trusted = status == "t"
addBtn.set_sensitive(not trusted)
Expand Down Expand Up @@ -123,4 +124,5 @@ def on_trust_selection_changed(self, trust):

def on_addBtn_clicked(self, *args):
if self.selectedFile:
self.file_added_to_ancillary_trust(self.selectedFile.path)
for sfile in self.selectedFile:
self.file_added_to_ancillary_trust(sfile.path)
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/trust_file_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def __init__(self, trust_func, markup_func=None, *args):
self.get_ref().connect("destroy", self.on_destroy)

def __handle_selection_changed(self, data):
trust = data[3] if data else None
trust = [datum[3] for datum in data] if data else None
self.trust_selection_changed(trust)

def _columns(self):
Expand Down