/** * (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jabylon.rest.ui.wicket.config.sections.security; import java.security.SecureRandom; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.PasswordTextField; import org.apache.wicket.markup.html.form.RequiredTextField; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.validation.validator.EmailAddressValidator; import org.jabylon.rest.ui.model.AttachableModel; import org.jabylon.rest.ui.model.EObjectPropertyModel; import org.jabylon.rest.ui.wicket.BasicPanel; import org.jabylon.rest.ui.wicket.components.ControlGroup; import org.jabylon.rest.ui.wicket.components.UserImagePanel; import org.jabylon.rest.ui.wicket.config.AbstractConfigSection; import org.jabylon.rest.ui.wicket.validators.UniqueNameValidator; import org.jabylon.security.CommonPermissions; import org.jabylon.users.User; import org.jabylon.users.UserManagement; import org.jabylon.users.UsersPackage; import org.osgi.service.prefs.Preferences; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UserConfigSection extends BasicPanel<User> { private static final long serialVersionUID = 1L; private TextField<String> tokenText; public UserConfigSection(String id, IModel<User> model, Preferences prefs) { super(id, model); boolean isLDAP = CommonPermissions.AUTH_TYPE_LDAP.equals(model.getObject().getType()); add(new UserImagePanel("image", getModel(), true)); UserManagement userManagement = getUserManagement(); ControlGroup usernameGroup = new ControlGroup("username-group", nls("username.label"), nls("username.help.block")); RequiredTextField<String> userID = new RequiredTextField<String>("username", new EObjectPropertyModel<String, User>(getModel(), UsersPackage.Literals.USER__NAME)); userID.setEnabled(!isLDAP); if (userManagement != null) userID.add(UniqueNameValidator.fromCollection(getUserManagement().getUsers(), UsersPackage.Literals.USER__NAME, getModel().getObject())); usernameGroup.add(userID); add(usernameGroup); ControlGroup passwordGroup = new ControlGroup("password-group", nls("userpassword.label"), nls("userpassword.help.block")); PasswordTextField passwordTextField = new PasswordTextField("userpassword", new EObjectPropertyModel<String, User>(getModel(), UsersPackage.Literals.USER__PASSWORD)); passwordTextField.setRequired(!isLDAP); passwordTextField.setEnabled(!isLDAP); passwordTextField.setResetPassword(false); passwordGroup.add(passwordTextField); add(passwordGroup); ControlGroup emailGroup = new ControlGroup("email-group", nls("email.label"), nls("email.help.block")); TextField<String> emailField = new TextField<String>("email", new EObjectPropertyModel<String, User>(getModel(), UsersPackage.Literals.USER__EMAIL)); emailField.setEnabled(!isLDAP); emailGroup.add(emailField); emailField.add(EmailAddressValidator.getInstance()); add(emailGroup); ControlGroup displaynameGroup = new ControlGroup("displayname-group", nls("displayName.label"), nls("displayName.help.block")); TextField<String> displayName = new TextField<String>("displayName", new EObjectPropertyModel<String, User>(getModel(), UsersPackage.Literals.USER__DISPLAY_NAME)); displayName.setEnabled(!isLDAP); displaynameGroup.add(displayName); add(displaynameGroup); ControlGroup typeGroup = new ControlGroup("type-group", nls("login.type"), nls("type.help.block")); TextField<String> type = new TextField<String>("type", new EObjectPropertyModel<String, User>(getModel(), UsersPackage.Literals.USER__TYPE)); type.setEnabled(false); typeGroup.add(type); add(typeGroup); EObjectPropertyModel<String, User> tokenModel = new EObjectPropertyModel<String, User>(getModel(), UsersPackage.Literals.USER__TOKEN); ControlGroup generateTokenGroup = new ControlGroup("token-group",nls("token.label"),nls("token.help.block")); generateTokenGroup.add(new AttributeAppender("class", " input-append")); tokenText = new TextField<String>("token", tokenModel); tokenText.setConvertEmptyInputStringToNull(true); generateTokenGroup.add(tokenText); GenerateTokenButton generateTokenButton = new GenerateTokenButton("generate-token",false); generateTokenButton.setDefaultFormProcessing(false); generateTokenGroup.add(generateTokenButton); GenerateTokenButton deleteTokenButton = new GenerateTokenButton("delete-token",true); deleteTokenButton.setDefaultFormProcessing(false); generateTokenGroup.add(deleteTokenButton); add(generateTokenGroup); } @SuppressWarnings("rawtypes") public UserManagement getUserManagement() { IModel<User> model = getModel(); if (model instanceof AttachableModel) { AttachableModel attachable = (AttachableModel) model; IModel<?> parent = attachable.getParent(); if (parent.getObject() instanceof UserManagement) { return (UserManagement) parent.getObject(); } } else if (model.getObject().eContainer() instanceof UserManagement) { return (UserManagement) model.getObject().eContainer(); } return null; } public static class UserConfigSectionContributor extends AbstractConfigSection<User> { private static final long serialVersionUID = 1L; private static Logger logger = LoggerFactory.getLogger(UserConfigSectionContributor.class); @Override public WebMarkupContainer doCreateContents(String id, IModel<User> input, Preferences config) { return new UserConfigSection(id, input, config); } @Override public void commit(IModel<User> input, Preferences config) { User user = input.getObject(); if (input instanceof AttachableModel) { //newly created users are always of type DB user.setType(CommonPermissions.AUTH_TYPE_DB); @SuppressWarnings("rawtypes") AttachableModel<?> model = (AttachableModel) input; Object container = model.getParent().getObject(); if (container instanceof UserManagement) { // only initialize defaults if it is an attachable model // (new user) UserManagement userManagement = (UserManagement) container; CommonPermissions.addDefaultPermissions(userManagement, user); CommonPermissions.addDefaultPermissions(userManagement, user); } else logger.error("Failed to obtain usermanagement for " + user + ". Default permissions will not be initialized"); } } @Override public String getRequiredPermission() { String name = "null"; if (getDomainObject() != null && getDomainObject().getName() != null) name = getDomainObject().getName(); return CommonPermissions.constructPermission(CommonPermissions.USER, name, CommonPermissions.ACTION_CONFIG); } } protected static String generateToken() { SecureRandom random = new SecureRandom(); StringBuilder result = new StringBuilder(); // glues 2 random longs together long number = random.nextLong(); result.append(Long.toHexString(number)); number = random.nextLong(); result.append(Long.toHexString(number)); return result.toString(); } class GenerateTokenButton extends AjaxButton { private boolean delete; public GenerateTokenButton(String id, boolean delete) { super(id); this.delete = delete; } private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); target.add(tokenText); if(delete) tokenText.setDefaultModelObject(""); else tokenText.setDefaultModelObject(generateToken()); } } }