Plesk-Sync: Auto-Import bei User-Remove deaktivieren

Folge-Bug zu 194c864: User löscht Adresse im Modal → DB-Liste
wird kürzer → Plesk-Sync läuft → Auto-Import sieht "c ist in
Plesk aber nicht in DB" → schreibt c zurück in
additionalForwardingEmails → Diff sagt nichts zu entfernen.

Ursache: Auto-Import (Pentest 83.x) lief für alle Sync-Pfade.
Beim Sync-Button ist Plesk→DB-Übernahme gewollt (Bestands-
Migration). Beim User-Add/Remove ist die DB-Liste die explizite
Intent – Auto-Import macht das User-Delete kaputt.

syncForwardingForEmail(id, opts?: { autoImportPleskMembers? })
mit Default true (Sync-Button-Verhalten). setAdditionalForwards
ruft mit false – entfernte Adressen verschwinden jetzt sauber
auch beim Provider.
This commit is contained in:
2026-06-18 18:24:44 +02:00
parent 194c86409f
commit dfe2a4b241
2 changed files with 77 additions and 49 deletions
@@ -350,8 +350,10 @@ export async function setAdditionalForwards(
});
// Provider unmittelbar nachziehen, sonst läuft das Plesk-Mail-Konto
// mit der alten Liste weiter.
const syncResult = await syncForwardingForEmail(id);
// mit der alten Liste weiter. autoImport=false, weil unsere DB-Liste
// hier die explizite User-Intent ist kein Plesk-Member-Auto-Pull,
// sonst landen gerade entfernte Adressen zurück in der Liste.
const syncResult = await syncForwardingForEmail(id, { autoImportPleskMembers: false });
// 71.4: Rollback wenn Plesk den Sync abgelehnt hat. DB darf nicht
// den optimistischen Stand zeigen, wenn der Provider noch auf dem
@@ -506,6 +508,7 @@ export async function getDecryptedPassword(id: number): Promise<string | null> {
// Einträge, bei denen das Flag nie gesetzt wurde, werden so geheilt).
export async function syncForwardingForEmail(
id: number,
options: { autoImportPleskMembers?: boolean } = {},
): Promise<{
success: boolean;
forwardTargets?: string[];
@@ -513,6 +516,14 @@ export async function syncForwardingForEmail(
passwordReset?: boolean;
error?: string;
}> {
// Auto-Import übernimmt unbekannte Plesk-Members in unsere DB. Macht
// beim Sync-Button Sinn (Bestands-Migration), aber NICHT beim
// User-getriggerten Add/Remove dort ist die DB-Liste die Wahrheit.
// Sonst kreisen entfernte Adressen zurück in die Liste:
// 1. User entfernt c → DB=[a,b], Plesk=[a,b,c]
// 2. Auto-Import: "c ist in Plesk aber nicht in DB → in DB schreiben"
// 3. → DB=[a,b,c], Diff sagt nichts zu löschen, Plesk bleibt [a,b,c].
const autoImport = options.autoImportPleskMembers ?? true;
const stressfreiEmail = await prisma.stressfreiEmail.findUnique({
where: { id },
select: {
@@ -572,6 +583,7 @@ export async function syncForwardingForEmail(
// als Forwarding-Target auf sich selbst (Mail-Loop).
seenKeys.add(canonicalEmailKey(stressfreiEmail.email));
if (autoImport) {
try {
const pleskState = await checkEmailExists(localPart);
const existingMembers = [
@@ -622,6 +634,7 @@ export async function syncForwardingForEmail(
// alte Empfänger, aber der eigentliche Sync soll trotzdem laufen.
console.error('[syncForwardingForEmail] Mailgroup-Import fehlgeschlagen:', importErr);
}
}
// 1) Forwards neu setzen (deaktiviert intern Mailgroup).
const forwardResult = await setEmailForwardTargets(localPart, forwardTargets);
+15
View File
@@ -97,6 +97,21 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🐞 Entfernte Weiterleitungen kamen via Auto-Import zurück**
- Folge-Bug: User löscht Adresse im Modal → DB-Liste wird kürzer →
Plesk-Sync läuft → Auto-Import (`Pentest 83.x`) sieht „c ist in
Plesk aber nicht in DB" → schreibt `c` zurück in
`additionalForwardingEmails` → Diff sagt nichts zu entfernen.
- Ursache: Auto-Import war für **alle** Sync-Aufrufe aktiv. Beim
Sync-Button-Klick will der User Plesk-Bestand übernehmen (Import
sinnvoll), beim Add/Remove im Modal ist die DB-Liste die
explizite Intent (Import schädlich).
- Fix: `syncForwardingForEmail(id, { autoImportPleskMembers? })`
mit Default `true`. `setAdditionalForwards` ruft mit
`false` auf → entfernte Adressen verschwinden jetzt sauber bei
Plesk. Sync-Button-Pfad bleibt unverändert (importiert weiterhin
alte Bestands-Members).
- [x] **🐞 Plesk-Sync: `-forwarding-addresses set:` existiert gar nicht**
- Folge-Bug nach `a83358b`/`24e152b`: Sync verändert Plesk weiterhin
nicht. `plesk bin mail --help` zeigt: `-forwarding-addresses`