diff --git a/.gitignore b/.gitignore index 72dac4756..0879883e5 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ dist \#*.glade\# *.glade~ .coverage +.testmondata .env *.mo diff --git a/python/.testmondata b/python/.testmondata deleted file mode 100644 index a9429eee5..000000000 Binary files a/python/.testmondata and /dev/null differ diff --git a/python/fapolicy_analyzer/tests/test_ancillary_trust_database_admin.py b/python/fapolicy_analyzer/tests/test_ancillary_trust_database_admin.py index 9105bb5df..333ed2d8d 100644 --- a/python/fapolicy_analyzer/tests/test_ancillary_trust_database_admin.py +++ b/python/fapolicy_analyzer/tests/test_ancillary_trust_database_admin.py @@ -71,13 +71,16 @@ def test_updates_trust_details(widget, mocker): mocker.patch.object(widget.trustFileDetails, "set_in_databae_view") 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.stat", return_value="stat for foo file" + ) trust = MagicMock(status="T", path="/tmp/foo", size=1, hash="abc") widget.on_file_selection_change(trust) widget.trustFileDetails.set_in_databae_view.assert_called_with( "File: /tmp/foo\nSize: 1\nSHA256: abc" ) widget.trustFileDetails.set_on_file_system_view.assert_called_with( - "stat: cannot stat '/tmp/foo': No such file or directory\nSHA256: abc" + "stat for foo file\nSHA256: abc" ) widget.trustFileDetails.set_trust_status.assert_called_with("This file is trusted.") @@ -116,9 +119,11 @@ def test_on_neg_confirm_deployment(widget, confirm_dialog): def test_on_revert_deployment(widget, confirm_dialog, revert_dialog, state): parent = Gtk.Window() parent.add(widget.get_content()) + with patch("fapolicy_analyzer.System") as mock: widget.system = mock.return_value - state.add_changeset_q("foo") + mockChangeset = MagicMock() + state.add_changeset_q(mockChangeset) assert len(state.get_changeset_q()) == 1 widget.on_deployBtn_clicked() assert len(state.get_changeset_q()) == 1 @@ -131,9 +136,11 @@ def test_on_revert_deployment(widget, confirm_dialog, revert_dialog, state): def test_on_neg_revert_deployment(widget, confirm_dialog, revert_dialog, state): parent = Gtk.Window() parent.add(widget.get_content()) + with patch("fapolicy_analyzer.System") as mock: widget.system = mock.return_value - state.add_changeset_q("foo") + mockChangeset = MagicMock() + state.add_changeset_q(mockChangeset) assert len(state.get_changeset_q()) == 1 widget.on_deployBtn_clicked() assert len(state.get_changeset_q()) == 0 diff --git a/python/fapolicy_analyzer/ui/ancillary_trust_database_admin.py b/python/fapolicy_analyzer/ui/ancillary_trust_database_admin.py index 73501eb32..6245b34d7 100644 --- a/python/fapolicy_analyzer/ui/ancillary_trust_database_admin.py +++ b/python/fapolicy_analyzer/ui/ancillary_trust_database_admin.py @@ -131,6 +131,12 @@ def on_untrustBtn_clicked(self, *args): self.delete_trusted_files(self.selectedFile) def on_deployBtn_clicked(self, *args): + # Get list of human-readable undeployed path/operation pairs + listPathActionTuples = stateManager.get_path_action_list() + + # TODO: 20210607 tpa Functional verification. Pls leave in until ui + # element integration + print(listPathActionTuples) parent = self.content.get_toplevel() confirmDialog = ConfirmDialog( strings.DEPLOY_ANCILLARY_CONFIRM_DIALOG_TITLE, diff --git a/python/fapolicy_analyzer/ui/state_manager.py b/python/fapolicy_analyzer/ui/state_manager.py index 656fe2997..016dfe4a8 100644 --- a/python/fapolicy_analyzer/ui/state_manager.py +++ b/python/fapolicy_analyzer/ui/state_manager.py @@ -86,6 +86,11 @@ def __update_dirty_queue(self): self.changeset_queue_updated() return self.bDirtyQ + def get_path_action_list(self): + # Iterate through the StateManagers Changeset list + # Each changeset contains a dict with at least one Path/Action pair + return [t for e in self.listChangeset for t in e.get_path_action_map().items()] + def add_system_notification( self, notification: str, notification_type: NotificationType ): diff --git a/python/src/trust.rs b/python/src/trust.rs index 1a81fd0cb..122c5641c 100644 --- a/python/src/trust.rs +++ b/python/src/trust.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use pyo3::prelude::*; use fapolicy_analyzer::api; @@ -105,6 +107,10 @@ impl PyChangeset { pub fn is_empty(&self) -> bool { self.len() == 0 } + + pub fn get_path_action_map(&self) -> HashMap { + trust::get_path_action_map(&self.s) + } } pub fn init_module(_py: Python, m: &PyModule) -> PyResult<()> { diff --git a/src/trust.rs b/src/trust.rs index fa00cc3f1..09d5bf81b 100644 --- a/src/trust.rs +++ b/src/trust.rs @@ -158,6 +158,14 @@ impl TrustOp { } } +fn to_pair(trust_op: &TrustOp) -> (String, String) { + match trust_op { + TrustOp::Add(path) => (path.to_string(), "Add".to_string()), + TrustOp::Del(path) => (path.to_string(), "Del".to_string()), + TrustOp::Ins(path, _size, _hash) => (path.to_string(), "Ins".to_string()), + } +} + pub enum ChangesetErr { NotFound, } @@ -199,6 +207,10 @@ impl Changeset { } } +pub fn get_path_action_map(cs: &Changeset) -> HashMap { + cs.changes.iter().map(to_pair).collect() +} + impl ::std::default::Default for Changeset { fn default() -> Self { Self { changes: vec![] }