Skip to content

commit 25c5e1d

abduznik edited this page May 23, 2026 · 1 revision

feat: add advanced log filters and automatic IP address masking for privacy

Commit: 25c5e1d7e0dc4994b904b7441a04420a4a0a9d81

Author: abduznik

Date: 2026-04-29

Why: Adds a new feature or capability to the application.

Files Changed

lib/ui/screens/settings_screen.dart | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
  • lib/ui/screens/settings_screen.dart

Diff

diff --git a/lib/ui/screens/settings_screen.dart b/lib/ui/screens/settings_screen.dart
index 691be90..42a88f3 100644
--- a/lib/ui/screens/settings_screen.dart
+++ b/lib/ui/screens/settings_screen.dart
@@ -410,6 +410,11 @@ class _LogsDialogContentState extends State<_LogsDialogContent> {
   String _filter = 'ALL';
   final ScrollController _scrollController = ScrollController();
 
+  String _maskIPs(String text) {
+    final ipRegex = RegExp(r'\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b');
+    return text.replaceAll(ipRegex, '***.***.***.***');
+  }
+
   @override
   Widget build(BuildContext context) {
     return Dialog(
@@ -451,6 +456,10 @@ class _LogsDialogContentState extends State<_LogsDialogContent> {
                   const SizedBox(width: 8),
                   _FilterChip(label: 'NETWORK', selected: _filter == 'NETWORK', onSelected: () => setState(() => _filter = 'NETWORK')),
                   const SizedBox(width: 8),
+                  _FilterChip(label: 'REGISTRY', selected: _filter == 'REGISTRY', onSelected: () => setState(() => _filter = 'REGISTRY')),
+                  const SizedBox(width: 8),
+                  _FilterChip(label: 'DIRECTORY', selected: _filter == 'DIRECTORY', onSelected: () => setState(() => _filter = 'DIRECTORY')),
+                  const SizedBox(width: 8),
                   _FilterChip(label: 'ERROR', selected: _filter == 'ERROR', onSelected: () => setState(() => _filter = 'ERROR')),
                 ],
               ),
@@ -466,12 +475,14 @@ class _LogsDialogContentState extends State<_LogsDialogContent> {
                     final msg = log.toString().toUpperCase();
                     if (_filter == 'ALL') return true;
                     if (_filter == 'SCANNER') return msg.contains('[SCAN]') || msg.contains('[ROM SCANNER]');
-                    if (_filter == 'NETWORK') return msg.contains('[NETWORK]') || msg.contains('[ROMMSERVICE]');
+                    if (_filter == 'NETWORK') return msg.contains('[NETWORK]') || msg.contains('[ROMMSERVICE]') || msg.contains('[ROMM-NETWORK]');
+                    if (_filter == 'REGISTRY') return msg.contains('[REGISTRY]');
+                    if (_filter == 'DIRECTORY') return msg.contains('[DIRECTORYSERVICE]');
                     if (_filter == 'ERROR') return msg.contains('ERROR') || msg.contains('FAILED');
                     return true;
                   }).toList();
 
-                  final fullText = filteredLogs.map((e) => e.toString()).join('\n');
+                  final fullText = _maskIPs(filteredLogs.map((e) => e.toString()).join('\n'));
 
                   return Container(
                     width: double.infinity,

Clone this wiki locally