diff --git a/Web/push_notifications.py b/Web/push_notifications.py index 58b9fcf..5c50f9c 100644 --- a/Web/push_notifications.py +++ b/Web/push_notifications.py @@ -122,29 +122,33 @@ def get_user_subscriptions(username): def save_push_subscription(username, subscription_obj): - """Save a new push subscription for a user with field-level encryption.""" + import traceback # Hilft uns, Fehler genau zu sehen try: + print("--- DEBUG PUSH PAYLOAD ---") + print(subscription_obj) + endpoint = subscription_obj.get('endpoint') keys = subscription_obj.get('keys', {}) if not endpoint or not keys.get('p256dh') or not keys.get('auth'): - logger.warning(f'Invalid subscription object for {username}: missing endpoint or keys') + print( + f"DEBUG FEHLER: Keys fehlen! Endpoint: {bool(endpoint)}, p256dh: {bool(keys.get('p256dh'))}, auth: {bool(keys.get('auth'))}") return False client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT) db = client[cfg.MONGODB_DB] subs_col = get_push_subscriptions_collection(db) - + # Create unique hash of subscription using plaintext data to avoid duplicates sub_hash = hashlib.shake_256( f"{username}:{endpoint}".encode('utf-8') ).hexdigest() - + # Check if subscription already exists by Hash existing = subs_col.find_one({ 'SubscriptionHash': sub_hash }) - + if existing: subs_col.update_one( {'_id': existing['_id']}, @@ -156,10 +160,10 @@ def save_push_subscription(username, subscription_obj): logger.info('Updated existing push subscription') client.close() return True - + # Format keys as JSON string for your encrypt_text module keys_str = json.dumps(subscription_obj.get('keys', {})) - + # Save new subscription, encrypting sensitive fields subscription_doc = { 'UsernameHash': _get_username_hash(username), @@ -172,14 +176,16 @@ def save_push_subscription(username, subscription_obj): 'LastUsed': datetime.datetime.now(), 'UserAgent': subscription_obj.get('userAgent', ''), } - + subs_col.insert_one(subscription_doc) logger.info('Saved new encrypted push subscription') client.close() return True - + + except Exception as e: - logger.error(f'Error saving push subscription: {e}') + print(f"DEBUG ABSTURZ in save_push_subscription: {e}") + traceback.print_exc() return False diff --git a/Web/static/js/push-notifications.js b/Web/static/js/push-notifications.js index 626b17c..2e5e6e5 100644 --- a/Web/static/js/push-notifications.js +++ b/Web/static/js/push-notifications.js @@ -161,15 +161,19 @@ class PushNotificationManager { try { const subscription = await this.serviceWorkerRegistration.pushManager.getSubscription(); if (!subscription) { - console.warn('No active push subscription'); - return true; // Bereits deaktiviert + return true; } - // Best-Effort: Dem Server Bescheid geben (wir ignorieren absichtlich, - // falls der Server das Abo nicht mehr kennt) - await this.removeSubscriptionFromServer(subscription); + // Best-Effort: Server benachrichtigen (Eigener try/catch Block!) + try { + await this.removeSubscriptionFromServer(subscription); + } catch (serverError) { + // Fehler vom Server ignorieren wir absichtlich. + // Das Skript läuft weiter, statt hier abzubrechen! + console.warn('Server-Abmeldung fehlgeschlagen, lösche lokal trotzdem:', serverError); + } - // WICHTIG: Das Abo im Browser immer zwingend löschen! + // WICHTIG: Das hier wird jetzt garantiert ausgeführt await subscription.unsubscribe(); return true;