Manticore-RT-Index für Mail-Suchdokumente (Betreff, Text, Anhangstext, Metadaten), statisches versioniertes Schema. - fields.go: statische Feld-/Index-Namen-Whitelist, einzige Quelle für Feldnamen im Paket (vermeidet known-issues-archivmail.md #11/#12: Sprintf/Join-basierte SQL-Klauselbildung). - migrations/0001_mail_documents.sql: statisches Schema, per go:embed eingebettet, über /sql?mode=raw angelegt (kein String-Zusammenbau). - client.go: Index/Search über die strukturierte Manticore-HTTP-JSON-API, Tenant-Filter über strukturiertes equals-Feld statt WHERE-Interpolation. Prüfungen (alle real durchgeführt, siehe mail/docs/SRC-01-PRUEFPROTOKOLL.md): 1. TestNoDynamicSQLClauseBuilding: automatisierter Quelltext-Scan bestätigt keine Sprintf/Join-SQL-Klauselbildung. 2. TestSearch_MaliciousInputDoesNotAlterFieldNames: Injection-artige Eingaben verändern nachweislich keine Feldnamen im gesendeten Payload. 3. TestSearch_FindsExpectedDocument: Funktionstest gegen echtes Manticore auf 192.168.1.131 liefert erwartete Treffer. Zusätzlich TestSearch_TenantIsolation für Akzeptanzkriterium 3. Kein Umbau: storage/crypto/encstorage/dedup unverändert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
30 lines
1.3 KiB
Go
30 lines
1.3 KiB
Go
// Package search implementiert SRC-01: den Manticore-RT-Suchindex für
|
|
// Mail-Inhalte. Bekannter Fehler vermeiden (siehe known-issues-archivmail.md
|
|
// #11/#12): archivmail baute WHERE-Klauseln und teils Spalten-/Tabellennamen
|
|
// dynamisch über fmt.Sprintf/strings.Join zusammen. Für dieses Paket gilt
|
|
// verbindlich: Spalten- und Tabellennamen kommen AUSSCHLIESSLICH aus den
|
|
// Konstanten dieser Datei, nirgendwo sonst im Paket wird ein Feld- oder
|
|
// Tabellenname zur Laufzeit zusammengesetzt. Suchanfragen laufen über die
|
|
// strukturierte Manticore-HTTP-JSON-API (Query/Insert-Sub, kein
|
|
// String-Zusammenbau von SQL), nicht über die SQL-Schnittstelle.
|
|
package search
|
|
|
|
// IndexName ist der einzige Ort, an dem der Manticore-Indexname als
|
|
// Literal steht.
|
|
const IndexName = "mail_documents"
|
|
|
|
// Statische Feld-Whitelist des mail_documents-Index (muss deckungsgleich
|
|
// mit migrations/0001_mail_documents.sql bleiben).
|
|
const (
|
|
FieldTenantSlug = "tenant_slug"
|
|
FieldMessageID = "message_id"
|
|
FieldSubject = "subject"
|
|
FieldBody = "body"
|
|
FieldAttachmentText = "attachment_text"
|
|
FieldSentAt = "sent_at"
|
|
)
|
|
|
|
// searchableTextFields sind die Volltextfelder, über die eine Suchanfrage
|
|
// läuft (Akzeptanzprüfung 3: Volltextsuche liefert erwartete Treffer).
|
|
var searchableTextFields = []string{FieldSubject, FieldBody, FieldAttachmentText}
|