Möglicher Fehler: Keine Berechtigungsabfrage in UserNotificationHandler::fireEvent()

  • Affected Version
    WoltLab Suite 5.5
    Affected App
    WoltLab Suite Core

    Ich bin mir nicht sicher, ob das gewolltes Verhalten ist oder ein Fehler:

    Wenn ich eine Notification feuer, dann wird die Notification an alle Nutzer versendet, die das eingestellt haben, unabhängig davon, ob sie die Berechtigung haben oder nicht.


    Aufgefallen ist mir das, weil ich eine Benachrichtigung an eine Berechtigung geknüpft habe, die nur in einer bestimmten Benutzergruppe gesetzt ist. Wenn der Nutzer einmal zu dieser Gruppe gehört hat, die Benachrichtigung aktiviert hat, dann aber die Gruppe wieder verlässt, bekommt er weiterhin dazu Benachrichtigungen. Da er die Berechtigung für diese Benachrichtigung nicht mehr hat, kann sie selber auch nicht mehr abbestellen.


    Für mich klingt das wie ein Fehler, aber vielleicht übersehe ich etwas? Ich habe leider keine Möglichkeit gefunden, die Empfänger von Benachrichtigungen vorher per Event zu bearbeiten.

    • Official Post

    Hallo,


    du musst bei der Anzeige der Benachrichtigung zur Laufzeit prüfen, ob die Benachrichtigung noch zugänglich ist. Dazu gibt es die Methode AbstractUserNotificationEvent::checkAccess(), die als Rückgabe ein true (zugänglich) bzw. false (nicht [mehr] zugänglich) liefert.

  • Ah super, dankeschön. Ich hatte übersehen, dass processNotifications auch beim eMail-Versand getriggert wird :):thumbup:

    Ich hab das jetzt so gelöst, dass ich in meinen checkAccess vorher die Permissions validiere

    Code
    if (!$this->validatePermissions()) return false;

    Gibt es einen Grund warum das nicht pauschal gemacht wird? Welchen Use-Case gibt es, wo die Berechtigungen nicht überprüft werden sollten?

  • Update: Gerade nochmal ein bisschen ausführlicher getestet. CheckAccess() tut was es soll, allerdings zu spät. Die Notification geht trotzdem raus, zwar nicht per eMail, der Nutzer sieht aber an der Glocke, dass er eine neue Benachrichtigung hat. Erst wenn er auf die Glocke klickt verschwindet die Badge, die notification wird gelöscht und er bekommt keine angezeigt.


    Wäre es nicht möglich, das vor dem feuern zu überprüfen, sodass erst gar nichts in der Datenbank erstellt wird?

    • Official Post

    Ich fürchte, hier liegt ein Missverständnis vor. Du bist dafür zuständig, vor dem Erzeugen der Benachrichtigung die gültigen Empfänger zu ermitteln. checkAccess() ist dafür da, bei bereits erzeugten Benachrichtigungen zu prüfen, ob diese weiterhin angezeigt werden dürfen.

  • Verstehe, dann ist das ein spezielles Problem. Ich kann das leider nicht äändern. Das ganze läuft über UserObjectWatchHandler::getInstance()->updateObject() was sich ja die Empfänger selber raussucht. Ich würde ungern alle Object-Watches entfernen (müssen), wenn ein Nutzer eine Gruppe verlässt, da er sie zu einem späteren Zeitpunkt wieder betreten könnte und dann alles wieder neu anlegen muss.

    • Official Post

    In dem Fall hast du alles richtig gemacht, einen anderen Weg gibt es nicht. Genauso arbeiten wir beim Forum auch, weil es die einzige Variante ist, die sowohl zuverlässig und als auch performant/skalierbar ist.

  • Ok verstanden. Ja vermutlich ist bei einer hohen Anzahl an notifications der session wechsel nicht performant zu lösen. Alles klar, danke für die Erklärung :saint:

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!