Skip to content

Commit f179d33

Browse files
branquinhoaarenato
andauthored
FIX: avoid ProseMirror handling paste when unauthorized (#35640) (#35659)
Backporting change merged in [this commit ](#35640 stable branch --------- Co-authored-by: Renato Atilio <[email protected]>
1 parent cc8d3f6 commit f179d33

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

app/assets/javascripts/discourse/app/static/prosemirror/components/prosemirror-editor.gjs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import * as ProsemirrorView from "prosemirror-view";
2424
import { EditorView } from "prosemirror-view";
2525
import { getExtensions } from "discourse/lib/composer/rich-editor-extensions";
2626
import { bind } from "discourse/lib/decorators";
27+
import { authorizesOneOrMoreExtensions } from "../../../lib/uploads";
2728
import { buildInputRules } from "../core/inputrules";
2829
import { buildKeymap } from "../core/keymap";
2930
import Parser from "../core/parser";
@@ -74,6 +75,7 @@ export default class ProsemirrorEditor extends Component {
7475
@service site;
7576
@service siteSettings;
7677
@service appEvents;
78+
@service currentUser;
7779

7880
schema = createSchema(this.extensions, this.args.includeDefault);
7981
view;
@@ -213,6 +215,28 @@ export default class ProsemirrorEditor extends Component {
213215
next(() => this.args.focusOut?.());
214216
return false;
215217
},
218+
paste: (view, event) => {
219+
// When !authorizesOneOrMoreExtensions, we don't ComposerUpload#setup,
220+
// which is originally responsible for preventDefault.
221+
if (
222+
event.clipboardData.files &&
223+
!authorizesOneOrMoreExtensions(
224+
this.currentUser.staff,
225+
this.siteSettings
226+
)
227+
) {
228+
event.preventDefault();
229+
}
230+
},
231+
drop: (view, event) => {
232+
if (
233+
[...event.dataTransfer.items].some((item) => item.kind === "file")
234+
) {
235+
// Skip processing the drop event (e.g. Safari cross-window content drag),
236+
// Uppy's DropTarget should handle that instead.
237+
return true;
238+
}
239+
},
216240
},
217241
handleKeyDown: (view, event) => {
218242
// suppress if Enter/Tab and the autocomplete is open

spec/system/composer/prosemirror_editor_spec.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,29 @@ def body(title)
795795
expect(composer).to have_value("![image|244x66](upload://hGLky57lMjXvqCWRhcsH31ShzmO.png)")
796796
end
797797

798+
it "avoids triggering upload when unauthorized" do
799+
SiteSetting.authorized_extensions = ""
800+
801+
valid_png_data_uri =
802+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=="
803+
804+
cdp.allow_clipboard
805+
806+
open_composer
807+
808+
html = <<~HTML
809+
<img src="#{valid_png_data_uri}" alt="img1" width="100" height="100">
810+
HTML
811+
812+
cdp.copy_paste(html, html: true)
813+
814+
expect(rich).to have_no_css("img")
815+
816+
composer.toggle_rich_editor
817+
818+
expect(composer).to have_value("")
819+
end
820+
798821
it "merges text with link marks created from parsing" do
799822
cdp.allow_clipboard
800823
open_composer

0 commit comments

Comments
 (0)