Name shortcut zu mailadler
This commit is contained in:
579
TELEMETRIE_FEHLERBERICHTERSTATTUNG.md
Normal file
579
TELEMETRIE_FEHLERBERICHTERSTATTUNG.md
Normal file
@@ -0,0 +1,579 @@
|
||||
# Telemetrie & Fehlerberichterstattung System
|
||||
|
||||
## Übersicht
|
||||
Mail-Adler wird ein optionales Fehlerberichterstattungs- und Telemetrie-System mit vollständiger Benutzerkontrolle implementieren.
|
||||
|
||||
## 1. Datenschutz & Benutzer-Einwilligung
|
||||
|
||||
### Installation & Onboarding
|
||||
Bei der **ersten Anwendung** wird der Benutzer gefragt:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Mail-Adler Willkommen │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ Fehlerberichterstattung helfen, Mail-Adler │
|
||||
│ zu verbessern. Ihre Privatsphäre ist │
|
||||
│ wichtig: Keine persönlichen Daten werden │
|
||||
│ ohne Ihre Zustimmung übertragen. │
|
||||
│ │
|
||||
│ ☐ Automatische Fehlerberichterstattung │
|
||||
│ (Betriebssystem, Fehlertyp, Stack-Trace) │
|
||||
│ │
|
||||
│ ☐ Anonyme Nutzungsstatistiken │
|
||||
│ (Feature-Nutzung, Sync-Erfolgsrate) │
|
||||
│ │
|
||||
│ [Ja, Standard aktiviert] [Nein, später] │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Standardverhalten:** Aktiviert (Benutzer wird informiert)
|
||||
|
||||
**Speicherort:** `~/.config/mail-adler/telemetry_consent.json`
|
||||
```json
|
||||
{
|
||||
"version": 1,
|
||||
"timestamp": "2025-02-03T12:00:00Z",
|
||||
"error_reporting": true,
|
||||
"usage_statistics": false,
|
||||
"last_asked": "2025-02-03T12:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### Wiederholung
|
||||
Alle 90 Tage wird der Benutzer erneut gefragt, ob die Einwilligung noch aktuell ist.
|
||||
|
||||
---
|
||||
|
||||
## 2. Fehlerberichterstattungs-Architektur
|
||||
|
||||
### 2.1 Fehlererfassung
|
||||
|
||||
#### Automatische Erfassung
|
||||
```cpp
|
||||
// src/telemetry/ErrorReporter.h/cpp
|
||||
class ErrorReporter {
|
||||
public:
|
||||
static void reportError(
|
||||
const QString &errorType, // z.B. "ImapConnectionFailed"
|
||||
const QString &message, // Fehlermeldung
|
||||
const QString &stackTrace, // Stack-Trace
|
||||
const QMap<QString, QString> &context // Zusätzlicher Kontext
|
||||
);
|
||||
|
||||
static void reportException(const std::exception &e);
|
||||
static void reportWarning(const QString &warning);
|
||||
};
|
||||
```
|
||||
|
||||
#### Fehlertypen
|
||||
| Fehler-ID | Beschreibung | Beispiel |
|
||||
|-----------|-------------|---------|
|
||||
| `IMAP_CONNECTION_FAILED` | IMAP-Verbindungsfehler | Timeout, SSL-Fehler |
|
||||
| `SMTP_SEND_FAILED` | SMTP-Versandfehler | Auth-Fehler, Relay-Fehler |
|
||||
| `DATABASE_ERROR` | SQLite-Fehler | Schema-Migration, Locking |
|
||||
| `SYNC_FAILED` | Sync-Fehler | Netzwerkfehler, Konflikt |
|
||||
| `CRASH` | Anwendungs-Crash | Segfault, Assertion |
|
||||
| `UI_ERROR` | UI-Rendering-Fehler | Widget-Initialisierung |
|
||||
|
||||
### 2.2 Fehler-Kontext
|
||||
|
||||
Jeder Fehler enthält:
|
||||
|
||||
```json
|
||||
{
|
||||
"error_id": "unique-uuid-v4",
|
||||
"error_type": "IMAP_CONNECTION_FAILED",
|
||||
"message": "Connection timeout after 30s",
|
||||
"timestamp": "2025-02-03T12:34:56.789Z",
|
||||
"severity": "ERROR",
|
||||
|
||||
"system": {
|
||||
"os": "Windows 11 (Build 22621)",
|
||||
"os_version": "11.0.22621",
|
||||
"architecture": "x86_64",
|
||||
"cpu_cores": 8,
|
||||
"memory_mb": 16384,
|
||||
"qt_version": "6.4.2"
|
||||
},
|
||||
|
||||
"application": {
|
||||
"version": "0.1.0-beta",
|
||||
"build_hash": "abc1234567",
|
||||
"uptime_seconds": 3600,
|
||||
"session_duration_seconds": 1800
|
||||
},
|
||||
|
||||
"account_info": {
|
||||
"account_id": "hash(account-uuid)", // Anonymisiert
|
||||
"provider": "gmail", // "gmail", "gmx", "web.de", "telekom", etc.
|
||||
"last_sync_minutes_ago": 15
|
||||
},
|
||||
|
||||
"stack_trace": "...",
|
||||
"additional_context": {
|
||||
"operation": "ImapSync.incrementalFetch",
|
||||
"retry_count": 2,
|
||||
"network_available": true
|
||||
},
|
||||
|
||||
"hash": "sha256(message+stacktrace)" // Zur Deduplizierung
|
||||
}
|
||||
```
|
||||
|
||||
### 2.3 Fehler-Deduplizierung
|
||||
|
||||
Wenn derselbe Fehler erneut auftritt:
|
||||
|
||||
```cpp
|
||||
// Fehler wird NICHT erneut gesendet, sondern lokal gezählt
|
||||
// Nach dem 1. Bericht: Zähler++ (lokal gespeichert)
|
||||
// Nach 10 Vorkommen: Bericht mit occurrence_count: 10
|
||||
|
||||
// Speicherung in: ~/.config/mail-adler/error_cache.json
|
||||
{
|
||||
"sha256_hash_of_error": {
|
||||
"first_occurrence": "2025-02-03T12:00:00Z",
|
||||
"occurrence_count": 5,
|
||||
"last_reported": "2025-02-03T13:00:00Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2.4 Fehler-Upload
|
||||
|
||||
**Trigger-Punkte:**
|
||||
1. Unmittelbar nach kritischem Fehler (mit User-Bestätigung)
|
||||
2. Täglich um 8:00 Uhr (gesammelt)
|
||||
3. Beim Beenden der Anwendung
|
||||
4. Nach WiFi/Netzwerk-Wiederherstellung
|
||||
|
||||
**Upload-Ziel:**
|
||||
```
|
||||
POST https://mail-adler-telemetry.example.com/api/v1/errors
|
||||
Authorization: Bearer <api-key>
|
||||
Content-Type: application/json
|
||||
|
||||
[
|
||||
{ error_json_1 },
|
||||
{ error_json_2 },
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
**Fehlerbehandlung beim Upload:**
|
||||
- Lokal gecacht, wenn Netzwerk nicht verfügbar
|
||||
- Max. 1000 Fehler gecacht (älteste werden verworfen)
|
||||
- Keine Blockierung der UI während Upload
|
||||
|
||||
---
|
||||
|
||||
## 3. Nutzungsstatistiken
|
||||
|
||||
### 3.1 Sammlung (nur wenn aktiviert)
|
||||
|
||||
```json
|
||||
{
|
||||
"session_id": "uuid-v4",
|
||||
"timestamp": "2025-02-03T12:00:00Z",
|
||||
"application": {
|
||||
"version": "0.1.0-beta"
|
||||
},
|
||||
|
||||
"usage": {
|
||||
"feature_usage": {
|
||||
"imap_sync_count": 5,
|
||||
"smtp_send_count": 2,
|
||||
"read_messages_count": 50,
|
||||
"compose_messages_count": 3
|
||||
},
|
||||
|
||||
"sync_statistics": {
|
||||
"successful_syncs": 98,
|
||||
"failed_syncs": 2,
|
||||
"average_sync_duration_seconds": 12.5,
|
||||
"total_messages_synced": 1250
|
||||
},
|
||||
|
||||
"ui_interactions": {
|
||||
"features_used": ["MailList", "MailView", "Compose"],
|
||||
"session_duration_seconds": 3600
|
||||
}
|
||||
},
|
||||
|
||||
"system": {
|
||||
"os": "Windows 11",
|
||||
"architecture": "x86_64"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Upload:** Täglich um 8:00 Uhr (zusammen mit Fehlern)
|
||||
|
||||
---
|
||||
|
||||
## 4. Expert-Modus
|
||||
|
||||
### 4.1 Aktivierung
|
||||
|
||||
**Menü:** `Einstellungen → Expertenoptionen → Expert-Modus aktivieren`
|
||||
|
||||
```cpp
|
||||
// src/telemetry/ExpertMode.h/cpp
|
||||
class ExpertMode {
|
||||
public:
|
||||
bool isEnabled() const;
|
||||
void setEnabled(bool enabled);
|
||||
|
||||
// Zeige Telemetrie-Daten an
|
||||
void showSentErrorReports(); // Fehler, die zu uns gesendet wurden
|
||||
void showReceivedUpdates(); // Updates, die von uns kamen
|
||||
void showTelemetryLog(); // Vollständiges Telemetrie-Log
|
||||
};
|
||||
```
|
||||
|
||||
### 4.2 Expert-Modus UI
|
||||
|
||||
#### Fenster: "Telemetrie-Inspektor"
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────┐
|
||||
│ Telemetrie-Inspektor [X] │
|
||||
├──────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 📤 Zu uns gesendete Fehler │
|
||||
│ ├─ 2025-02-03 12:34 | IMAP_CONNECTION_FAILED │
|
||||
│ ├─ 2025-02-03 11:20 | SYNC_FAILED (5x) │
|
||||
│ └─ 2025-02-02 15:45 | SMTP_SEND_FAILED │
|
||||
│ │
|
||||
│ 📥 Von uns empfangene Meldungen │
|
||||
│ ├─ 2025-02-03 08:00 | Spam-Liste aktualisiert │
|
||||
│ ├─ 2025-02-02 08:00 | Feature-Ankündigung │
|
||||
│ └─ 2025-02-01 10:30 | Sicherheitsupdate │
|
||||
│ │
|
||||
│ [Details ansehen] [Export als JSON] │
|
||||
└──────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### Details-Ansicht (Fehler)
|
||||
```json
|
||||
{
|
||||
"error_id": "uuid-1234",
|
||||
"type": "IMAP_CONNECTION_FAILED",
|
||||
"timestamp": "2025-02-03T12:34:56Z",
|
||||
"status": "SENT",
|
||||
"sent_at": "2025-02-03T13:00:00Z",
|
||||
"message": "Connection timeout after 30s",
|
||||
"stack_trace": "..."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Fehlerbehandlung mit Benutzer-Dialog
|
||||
|
||||
### 5.1 Kritischer Fehler
|
||||
|
||||
Wenn ein kritischer Fehler auftritt:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Ein Fehler ist aufgetreten │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ Ein unerwarteter Fehler hat die Anwendung │
|
||||
│ beeinträchtigt. Helfen Sie, Mail-Adler zu │
|
||||
│ verbessern, indem Sie diesen Fehler │
|
||||
│ berichten. │
|
||||
│ │
|
||||
│ Fehlernummer: ERR-20250203-001 │
|
||||
│ │
|
||||
│ Was haben Sie zuvor getan? │
|
||||
│ [______________________________] │
|
||||
│ │
|
||||
│ ☑ Fehler automatisch berichten │
|
||||
│ │
|
||||
│ [Bericht senden] [Verwerfen] │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 5.2 Fehler-Tracking
|
||||
|
||||
Nach Fehler wird gespeichert:
|
||||
```json
|
||||
{
|
||||
"error_number": "ERR-20250203-001",
|
||||
"type": "IMAP_CONNECTION_FAILED",
|
||||
"timestamp": "2025-02-03T12:34:56Z",
|
||||
"user_description": "Ich habe auf 'Synchronisieren' geklickt",
|
||||
"was_reported": true,
|
||||
"reported_at": "2025-02-03T12:35:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
Wenn **derselbe Fehler erneut auftritt**:
|
||||
- Lokale Fehler-ID erhöhen (ERR-20250203-002)
|
||||
- Benutzer wird erneut gefragt
|
||||
- Bericht mit Details über vorherige Fehlerberichte senden
|
||||
|
||||
---
|
||||
|
||||
## 6. Spam-Liste Service
|
||||
|
||||
### 6.1 Zentrale Spam-Datenbank
|
||||
|
||||
Täglich um 9:00 Uhr:
|
||||
- Alle Benutzer melden lokale Spam-Markierungen
|
||||
- Zentrale Datenbank aggregiert und dedupliziert
|
||||
- Um 10:00 Uhr: Clients fragen aktualisierte Spam-Liste ab
|
||||
|
||||
### 6.2 Spam-Liste Schema
|
||||
|
||||
```json
|
||||
{
|
||||
"timestamp": "2025-02-03T09:00:00Z",
|
||||
"version": "20250203-0900",
|
||||
"entries": [
|
||||
{
|
||||
"email_hash": "sha256(spam@example.com)",
|
||||
"type": "PHISHING",
|
||||
"severity": 1.0,
|
||||
"reported_count": 157,
|
||||
"last_seen": "2025-02-03T08:45:00Z"
|
||||
},
|
||||
{
|
||||
"email_hash": "sha256(spam2@example.com)",
|
||||
"type": "BULK",
|
||||
"severity": 0.7,
|
||||
"reported_count": 43,
|
||||
"last_seen": "2025-02-03T07:30:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 6.3 Spam-Klassifikation
|
||||
|
||||
| Typ | Beschreibung | Aktion |
|
||||
|-----|-------------|--------|
|
||||
| `PHISHING` | Phishing/Social Engineering | Block alle |
|
||||
| `MALWARE` | Malware-Quellen | Block alle |
|
||||
| `SPAM_BULK` | Massenmails | Block für alle |
|
||||
| `BLOCKED_BY_USER` | Einzelne Personen blockiert | Nur eigene Blockierung |
|
||||
|
||||
---
|
||||
|
||||
## 7. Tägliche Fehler-Zusammenfassung
|
||||
|
||||
### 7.1 Fehler-Zusammenfassung Email
|
||||
|
||||
**Täglich um 9:00 Uhr** sendet zentraler Service eine Email an `georg.dahmen@proton.me`:
|
||||
|
||||
```
|
||||
Betreff: Mail-Adler Fehler-Zusammenfassung - 2025-02-03
|
||||
|
||||
─────────────────────────────────────────────────────
|
||||
|
||||
Gestrige Fehler (2025-02-02):
|
||||
|
||||
Kritische Fehler (2):
|
||||
• IMAP_CONNECTION_FAILED (5 Benutzer, 12 Vorkommen)
|
||||
→ Mögliche Ursache: TLS-Upgrade auf Gmail-Konten
|
||||
→ Link: https://mail-adler-telemetry.example.com/errors/IMAP_CONNECTION_FAILED
|
||||
|
||||
• DATABASE_ERROR (1 Benutzer, 3 Vorkommen)
|
||||
→ Mögliche Ursache: Schema-Migration fehlgeschlagen
|
||||
→ Link: https://mail-adler-telemetry.example.com/errors/DATABASE_ERROR
|
||||
|
||||
Warnungen (8):
|
||||
• SYNC_FAILED (18 Benutzer)
|
||||
• UI_ERROR (4 Benutzer)
|
||||
...
|
||||
|
||||
Spam-Report:
|
||||
• 242 neue Spam-Quellen gemeldet
|
||||
• Top 5: phishing@attacker1.com, spam@bulkmail2.ru, ...
|
||||
|
||||
Nutzungsstatistiken:
|
||||
• Aktive Benutzer: 1,250
|
||||
• Durchschn. Sync-Erfolgsrate: 98.3%
|
||||
• Durchschn. Session-Dauer: 35 Minuten
|
||||
|
||||
─────────────────────────────────────────────────────
|
||||
Vollständiger Bericht: https://mail-adler-telemetry.example.com/reports/2025-02-02
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Client-Update Mechanismus
|
||||
|
||||
### 8.1 Update-Check
|
||||
|
||||
**Täglich um 8:00 Uhr** fragt Client ab:
|
||||
```
|
||||
GET /api/v1/updates?version=0.1.0-beta&os=windows&arch=x86_64
|
||||
```
|
||||
|
||||
**Antwort:**
|
||||
```json
|
||||
{
|
||||
"current_version": "0.1.0-beta",
|
||||
"latest_version": "0.2.0",
|
||||
"update_available": true,
|
||||
"critical": false,
|
||||
"download_url": "https://...",
|
||||
"release_notes": "...",
|
||||
"checksum": "sha256=..."
|
||||
}
|
||||
```
|
||||
|
||||
### 8.2 Update-Dialog
|
||||
|
||||
Wenn Update verfügbar:
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Update verfügbar: Mail-Adler 0.2.0 │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ Neue Features: │
|
||||
│ • Multi-Account Unterstützung │
|
||||
│ • Verbesserte Verschlüsselung │
|
||||
│ • 5 Bugfixes │
|
||||
│ │
|
||||
│ Größe: 45 MB │
|
||||
│ │
|
||||
│ [Jetzt aktualisieren] [Später] │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Datenspeicherung (Server-Seite)
|
||||
|
||||
### 9.1 Fehler-Datenbank
|
||||
|
||||
```sql
|
||||
CREATE TABLE telemetry_errors (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
error_id TEXT UNIQUE NOT NULL,
|
||||
error_type TEXT NOT NULL,
|
||||
message TEXT,
|
||||
severity TEXT,
|
||||
|
||||
system_os TEXT,
|
||||
system_arch TEXT,
|
||||
app_version TEXT,
|
||||
|
||||
account_provider TEXT, -- "gmail", "gmx", "web.de", etc.
|
||||
|
||||
stack_trace TEXT,
|
||||
hash TEXT UNIQUE, -- Für Deduplizierung
|
||||
|
||||
timestamp DATETIME,
|
||||
occurrence_count INTEGER DEFAULT 1,
|
||||
|
||||
INDEX idx_error_type (error_type),
|
||||
INDEX idx_timestamp (timestamp),
|
||||
INDEX idx_hash (hash)
|
||||
);
|
||||
```
|
||||
|
||||
### 9.2 Aufbewahrungsrichtlinie
|
||||
|
||||
- **Detaillierte Fehler:** 90 Tage
|
||||
- **Aggregierte Statistiken:** 1 Jahr
|
||||
- **Spam-Liste:** Permanent (mit Deduplizierung)
|
||||
|
||||
---
|
||||
|
||||
## 10. Sicherheit & Datenschutz
|
||||
|
||||
### 10.1 Verschlüsselung
|
||||
|
||||
- Alle Übertragungen: **HTTPS/TLS 1.3**
|
||||
- Passwörter/Tokens: **Keine** im Telemetrie-Daten
|
||||
- Stack-Traces: Redaktioniert, um Dateipfade zu verbergen
|
||||
|
||||
### 10.2 Anonymisierung
|
||||
|
||||
- Account-ID: **gehashed** (SHA256)
|
||||
- Benutzernamen: **nicht erfasst**
|
||||
- IP-Adressen: **nicht gespeichert**
|
||||
- Email-Adressen: Nur gehashed (für Spam-Liste)
|
||||
|
||||
### 10.3 Benutzerkontrolle
|
||||
|
||||
```cpp
|
||||
// src/telemetry/TelemetrySettings.h
|
||||
class TelemetrySettings {
|
||||
public:
|
||||
bool errorReportingEnabled() const;
|
||||
void setErrorReportingEnabled(bool enabled);
|
||||
|
||||
bool usageStatisticsEnabled() const;
|
||||
void setUsageStatisticsEnabled(bool enabled);
|
||||
|
||||
// Daten exportieren
|
||||
void exportAllTelemetryData(const QString &filePath);
|
||||
|
||||
// Daten löschen
|
||||
void deleteAllLocalTelemetryData();
|
||||
void deleteOldTelemetryData(int daysOld);
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. Implementierungs-Roadmap
|
||||
|
||||
### Phase 1: Fehlerberichterstattungs-Kern
|
||||
- [ ] ErrorReporter Klasse
|
||||
- [ ] Error-JSON Schema
|
||||
- [ ] Fehler-Deduplication
|
||||
- [ ] Lokale Caching-Logik
|
||||
|
||||
### Phase 2: Server-Infrastruktur
|
||||
- [ ] Telemetry-API Server aufsetzen
|
||||
- [ ] Fehler-Datenbank
|
||||
- [ ] Spam-Liste Service
|
||||
- [ ] Update-Check Endpoint
|
||||
|
||||
### Phase 3: Client-Integration
|
||||
- [ ] Fehler-Dialog UI
|
||||
- [ ] Expert-Modus
|
||||
- [ ] Onboarding-Consent Dialog
|
||||
- [ ] Tägliche Synchronisierung
|
||||
|
||||
### Phase 4: Monitoring & Analyse
|
||||
- [ ] Dashboard für Entwickler
|
||||
- [ ] Fehler-Trends Analyse
|
||||
- [ ] Spam-Statistiken
|
||||
- [ ] Tägliche Summary-Emails
|
||||
|
||||
---
|
||||
|
||||
## 12. Kontakt & Support
|
||||
|
||||
**Fehlerberichterstattung:** georg.dahmen@proton.me
|
||||
**Sicherheitsbedenken:** security@mail-adler.dev
|
||||
**Datenschutz:** privacy@mail-adler.dev
|
||||
|
||||
---
|
||||
|
||||
## 13. FAQ
|
||||
|
||||
**F: Werden meine Passwörter übertragen?**
|
||||
A: Nein. Passwörter und API-Tokens werden niemals in Fehlerberichten erfasst.
|
||||
|
||||
**F: Kann ich Telemetrie deaktivieren?**
|
||||
A: Ja. Einstellungen → Datenschutz → Telemetrie-Optionen.
|
||||
|
||||
**F: Wie lange werden Fehler gespeichert?**
|
||||
A: 90 Tage detaillierte Fehler, dann aggregierte Statistiken für 1 Jahr.
|
||||
|
||||
**F: Sind meine Daten exportierbar?**
|
||||
A: Ja. Einstellungen → Datenschutz → "Alle Telemetrie-Daten exportieren".
|
||||
|
||||
**F: Kann ich einen Fehler manuell löschen?**
|
||||
A: Ja. Expert-Modus → Telemetrie-Inspektor → Fehler auswählen → Löschen.
|
||||
Reference in New Issue
Block a user