/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.registration; import java.util.ArrayList; import java.util.List; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.ValidationError; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; import org.olat.core.helpers.Settings; import org.olat.core.util.StringHelper; import org.olat.user.UserPropertiesConfig; import org.olat.user.propertyhandlers.Generic127CharTextPropertyHandler; import org.olat.user.propertyhandlers.UserPropertyHandler; /** * Admin panel to configure the registration settings: should link appear on the login page... * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class RegistrationAdminController extends FormBasicController { private MultipleSelectionElement registrationElement; private MultipleSelectionElement registrationLinkElement; private MultipleSelectionElement registrationLoginElement; private MultipleSelectionElement staticPropElement; private SingleSelection propertyElement; private TextElement propertyValueElement; private TextElement exampleElement; private TextElement domainListElement; private FormLayoutContainer domainsContainer; private FormLayoutContainer staticPropContainer; private static final String[] enableRegistrationKeys = new String[]{ "on" }; private static final String[] enableRegistrationValues = new String[1]; private String[] propertyKeys, propertyValues; private final RegistrationModule registrationModule; private final RegistrationManager registrationManager; private final UserPropertiesConfig userPropertiesConfig; private final Translator userPropTranslator; public RegistrationAdminController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl, "admin"); registrationModule = CoreSpringFactory.getImpl(RegistrationModule.class); registrationManager = CoreSpringFactory.getImpl(RegistrationManager.class); userPropertiesConfig = CoreSpringFactory.getImpl(UserPropertiesConfig.class); //decorate the translator userPropTranslator = userPropertiesConfig.getTranslator(getTranslator()); enableRegistrationValues[0] = translate("admin.enableRegistration.on"); List<UserPropertyHandler> allPropertyHandlers = userPropertiesConfig.getAllUserPropertyHandlers(); List<UserPropertyHandler> propertyHandlers = new ArrayList<UserPropertyHandler>(allPropertyHandlers.size()); for(UserPropertyHandler handler:allPropertyHandlers) { if(handler instanceof Generic127CharTextPropertyHandler) { propertyHandlers.add(handler); } } propertyKeys = new String[propertyHandlers.size() + 1]; propertyValues = new String[propertyHandlers.size() + 1]; int count = 0; propertyKeys[0] = "-"; propertyValues[0] = ""; for(UserPropertyHandler propertyHandler:propertyHandlers) { propertyKeys[1 + count] = propertyHandler.getName(); propertyValues[1 + count++] = userPropTranslator.translate(propertyHandler.i18nFormElementLabelKey()); } initForm(ureq); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { //settings FormLayoutContainer settingsContainer = FormLayoutContainer.createDefaultFormLayout("settings", getTranslator()); settingsContainer.setRootForm(mainForm); settingsContainer.setFormTitle(translate("admin.registration.title")); formLayout.add(settingsContainer); registrationElement = uifactory.addCheckboxesHorizontal("enable.self.registration", "admin.enableRegistration", settingsContainer, enableRegistrationKeys, enableRegistrationValues); registrationElement.addActionListener(FormEvent.ONCHANGE); registrationElement.select("on", registrationModule.isSelfRegistrationEnabled()); registrationLoginElement = uifactory.addCheckboxesHorizontal("enable.registration.login", "admin.enableRegistrationLogin", settingsContainer, enableRegistrationKeys, enableRegistrationValues); registrationLoginElement.addActionListener(FormEvent.ONCHANGE); registrationLoginElement.select("on", registrationModule.isSelfRegistrationLoginEnabled()); registrationLinkElement = uifactory.addCheckboxesHorizontal("enable.registration.link", "admin.enableRegistrationLink", settingsContainer, enableRegistrationKeys, enableRegistrationValues); registrationLinkElement.addActionListener(FormEvent.ONCHANGE); registrationLinkElement.select("on", registrationModule.isSelfRegistrationLinkEnabled()); String example = generateExampleCode(); exampleElement = uifactory.addTextAreaElement("registration.link.example", "admin.registrationLinkExample", 64000, 4, 65, true, example, settingsContainer); //domain configuration domainsContainer = FormLayoutContainer.createDefaultFormLayout("domains", getTranslator()); domainsContainer.setRootForm(mainForm); domainsContainer.setFormTitle(translate("admin.registration.domains.title")); formLayout.add(domainsContainer); uifactory.addStaticTextElement("admin.registration.domains.error", null, translate("admin.registration.domains.desc"), domainsContainer); String domainsList = registrationModule.getDomainListRaw(); domainListElement = uifactory.addTextAreaElement("registration.domain.list", "admin.registration.domains", 64000, 10, 65, true, domainsList, domainsContainer); //static property staticPropContainer = FormLayoutContainer.createDefaultFormLayout("propertiesmapping", getTranslator()); staticPropContainer.setRootForm(mainForm); staticPropContainer.setFormTitle(translate("admin.registration.staticprop.title")); formLayout.add(staticPropContainer); uifactory.addStaticTextElement("admin.registration.staticprop.error", null, translate("admin.registration.staticprop.desc"), staticPropContainer); staticPropElement = uifactory.addCheckboxesHorizontal("enable.staticprop", "admin.enableStaticProp", staticPropContainer, enableRegistrationKeys, enableRegistrationValues); staticPropElement.addActionListener(FormEvent.ONCHANGE); staticPropElement.select("on", registrationModule.isStaticPropertyMappingEnabled()); propertyElement = uifactory.addDropdownSingleselect("property", "admin.registration.property", staticPropContainer, propertyKeys, propertyValues, null); String propertyName = registrationModule.getStaticPropertyMappingName(); UserPropertyHandler handler = userPropertiesConfig.getPropertyHandler(propertyName); if(handler != null) { propertyElement.select(handler.getName(), true); } propertyElement.addActionListener(FormEvent.ONCHANGE); String propertyValue = registrationModule.getStaticPropertyMappingValue(); propertyValueElement = uifactory.addTextElement("admin.registration.prop.value", "admin.registration.propertyValue", 255, propertyValue, staticPropContainer); //static property FormLayoutContainer remoteLoginContainerContainer = FormLayoutContainer.createDefaultFormLayout("remotelogin", getTranslator()); remoteLoginContainerContainer.setRootForm(mainForm); remoteLoginContainerContainer.setFormTitle(translate("remote.login.title")); formLayout.add(remoteLoginContainerContainer); String remoteExample = generateRemoteLoginExampleCode(); uifactory.addTextAreaElement("remotelogin.example", "admin.registrationLinkExample", 64000, 4, 65, true, remoteExample, remoteLoginContainerContainer); FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); buttonGroupLayout.setRootForm(mainForm); uifactory.addFormSubmitButton("save", buttonGroupLayout); formLayout.add(buttonGroupLayout); updateUI(); } @Override protected void doDispose() { // } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if(source == registrationElement) { boolean enable = registrationElement.isSelected(0); registrationModule.setSelfRegistrationEnabled(enable); updateUI(); } else if(source == registrationLinkElement) { registrationModule.setSelfRegistrationLinkEnabled(registrationLinkElement.isSelected(0)); updateUI(); } else if(source == registrationLoginElement) { registrationModule.setSelfRegistrationLoginEnabled(registrationLoginElement.isSelected(0)); updateUI(); } else if (source == staticPropElement) { registrationModule.setStaticPropertyMappingEnabled(staticPropElement.isSelected(0)); updateUI(); } super.formInnerEvent(ureq, source, event); } private void updateUI() { boolean enableMain = registrationElement.isSelected(0); registrationLinkElement.setEnabled(enableMain); registrationLoginElement.setEnabled(enableMain); boolean example = enableMain && registrationLinkElement.isSelected(0); exampleElement.setVisible(example); boolean enableDomains = enableMain && (registrationLinkElement.isSelected(0) || registrationLoginElement.isSelected(0)); domainsContainer.setVisible(enableDomains); //static prop boolean enableProps = enableMain && (registrationLinkElement.isSelected(0) || registrationLoginElement.isSelected(0)); staticPropContainer.setVisible(enableProps); boolean enabledProp = staticPropElement.isSelected(0); propertyElement.setVisible(enableProps && enabledProp); propertyValueElement.setVisible(enableProps && enabledProp); } @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; String whiteList = domainListElement.getValue(); domainListElement.clearError(); if(StringHelper.containsNonWhitespace(whiteList)) { List<String> normalizedList = registrationModule.getDomainList(whiteList); List<String> errors = registrationManager.validateWhiteList(normalizedList); if(!errors.isEmpty()) { StringBuilder sb = new StringBuilder(); for(String error:errors) { if(sb.length() > 0) sb.append(" ,"); sb.append(error); } domainListElement.setErrorKey("admin.registration.domains.error", new String[]{sb.toString()}); allOk &= false; } } if(staticPropElement.isSelected(0)) { if(propertyElement.isOneSelected()) { String propertyName = propertyElement.getSelectedKey(); String value = propertyValueElement.getValue(); UserPropertyHandler handler = userPropertiesConfig.getPropertyHandler(propertyName); if(handler != null) { ValidationError validationError = new ValidationError(); boolean valid = handler.isValidValue(null, value, validationError, getLocale()); if(!valid) { propertyValueElement.setErrorKey("admin.registration.propertyValue.error", null); allOk &= false; } } } } return allOk && super.validateFormLogic(ureq); } @Override protected void formOK(UserRequest ureq) { registrationModule.setSelfRegistrationEnabled(registrationElement.isSelected(0)); registrationModule.setSelfRegistrationLinkEnabled(registrationLinkElement.isSelected(0)); registrationModule.setSelfRegistrationLoginEnabled(registrationLoginElement.isSelected(0)); String domains = domainListElement.getValue(); registrationModule.setDomainListRaw(domains); registrationModule.setStaticPropertyMappingEnabled(staticPropElement.isSelected(0)); if(propertyElement.isOneSelected()) { registrationModule.setStaticPropertyMappingName(propertyElement.getSelectedKey()); } else { registrationModule.setStaticPropertyMappingName("-"); } registrationModule.setStaticPropertyMappingValue(propertyValueElement.getValue()); } private String generateExampleCode() { StringBuilder code = new StringBuilder(); code.append("<form name=\"openolatregistration\" action=\"") .append(Settings.getServerContextPathURI()).append("/url/registration/0") .append("\" method=\"post\" target=\"OpenOLAT\" onsubmit=\"var openolat=window.open('','OpenOLAT',''); openolat.focus();\">\n") .append(" <input type=\"submit\" value=\"Go to registration\">\n") .append("</form>"); return code.toString(); } private String generateRemoteLoginExampleCode() { StringBuilder code = new StringBuilder(); code.append("<form name=\"olatremotelogin\" action=\"") .append(Settings.getServerContextPathURI()).append("/remotelogin/") .append("\" method=\"post\" target=\"OpenOLAT\" onsubmit=\"var openolat=window.open('','OpenOLAT', 'location=no,menubar=no,resizable=yes,toolbar=no,statusbar=no,scrollbars=yes'); openolat.focus();\">\n") .append(" Benutzername <input type=\"text\" name=\"username\">") .append(" Passwort <input type=\"password\" name=\"pwd\">") .append(" <input type=\"submit\" value=\"Login\">\n") .append("</form>"); return code.toString(); } }