fix(kerio): korrekte Admin-API gemäß Delivery.idl + Pop3Account-Doku

- Methoden: Delivery.getPop3AccountList / addPop3AccountList /
  setPop3Account (vorher geraten als Pop3Accounts.set/.create →
  Method not found).
- Pop3Account-Felder mit den richtigen Namen: isActive (statt enabled),
  mode (statt sslMode), authentication (statt authType), und
  leaveOnServer.removeAfterPeriod als OptionalLong-Wrapper.
  Falsche Namen wurden von Kerio still ignoriert → Sammler war inaktiv.
- User-Struct: allowPasswordChange=false (statt mayChangePassword,
  das es nicht gibt). emailAddresses weggelassen, Kerio leitet die
  primäre Adresse aus loginName+domain ab.
- Kerio-Step in 2 Sub-Steps aufgeteilt: User (skip wenn vorhanden) +
  POP3 (upsert). Damit wird bei einem zweiten Lauf der Sammler nicht
  übersprungen, nur weil der User schon existiert.
- POP3-Sammler ist jetzt UPSERT: existierende werden via setPop3Account
  überschrieben → Selbstreparatur kaputter Einträge + Passwort-
  Änderungen aus der CSV ziehen sich von selbst nach.

GUI: 👁/🙈-Toggle pro Passwort-Feld (Klartext temporär einsehbar).

Filenames der Sammel-PDFs + Admin-Report ohne Zeitstempel –
erneuter Lauf überschreibt statt anzuhäufen.

README: Ablauf-Sektion + Idempotenz-Tabelle aktualisiert; Kerio-
Caveat ersetzt durch konkrete Methoden-/Feld-Liste mit Doku-Link.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-12 14:09:06 +02:00
parent 4711c55d89
commit 06d7e00e49
4 changed files with 235 additions and 86 deletions
+26 -4
View File
@@ -77,10 +77,12 @@ class AccountRow(ttk.Frame):
cell.grid(row=1, column=col, padx=2, sticky="w")
ttk.Label(cell, text=label,
font=("Helvetica", 8)).pack(anchor="w")
show = "" if "kennwort" in key else None
e = ttk.Entry(cell, width=width, show=show)
e.pack()
self.entries[key] = e
if "kennwort" in key:
self._make_password_entry(cell, key, width)
else:
e = ttk.Entry(cell, width=width)
e.pack()
self.entries[key] = e
def _make_field(self, parent, key, label, width, side="left"):
cell = ttk.Frame(parent)
@@ -90,6 +92,26 @@ class AccountRow(ttk.Frame):
e.pack()
self.entries[key] = e
def _make_password_entry(self, parent, key, width):
"""Passwort-Entry + Auge-Toggle nebenan."""
row = ttk.Frame(parent)
row.pack()
e = ttk.Entry(row, width=width, show="")
e.pack(side="left")
btn = ttk.Button(row, text="👁", width=2)
btn.config(command=lambda: self._toggle_password(e, btn))
btn.pack(side="left", padx=(2, 0))
self.entries[key] = e
@staticmethod
def _toggle_password(entry, btn):
if entry.cget("show"):
entry.config(show="")
btn.config(text="🙈")
else:
entry.config(show="")
btn.config(text="👁")
def to_dict(self) -> dict:
return {k: e.get().strip() for k, e in self.entries.items()}