anrufmonitor/README.md

2.9 KiB
Raw Blame History

Anrufmonitor

SIP-Client (Windows, .NET/C# Tray-App), der eingehende Anrufe passiv mitliest und automatisch den passenden Kontakt aus Office 365, Google Contacts oder einem öffentlichen Verzeichnis anzeigt.

Funktionsweise

  • SIP: registriert sich bei der Telefonanlage/dem Provider und liest eingehende INVITE-Requests passiv mit (Anrufer-Rufnummer). Es wird nie Answer() aufgerufen der Client nimmt den Anruf nicht an, sondern zeigt nur an, wer anruft. Voraussetzung: die Telefonanlage forkt eingehende Anrufe an mehrere registrierte Geräte/Kontakte derselben Nebenstelle.
  • Kontakte: werden periodisch im Hintergrund aus Office 365 (Microsoft Graph) und Google Contacts (People API) in einen lokalen SQLite-Cache synchronisiert. Beim eingehenden Anruf wird nur der Cache abgefragt (schnell, keine Live-API-Calls während des Anrufs). Ist die Nummer unbekannt, kann optional ein öffentliches Verzeichnis per On-Demand-Reverse-Lookup gefragt werden (Ergebnis wird ebenfalls gecacht).
  • UI: Tray-Icon, Popup unten rechts mit Name/Firma/Nummer bei eingehendem Anruf.

Projektstruktur

src/
  Anrufmonitor.App/       WPF-Tray-App (Einstiegspunkt, appsettings.json)
  Anrufmonitor.Sip/       Passiver SIP-Monitor (SIPSorcery)
  Anrufmonitor.Contacts/  Kontakt-Provider, SQLite-Cache, Lookup-Service
tests/
  Anrufmonitor.Tests/     xUnit-Tests

Bauen & Starten

dotnet build Anrufmonitor.slnx
dotnet test tests\Anrufmonitor.Tests\Anrufmonitor.Tests.csproj
dotnet run --project src\Anrufmonitor.App\Anrufmonitor.App.csproj

Konfiguration

src\Anrufmonitor.App\appsettings.json enthält nur die Struktur (keine Secrets, wird committet). Für echte Werte appsettings.Local.json.example nach appsettings.Local.json kopieren (liegt in .gitignore, wird beim Build automatisch mitkopiert falls vorhanden) und ausfüllen:

  • Sip: Server, Username, Password der Telefonanlage.
  • Contacts:Office365: App-Registration in Azure/Entra (Typ Public client, Delegated Permission Contacts.Read), ClientId eintragen. Anmeldung erfolgt beim ersten Sync per Device-Code-Flow (Code wird geloggt, im Browser unter microsoft.com/devicelogin eingeben).
  • Contacts:Google: OAuth-Client (Typ Desktop app) in der Google Cloud Console, People API aktivieren, ClientId/ClientSecret eintragen. Anmeldung per Browser-Login beim ersten Sync, Token wird danach lokal zwischengespeichert.
  • Contacts:PublicDirectory: optional, generisches URL-Template ({number} wird ersetzt) für ein öffentliches Verzeichnis muss je nach Anbieter angepasst werden (PublicDirectoryLookupProvider.ExtractDisplayName).

Sicherheit

Public Repo niemals Zugangsdaten, Tokens, Client-Secrets oder SIP-Passwörter committen. Konfiguration ausschließlich über appsettings.Local.json (gitignored) oder Umgebungsvariablen.

Lizenz

TBD