diff --git a/web/src/main/java/de/hsadmin/web/BinaryPathEditor.java b/web/src/main/java/de/hsadmin/web/BinaryPathEditor.java new file mode 100644 index 0000000..351d066 --- /dev/null +++ b/web/src/main/java/de/hsadmin/web/BinaryPathEditor.java @@ -0,0 +1,137 @@ +package de.hsadmin.web; + +import java.util.List; +import java.util.Map; + +import com.vaadin.ui.CustomComponent; +import com.vaadin.v7.data.Validator; +import com.vaadin.v7.data.Property.ValueChangeEvent; +import com.vaadin.v7.data.Property.ValueChangeListener; +import com.vaadin.v7.ui.HorizontalLayout; +import com.vaadin.v7.ui.NativeSelect; +import com.vaadin.v7.ui.TextField; +import com.vaadin.v7.ui.VerticalLayout; + +import de.hsadmin.rpc.PropertyInfo; + +public class BinaryPathEditor extends CustomComponent implements IHSEditor { + + private static final long serialVersionUID = 1L; + + public static final String[] PYTHON3_PATH = + new String[] { + "/usr/bin/python3" + }; + + public static final String[] RUBY_PATH = + new String[] { + "/usr/bin/ruby" + }; + + public static final String[] NODEJS_PATH = + new String[] { + "/usr/bin/node" + }; + + public static final String[] PHP_CGI_PATH = + new String[] { + "/usr/lib/cgi-bin/php7.4", + "/usr/lib/cgi-bin/php8.0", + "/usr/lib/cgi-bin/php8.1", + "/usr/lib/cgi-bin/php8.2", + "/usr/lib/cgi-bin/php" + }; + + private PropertyInfo propertyInfo; + private I18N i18n; + private HorizontalLayout layout; + private NativeSelect isManagedInstallationSelect; + private NativeSelect managedPathSelect; + private TextField pathField; + + public BinaryPathEditor(final I18N i18n, final PropertyInfo propertyInfo, final String[] values) { + this.propertyInfo = propertyInfo; + this.i18n = i18n; + this.setCaption(i18n.getText(propertyInfo.getName())); + layout = new HorizontalLayout(); + layout.setSpacing(true); + isManagedInstallationSelect = new NativeSelect(); + isManagedInstallationSelect.setMultiSelect(false); + isManagedInstallationSelect.setNullSelectionAllowed(false); + isManagedInstallationSelect.addItem(i18n.getText("patheditor.managed")); + isManagedInstallationSelect.addItem(i18n.getText("patheditor.userspace")); + isManagedInstallationSelect.setValue(i18n.getText("patheditor.managed")); + isManagedInstallationSelect.setVisible(true); + isManagedInstallationSelect.setWidth("200px"); + layout.addComponent(isManagedInstallationSelect); + managedPathSelect = new NativeSelect(); + managedPathSelect.setMultiSelect(false); + managedPathSelect.setNullSelectionAllowed(false); + String defaultPath = ""; + for (String path : values) { + managedPathSelect.addItem(path); + defaultPath = path; + } + managedPathSelect.setValue(defaultPath); + managedPathSelect.setWidth("400px"); + layout.addComponent(managedPathSelect); + pathField = new TextField(); + pathField.setWidth("400px"); + pathField.setVisible(false); + layout.addComponent(pathField); + isManagedInstallationSelect.setImmediate(true); + isManagedInstallationSelect.addValueChangeListener(new ValueChangeListener() { + @Override + public void valueChange(ValueChangeEvent event) { + final Object selectedValue = event.getProperty().getValue(); + if (i18n.getText("patheditor.managed").equals(selectedValue)) { + managedPathSelect.setVisible(true); + pathField.setVisible(false); + } else { + managedPathSelect.setVisible(false); + pathField.setVisible(true); + } + } + }); + setCompositionRoot(layout); + } + + @Override + public void setValues(Map valuesMap) { + Object value = valuesMap.get(propertyInfo.getName()); + if (value == null) value = ""; + if (!(value instanceof String)) value = ""; + String text = (String) value; + if (text.isEmpty() || text.startsWith("/usr/bin/") || text.startsWith("/usr/lib/")) { + isManagedInstallationSelect.setValue(i18n.getText("patheditor.managed")); + managedPathSelect.setValue(text); + } else { + isManagedInstallationSelect.setValue(i18n.getText("patheditor.userspace")); + pathField.setValue(text); + } + } + + @Override + public Object getValue() { + if (i18n.getText("patheditor.managed").equals(isManagedInstallationSelect.getValue())) { + return managedPathSelect.getValue(); + } + return pathField.getValue(); + } + + @Override + public void addValidator(Validator validator) { + pathField.addValidator(validator); + } + + @Override + public boolean isValid() { + Object value = getValue(); + if (value instanceof String) { + String text = (String) value; + return text.startsWith("/usr/") || text.startsWith("/home/"); + } + return false; + } + +} diff --git a/web/src/main/java/de/hsadmin/web/GenericEditorFactory.java b/web/src/main/java/de/hsadmin/web/GenericEditorFactory.java index 98ce5a5..b15e565 100644 --- a/web/src/main/java/de/hsadmin/web/GenericEditorFactory.java +++ b/web/src/main/java/de/hsadmin/web/GenericEditorFactory.java @@ -44,8 +44,17 @@ public class GenericEditorFactory implements IEditorFactory, Serializable { if ("domainoptions".equals(inputName)) { return getDomainOptionsEditor(action, propertyInfo, session, whereContext); } - if ("passengerpython".equals(inputName)|"passengernodejs".equals(inputName)|"passengerruby".equals(inputName)|"fcgiphpbin".equals(inputName)) { - return getScriptingPathEditor(action, propertyInfo); + if ("passengernodejs".equals(inputName)) { + return getScriptingPathEditor(action, propertyInfo, BinaryPathEditor.NODEJS_PATH); + } + if ("passengerpython".equals(inputName)) { + return getScriptingPathEditor(action, propertyInfo, BinaryPathEditor.PYTHON3_PATH); + } + if ("passengerruby".equals(inputName)) { + return getScriptingPathEditor(action, propertyInfo, BinaryPathEditor.RUBY_PATH); + } + if ("fcgiphpbin".equals(inputName)) { + return getScriptingPathEditor(action, propertyInfo, BinaryPathEditor.PHP_CGI_PATH); } } if ("emailaddress".equals(module) || "emailalias".equals(module)) { @@ -80,8 +89,12 @@ public class GenericEditorFactory implements IEditorFactory, Serializable { return PanelToolbar.ACTION_EDIT.equals(action) ? getEditor(action, propertyInfo) : new NullEditor(); } - private IHSEditor getScriptingPathEditor(final String action, final PropertyInfo propertyInfo) { - return PanelToolbar.ACTION_EDIT.equals(action) ? getEditor(action, propertyInfo) : new NullEditor(); + private IHSEditor getScriptingPathEditor(final String action, final PropertyInfo propertyInfo, final String[] selectableValues) { + if (PanelToolbar.ACTION_EDIT.equals(action)) { + final IHSEditor editor = new BinaryPathEditor(i18n, propertyInfo, selectableValues); + return editor; + } + return new NullEditor(); } private IHSEditor getDomainOptionsEditor(final String action, final PropertyInfo propertyInfo, final HSAdminSession session, final Map whereContext) { @@ -158,7 +171,7 @@ public class GenericEditorFactory implements IEditorFactory, Serializable { { final HSPacPrefixedField field = new HSPacPrefixedField(i18n, propertyInfo, delimiter); field.setWidth("100%"); - field.setValue("xyz00-"); + field.setValue("xyz00" + delimiter); enableAndValidate(action, propertyInfo, field); return field; } @@ -166,7 +179,7 @@ public class GenericEditorFactory implements IEditorFactory, Serializable { private IHSEditor getShellSelect(final String action, final PropertyInfo propertyInfo) { final String[] items = new String[] { "/bin/false", "/bin/bash", "/bin/csh", "/bin/dash", "/usr/bin/tcsh", "/usr/bin/zsh", "/usr/bin/passwd" }; - final HSSelect field = new HSSelect(i18n, propertyInfo, 7, Arrays.asList(items)); + final HSSelect field = new HSSelect(i18n, propertyInfo, 1, Arrays.asList(items)); field.setWidth("100%"); field.setEnabled(isWriteAble(propertyInfo, action)); return field; diff --git a/web/src/main/java/de/hsadmin/web/GenericFormWindow.java b/web/src/main/java/de/hsadmin/web/GenericFormWindow.java index d4718e6..6912755 100644 --- a/web/src/main/java/de/hsadmin/web/GenericFormWindow.java +++ b/web/src/main/java/de/hsadmin/web/GenericFormWindow.java @@ -29,7 +29,7 @@ public class GenericFormWindow extends Window implements IHSWindow { this.parent = parent; center(); setModal(true); - setWidth("640px"); + setWidth("960px"); inputFields = new HashMap(); contentForm = new FormLayout(); contentForm.setMargin(true); diff --git a/web/src/main/resources/de/hsadmin/web/main.properties b/web/src/main/resources/de/hsadmin/web/main.properties index c971321..e5d67ad 100644 --- a/web/src/main/resources/de/hsadmin/web/main.properties +++ b/web/src/main/resources/de/hsadmin/web/main.properties @@ -193,3 +193,9 @@ pac.name=Packet name pac.basepac=Packet type pac.hive=Packet server pac.curinetaddr=IPv4 address +patheditor.managed=provided (/usr/bin/..) +patheditor.userspace=Userspace (/home/..) +passengerpython=passenger python binary +passengernodejs=passenger node binary +passengerruby=passenger ruby binary +fcgiphpbin=fcgi php binary \ No newline at end of file diff --git a/web/src/main/resources/de/hsadmin/web/main_de.properties b/web/src/main/resources/de/hsadmin/web/main_de.properties index c4b7003..00fb30e 100644 --- a/web/src/main/resources/de/hsadmin/web/main_de.properties +++ b/web/src/main/resources/de/hsadmin/web/main_de.properties @@ -188,3 +188,9 @@ pac.name=Paket-Name pac.basepac=Paket-Typ pac.hive=Server/Hive pac.curinetaddr=Netzwerk-Adresse (IPv4) +patheditor.managed=vorinstalliert (/usr/bin/..) +patheditor.userspace=Userspace (/home/..) +passengerpython=Passenger Python-Interpreter +passengernodejs=Passenger Node-Interpreter +passengerruby=Passenger Ruby-Interpreter +fcgiphpbin=FCGI-PHP-Interpreter \ No newline at end of file