diff --git a/trace/cli.py b/trace/cli.py index 61effee..e7b57d4 100644 --- a/trace/cli.py +++ b/trace/cli.py @@ -42,11 +42,14 @@ def quick_add_note(content: str): signature = None if settings.get("pgp_enabled", True): gpg_key_id = settings.get("gpg_key_id", None) - signature = Crypto.sign_content(f"Hash: {note.content_hash}\nContent: {note.content}", key_id=gpg_key_id) - if signature: - note.signature = signature + if gpg_key_id: + signature = Crypto.sign_content(f"Hash: {note.content_hash}\nContent: {note.content}", key_id=gpg_key_id) + if signature: + note.signature = signature + else: + print("Warning: GPG signature failed (GPG not found or no key). Note saved without signature.") else: - print("Warning: GPG signature failed (GPG not found or no key). Note saved without signature.") + print("Warning: No GPG key ID configured. Note saved without signature.") # Attach to evidence or case if target_evidence: diff --git a/trace/storage.py b/trace/storage.py index 6666947..18c94c3 100644 --- a/trace/storage.py +++ b/trace/storage.py @@ -23,7 +23,6 @@ class Storage: def _create_demo_case(self): """Create a demo case with evidence showcasing all features""" - # Create demo case demo_case = Case( case_number="DEMO-2024-001", name="Sample Investigation", diff --git a/trace/tui.py b/trace/tui.py index bc3fa4a..25b13ae 100644 --- a/trace/tui.py +++ b/trace/tui.py @@ -1391,21 +1391,21 @@ class TUI: case_notes = self.active_case.notes filtered = self._get_filtered_list(self.active_case.evidence, "name", "description") - # Only allow setting active for evidence, not notes - if self.selected_index < len(case_notes): + # Evidence is displayed first (indices 0 to len(evidence)-1) + # Case notes are displayed second (indices len(evidence) to len(evidence)+len(notes)-1) + if self.selected_index < len(filtered): + # Selected evidence - set it as active + ev = filtered[self.selected_index] + self.state_manager.set_active(case_id=self.active_case.case_id, evidence_id=ev.evidence_id) + self.global_active_case_id = self.active_case.case_id + self.global_active_evidence_id = ev.evidence_id + self.show_message(f"Active: {ev.name}") + elif case_notes and self.selected_index - len(filtered) < len(case_notes): # Selected a note - set case as active (not evidence) self.state_manager.set_active(case_id=self.active_case.case_id, evidence_id=None) self.global_active_case_id = self.active_case.case_id self.global_active_evidence_id = None self.show_message(f"Active: Case {self.active_case.case_number}") - elif filtered and self.selected_index - len(case_notes) < len(filtered): - # Selected evidence - set it as active - evidence_idx = self.selected_index - len(case_notes) - ev = filtered[evidence_idx] - self.state_manager.set_active(case_id=self.active_case.case_id, evidence_id=ev.evidence_id) - self.global_active_case_id = self.active_case.case_id - self.global_active_evidence_id = ev.evidence_id - self.show_message(f"Active: {ev.name}") else: # Nothing selected - set case as active self.state_manager.set_active(case_id=self.active_case.case_id, evidence_id=None) @@ -1833,7 +1833,7 @@ class TUI: x = (self.width - w) // 2 win = curses.newwin(h, w, y, x) - win.keypad(1) # Enable keypad mode for arrow keys + win.keypad(True) # Enable keypad mode for arrow keys while True: win.clear() @@ -1930,7 +1930,7 @@ class TUI: x = (self.width - w) // 2 win = curses.newwin(h, w, y, x) - win.keypad(1) # Enable keypad mode for arrow keys + win.keypad(True) # Enable keypad mode for arrow keys scroll_offset = 0 while True: @@ -2073,12 +2073,12 @@ class TUI: if self.current_view == "evidence_detail" and self.active_evidence: context_title = f"Add Note → Evidence: {self.active_evidence.name}" - context_prompt = f"Case: {self.active_case.case_number if self.active_case else '?'}\nEvidence: {self.active_evidence.name}\n\nNote will be added to this evidence." + context_prompt = f"Case: {self.active_case.case_number if self.active_case else '?'}\nEvidence: {self.active_evidence.name}\n" recent_notes = self.active_evidence.notes[-5:] if len(self.active_evidence.notes) > 0 else [] target_evidence = self.active_evidence elif self.current_view == "case_detail" and self.active_case: context_title = f"Add Note → Case: {self.active_case.case_number}" - context_prompt = f"Case: {self.active_case.case_number}\n{self.active_case.name if self.active_case.name else ''}\n\nNote will be added to case notes." + context_prompt = f"Case: {self.active_case.case_number}\n{self.active_case.name if self.active_case.name else ''}\nNote will be added to case notes." recent_notes = self.active_case.notes[-5:] if len(self.active_case.notes) > 0 else [] target_case = self.active_case elif self.current_view == "case_list": @@ -2091,14 +2091,14 @@ class TUI: for ev in active_case.evidence: if ev.evidence_id == self.global_active_evidence_id: context_title = f"Add Note → Evidence: {ev.name}" - context_prompt = f"Case: {active_case.case_number}\nEvidence: {ev.name}\n\nNote will be added to this evidence." + context_prompt = f"Case: {active_case.case_number}\nEvidence: {ev.name}\n" recent_notes = ev.notes[-5:] if len(ev.notes) > 0 else [] target_case = active_case target_evidence = ev break else: context_title = f"Add Note → Case: {active_case.case_number}" - context_prompt = f"Case: {active_case.case_number}\n\nNote will be added to case notes." + context_prompt = f"Case: {active_case.case_number}\nNote will be added to case notes." recent_notes = active_case.notes[-5:] if len(active_case.notes) > 0 else [] target_case = active_case @@ -2131,7 +2131,7 @@ class TUI: signed = False if pgp_enabled: - sig = Crypto.sign_content(f"Hash: {note.content_hash}\nContent: {note.content}", key_id=gpg_key_id) + sig = Crypto.sign_content(f"Hash: {note.content_hash}\nContent: {note.content}", key_id=gpg_key_id or "") if sig: note.signature = sig signed = True