Skip to content

Commit 57da32a

Browse files
authored
Merge pull request #3370 from ControlSystemStudio/checked_actions3360
Actions with confirmation or password: Prevent context menu backdoor
2 parents 596e165 + 4fc17d4 commit 57da32a

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
/*******************************************************************************
2-
* Copyright (c) 2017-2020 Oak Ridge National Laboratory.
2+
* Copyright (c) 2017-2025 Oak Ridge National Laboratory.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
66
* http://www.eclipse.org/legal/epl-v10.html
77
*******************************************************************************/
88
package org.csstudio.display.builder.runtime.app;
99

10+
import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialog;
11+
import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propPassword;
12+
1013
import javafx.collections.ObservableList;
1114
import javafx.scene.Node;
1215
import javafx.scene.Parent;
@@ -127,12 +130,20 @@ private void fillMenu(Runnable setFocus, final Widget widget) {
127130
}
128131

129132
// Widget actions
130-
for (ActionInfo info : widget.propActions().getValue().getActions()) {
131-
List<MenuItem> actionMenuItems = info.getContextMenuItems(RuntimeUtil.getExecutor(), widget);
132-
if (actionMenuItems != null) {
133-
items.addAll(actionMenuItems);
133+
// Skip if widget requires password or confirmation dialog,
134+
// because in here we would invoke actions without those constraints
135+
final Optional<WidgetProperty<String>> pass = widget.checkProperty(propPassword);
136+
final Optional<WidgetProperty<Boolean>> prompt = widget.checkProperty(propConfirmDialog);
137+
final boolean need_dialog = (pass.isPresent() && !pass.get().getValue().isBlank()) ||
138+
(prompt.isPresent() && prompt.get().getValue());
139+
140+
if (! need_dialog)
141+
for (ActionInfo info : widget.propActions().getValue().getActions()) {
142+
List<MenuItem> actionMenuItems = info.getContextMenuItems(RuntimeUtil.getExecutor(), widget);
143+
if (actionMenuItems != null) {
144+
items.addAll(actionMenuItems);
145+
}
134146
}
135-
}
136147

137148
// Actions of the widget runtime
138149
final WidgetRuntime<Widget> runtime = RuntimeUtil.getRuntime(widget);

0 commit comments

Comments
 (0)