• v0.9.0-beta.1 ae58abb371

    v0.9.0-beta.1 (Beta) Pre-release

    julian released this 2026-11-04 21:44:55 +01:00 | 1 commits to main since this release

    Release Notes — v0.9.0-beta.1

    Status: Vorabversion (Beta / Prerelease). Nicht produktionsreif, nicht vollständig getestet.
    Datum: 2026-11-04

    Neu in 0.9.0-beta.1

    1. Updater (update.bat / update.sh)

    Aktualisieren ohne Neuentpacken und ohne erneuten Download der Laufzeit.

    • Prüft die Forgejo-Releases, vergleicht Versionen und bleibt standardmäßig im
      bisherigen Kanal (auto): eine Beta-Installation wird nicht auf einen
      Stable-Release zurückgesetzt. --channel stable|beta erzwingt einen Kanal.
    • Signierte Prüfsummen: SHA256SUMS trägt eine Ed25519-Signatur; der
      öffentliche Schlüssel ist im Programm hinterlegt (backend/app/release_key.py).
      Ohne gültige Signatur wird nichts installiert — die Integrität hängt nicht am
      Download-Endpunkt.
    • Runtime bleibt erhalten: Ein Manifest (MANIFEST-<plattform>.json) nennt
      Python-, Perl-, imapsync- und Paketstände. Nur wenn dort etwas abweicht, wird
      die Laufzeit nachgezogen; unveränderte Komponenten bleiben unangetastet.
    • Daten sind geschützt: .env, data/ und runtime/ werden nie
      überschrieben. Vor dem Austausch werden Konfiguration und Datenbank (SQLite-
      Backup-API) gesichert; Programmdateien werden journalliert ausgetauscht und bei
      einem Fehler zurückgerollt — inklusive Datenbank-Restore, damit Code und Schema
      wieder zusammenpassen.
    • Abbruch bei laufender Anwendung oder laufenden Migrationen. Download in ein
      temporäres Verzeichnis, Prüfung von Signatur und Prüfsummen vor dem
      Entpacken.
    • Fehlermeldungen nennen Ursache und nächsten Schritt (offline, HTTP-Fehler,
      fehlende Signatur, fehlende Berechtigung).

    2. Ein Startskript, automatische Einrichtung

    start.bat / start.sh erledigen beim ersten Start alles: fehlende Laufzeit
    einrichten (einmaliger Download), Konfiguration erzeugen, Datenbank anlegen,
    Server starten, Browser erst nach dem tatsächlichen Start öffnen. Folgestarts
    nutzen die vorhandene Laufzeit ohne Download. start.bat --repair prüft und
    ersetzt beschädigte Laufzeitkomponenten.

    3. Ersteinrichtung im Browser

    Statt eines Passworts im Setup gibt es jetzt eine Einrichtungsseite: Benutzername
    (Standard admin), eigenes Passwort (mindestens 12 Zeichen), Bestätigung. Kein
    Standardpasswort, nur der Argon2id-Hash landet in .env. Solange kein
    Administrator existiert, leitet die Anwendung ausschließlich auf diese Seite.
    Parallele Einrichtungsversuche werden über eine Sperrdatei abgewiesen.

    4. IMAP als Quelle (IMAP → IMAP)

    Neben Microsoft 365 können klassische Postfächer migriert werden
    (Mailcow → Mailcow, IONOS/Strato → Mailcow, eigener Server → eigener Server).

    • Quellserver unter „Quellserver“ anlegen (Host, Port, SSL/TLS/STARTTLS), Passwort
      verschlüsselt; Verbindungstest ohne Änderungen.
    • Dieselbe Migrationsengine wie bisher (imapsync, Queue, Scheduler, Logs,
      Retry) — keine zweite Engine.
    • Microsoft-365-Funktionen bleiben unverändert.

    5. Postfachvorschau und Ordnerauswahl (nur lesend)

    • „Postfach analysieren“ liest ausschließlich LIST/STATUS: Ordnerhierarchie,
      Nachrichtenzahlen je Ordner, Fehler einzelner Ordner werden gesammelt.
    • Es entstehen dabei keine Jobs, keine Nachrichten werden verändert.
    • Ordnerbaum mit Auf-/Zuklappen, „alle auswählen“, „alle abwählen“, Aktualisieren.
    • Auswahl wird pro Job gespeichert: „alle Ordner (auch künftige)“ oder „nur
      ausgewählte“ (--folder je Ordner). Neue Ordner im Quellpostfach werden bei
      „nur ausgewählte“ nicht automatisch übernommen.
    • Nachrichtenzahlen sind als Momentaufnahme gekennzeichnet.

    6. Assistent „Postfach prüfen und migrieren“

    Ein geführter Ablauf: Quelle wählen → verbinden → analysieren → Ordner auswählen →
    Ziel und Adressen → „Nur anlegen“ oder „Migration starten“. Vorschau und Start
    sind klar getrennt; erst der letzte Schritt überträgt Daten.

    7. Getrennte Plattformpakete

    • M365-to-Exchange-Sync-Windows.zip: nur setup.bat, start.bat, update.bat,
      scripts/setup.ps1 — keine Shell-Skripte.
    • M365-to-Exchange-Sync-Linux.tar.gz: nur setup.sh, start.sh, update.sh —
      keine Batch-/PowerShell-Dateien.

    8. Dokumentation

    • Forgejo-Wiki mit 16 Seiten (Installation, Ersteinrichtung, Microsoft 365,
      IMAP-Quellen, Vorschau, Migration, Überwachung, Scheduler, Updates, Sicherheit,
      Fehlerbehebung, FAQ, Entwicklung, Einschränkungen).
    • README als kurze Projektstartseite mit Verweisen ins Wiki.
    • AGENTS.md: verbindliche Dokumentationsregeln für künftige Änderungen.

    Unterstützte Betriebssysteme

    Plattform Status
    Windows 10 (1803+)/11, Server 2019+ getestet (portable Laufzeit, Start, Vorschau, Migration, Update)
    Debian 12 / Ubuntu 22.04+ vorbereitet, nicht ausgeführt getestet

    Installation

    Windows:  ZIP entpacken → start.bat        (erster Start richtet alles ein)
    Linux:    tar xzf … && ./start.sh
    

    Beim ersten Start werden Laufzeit und Abhängigkeiten einmalig geladen
    (ca. 360 MB). Danach genügt start.bat bzw. ./start.sh.

    Voraussetzungen

    • Windows 10 1803+ (nutzt tar.exe) bzw. Linux x86_64 mit tar und curl/wget.
    • Internetzugang beim ersten Start (Laufzeit-Download) und für Updates.
    • Für Microsoft 365: eigene Entra-App-Registrierung (Public Client, Redirect-URI
      http://127.0.0.1:<port>/api/v1/oauth/callback, Scope
      https://outlook.office.com/IMAP.AccessAsUser.All).
    • Kein Docker, keine Administratorrechte, keine Registry-/PATH-Änderungen.

    Getestete Funktionen

    • Updater: Versionsvergleich und Kanäle, signierte Prüfsummen (Ed25519),
      Manipulations- und Checksummen-Fehler, Abbruch bei laufender Anwendung und bei
      laufenden Migrationen, Rollback nach fehlgeschlagener Datenbankmigration,
      Runtime-Wiederverwendung, Installation in einem Pfad mit Leerzeichen.
    • Start: automatische Einrichtung beim ersten Start, Folgestarts ohne
      Download, Reparatur, Portauswahl mit Ausweichport.
    • Ersteinrichtung: Setup-Seite, Passwortregeln, einmalige Einrichtung,
      parallele Anfragen, Login danach.
    • IMAP-Quellen: CRUD, Verbindungstest, Nur-Lesen-Vorschau (auch gegen einen
      echten IMAP-Server), Ordnerauswahl persistent, Job-Anlage, Argumenterzeugung
      (--passfile1, --folder, TLS-Modi).
    • Migration: echte lokale IMAP→IMAP-Migration mit dem portablen imapsync.
    • Automatisierte Tests: Backend-Suite, Frontend-Suite (inkl. Setup- und
      Vorschau-Flow), TypeScript-Prüfung, Produktionsbuild.

    Nicht getestete Funktionen

    • Microsoft-365-Live-Anmeldung und -Migration: kein Testkonto/keine Entra-App.
      Mit Mocks getestet, nicht live verifiziert.
    • Linux-Betrieb: setup.sh, relocatable-perl, start.sh, update.sh sind
      vorbereitet, aber nie ausgeführt.
    • Echtes Strg+C in einer Windows-Konsole: Signalzustellung in der
      Testumgebung nicht reproduzierbar; geordnetes Herunterfahren wurde in-process
      mit echtem uvicorn geprüft.
    • Browser-Klicktest: Werkzeug blockiert Loopback; ersetzt durch
      Komponententests und HTTP-Integrationstests.

    Bekannte Einschränkungen

    • Ein Update ersetzt Programmdateien; eine laufende Anwendung muss vorher beendet
      werden (der Updater weist darauf hin).
    • Ordnerauswahl wird über imapsync---folder umgesetzt: umbenannte Ordner im
      Quellpostfach erscheinen als neuer Ordner.
    • Die Vorschau zeigt eine Momentaufnahme; die tatsächlich übertragene Menge kann
      durch Duplikaterkennung und Änderungen am Quellpostfach abweichen.
    • Genau eine Backend-Instanz pro Datenverzeichnis.
    • Der Ausweichport ist nicht dauerhaft; für eine feste OAuth-Redirect-URI
      APP_PORT setzen.

    Sicherheitshinweise

    • Keine Microsoft-Passwörter in der Anwendung; Anmeldung im Browser, Tokens und
      Quell-/Zielpasswörter Fernet-verschlüsselt in data/database/app.db.
    • .env enthält APP_ENCRYPTION_KEY, SESSION_SECRET und den
      Argon2id-Passwort-Hash — Datei schützen (Windows-ACL, Linux chmod 600).
    • Releases werden mit Ed25519 signiert; der Updater prüft die Signatur vor jeder
      Installation.
    • Optionale Authentifizierung am Release-Server ausschließlich über die
      Umgebungsvariable FORGEJO_TOKEN (nicht in Skripten, Logs oder URLs).
    • Bindung ausschließlich an 127.0.0.1.

    Lizenz

    Eigener Code: MIT (LICENSE). Nicht gebündelt: imapsync (wird beim ersten Start
    von der offiziellen Quelle geladen), Python (PSF), Strawberry Perl
    (Artistic/GPL) bzw. relocatable-perl, CPAN-Module, Frontend-Bibliotheken
    (MIT/ISC). Details: LICENSE.md.

    Upgrade von 0.8.0-beta.3

    Empfohlen: update.bat bzw. ./update.sh --apply — Daten, Konfiguration und
    Laufzeit bleiben erhalten. Alternativ das neue Archiv in einen neuen Ordner
    entpacken; data/ und .env können übernommen werden.

    Prüfsummen

    SHA256SUMS (signiert als SHA256SUMS.sig) enthält die SHA-256-Werte für beide
    Archive, beide Manifeste und diese Release Notes.

    Downloads
  • v0.8.0-beta.3 8800e781b0

    v0.8.0-beta.3 (Beta) Pre-release

    julian released this 2026-11-04 21:03:08 +01:00 | 3 commits to main since this release

    Release Notes — v0.8.0-beta.3

    Status: Vorabversion (Beta / Prerelease). Nicht produktionsreif, nicht vollständig getestet.
    Datum: 2026-11-04

    Neu in 0.8.0-beta.3: vollständig portable Architektur

    Die Anwendung bringt ihre komplette Laufzeit im eigenen Ordner unter und startet
    nichts aus dem System.

    M365-to-Exchange-Sync/
    ├── setup.bat | start.bat | setup.sh | start.sh
    ├── backend/            FastAPI
    ├── frontend/dist/      gebautes React-Frontend
    ├── runtime/
    │   ├── python/         CPython 3.12.16 (python-build-standalone)
    │   ├── perl/           Windows: Strawberry Perl 5.42.3 · Linux: relocatable-perl 5.44
    │   └── imapsync/       imapsync 2.326
    ├── data/
    │   ├── database/       SQLite (app.db)
    │   ├── logs/
    │   └── tmp/
    └── .env
    
    • Kein systemweites Python mehr nötig. setup.bat lädt CPython 3.12
      (portable, SHA-256 geprüft) nach runtime/python und installiert die
      gepinnten Pakete dort hinein. start.bat startet ausschließlich diesen
      Interpreter.
    • Kein systemweites Perl, kein PATH-Eintrag. Perl kommt als portable
      Verteilung nach runtime/perl, imapsync als Skript nach runtime/imapsync.
      Der Runner startet runtime\perl\perl\bin\perl.exe runtime\imapsync\imapsync
      mit kontrollierter Umgebung (PATH/PERL5LIB nur mit lokalen Pfaden).
    • Fremde Installationen werden ignoriert. Ein imapsync.bat 0.22 oder ein
      systemweites Perl im PATH beeinflusst die Anwendung nicht mehr (früher wurde
      genau das als „inkompatibel (0.22)" erkannt).
    • Alle Daten im Programmordner: data/database (SQLite), data/logs,
      data/tmp. Ältere Installationen mit data/app.db werden beim ersten Start
      automatisch übernommen.
    • Relative Pfade in .env (DATA_DIR=data,
      IMAPSYNC_PATH=runtime/imapsync/imapsync, PERL_PATH=…) — der komplette
      Ordner lässt sich verschieben, auch in Pfade mit Leerzeichen.
    • Verständliche Fehlermeldungen, wenn die Laufzeit fehlt:
      [Fehler] Portable Laufzeit ist unvollständig (Perl, imapsync). Bitte setup.bat ausführen.
    • Keine Systemänderung: keine Registry-Einträge, keine Dienste, keine
      geplanten Aufgaben, keine AppData/ProgramData-Daten. Deinstallation =
      Ordner löschen (entfernt auch Tokens, Datenbank und Logs).

    Enthalten aus den Vorgängerversionen: Portauswahl mit Fallback
    (WinError 10013), Browser erst nach Serverstart, Erkennung einer zweiten
    Instanz, Migration über OAuth2/XOAUTH2 mit imapsync, persistente Warteschlange
    mit Scheduler/Retry/Recovery, React-Oberfläche, MIT-Lizenz.

    Unterstützte Betriebssysteme

    Plattform Status
    Windows 10 (1803+)/11, Server 2019+ getestet (portable Laufzeit, Start, Verschieben, Migration)
    Debian 12 / Ubuntu 22.04+ vorbereitet, nicht getestet (keine Linux-Umgebung)

    Installation

    Windows:

    ZIP entpacken → setup.bat (Administratorpasswort, min. 12 Zeichen) → start.bat
    

    Linux:

    tar xzf M365-to-Exchange-Sync-Linux.tar.gz
    cd M365-to-Exchange-Sync && ./setup.sh && ./start.sh
    

    Download der Laufzeit beim Setup: ca. 360 MB (Windows) bzw. 370 MB (Linux),
    einmalig. Bei erneutem Setup wird der Cache in runtime/.cache genutzt, solange
    die Prüfsumme passt.

    Voraussetzungen

    • Windows 10 1803+ (nutzt tar.exe) bzw. Linux x86_64 mit tar und curl/wget.
    • Internetzugang beim Setup (offizielle Quellen, SHA-256-geprüft).
    • Für Migrationen: eigene Entra-App-Registrierung (Public Client, Redirect-URI
      http://127.0.0.1:<port>/api/v1/oauth/callback, Scope
      https://outlook.office.com/IMAP.AccessAsUser.All).
    • Kein Docker, keine Administratorrechte, keine PATH-/Registry-Änderungen.

    Getestete Funktionen

    • Portable Python-Laufzeit (runtime/python/python.exe, CPython 3.12.16),
      inklusive Installation der gepinnten Pakete in diese Laufzeit.
    • Portable Perl-Laufzeit (Strawberry 5.42.3) mit 27 Modulen (u. a.
      Net::SSLeay, IO::Socket::SSL, Mail::IMAPClient).
    • Lokales imapsync 2.326 (Start über runtime/perl, --version geprüft).
    • Fremdes imapsync.bat 0.22 im PATH wird ignoriert — die Anwendung meldet
      2.326 aus runtime/imapsync.
    • Start aus dem entpackten Archiv in einem leeren Verzeichnis, ohne
      APP_PORT, mit Ausweichport; Health, Oberfläche, Login, CRUD.
    • Verschieben des Programmordners (inkl. Pfad mit Leerzeichen), Neustart
      danach, Daten und Laufzeit intakt.
    • Wiederholtes Setup ändert .env nicht und lädt die Laufzeit nicht neu.
    • Echte lokale IMAP-Migration mit dem lokalen imapsync.
    • Automatisierte Tests: Backend-Suite inkl. neuer Runtime-/Porttests,
      Frontend-Suite, TypeScript-Prüfung, Produktionsbuild.

    Nicht getestete Funktionen

    • Microsoft-365-Live-Anmeldung und -Migration: kein Testkonto, keine
      Entra-App. OAuth ist implementiert und mit Mocks getestet, nicht live.
    • Linux-Betrieb: setup.sh/start.sh und die Linux-Laufzeit
      (relocatable-perl) sind vorbereitet, aber nie ausgeführt.
    • Echtes Strg+C in einer Windows-Konsole: Signalzustellung in der
      Testumgebung nicht reproduzierbar; geordnetes Herunterfahren wurde in-process
      mit echtem uvicorn geprüft.
    • Browser-Klicktest: Werkzeug blockiert Loopback; ersetzt durch HTTP-Tests.

    Bekannte Einschränkungen

    • Setup benötigt Internet (kein Offline-Bundle).
    • Strawberry Perl veröffentlicht keine Prüfsummen-Datei; die SHA-256 wurde
      einmalig aus dem offiziellen Release ermittelt (im Skript dokumentiert).
    • Genau eine Backend-Instanz pro Datenverzeichnis.
    • Der Ausweichport ist nicht dauerhaft; für eine fest registrierte
      OAuth-Redirect-URI APP_PORT setzen.
    • runtime/ ist groß (Windows: ca. 1,3 GB nach dem Setup) — bewusst, dafür
      keine Systeminstallationen.

    Sicherheitshinweise

    • Keine Microsoft-Passwörter in der Anwendung; Anmeldung im Browser,
      Tokens verschlüsselt (Fernet) in data/database/app.db.
    • .env enthält APP_ENCRYPTION_KEY, SESSION_SECRET und den
      Argon2id-Passwort-Hash — Datei schützen (Windows: ACL, Linux: chmod 600).
    • Temporäre Token-/Passwortdateien in data/tmp/<run-id>/ mit 0600 bzw.
      restriktiver DACL, Löschung nach jedem Lauf; Logs werden redigiert.
    • Bindung ausschließlich an 127.0.0.1.
    • Der Download der Laufzeit erfolgt ausschließlich von den dokumentierten
      Quellen und wird vor dem Entpacken per SHA-256 geprüft.
    • Beim Verschieben des Ordners bleiben die Dateirechte erhalten; bei
      Kopien auf Datenträger ohne Rechteübernahme (FAT/exFAT) können Tokens und
      Schlüssel für andere Benutzer lesbar werden.

    Lizenz

    Eigener Code: MIT (LICENSE). Nicht gebündelt: imapsync (NO LIMIT PUBLIC
    LICENSE, wird beim Setup von der offiziellen Quelle geladen), Python
    (PSF), Strawberry Perl (Artistic/GPL) bzw. relocatable-perl, CPAN-Module,
    Frontend-Bibliotheken (MIT/ISC). Details: LICENSE.md.

    Upgrade von 0.8.0-beta.2

    1. Server beenden, Ordner sichern.
    2. Neues Archiv in einen neuen Ordner entpacken (oder alten Ordner ersetzen).
    3. setup.bat — übernimmt .env und data/ falls vorhanden; die alte
      data/app.db wird beim Start automatisch nach data/database/app.db
      verschoben.
    4. start.bat.

    Die Migrationen laufen automatisch.

    Prüfsummen

    SHA256SUMS.txt enthält die SHA-256-Werte für beide Archive und diese Release
    Notes.

    Downloads
  • v0.8.0-beta.2 a3e49b2458

    v0.8.0-beta.2 (Beta) Pre-release

    julian released this 2026-11-04 20:22:41 +01:00 | 5 commits to main since this release

    Release Notes — v0.8.0-beta.2

    Status: Vorabversion (Beta / Prerelease). Nicht produktionsreif, nicht vollständig getestet.
    Datum: 2026-11-04

    Behoben in 0.8.0-beta.2

    Windows-Startproblem (WinError 10013 / belegter Port).
    Die Vorgängerversion 0.8.0-beta.1 band fest an 127.0.0.1:8000. War der Port
    belegt oder durch eine Windows-Richtlinie gesperrt, initialisierte sich die
    Anwendung vollständig und beendete sich anschließend mit Exit-Code 3 — ohne
    brauchbare Meldung.

    Jetzt gilt:

    • Bevorzugt wird weiterhin Port 8000 (bzw. APP_PORT).
    • Ist er belegt oder gesperrt, prüft der Start automatisch die folgenden Ports
      (8001 … 8025) und verwendet den ersten freien.
    • Die Meldung nennt den Grund und den tatsächlich verwendeten Port:
      [Hinweis] Port 8000 ist belegt oder gesperrt — verwende 8001.
    • Ist kein Port frei, endet der Start mit Exit 3 und einer verständlichen
      Meldung samt Hinweis auf APP_PORT.
    • Der Browser wird erst geöffnet, nachdem der Server tatsächlich lauscht —
      mit der real verwendeten Portnummer.
    • Eine zweite Instanz auf demselben Datenverzeichnis wird vor dem Start
      erkannt (Exit 4, mit PID und Pfad der Sperrdatei).
    • Weicht der Port von APP_BASE_URL ab, wird ausdrücklich auf die dann
      notwendige Microsoft-Redirect-URI hingewiesen. Die Anwendung ändert keine
      OAuth-Einstellungen automatisch.
    • start.bat und start.sh delegieren an dieselbe Logik (python -m app.launcher);
      keine Windows-Firewall- oder Systemänderungen.

    Neue Funktionen (aus 0.8.0-beta.1)

    • Migration von Microsoft-365-Postfächern über IMAP (OAuth2/XOAUTH2, MSAL,
      Auth-Code-Flow mit PKCE) auf beliebige IMAP-Ziele mittels imapsync.
    • Verwaltung von Tenants, Microsoft-Konten, IMAP-Zielen und Jobs; verschlüsselte
      Token-Caches (Fernet) und Zielpasswörter.
    • Persistente Warteschlange mit Parallelität, Prioritäten, Zeitplänen,
      Wiederholungen mit exponentiellem Backoff und Wiederherstellung nach Neustart.
    • React-Weboberfläche (Dashboard, Postfächer, Assistent, Migrationen, Queue,
      Laufdetails mit Logs, Microsoft-Verwaltung, Ziele, Einstellungen, Dark/Light).
    • Betrieb ohne Docker: setup.bat/setup.sh, start.bat/start.sh, lokal auf
      127.0.0.1, ein Worker.

    Unterstützte Betriebssysteme

    Plattform Status
    Windows 10/11, Windows Server 2019+ getestet (Installation, Start mit Portausweichen, Migration lokal)
    Debian 12 / Ubuntu 22.04+ vorbereitet, nicht getestet (keine Linux-Umgebung verfügbar)

    Installation

    Windows:

    M365-to-Exchange-Sync-Windows.zip entpacken
    setup.bat        (fragt nach einem Administratorpasswort, mind. 12 Zeichen)
    start.bat        → Konsole nennt die tatsächliche URL, z. B. http://127.0.0.1:8001
    

    Linux (Debian/Ubuntu):

    tar xzf M365-to-Exchange-Sync-Linux.tar.gz
    cd M365-to-Exchange-Sync
    ./setup.sh && ./start.sh
    

    Kein Docker, keine Administratorrechte für die Anwendung, Node.js nicht
    erforderlich (React-Build ist enthalten).

    Voraussetzungen

    • Python 3.12 oder neuer.
    • imapsync (Perl-Skript bzw. imapsync.exe), getestet mit 2.326; empfohlen:
      Strawberry Perl (portable) + cpanm-Module, siehe docs/INSTALL_WINDOWS.md.
    • Für die Microsoft-Anmeldung: eigene Entra-App-Registrierung (Public Client,
      Redirect-URI http://127.0.0.1:<port>/api/v1/oauth/callback, Scope
      https://outlook.office.com/IMAP.AccessAsUser.All), siehe docs/ENTRA_SETUP.md.
      Wird ein Ausweichport verwendet, muss diese URI mit dem tatsächlichen Port
      übereinstimmen — oder APP_PORT auf den registrierten Port festlegen.

    Getestete Funktionen

    • Startlogik (neu): 25 automatisierte Tests zu Portauswahl, WinError 10013,
      belegtem Port, Fallback, Browser-Öffnung erst nach Bereitschaft, fehlendem
      freien Port, zweiter Instanz und sauberem Herunterfahren (echter uvicorn-Start,
      Health-Check 200, Port nach dem Beenden wieder bindbar).
    • Installation aus dem Release-Archiv in einem leeren Verzeichnis, ohne
      APP_PORT: Der Start wählt wegen des lokal gesperrten Ports 8000 automatisch
      einen Ausweichport; Health, Oberfläche, Login und CRUD funktionieren dort.
      Zweite Instanz wird abgewiesen, Neustart nach hartem Abbruch funktioniert.
    • Echtes imapsync 2.326 gegen zwei lokale IMAP-Server: 12 Nachrichten,
      Ordnerstruktur inkl. Unterordner, \Seen, zweiter Lauf ohne Duplikate,
      Abbruch + Fortsetzung bis 72/72.
    • Automatisierte Tests: 279 Backend-Tests (3 übersprungen), 35 Frontend-Tests,
      TypeScript-Prüfung, Produktionsbuild.

    Nicht getestete Funktionen

    • Microsoft-365-Live-Anmeldung und -Migration: kein Testkonto, keine
      Entra-App verfügbar. OAuth ist implementiert und mit Mocks getestet, nicht
      live verifiziert
      .
    • Linux-Betrieb: Skripte und Rechtebehandlung sind vorbereitet, nie
      ausgeführt (insbesondere die neue Portlogik unter Linux).
    • Browser-Klicktest: nicht durchgeführt (Testumgebung blockiert Loopback);
      ersetzt durch Komponententests und HTTP-Integrationstests.
    • Strg+C unter Windows in einer echten Konsole: nicht als Testfall
      reproduziert. Das geordnete Herunterfahren wurde in-process mit echtem uvicorn
      geprüft (Server stoppt, Port wird freigegeben); harter Abbruch und Neustart
      wurden im Installationsarchiv getestet.

    Bekannte Einschränkungen

    • Genau eine Backend-Instanz pro Datenverzeichnis (Sperrdatei data/queue.lock).
    • Der Ausweichport ist nicht dauerhaft: Nach einem Neustart wird erneut ab 8000
      gesucht. Für eine fest registrierte OAuth-Redirect-URI APP_PORT setzen.
    • imapsync ist nicht enthalten und muss separat installiert werden.
    • Mehrere imapsync-Installationen im PATH: IMAPSYNC_PATH in .env setzen.
    • Shared Mailboxes werden nicht zugesagt (delegierter Zugriff nicht getestet).

    Bekannte Fehler

    Keine kritischen Fehler bekannt. Beobachtet:

    • 502 oauth_provider_unavailable ohne konfigurierte Client-ID bzw. ohne
      Internetzugang zur Microsoft-Discovery (erwartetes Verhalten).
    • Ein fremdes imapsync.bat im Benutzerprofil kann als „inkompatibel (0.22)“
      erkannt werden; Abhilfe: IMAPSYNC_PATH setzen.

    Sicherheitshinweise

    • Die Anwendung fragt keine Microsoft-Passwörter ab und speichert sie nicht.
    • Tokens und Zielpasswörter liegen ausschließlich verschlüsselt in der lokalen
      SQLite-DB; der Schlüssel steht in .env (APP_ENCRYPTION_KEY).
    • Temporäre Token-/Passwortdateien: 0600 (Windows: DACL nur Benutzer/SYSTEM/
      Administratoren), Löschung nach jedem Lauf.
    • Logs werden vor dem Schreiben redigiert (Bearer, XOAUTH2, Passwörter).
    • Die Anwendung bindet nur an 127.0.0.1; die Portauswahl ändert keine
      Firewall- oder Systemeinstellungen.
    • Keine Standard-Zugangsdaten: Setup erzeugt ein zufälliges Startpasswort oder fragt ab.

    Lizenz

    Der eigene Quellcode steht unter der MIT-Lizenz (LICENSE). imapsync wird
    nicht gebündelt; Python-Pakete werden beim Setup von PyPI installiert;
    Frontend-Bibliotheken (MIT/ISC) sind im Build enthalten. Details: LICENSE.md.

    Upgrade von 0.8.0-beta.1

    data/ und .env bleiben gültig; Datenbankmigrationen laufen automatisch.
    Nach dem Update start.bat bzw. start.sh verwenden — die Startskripte rufen
    jetzt python -m app.launcher auf. Ein bereits laufender Server sollte vorher
    beendet werden.

    Prüfsummen

    SHA256SUMS.txt enthält die SHA-256-Werte für beide Archive und diese Release Notes.

    Downloads
  • v0.8.0-beta.1 757e64d90b

    v0.8.0-beta.1 (Beta) Pre-release

    julian released this 2026-11-04 19:54:54 +01:00 | 8 commits to main since this release

    Release Notes — v0.8.0-beta.1

    Status: Vorabversion (Beta / Prerelease). Nicht produktionsreif, nicht vollständig getestet.
    Datum: 2026-11-04

    Neue Funktionen

    • Migration von Microsoft-365-/Exchange-Online-Postfächern über IMAP (OAuth2/XOAUTH2)
      auf beliebige IMAP-Ziele (Mailcow, Dovecot, Cyrus) mit imapsync.
    • Microsoft-Anmeldung über MSAL (Authorization Code Flow mit PKCE, Public Client),
      verschlüsselter Token-Cache pro Identität, automatischer Token-Refresh.
    • Postfachverwaltung: Tenants, Microsoft-Konten, IMAP-Zielserver, Migrationsjobs.
    • Migrationsengine: imapsync-Erkennung (Version + Pflichtoptionen), Secret-Dateien mit
      restriktiven Rechten, Log-Redaktion, Exit-Code-Mapping, Abbruch, Zeitlimit.
    • Persistente Warteschlange: Parallelität (Standard 2), Prioritäten, Pause/Fortsetzen,
      Zeitpläne je Job, Wiederholungen mit exponentiellem Backoff, Recovery nach Neustart.
    • Weboberfläche (React/TypeScript): Dashboard, Postfächer, Assistent, Migrationen,
      Warteschlange, Laufdetails mit Logs, Microsoft-365-Verwaltung, Zielserver, Einstellungen,
      Dark/Light-Mode, deutsch.
    • Betrieb ohne Docker: setup.bat/setup.sh, start.bat/start.sh, ausschließlich
      127.0.0.1:8000, ein Worker, keine automatischen Reloads.

    Unterstützte Betriebssysteme

    Plattform Status
    Windows 10/11, Windows Server 2019+ getestet (Installation, Start, Migration lokal)
    Debian 12 / Ubuntu 22.04+ vorbereitet, nicht getestet (keine Linux-Umgebung verfügbar)

    Installation

    Windows:

    M365-to-Exchange-Sync-Windows.zip entpacken
    setup.bat        (fragt nach einem Administratorpasswort, mind. 12 Zeichen)
    start.bat        → http://127.0.0.1:8000
    

    Linux (Debian/Ubuntu):

    tar xzf M365-to-Exchange-Sync-Linux.tar.gz
    cd M365-to-Exchange-Sync
    ./setup.sh && ./start.sh
    

    Kein Docker, keine Administratorrechte für die Anwendung. Der React-Build ist enthalten —
    Node.js wird nicht benötigt.

    Voraussetzungen

    • Python 3.12 oder neuer.
    • imapsync (Perl-Skript bzw. imapsync.exe), Version ≥ 2.200, getestet mit 2.326.
      Empfohlen: Strawberry Perl (portable) + cpanm-Module, siehe docs/INSTALL_WINDOWS.md.
    • Für die Microsoft-Anmeldung: eigene Entra-App-Registrierung (Public Client,
      Redirect-URI http://127.0.0.1:8000/api/v1/oauth/callback, Scope
      https://outlook.office.com/IMAP.AccessAsUser.All), siehe docs/ENTRA_SETUP.md.
      Ohne Client-ID startet die Anwendung, die Anmeldung ist dann deaktiviert.

    Getestete Funktionen

    • Echtes imapsync 2.326 (Strawberry Perl 5.42.3, portable) gegen zwei lokale
      IMAP-Server (Greenmail): 12 Nachrichten vollständig übertragen, Ordnerstruktur
      inklusive Unterordner, \Seen-Flag übernommen, zweiter Lauf ohne Duplikate
      (0 messages transferred), Abbruch mitten im Lauf und Fortsetzung bis 72/72.
    • Installation aus dem Release-Archiv in einem leeren Verzeichnis: Setup, Login,
      Weboberfläche, Tenant/Zielserver/Konto/Job anlegen, Neustart mit erhaltenen Daten,
      zweites Setup ohne Änderungen an .env, keine Secrets in Logs.
    • Automatisierte Tests: 254 Backend-Tests (3 übersprungen), 35 Frontend-Tests,
      TypeScript-Prüfung, Produktionsbuild, Release-Archivprüfung.

    Nicht getestete Funktionen

    • Microsoft-365-Live-Anmeldung und -Migration: kein Testkonto, keine Entra-App
      verfügbar. OAuth ist implementiert und mit Mocks getestet, nicht live verifiziert.
      Ohne Entra-Konfiguration antwortet POST /identities/{id}/authorize mit
      502 oauth_provider_unavailable.
    • Linux-Betrieb: Skripte und Pfad-/Rechtebehandlung sind vorbereitet, aber nie
      ausgeführt. Linux gilt ausdrücklich nicht als getestet.
    • Browser-Klicktest: nicht durchgeführt (Testumgebung blockiert Loopback-Adressen);
      ersetzt durch Komponententests und einen HTTP-Integrationstest.
    • Token-Ablauf während eines langen Laufs: Mechanismus (Refresh + atomarer
      Dateiaustausch) ist getestet, das reale Verhalten gegen Exchange Online nicht.
    • TLS gegen produktive Zertifikate: Testserver nutzten selbstsignierte Zertifikate.

    Bekannte Einschränkungen

    • Genau eine Backend-Instanz pro Datenverzeichnis (Sperrdatei data/queue.lock);
      mehrere Worker/Hosts werden nicht unterstützt (SQLite).
    • Standardport 8000 kann durch lokale Richtlinien gesperrt sein (APP_PORT setzen);
      python -m app.cli check warnt dann.
    • imapsync ist nicht enthalten und muss separat installiert werden.
    • Werden mehrere imapsync-Versionen im PATH gefunden, kann die falsche erkannt werden —
      IMAPSYNC_PATH in .env setzen.
    • Shared Mailboxes werden nicht zugesagt (delegierter Zugriff nicht getestet).

    Bekannte Fehler

    Keine kritischen Fehler bekannt. Beobachtet:

    • 502 oauth_provider_unavailable ohne konfigurierte Client-ID bzw. ohne Internetzugang
      zur Microsoft-Discovery (erwartetes Verhalten, wird in der Oberfläche erklärt).
    • Ein fremdes imapsync.bat im Benutzerprofil kann als „inkompatibel (0.22)“ erkannt
      werden; Abhilfe: IMAPSYNC_PATH setzen.

    Sicherheitshinweise

    • Die Anwendung fragt keine Microsoft-Passwörter ab und speichert sie nicht.
    • Tokens und Zielpasswörter liegen ausschließlich verschlüsselt in der lokalen SQLite-DB;
      der Schlüssel steht in .env (APP_ENCRYPTION_KEY). Verlust des Schlüssels macht
      gespeicherte Geheimnisse unlesbar — .env sichern.
    • Temporäre Token-/Passwortdateien: 0600 in data/tmp/<run-id>/, unter Windows
      explizite DACL (nur Benutzer, SYSTEM, Administratoren); Löschung nach jedem Lauf.
    • Logs werden vor dem Schreiben redigiert (Bearer, XOAUTH2, Passwörter).
    • Die Anwendung bindet nur an 127.0.0.1. Für Netzwerkzugriff ist ein HTTPS-Reverse-Proxy
      erforderlich; ohne HTTPS wird das Session-Cookie ohne Secure gesetzt.
    • Keine Standard-Zugangsdaten: Setup erzeugt ein zufälliges Startpasswort oder fragt ab.

    Lizenzstatus

    Der Quellcode dieses Projekts steht unter der MIT-Lizenz (LICENSE).
    imapsync wird nicht gebündelt (eigene Lizenz des Autors, extern zu installieren);
    Python-Abhängigkeiten werden beim Setup von PyPI installiert; Frontend-Bibliotheken
    (MIT/ISC) sind im Build enthalten. Details: LICENSE.md.

    Upgrade-Hinweis

    Vorhandene data/- und .env-Dateien werden beim Setup nicht überschrieben. Vor einem
    Wechsel die Verzeichnisse sichern. Datenbankmigrationen laufen automatisch
    (python -m app.cli init).

    Prüfsummen

    SHA256SUMS.txt enthält die SHA-256-Werte für beide Archive und diese Release Notes.

    Downloads