Skip to content

Commit cedcd0c

Browse files
author
kasemir
committed
Actions with confirmation or password: Prevent context menu backdoor
1 parent 596e165 commit cedcd0c

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

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

Lines changed: 16 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.propConfirmMessage;
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,19 @@ 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<String>> prompt = widget.checkProperty(propConfirmMessage);
137+
final boolean need_dialog = (pass.isPresent() && !pass.get().getValue().isBlank()) ||
138+
(prompt.isPresent() && !prompt.get().getValue().isBlank());
139+
if (! need_dialog)
140+
for (ActionInfo info : widget.propActions().getValue().getActions()) {
141+
List<MenuItem> actionMenuItems = info.getContextMenuItems(RuntimeUtil.getExecutor(), widget);
142+
if (actionMenuItems != null) {
143+
items.addAll(actionMenuItems);
144+
}
134145
}
135-
}
136146

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

0 commit comments

Comments
 (0)