Konflikt mit Quantcast RGPD-Lösung "choice" und ember.js

Hallo,
dies ist zwar ein recht spezifischer Fehler, aber seine Auswirkungen könnten weit über diesen Einzelfall hinausgehen, daher habe ich dazu eine Frage.

(Auch möchte ich mich für mein Englisch entschuldigen; ich bin Franzose und kein Muttersprachler…)

Aber zunächst möchte ich den Kontext erklären.
Ich verwende Discourse schon seit einiger Zeit für ein französisches Forum über den Raspberry Pi (forum.raspberry-pi.fr). Dieses Forum nutzt ein Werbeanzeigen-Management (Themoneytizer). Wie Sie wahrscheinlich wissen, verpflichtet uns Europa zur Umsetzung der DSGVO zum Schutz der Privatsphäre der Nutzer. Der wichtigste Akteur (zumindest in Frankreich) für die DSGVO-Einwilligung ist Quantcast mit ihrer „Choice“-Lösung.

Ich habe die Quantcast-Lösung also schon eine ganze Weile ohne Probleme genutzt, bis ich kürzlich feststellte, dass die Schaltfläche „Alle akzeptieren“ nicht mehr richtig funktioniert. Beim Klicken passiert nichts, und in der Entwicklerkonsole erhalte ich folgenden Fehler: „Uncaught TypeError: can’t define property ‘status’: Function is not extensible“.

Was passiert (zumindest nach meinem besten Verständnis):
Glauben Sie mir, wenn ich sage, dass es mir eine unendlich lange Zeit gekostet hat, die Ursache des Problems zu finden. Offensichtlich erweitert Ember.js (mit dem ich mich sehr wenig auskenne) einige native JavaScript-Objekte wie Array, String und Function. Und aus irgendeinem Grund scheint es diese Objekte auch auf eine Weise zu verhindern, dass sie erweitert werden können (diesen Teil habe ich noch nicht vollständig verstanden).

Die Quantcast-Lösung versucht ihrerseits, wahrscheinlich in der Funktion FunctionAcceptAll (was erklärt, warum der Fehler nur beim Klicken auf die Schaltflächen „Alle akzeptieren“ und „Alle ablehnen“ auftritt), ein Objekt zu erweitern, vermutlich ein Array, dessen normales Verhalten durch Ember.js geändert wurde.

Nach vielen Recherchen zum Verständnis dieses Fehlers habe ich auch festgestellt, dass es möglich ist, das Verhalten von Ember.js so zu ändern, dass es keine JavaScript-Prototypen erweitert, wie auf dieser Seite erklärt: https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/.

Ich habe einige Tests durchgeführt, und der Fehler verschwindet, wenn ich die Zeile window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; in die Datei _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js nach der Zeile window.EmberENV.FORCE_JQUERY = true; hinzufüge.

Für diejenigen unter Ihnen, die es ausprobieren möchten, können Sie sich die Seite /tst/index.html auf dem Forum ansehen (möglicherweise benötigen Sie eine europäische IP-Adresse, damit das Skript startet; ich habe keine Ahnung).
Jetzt denke ich, dass Sie alle Informationen haben, die ich Ihnen geben kann.

Also, hier ist meine Frage.
Obwohl dies ein recht spezifischer Fehler ist, ist die DSGVO in Europa immer präsenter, und es wird nicht einfacher werden.
Quantcast befindet sich in einer ziemlich monopolistischen Position, zumindest für Akteure, die sich nicht leisten können, hunderte von Dollar für die Umsetzung der DSGVO auszugeben. Dieser Fehler verhindert jede Nutzung von Quantcast und damit von Werbung auf Discourse in Europa, was für mich ein großes Problem zu sein scheint.
Auch wenn ich den Fehler nur mit Quantcast gefunden habe, kann eine solche Art von Fehler tatsächlich bei vielen Drittanbieter-Skripten auftreten, die wir für Werbung oder andere Zwecke einbetten müssen, über die wir keinerlei Kontrolle haben und die sich auf das „normale“ Verhalten von JavaScript-Objekten wie Array, String und Function verlassen.

Ich kenne den Discourse-Code nicht gut genug, daher frage ich Sie: Werden die von Ember.js hinzugefügten Eigenschaften für Array-, String- und Function-Objekte (siehe den vorherigen Link) von Discourse verwendet oder nicht? Wenn nicht, sollten wir vielleicht erwägen, die Prototyp-Erweiterungen von Ember.js zu deaktivieren, um solche Nebeneffekte zu verhindern?

Ich hoffe, jemand kann mir dazu Informationen geben,
vielen Dank

Dies wird derzeit nicht unterstützt; wir verlassen uns auf die Erweiterungen. Vielleicht ist das in einer zukünftigen Version nicht mehr der Fall. @eviltrout kann mehr Kontext liefern.

Ich bin mir nicht sicher, was hier zu tun ist, aber ich denke, wir sollten eine Umgehungslösung finden. Es überrascht mich, dass dies RGPD bricht. Vielleicht sollten wir ein Ticket bei Quantcast eröffnen, um dies zu besprechen, und hier verlinken?

