fix: close remaining security gaps, test fixes, frontend integration, event bus
Check Cross-Plugin Imports / check (push) Has been cancelled

- RCE: move _check_dangerous_imports() BEFORE exec_module() in plugins.py
- verify_ws_origin: reject empty Origin header when CORS configured
- Test: ai_app fixture with permission_registry init for ai_assistant
- Test: login_client sets CSRF token + Origin as client default headers
- Test: SESSION_COOKIE_SECURE=false override + get_settings.cache_clear()
- Test: asyncio_default_test_loop_scope=session fixes event loop closed
- Test: fix 15 assertions (paths, variables, auth expectations)
- Frontend: integrate SavedFilterBar in ContactsList, Mail, Calendar
- Frontend: integrate TagSelector in ContactsList, Mail, Calendar
- Event Bus: add 4 subscribers in system_notif (conversation/participant/reaction)
- Docs: update all analysis reports and FIX-PLAN-V2 to current state
This commit is contained in:
Agent Zero
2026-07-27 12:45:45 +02:00
parent 1916243d36
commit 719ee251f2
11 changed files with 344 additions and 158 deletions
+25
View File
@@ -19,6 +19,9 @@ import { MailComposeForm, type ComposeMode } from '@/components/mail/MailCompose
import { useWindowStore } from '@/store/windowStore';
import { usePluginToolbarStore } from '@/store/pluginToolbarStore';
import { ArrowRight, Check, ChevronLeft, ExternalLink, Loader2, Plus, Redo2, Trash2, TrendingUp, Undo2 } from 'lucide-react';
import { SavedFilterBar } from '@/components/common/SavedFilterBar';
import { TagSelector } from '@/components/tags/TagSelector';
import type { Tag } from '@/api/tags';
import {
fetchAccounts,
fetchFolders,
@@ -83,6 +86,7 @@ export function MailPage() {
const [sortBy, setSortBy] = useState<'date' | 'from' | 'subject'>('date');
const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc');
const [isSyncing, setIsSyncing] = useState(false);
const [selectedTags, setSelectedTags] = useState<Tag[]>([]);
// Ref to track the current folder ID for async callbacks (prevents race conditions)
const selectedFolderIdRef = useRef<string | null>(null);
@@ -810,6 +814,27 @@ export function MailPage() {
className="border-r border-secondary-200 bg-white"
data-testid="mail-list-pane"
>
{/* Saved filter bar + tag selector */}
<div className="flex items-center gap-2 px-3 py-2 border-b border-secondary-200 bg-secondary-50 flex-wrap" data-testid="mail-filter-bar">
<SavedFilterBar
entityType="mail"
currentFilters={{ search: searchQuery, sortBy, sortOrder, folderId: selectedFolderId }}
onApplyFilter={(criteria) => {
if (criteria.search !== undefined) handleSearch(criteria.search);
if (criteria.sortBy) setSortBy(criteria.sortBy as 'date' | 'from' | 'subject');
if (criteria.sortOrder) setSortOrder(criteria.sortOrder as 'asc' | 'desc');
}}
/>
<div className="flex-1 min-w-[180px]" data-testid="mail-tag-selector">
<TagSelector
entityType="file"
entityId={selectedMail?.id ?? ''}
selectedTags={selectedTags}
onChange={setSelectedTags}
placeholder={t('tags.selectPlaceholder', 'Tags filtern...')}
/>
</div>
</div>
<MailList
mails={mails}
selectedMailId={selectedMail?.id || null}