diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java index 1f56ddea77..940741e377 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java @@ -51,6 +51,7 @@ public class Messages DisplayMode, EmbeddedDisplayWidget_GroupName, EnableGradient, + Encryption_NONE, FontStyle_Bold, FontStyle_BoldItalic, FontStyle_Italic, @@ -58,6 +59,7 @@ public class Messages GroupWidget_Description, GroupWidget_Name, HighlightActiveRegion, + InformativeTooltipCryptedPassword, InformativeTooltipActions, InformativeTooltipAlarmBorder, InformativeTooltipHeight, @@ -87,6 +89,7 @@ public class Messages LoLoAndHiHiWarningColor, LowAndHighWarningColor, NeedleWidth, + Md5_Encryption, Middle, MinAndMaxFromPV, NoLimitsFromPV, @@ -133,6 +136,8 @@ public class Messages Rotation_90, ScrollBar_ShowValueTip, ScrollBar_BarLength, + Sha256_Encryption, + Sha512_Encryption, SlideButton_Label, Spinner_ButtonsOnLeft, Stripchart_Description, @@ -204,6 +209,7 @@ public class Messages WidgetProperties_CursorInfoPV, WidgetProperties_CursorXPV, WidgetProperties_CursorYPV, + WidgetProperties_CryptedPassword, WidgetProperties_DataHeight, WidgetProperties_DataWidth, WidgetProperties_DateColor, diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/properties/CommonWidgetProperties.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/properties/CommonWidgetProperties.java index 236702a380..0e7cb642ea 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/properties/CommonWidgetProperties.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/properties/CommonWidgetProperties.java @@ -771,6 +771,18 @@ public EnumWidgetProperty createProperty(final Widget widget, fin public static final WidgetPropertyDescriptor propPassword = newStringPropertyDescriptor(WidgetPropertyCategory.BEHAVIOR, "password", Messages.WidgetProperties_Password); + /** + * 'crypted password' property: Select the hash algorithm of the provided crypted password + */ + public static final WidgetPropertyDescriptor propCryptedPassword = + new WidgetPropertyDescriptor<>( + WidgetPropertyCategory.BEHAVIOR, "crypted_password", Messages.WidgetProperties_CryptedPassword) { + @Override + public EnumWidgetProperty createProperty(final Widget widget, + final CryptedPassword default_value) { + return new EnumWidgetProperty<>(this, widget, default_value); + } + }; /** * Runtime 'pv_value' property: Typically read from primary PV */ diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/properties/CryptedPassword.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/properties/CryptedPassword.java new file mode 100644 index 0000000000..06d7f10689 --- /dev/null +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/properties/CryptedPassword.java @@ -0,0 +1,27 @@ +package org.csstudio.display.builder.model.properties; + +import org.csstudio.display.builder.model.Messages; + +public enum CryptedPassword { + + /** Password not crypted */ + NONE(Messages.Encryption_NONE), + /** MD5 Crypted password */ + MD5(Messages.Md5_Encryption), + /** SH256 Crypted password */ + SHA256(Messages.Sha256_Encryption), + /** SHA512 Crypted password */ + SHA512(Messages.Sha512_Encryption); + private final String label; + + private CryptedPassword(final String label) + { + this.label = label; + } + + @Override + public String toString() + { + return label; + } +} diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ActionButtonWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ActionButtonWidget.java index be5b2cad25..05f682fbf8 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ActionButtonWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ActionButtonWidget.java @@ -10,6 +10,7 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propBackgroundColor; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialog; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmMessage; +import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propCryptedPassword; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propEnabled; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propFont; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propForegroundColor; @@ -24,6 +25,7 @@ import java.util.Arrays; import java.util.List; +import org.csstudio.display.builder.model.Messages; import org.csstudio.display.builder.model.MacroizedWidgetProperty; import org.csstudio.display.builder.model.Version; import org.csstudio.display.builder.model.Widget; @@ -36,6 +38,7 @@ import org.csstudio.display.builder.model.persist.WidgetFontService; import org.csstudio.display.builder.model.persist.XMLTags; import org.csstudio.display.builder.model.properties.CommonWidgetProperties; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.HorizontalAlignment; import org.csstudio.display.builder.model.properties.RotationStep; import org.csstudio.display.builder.model.properties.VerticalAlignment; @@ -237,6 +240,7 @@ public WidgetConfigurator getConfigurator(final Version persisted_version) private volatile WidgetProperty confirm_dialog; private volatile WidgetProperty confirm_message; private volatile WidgetProperty password; + private volatile WidgetProperty cryptedPassword; /** Constructor */ public ActionButtonWidget() @@ -271,6 +275,8 @@ protected void defineProperties(final List> properties) properties.add(confirm_dialog = propConfirmDialog.createProperty(this, false)); properties.add(confirm_message = propConfirmMessage.createProperty(this, "Are your sure you want to do this?")); properties.add(password = propPassword.createProperty(this, "")); + properties.add(cryptedPassword = propCryptedPassword.createProperty(this, CryptedPassword.NONE)); + cryptedPassword.setInformativeTooltip(Messages.InformativeTooltipCryptedPassword); } @Override @@ -358,4 +364,10 @@ public WidgetProperty propPassword() { return password; } + + /** @return 'crypted_password' property */ + public WidgetProperty propCryptedPassword() + { + return cryptedPassword; + } } diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/BoolButtonWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/BoolButtonWidget.java index 30b1b9222d..d71266cb3a 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/BoolButtonWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/BoolButtonWidget.java @@ -13,6 +13,7 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propBit; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialogOptions; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmMessage; +import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propCryptedPassword; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propEnabled; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propFont; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propForegroundColor; @@ -41,6 +42,7 @@ import org.csstudio.display.builder.model.persist.NamedWidgetFonts; import org.csstudio.display.builder.model.persist.WidgetFontService; import org.csstudio.display.builder.model.properties.ConfirmDialog; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.EnumWidgetProperty; import org.csstudio.display.builder.model.properties.HorizontalAlignment; import org.csstudio.display.builder.model.properties.VerticalAlignment; @@ -182,6 +184,7 @@ public EnumWidgetProperty createProperty(final Widget widget, final Mode d private volatile WidgetProperty confirm_dialog; private volatile WidgetProperty confirm_message; private volatile WidgetProperty password; + private volatile WidgetProperty cryptedPassword; /** Constructor */ public BoolButtonWidget() @@ -200,6 +203,7 @@ public WidgetConfigurator getConfigurator(Version persisted_version) protected void defineProperties(final List> properties) { super.defineProperties(properties); + properties.add(bit = propBit.createProperty(this, 0)); properties.add(off_label = propOffLabel.createProperty(this, "Off")); properties.add(off_color = propOffColor.createProperty(this, new WidgetColor(60, 100, 60))); @@ -219,6 +223,8 @@ protected void defineProperties(final List> properties) properties.add(confirm_dialog = propConfirmDialogOptions.createProperty(this, ConfirmDialog.NONE)); properties.add(confirm_message = propConfirmMessage.createProperty(this, "Are your sure you want to do this?")); properties.add(password = propPassword.createProperty(this, "")); + properties.add(cryptedPassword = propCryptedPassword.createProperty(this, CryptedPassword.NONE)); + cryptedPassword.setInformativeTooltip(Messages.InformativeTooltipCryptedPassword); } /** @return 'bit' property */ @@ -334,4 +340,10 @@ public WidgetProperty propPassword() { return password; } + + /** @return 'crypted_password' property */ + public WidgetProperty propCryptedPassword() + { + return cryptedPassword; + } } diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/CheckBoxWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/CheckBoxWidget.java index 56a9635210..ff232c8311 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/CheckBoxWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/CheckBoxWidget.java @@ -12,6 +12,7 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propBit; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialogOptions; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmMessage; +import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propCryptedPassword; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propEnabled; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propFont; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propForegroundColor; @@ -30,6 +31,7 @@ import org.csstudio.display.builder.model.persist.NamedWidgetFonts; import org.csstudio.display.builder.model.persist.WidgetFontService; import org.csstudio.display.builder.model.properties.ConfirmDialog; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.WidgetFont; import org.phoebus.ui.color.NamedWidgetColors; import org.phoebus.ui.color.WidgetColor; @@ -73,6 +75,7 @@ public Widget createWidget() private volatile WidgetProperty confirm_dialog; private volatile WidgetProperty confirm_message; private volatile WidgetProperty password; + private volatile WidgetProperty cryptedPassword; @Override protected void defineProperties(final List> properties) @@ -87,6 +90,8 @@ protected void defineProperties(final List> properties) properties.add(confirm_dialog = propConfirmDialogOptions.createProperty(this, ConfirmDialog.NONE)); properties.add(confirm_message = propConfirmMessage.createProperty(this, "Are your sure you want to do this?")); properties.add(password = propPassword.createProperty(this, "")); + properties.add(cryptedPassword = propCryptedPassword.createProperty(this, CryptedPassword.NONE)); + cryptedPassword.setInformativeTooltip(Messages.InformativeTooltipCryptedPassword); } /** Constructor */ @@ -148,4 +153,10 @@ public WidgetProperty propPassword() { return password; } + + /** @return 'crypted_password' property */ + public WidgetProperty propCryptedPassword() + { + return cryptedPassword; + } } diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ChoiceButtonWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ChoiceButtonWidget.java index 1ba8a08431..1e9f584a70 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ChoiceButtonWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ChoiceButtonWidget.java @@ -10,6 +10,7 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propBackgroundColor; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialog; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmMessage; +import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propCryptedPassword; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propEnabled; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propFont; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propForegroundColor; @@ -34,6 +35,7 @@ import org.csstudio.display.builder.model.persist.NamedWidgetFonts; import org.csstudio.display.builder.model.persist.WidgetFontService; import org.csstudio.display.builder.model.properties.CommonWidgetProperties; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.HorizontalAlignment; import org.csstudio.display.builder.model.properties.VerticalAlignment; import org.csstudio.display.builder.model.properties.WidgetFont; @@ -77,6 +79,7 @@ public Widget createWidget() private volatile WidgetProperty confirm_dialog; private volatile WidgetProperty confirm_message; private volatile WidgetProperty password; + private volatile WidgetProperty cryptedPassword; /** Constructor */ public ChoiceButtonWidget() @@ -110,6 +113,8 @@ protected void defineProperties(final List> properties) properties.add(confirm_dialog = propConfirmDialog.createProperty(this, false)); properties.add(confirm_message = propConfirmMessage.createProperty(this, "Are your sure you want to do this?")); properties.add(password = propPassword.createProperty(this, "")); + properties.add(cryptedPassword = propCryptedPassword.createProperty(this, CryptedPassword.NONE)); + cryptedPassword.setInformativeTooltip(Messages.InformativeTooltipCryptedPassword); } /** @return 'foreground_color' property */ @@ -189,4 +194,10 @@ public WidgetProperty propPassword() { return password; } + + /** @return 'crypted_password' property */ + public WidgetProperty propCryptedPassword() + { + return cryptedPassword; + } } diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ComboWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ComboWidget.java index e475602b42..1794d51d10 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ComboWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/ComboWidget.java @@ -11,6 +11,7 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propBackgroundColor; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialog; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmMessage; +import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propCryptedPassword; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propEnabled; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propFont; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propForegroundColor; @@ -36,6 +37,7 @@ import org.csstudio.display.builder.model.persist.NamedWidgetFonts; import org.csstudio.display.builder.model.persist.WidgetFontService; import org.csstudio.display.builder.model.properties.CommonWidgetProperties; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.StringWidgetProperty; import org.csstudio.display.builder.model.properties.WidgetFont; import org.phoebus.ui.color.NamedWidgetColors; @@ -132,6 +134,7 @@ public WidgetConfigurator getConfigurator(final Version persisted_version) private volatile WidgetProperty confirm_dialog; private volatile WidgetProperty confirm_message; private volatile WidgetProperty password; + private volatile WidgetProperty cryptedPassword; /** Constructor */ public ComboWidget() @@ -153,6 +156,8 @@ protected void defineProperties(final List> properties) properties.add(confirm_dialog = propConfirmDialog.createProperty(this, false)); properties.add(confirm_message = propConfirmMessage.createProperty(this, "Are your sure you want to do this?")); properties.add(password = propPassword.createProperty(this, "")); + properties.add(cryptedPassword = propCryptedPassword.createProperty(this, CryptedPassword.NONE)); + cryptedPassword.setInformativeTooltip(Messages.InformativeTooltipCryptedPassword); } /** @return 'foreground_color' property */ @@ -234,4 +239,10 @@ public WidgetProperty propPassword() { return password; } + + /** @return 'crypted_password' property */ + public WidgetProperty propCryptedPassword() + { + return cryptedPassword; + } } diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/RadioWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/RadioWidget.java index 13e2faaad3..ddd12ed827 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/RadioWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/RadioWidget.java @@ -9,12 +9,14 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialog; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmMessage; +import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propCryptedPassword; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propEnabled; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propFont; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propForegroundColor; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propHorizontal; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propItemsFromPV; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propPassword; + import static org.csstudio.display.builder.model.widgets.ComboWidget.propItem; import java.util.Arrays; @@ -30,6 +32,7 @@ import org.csstudio.display.builder.model.persist.NamedWidgetFonts; import org.csstudio.display.builder.model.persist.WidgetFontService; import org.csstudio.display.builder.model.properties.CommonWidgetProperties; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.WidgetFont; import org.phoebus.ui.color.NamedWidgetColors; import org.phoebus.ui.color.WidgetColor; @@ -65,6 +68,7 @@ public Widget createWidget() private volatile WidgetProperty confirm_dialog; private volatile WidgetProperty confirm_message; private volatile WidgetProperty password; + private volatile WidgetProperty cryptedPassword; private static ArrayWidgetProperty.Descriptor> radioItemDescriptor = new ArrayWidgetProperty.Descriptor<>(WidgetPropertyCategory.BEHAVIOR, "items", "Items", @@ -95,6 +99,8 @@ protected void defineProperties(final List> properties) properties.add(confirm_dialog = propConfirmDialog.createProperty(this, false)); properties.add(confirm_message = propConfirmMessage.createProperty(this, "Are your sure you want to do this?")); properties.add(password = propPassword.createProperty(this, "")); + properties.add(cryptedPassword = propCryptedPassword.createProperty(this, CryptedPassword.NONE)); + cryptedPassword.setInformativeTooltip(Messages.InformativeTooltipCryptedPassword); } /** @return 'foreground_color' property */ @@ -151,6 +157,12 @@ public WidgetProperty propPassword() return password; } + /** @return 'crypted_password' property */ + public WidgetProperty propCryptedPassword() + { + return cryptedPassword; + } + // TODO: CR: Changing the name of a radio button item has no immediate effect, // only after a resize the name is changed. } diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/SlideButtonWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/SlideButtonWidget.java index 95e5878fb0..03a3d09094 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/SlideButtonWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/SlideButtonWidget.java @@ -13,6 +13,7 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propBit; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmDialogOptions; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propConfirmMessage; +import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propCryptedPassword; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propEnabled; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propFont; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propForegroundColor; @@ -33,6 +34,7 @@ import org.csstudio.display.builder.model.persist.NamedWidgetFonts; import org.csstudio.display.builder.model.persist.WidgetFontService; import org.csstudio.display.builder.model.properties.ConfirmDialog; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.WidgetFont; import org.phoebus.ui.color.NamedWidgetColors; import org.phoebus.ui.color.WidgetColor; @@ -80,6 +82,7 @@ public Widget createWidget ( ) { private volatile WidgetProperty off_color; private volatile WidgetProperty on_color; private volatile WidgetProperty password; + private volatile WidgetProperty cryptedPassword; /** Constructor */ public SlideButtonWidget () { @@ -163,6 +166,12 @@ public WidgetProperty propPassword ( ) { return password; } + /** @return 'crypted_password' property */ + public WidgetProperty propCryptedPassword() + { + return cryptedPassword; + } + @Override protected void defineProperties ( final List> properties ) { @@ -179,6 +188,7 @@ protected void defineProperties ( final List> properties ) { properties.add(confirm_dialog = propConfirmDialogOptions.createProperty(this, ConfirmDialog.NONE)); properties.add(confirm_message = propConfirmMessage.createProperty(this, "Are your sure you want to do this?")); properties.add(password = propPassword.createProperty(this, "")); - + properties.add(cryptedPassword = propCryptedPassword.createProperty(this, CryptedPassword.NONE)); + cryptedPassword.setInformativeTooltip(Messages.InformativeTooltipCryptedPassword); } } diff --git a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties index 278fcc4753..e295417aaa 100644 --- a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties +++ b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties @@ -33,6 +33,7 @@ Confirm_RELEASE=On Clear DisplayMode=Display Mode EmbeddedDisplayWidget_GroupName=Group name EnableGradient=Enable Gradient +Encryption_NONE=None FontStyle_Bold=Bold FontStyle_BoldItalic=Bold & Italic FontStyle_Italic=Italic @@ -40,6 +41,7 @@ FontStyle_Regular=Regular GroupWidget_Description=Group of widgets GroupWidget_Name=Group HighlightActiveRegion=Highlight Active Region +InformativeTooltipCryptedPassword=Select the hashing algorithm for the provided hashed password InformativeTooltipActions=Actions to execute when the widget is clicked on. InformativeTooltipAlarmBorder=Should an alarm border be shown around the widget when the displayed PV signals an alarm? InformativeTooltipHeight=The height of the widget in pixels. @@ -68,6 +70,7 @@ LineStyle_DashDotDot=Dash-Dot-Dot LineStyle_Dot=Dot LoLoAndHiHiWarningColor=LoLo & HiHi Warning Color LowAndHighWarningColor=Low & High Warning Color +Md5_Encryption=MD5 Middle=Middle MinAndMaxFromPV=Min & max from PV NeedleWidth=Needle Width @@ -115,6 +118,8 @@ Rotation_270=- 90 degrees Rotation_90=90 degrees ScrollBar_ShowValueTip=Show value tip ScrollBar_BarLength=Bar length +Sha256_Encryption=SHA-256 +Sha512_Encryption=SHA-512 SlideButton_Label=Label Spinner_ButtonsOnLeft=Buttons on left Stripchart_Description=Plot scalar PVs over time @@ -185,6 +190,7 @@ WidgetProperties_ConfirmMessage=Confirmation Message WidgetProperties_Connected=Connected WidgetProperties_CornerHeight=Corner Height WidgetProperties_CornerWidth=Corner Width +WidgetProperties_CryptedPassword=Hash Algorithm WidgetProperties_CursorCrosshair=Cursor Crosshair WidgetProperties_CursorInfo=Cursor Info WidgetProperties_CursorInfoPV=Cursor Info PV diff --git a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages_fr.properties b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages_fr.properties index a5764e7ef7..97c7bdcd90 100644 --- a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages_fr.properties +++ b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages_fr.properties @@ -33,6 +33,7 @@ Confirm_RELEASE=Sur Clear DisplayMode=Mode d'affichage EmbeddedDisplayWidget_GroupName=Nom du groupe EnableGradient=Activer le dégradé +Encryption_NONE=Aucun FontStyle_Bold=Gras FontStyle_BoldItalic=Gras & Italique FontStyle_Italic=Italique @@ -68,6 +69,7 @@ LineStyle_DashDotDot=Point-point-point LineStyle_Dot=Pointillée LoLoAndHiHiWarningColor=Couleur d’avertissement LoLo et HiHi LowAndHighWarningColor=Couleur d’avertissement Low et High +Md5_Encryption=MD5 Middle=Milieu MinAndMaxFromPV=Min & Max du PV NeedleWidth=Épaisseur de l’aiguille @@ -411,6 +413,7 @@ FontStyle_Regular=Normal GroupWidget_Description=Groupe de widgets GroupWidget_Name=Groupe HighlightActiveRegion=Mettre en surbrillance la région active +InformativeTooltipCryptedPassword=Selectionner la fonction de hachage du mot de passe haché défini InformativeTooltipActions=Actions à exécuter lors d’un clic sur le widget. InformativeTooltipAlarmBorder=Faut-il afficher une bordure d’alarme autour du widget lorsque le PV affiché déclenche une alarme ? InformativeTooltipHeight=Hauteur du widget en pixels. @@ -486,6 +489,8 @@ Rotation_270=-90 degrés Rotation_90=90 degrés ScrollBar_ShowValueTip=Afficher l'info-bulle de la valeur ScrollBar_BarLength=Longueur de la barre +Sha256_Encryption=SHA-256 +Sha512_Encryption=SHA-512 SlideButton_Label=Étiquette Spinner_ButtonsOnLeft=Boutons à gauche Stripchart_Description=Tracer des PV scalaires dans le temps @@ -560,6 +565,7 @@ WidgetProperties_CursorInfo=Info du curseur WidgetProperties_CursorInfoPV=Info du curseur PV WidgetProperties_CursorXPV=Curseur X PV WidgetProperties_CursorYPV=Curseur Y PV +WidgetProperties_CryptedPassword=Fonction de hachage WidgetProperties_DataHeight=Hauteur des données WidgetProperties_DataWidth=Largeur des données WidgetProperties_DateColor=Couleur de la date diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/JFXRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/JFXRepresentation.java index f0fabfd5fe..c92bd53a0f 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/JFXRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/JFXRepresentation.java @@ -41,6 +41,7 @@ import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; import org.csstudio.display.builder.model.Widget; import org.csstudio.display.builder.model.WidgetPropertyListener; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.PredefinedColorMaps; import org.csstudio.display.builder.representation.ToolkitRepresentation; import org.csstudio.display.builder.representation.javafx.widgets.JFXBaseRepresentation; @@ -899,13 +900,14 @@ public String showSelectionDialog(final Widget widget, final String title, final } @Override - public String showPasswordDialog(final Widget widget, final String title, final String correct_password) + public String showPasswordDialog(final Widget widget, final String title, final String correct_password, final CryptedPassword crypted_password) { final Node node = JFXBaseRepresentation.getJFXNode(widget); final CompletableFuture done = new CompletableFuture<>(); execute( ()-> { - final PasswordDialog dialog = new PasswordDialog(title, correct_password); + + final PasswordDialog dialog = new PasswordDialog(title, correct_password, crypted_password); DialogHelper.positionDialog(dialog, node, -100, -50); dialog.initOwner(node.getScene().getWindow()); final Optional result = dialog.showAndWait(); diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/PasswordDialog.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/PasswordDialog.java index 7102d27ede..a3ef9fcd3d 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/PasswordDialog.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/PasswordDialog.java @@ -18,6 +18,10 @@ import javafx.scene.control.PasswordField; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; +import org.csstudio.display.builder.model.properties.CryptedPassword; + +import java.security.MessageDigest; +import java.nio.charset.StandardCharsets; /** Dialog that prompts for password * @@ -38,15 +42,29 @@ public class PasswordDialog extends Dialog { private final String correct_password; + private final CryptedPassword crypted_password; private final PasswordField pass_entry = new PasswordField(); private final Label pass_caption = new Label(Messages.Password_Caption); + public static String hash(String value, String algorithm) throws Exception { + MessageDigest md = MessageDigest.getInstance(algorithm); + byte[] hash = md.digest(value.getBytes(StandardCharsets.UTF_8)); + + StringBuilder hex = new StringBuilder(hash.length * 2); + for (byte b : hash) { + hex.append(String.format("%02x", b)); + } + + return hex.toString(); + } + /** @param title Title, message * @param correct_password Password to check */ - public PasswordDialog(final String title, final String correct_password) + public PasswordDialog(final String title, final String correct_password, final CryptedPassword crypted_password) { this.correct_password = correct_password; + this.crypted_password = crypted_password; final DialogPane pane = getDialogPane(); pass_entry.setPromptText(Messages.Password_Prompt); @@ -70,8 +88,12 @@ public PasswordDialog(final String title, final String correct_password) final Button okButton = (Button) pane.lookupButton(ButtonType.OK); okButton.addEventFilter(ActionEvent.ACTION, event -> { - if (! checkPassword()) - event.consume(); + try { + if (! checkPassword()) + event.consume(); + } catch (Exception e) { + throw new RuntimeException(e); + } }); } @@ -83,11 +105,17 @@ public PasswordDialog(final String title, final String correct_password) Platform.runLater(() -> pass_entry.requestFocus()); } - private boolean checkPassword() - { + private boolean checkPassword() throws Exception { final String password = pass_entry.getText(); - if (correct_password.equals(password)) + boolean check; + if ("None".equals(crypted_password.toString())) { + check = correct_password.equals(password); + } else { + check = correct_password.equals(hash(password, crypted_password.toString())); + } + if (check) return true; + setHeaderText(Messages.Password_Error); Platform.runLater(() -> { diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ActionButtonRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ActionButtonRepresentation.java index d72c31f938..6736319563 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ActionButtonRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ActionButtonRepresentation.java @@ -31,6 +31,7 @@ import org.csstudio.display.builder.model.WidgetProperty; import org.csstudio.display.builder.model.WidgetPropertyListener; import org.csstudio.display.builder.model.properties.ActionInfos; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.properties.RotationStep; import org.csstudio.display.builder.model.properties.StringWidgetProperty; import org.csstudio.display.builder.model.spi.ActionInfo; @@ -221,9 +222,11 @@ private void confirm(final Runnable action) { if (model_widget.propConfirmDialog().getValue()) { final String message = model_widget.propConfirmMessage().getValue(); final String password = model_widget.propPassword().getValue(); + final CryptedPassword cryptedPassword = model_widget.propCryptedPassword().getValue(); + // .. check either with password or generic Ok/Cancel prompt if (password.length() > 0) { - if (toolkit.showPasswordDialog(model_widget, message, password) == null) + if (toolkit.showPasswordDialog(model_widget, message, password, cryptedPassword) == null) return; } else if (!toolkit.showConfirmationDialog(model_widget, message)) return; diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/BoolButtonRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/BoolButtonRepresentation.java index 6fe8000d4f..96c0647b99 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/BoolButtonRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/BoolButtonRepresentation.java @@ -20,6 +20,7 @@ import org.csstudio.display.builder.model.WidgetPropertyListener; import org.csstudio.display.builder.model.properties.CommonWidgetProperties; import org.csstudio.display.builder.model.properties.ConfirmDialog; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.util.ModelResourceUtil; import org.csstudio.display.builder.model.util.VTypeUtil; import org.csstudio.display.builder.model.widgets.BoolButtonWidget; @@ -172,9 +173,11 @@ private void confirm(final boolean pressed) { // Require password, or plain prompt? final String message = model_widget.propConfirmMessage().getValue(); final String password = model_widget.propPassword().getValue(); + final CryptedPassword cryptedPassword = model_widget.propCryptedPassword().getValue(); + if (password.length() > 0) { - if (toolkit.showPasswordDialog(model_widget, message, password) == null) + if (toolkit.showPasswordDialog(model_widget, message, password, cryptedPassword) == null) return; } else if (! toolkit.showConfirmationDialog(model_widget, message)) diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/CheckBoxRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/CheckBoxRepresentation.java index db73a336b6..b4bd5efc78 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/CheckBoxRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/CheckBoxRepresentation.java @@ -15,6 +15,7 @@ import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; import org.csstudio.display.builder.model.WidgetProperty; import org.csstudio.display.builder.model.WidgetPropertyListener; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.util.VTypeUtil; import org.csstudio.display.builder.model.widgets.CheckBoxWidget; import org.csstudio.display.builder.representation.javafx.JFXUtil; @@ -100,9 +101,11 @@ private void confirm() { final String message = model_widget.propConfirmMessage().getValue(); final String password = model_widget.propPassword().getValue(); + final CryptedPassword cryptedPassword = model_widget.propCryptedPassword().getValue(); + if (password.length() > 0) { - if (toolkit.showPasswordDialog(model_widget, message, password) == null) + if (toolkit.showPasswordDialog(model_widget, message, password, cryptedPassword) == null) return; } else if (!toolkit.showConfirmationDialog(model_widget, message)) diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ChoiceButtonRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ChoiceButtonRepresentation.java index 2e336eeb0d..957a594453 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ChoiceButtonRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ChoiceButtonRepresentation.java @@ -18,6 +18,7 @@ import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; import org.csstudio.display.builder.model.WidgetProperty; import org.csstudio.display.builder.model.WidgetPropertyListener; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.util.VTypeUtil; import org.csstudio.display.builder.model.widgets.ChoiceButtonWidget; import org.csstudio.display.builder.representation.javafx.Cursors; @@ -198,9 +199,11 @@ private void confirm(final Object value) { final String message = model_widget.propConfirmMessage().getValue(); final String password = model_widget.propPassword().getValue(); + final CryptedPassword cryptedPassword = model_widget.propCryptedPassword().getValue(); + if (password.length() > 0) { - if (toolkit.showPasswordDialog(model_widget, message, password) == null) + if (toolkit.showPasswordDialog(model_widget, message, password, cryptedPassword) == null) return; } else if (!toolkit.showConfirmationDialog(model_widget, message)) diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ComboRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ComboRepresentation.java index b462490dc6..ec7f3a9731 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ComboRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ComboRepresentation.java @@ -17,6 +17,7 @@ import org.csstudio.display.builder.model.DirtyFlag; import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; import org.csstudio.display.builder.model.WidgetProperty; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.util.VTypeUtil; import org.csstudio.display.builder.model.widgets.ComboWidget; import org.csstudio.display.builder.representation.javafx.Cursors; @@ -183,9 +184,11 @@ private void confirm(final String value) { final String message = model_widget.propConfirmMessage().getValue(); final String password = model_widget.propPassword().getValue(); + final CryptedPassword cryptedPassword = model_widget.propCryptedPassword().getValue(); + if (password.length() > 0) { - if (toolkit.showPasswordDialog(model_widget, message, password) == null) + if (toolkit.showPasswordDialog(model_widget, message, password, cryptedPassword) == null) return; } else if (!toolkit.showConfirmationDialog(model_widget, message)) diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/RadioRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/RadioRepresentation.java index c92fb5b4c8..fae51988f4 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/RadioRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/RadioRepresentation.java @@ -18,6 +18,7 @@ import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; import org.csstudio.display.builder.model.WidgetProperty; import org.csstudio.display.builder.model.WidgetPropertyListener; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.util.VTypeUtil; import org.csstudio.display.builder.model.widgets.RadioWidget; import org.csstudio.display.builder.representation.javafx.JFXUtil; @@ -169,9 +170,11 @@ private void confirm(final Object value) { final String message = model_widget.propConfirmMessage().getValue(); final String password = model_widget.propPassword().getValue(); + final CryptedPassword cryptedPassword = model_widget.propCryptedPassword().getValue(); + if (password.length() > 0) { - if (toolkit.showPasswordDialog(model_widget, message, password) == null) + if (toolkit.showPasswordDialog(model_widget, message, password, cryptedPassword) == null) return; } else if (!toolkit.showConfirmationDialog(model_widget, message)) diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/SlideButtonRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/SlideButtonRepresentation.java index 03d92d4bc7..d6c1df2f13 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/SlideButtonRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/SlideButtonRepresentation.java @@ -19,6 +19,7 @@ import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; import org.csstudio.display.builder.model.WidgetProperty; import org.csstudio.display.builder.model.WidgetPropertyListener; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.util.VTypeUtil; import org.csstudio.display.builder.model.widgets.SlideButtonWidget; import org.csstudio.display.builder.representation.javafx.JFXUtil; @@ -234,9 +235,10 @@ private void confirm ( ) { final String message = model_widget.propConfirmMessage().getValue(); final String password = model_widget.propPassword().getValue(); + final CryptedPassword cryptedPassword = model_widget.propCryptedPassword().getValue(); if ( password.length() > 0 ) { - if ( toolkit.showPasswordDialog(model_widget, message, password) == null ) { + if ( toolkit.showPasswordDialog(model_widget, message, password, cryptedPassword) == null ) { return; } } else if ( !toolkit.showConfirmationDialog(model_widget, message) ) { diff --git a/app/display/representation/src/main/java/org/csstudio/display/builder/representation/ToolkitRepresentation.java b/app/display/representation/src/main/java/org/csstudio/display/builder/representation/ToolkitRepresentation.java index ee26bc515b..402d87fd67 100644 --- a/app/display/representation/src/main/java/org/csstudio/display/builder/representation/ToolkitRepresentation.java +++ b/app/display/representation/src/main/java/org/csstudio/display/builder/representation/ToolkitRepresentation.java @@ -12,6 +12,7 @@ import org.csstudio.display.builder.model.Widget; import org.csstudio.display.builder.model.WidgetDescriptor; import org.csstudio.display.builder.model.WidgetPropertyListener; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.spi.ActionInfo; import org.csstudio.display.builder.model.util.ModelThreadPool; import org.csstudio.display.builder.model.widgets.PlaceholderWidget; @@ -549,7 +550,7 @@ public void schedule(final Runnable command, final long delay, final TimeUnit un * @param correct_password Password to check * @return Entered password or null */ - abstract public String showPasswordDialog(final Widget widget, final String title, final String correct_password); + abstract public String showPasswordDialog(final Widget widget, final String title, final String correct_password, final CryptedPassword crypted_password); /** * Show file "Save As" dialog for selecting/entering a new file name diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/script/ScriptUtil.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/script/ScriptUtil.java index 38ad56079e..62e173c3b3 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/script/ScriptUtil.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/script/ScriptUtil.java @@ -31,6 +31,7 @@ import org.csstudio.display.builder.model.DisplayModel; import org.csstudio.display.builder.model.Widget; import org.csstudio.display.builder.model.WidgetProperty; +import org.csstudio.display.builder.model.properties.CryptedPassword; import org.csstudio.display.builder.model.util.ModelResourceUtil; import org.csstudio.display.builder.representation.ToolkitRepresentation; import org.csstudio.display.builder.runtime.ActionUtil; @@ -276,11 +277,11 @@ public static String showSelectionDialog(final Widget widget, final String title * @param correct_password Password to check * @return Entered password or null */ - public static String showPasswordDialog(final Widget widget, final String title, final String correct_password) + public static String showPasswordDialog(final Widget widget, final String title, final String correct_password, final CryptedPassword crypted_password) { try { - return ToolkitRepresentation.getToolkit(widget.getDisplayModel()).showPasswordDialog(widget, title, correct_password); + return ToolkitRepresentation.getToolkit(widget.getDisplayModel()).showPasswordDialog(widget, title, correct_password, crypted_password); } catch (Exception ex) {