Ich habe gesehen, dass Emojis auf einer öffentlichen Website, die ich betreibe, fehlerhaft sind. Die Zugriffskontrolle ist auf „privat“ gesetzt und als „sicher“ markiert, mit dem Grund access control post dictates security | source: post creator.
Das Ausführen der Aufgabe uploads:secure_upload_analyse_and_update behebt das Problem, aber dann tritt es einige Tage später erneut auf. Dies geschah auch einmal mit dem Website-Logo, trat aber nie wieder auf.
Hallo @Wolftallemo , das ist ein ziemlich kniffliges Problem, wenn benutzerdefinierte Emojis (oder jeder öffentlich zugängliche Upload, der in einem Beitrag verwendet werden kann) und sichere Uploads kombiniert werden. Vor einiger Zeit haben wir eine UploadReference-Tabelle verwendet, um zu sehen, was mit was verknüpft ist. Als wir jedoch zu dieser Tabelle migriert haben, haben wir alle created_at-Datumsangaben auf dasselbe gesetzt. Die Folge davon ist, dass, wenn wir zu Sicherheitszwecken prüfen, ob die erste Verwendung eines Uploads öffentlich ist oder nicht, manchmal die Reihenfolge falsch ist und wir das Falsche verwenden, da PostgreSQL bei exakt demselben created_at sein eigenes Ding macht:
Ihre Erwähnung hat mich veranlasst, dies noch einmal zu untersuchen, und ich denke, wir können dies besser handhaben, indem wir zuerst nach created_at ASC und dann nach id ASC sortieren. Wenn es also Konflikte gibt, sollte der tatsächliche erste Datensatz verwendet werden.
Wenn die Probleme nach dem Mergen dieses Pull Requests (ich werde versuchen, ihn heute zu mergen) weiterhin bestehen und Sie Ihre Website hochgeladen haben, können wir weitere Optionen besprechen. Ich habe jedoch den Verdacht, dass dies das Problem bei Ihnen ist. Sie können dies bestätigen, indem Sie Folgendes tun und die Ergebnisse auf Ihrer Website vergleichen:
CustomEmoji.find_by(name: "success").upload.upload_references.order("created_at ASC")
CustomEmoji.find_by(name: "success").upload.upload_references.order("created_at ASC, id ASC")
Der erste sollte einen Post als target_type haben, der zweite sollte das CustomEmoji als Zieltyp haben.
Interessant, dann gibt es das richtige Ergebnis zurück. Können Sie für den verknüpften Upload die Werte security_last_changed_reason und security_last_changed_at posten und sehen, ob access_control_post_id ausgefüllt ist? Es sollte diesen Upload nicht als sicher markieren, wenn die erste Referenz das benutzerdefinierte Emoji ist. Versuchen Sie auch Folgendes:
Upload.find(ID)
.upload_references
.joins(<<~SQL)
LEFT JOIN posts ON upload_references.target_type = 'Post' AND upload_references.target_id = posts.id
SQL
.where("posts.deleted_at IS NULL")
.order("upload_references.created_at ASC, upload_references.id ASC")
.first
Interessant, und wurde das benutzerdefinierte Emoji in diesem Beitrag verwendet? Was wird zurückgegeben, wenn Sie den obigen Upload-Referenzcode mit dieser Upload-ID ausführen? Das Ausführen mit dem Upload-Datensatz und das Posten des Ergebnisses wäre ebenfalls hilfreich:
upload
.upload_references
.joins(<<~SQL)
LEFT JOIN posts ON upload_references.target_type = 'Post' AND upload_references.target_id = posts.id
SQL
.where("posts.deleted_at IS NULL")
.order("upload_references.created_at ASC, upload_references.id ASC")
.first
Wenn wir es wirklich müssen, könntest du einfach das created_at-Datum und die Uhrzeit des UploadReference-Eintrags von CustomEmoji auf einen früheren Zeitpunkt als alle anderen UploadReference-Einträge für diesen Upload setzen, aber das solltest du eigentlich nicht tun müssen.
Ich hätte das klarstellen sollen. Die Upload-ID war korrekt, die Post-ID nicht (was dazu führte, dass der Post das Emoji nicht enthielt – der, den ich hier eingefügt habe, war korrekt, aber ich habe ihn falsch eingegeben, als ich versuchte, ihn zu finden).
Alle anderen Befehle geben immer noch dasselbe zurück.
Wenn dies der Fall ist, gibt es tatsächlich einige Merkwürdigkeiten bei den Daten, die möglicherweise durch unsere automatische Migration verursacht wurden. Führen Sie Folgendes aus:
CustomEmoji.find_by(name: "success").upload.upload_references.order("created_at ASC, id ASC")
Um den UploadReference-Datensatz zu finden, der target_type: "CustomEmoji" angibt, führen Sie dann Folgendes aus:
Führen Sie dann Folgendes für den problematischen Upload aus:
upload.update_secure_status
Und es sollte behoben sein… Ich glaube wirklich, dass dies hauptsächlich ein Problem mit älteren Uploads seit dieser Migration sein wird. Eine andere Sache, die Sie tun könnten, ist, das benutzerdefinierte Emoji zu löschen, es erneut hochzuladen und dann Folgendes auszuführen: