fix(sec): Authorization-Bypässe und Path-Traversal schließen, Xapian-Doku bereinigen

- SEC: requireMailAccess auf GET /api/threads/{threadID} — superadmin/domain_admin konnten Mail-Metadaten lesen
- SEC: requireMailAccess auf POST /api/export/ediscovery — superadmin/domain_admin konnten bis zu 10k EML exportieren
- SEC: V1-API user-role Keys müssen 'contact=' angeben — verhindert vollständige Tenant-Enumeration
- SEC: Domain-Regex-Validierung in handleCertACME vor filepath.Join und certbot-Aufruf
- docs: README und config.test.yml auf Manticore Search aktualisiert (kein Xapian mehr)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-05-28 23:55:31 +02:00
parent 8d950b48f7
commit fa9f77782c
5 changed files with 39 additions and 37 deletions
+7
View File
@@ -17,10 +17,13 @@ import (
"os"
"os/exec"
"path/filepath"
"regexp"
"strings"
"time"
)
var validDomainRE = regexp.MustCompile(`^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$`)
const (
certDir = "/etc/ssl/archivmail"
certPath = "/etc/ssl/archivmail/archivmail.crt"
@@ -270,6 +273,10 @@ func (s *Server) handleCertACME(w http.ResponseWriter, r *http.Request) {
writeError(w, http.StatusBadRequest, "email is required")
return
}
if !validDomainRE.MatchString(req.Domain) {
writeError(w, http.StatusBadRequest, "invalid domain name")
return
}
// Verify certbot is available before attempting anything.
certbotPath, err := exec.LookPath("certbot")