Deaktivieren der Anforderung für Aktivierungs-E-Mails für eingeladene Benutzer

Hallo zusammen, ich habe einen Anwendungsfall, der derzeit nicht gut unterstützt wird: Ich muss die Aktivierungs-E-Mail für eingeladene Benutzer deaktivieren – einschließlich Benutzer, die über einen Link eingeladen wurden.

Nachdem ich das oben genannte Thema erstellt habe, wurde dies implementiert, aber nur für Benutzer, die per E-Mail eingeladen wurden.

Meine Discourse-Instanz ist nur per Einladung nutzbar, und ich versende Einladungslinks zwar per E-Mail, aber nicht über die integrierten Discourse-E-Mails. Ich generiere die Einladungslinks mit einer POST-Anfrage an /invites/link, speichere sie in einer externen Datenbank und sende die Links von dort aus an den Benutzer. Wenn Benutzer also auf den Link klicken, haben sie ihre E-Mail bereits verifiziert, werden aber dennoch erneut dazu aufgefordert.

Mir ist bewusst, dass mein Anwendungsfall nicht besonders verbreitet ist, daher dachte ich, ich versuche es mit einem einfachen Plugin, um die erforderlichen Teile von Discourse so anzupassen, dass es wie gewünscht funktioniert.

Ich habe ein Grundgerüst erstellt und eine Site-Einstellung (no_activation_enabled) hinzugefügt. Nach der Suche im Core-Repository vermute ich, dass dies die Datei ist, die bearbeitet werden muss:

Ich bin mir nicht ganz sicher, aber ich denke, wenn man bedingt (falls SiteSetting.no_activation_enabled und falls der Benutzer von einem Mitarbeiter eingeladen wurde, vielleicht invite.invited_by.staff?) active in user.attributes auf true setzt, könnte das funktionieren:

    user.attributes = {
      email: invite.email,
      username: available_username,
      name: name || available_username,
      active: false,
      trust_level: SiteSetting.default_invitee_trust_level,
      ip_address: ip_address,
      registration_ip_address: ip_address
    }

Aber wie gehe ich vor, um dies aus einem Plugin heraus zu ändern? Ist das überhaupt im Rahmen dessen, was Plugins leisten können? Können sie nur Dinge hinzufügen, aber nicht ändern? Oder muss ich die gesamte Datei invite_redeemer.rb ersetzen?

Ich habe die Einführung zum Erstellen von Plugins sowie diesen Leitfaden abgeschlossen, aber nach stundenlangem Suchen im Codebase, einschließlich anderer Plugins, habe ich das Gefühl, gegen eine Wand zu laufen… Wenn also jemand Tipps für mich hat, wäre ich超 dankbar!

Wenn du dies von einer externen Seite aus bearbeitest, warum lässt du dann nicht SSO übernehmen und gibst die Verifizierung einfach im Payload weiter?

Hallo Stephen, danke für deinen Input.

Ich verwalte keine Benutzerkonten auf einer externen Website. Ich habe ein Master-Airtable-Setup mit Zapier und GCFs, das mehrere Dienste (wie ESPs usw.) verbindet, aber Discourse ist die Hauptdatenbank für Benutzer. Ich möchte einfach nicht das reguläre Discourse-Anmeldeformular verwenden, da es nicht konversionsfreundlich ist und nicht z. B. in Blogbeiträge integriert werden kann. Eher ist Discourse der SSO-Anbieter für die Jekyll-basierte Content-Website, da es Fetch-Anfragen sendet, um zu prüfen, ob ein Benutzer bei Discourse eingeloggt ist, und die Content-Seiten entsprechend anpasst.

Hey, willkommen :slight_smile:

Wie @Stephen bin ich mir nicht ganz sicher, ob dies das richtige Werkzeug ist, aber ich vertraue darauf, dass du es ausreichend durchdacht hast.

Das würde ich unter allen Umständen vermeiden. Es gibt fast immer eine andere Lösung, selbst wenn du eine Klasse per Monkey Patching anpassen musst. Zu Monkey Patching in Discourse siehe: Override existing Discourse methods in plugins.

In diesem Fall scheint es, als gäbe es bereits Code in der Methode, auf die du dich konzentrierst, der das tut, was du möchtest: discourse/app/models/invite_redeemer.rb at main · discourse/discourse · GitHub

Das Problem ist, dass die von dir generierten Einladungen nicht den richtigen emailed_status_type haben, sodass diese Bedingung nicht erfüllt wird. Ich denke, die Lösung besteht darin, von vornherein andere Einladungen zu generieren. Darauf würde ich mich konzentrieren.

Im Wesentlichen wird hier eine Funktion wieder eingeführt, die aus dem Kern entfernt wurde, weil sie zu gefährlich war – falls du diese Einladungs-Token falsch verwaltest, könnte sich jeder, der sie stiehlt (bevor der beabsichtigte Empfänger sie nutzt), als dieser im Forum anmelden. Ich rate dringend davon ab, diese Art von Einladung für Moderator- oder Admin-Konten zu verwenden.

Deshalb ist der Code dafür bereits vorhanden, aber du musst ein wenig basteln, um ihn tatsächlich zu erreichen.