Wie fügst du die für Quantcast benötigten Skripte hinzu? Fügt du sie über ein Script-Tag mit einer src (extern) hinzu, wie hier:

<script src="foo"></script>

Oder fügst du sie inline hinzu, wie hier?

<script>
  alert("Hallo Welt!");
</script>

Hallo,
vielen Dank für eure Antworten.

@sam Ich habe am Tag der Erstellung dieses Themas ein Ticket bei Quantcast eröffnet, und sie haben heute auf mich reagiert. Offenbar prüfen sie den Fall gerade, und hoffentlich finden sie eine Lösung. Ich denke, das ist für sie eine recht einfache Korrektur, da der Button „Auswahl bestätigen

Ich kann mir nicht vorstellen, dass wir die Array-Prototypen in absehbarer Zeit sicher entfernen können. Sie waren über die Jahre hinweg völlig harmlos und bieten viel Komfort.

Vielleicht könntest du dich an Quantcast wenden, um eine Version der Skripte zu erhalten, die nicht auf Array-Prototypen angewiesen sind?

Hallo zusammen,
ich habe einige neue Informationen für euch und habe eine Lösung für dieses Problem gefunden.

Heute habe ich mich erneut mit diesem Bug beschäftigt und glaube, weitere Erkenntnisse gewonnen zu haben.

Beim Betrachten der Datei cmp2ui-fr.js von Quantcast konnte ich herausfinden, wo der Bug auftritt. Er befindet sich in dieser Funktion (wir haben nur eine minifizierte Version):

function(t){for(var n in t){t[n].status=e;}}

Wie ihr seht, verwendet diese Funktion eine for..in-Schleife, wobei die Variable t ein Array ist. Wir haben dies bereits zuvor erklärt: Ember.js erweitert das native JavaScript-Array. Es stellt sich heraus, dass eine der Änderungen das Hinzufügen eines _super-Eintrags ist.

Der _super-Eintrag verweist auf eine ROOT()-Funktion, die scheinbar auf _utils.ROOT in Ember.js verweist (vielleicht kommt euch das bei manchen von euch bekannt vor, aber nicht bei mir ^^). Diese ROOT()-Funktion ist nicht erweiterbar.

Offenbar wird diese _super-Eigenschaft als „enumerable

Vielen Dank @OsaAjani, dass Sie das Thema aufgegriffen haben. Wir haben exakt dasselbe Problem mit Quantcast Choice auf unserem Discourse-Forum und sind auf Version 12 festgefahren (die letzte Version, die den Fehler nicht auslöst).

Die neueste Version ist 23, und wir würden diese sehr gerne nutzen.

Wir freuen uns darauf, bald zu erfahren, wie wir das Problem lösen können.

Hallo @Terrapop, ich freue mich, wenn dieses Thema dir helfen kann. Bisher habe ich absolut kein Feedback zu dem Issue, das ich im ember.js-Repository eröffnet habe ([Bug] Property "_super" is enumerable on Array, creating conflicts with external libs (ex : Quantcast Choice RGPD) · Issue #19289 · emberjs/ember.js · GitHub), erhalten. Auch von Quantcast habe ich keine Rückmeldung bekommen.

Die gute Nachricht ist jedoch, dass ich die in meiner vorherigen Nachricht beschriebene Lösung bereits anwende: Ich habe eine Datei namens fix_ember.js mit folgendem Code erstellt:

Object.defineProperty(Array.prototype, '_super', {'enumerable': false});

Und habe folgende Zeile hinzugefügt:

<script defer src="/fix_emmber.js"></script>

Im Footer des Themes über die Anpassungsmöglichkeiten im Admin-Bereich.

Diese Lösung behebt das Problem, und bisher habe ich keine Nebeneffekte festgestellt. Du kannst diese Lösung also mit gutem Gewissen verwenden und auf Quantcast v23 migrieren.

Wir haben die Zeile vor dem Laden von choice.js hinzugefügt. Das scheint ebenfalls gut zu funktionieren.

Zur anderen Lösung: Wir haben keinen Reverse-Proxy vor unserem Discourse, daher sind wir uns nicht sicher, wie die Datei fix_ember.js ordnungsgemäß erstellt werden kann. Ist das überhaupt innerhalb von Docker möglich? Gibt es einen Vorschlag?

Nun, wenn Sie es vor choice.js laden können, ist das noch besser!

Ja, es funktioniert. Wir können Ihnen nicht genug danken. Wir haben uns tagelang den Kopf zerbrochen, da wir das Problem nicht finden konnten. Wir hatten 20 E-Mails hin und her mit Quantcast, und auch sie konnten das Problem nicht lokalisieren.

Nun, wenn du einen guten Kommunikationskanal zu Quantcast hast, könntest du sie vielleicht auf diesen Beitrag hinweisen, damit sie das Problem beheben können. Ich habe es versucht, aber da ich kein Kunde von ihnen bin, habe ich von der Unterstützung nicht viel Rückmeldung erhalten.

Wird gemacht. Guter Punkt.