package net.databinder.auth.components; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.zip.DataFormatException; import net.databinder.auth.AuthApplication; import net.databinder.auth.AuthSession; import net.databinder.auth.data.DataUser; import net.databinder.auth.valid.EqualPasswordConvertedInputValidator; import net.databinder.components.DataStyleLink; import net.databinder.components.ModelSourceListPanel; import net.databinder.components.NullPlug; import net.databinder.components.UnbindLink; import net.databinder.models.BindingModel; import org.apache.wicket.Component; import org.apache.wicket.authorization.strategies.role.Roles; import org.apache.wicket.authorization.strategies.role.annotations.AuthorizeInstantiation; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.RequiredTextField; import org.apache.wicket.markup.html.form.SimpleFormComponentLabel; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IChainingModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; /** * User administration page. Lists all users, allows editing usernames, passwords, and roles. * Must have Role.ADMIN to view. Replaceable String resources: <pre> * data.auth.user_admin * data.auth.user_add * data.auth.username * data.auth.password * data.auth.passwordConfirm * data.auth.roles * data.auth.save * data.auth.delete</pre> * @see AuthSession */ @AuthorizeInstantiation(Roles.ADMIN) public abstract class UserAdminPageBase<T extends DataUser> extends WebPage { protected Form<T> form; protected Form<T> getUserForm() { return form; } public UserAdminPageBase() { add(new DataStyleLink("css")); add(new Label("title", new ResourceModel("data.auth.user_admin", "User Administration"))); add(new Label("heading", new ResourceModel("data.auth.user_admin", "User Administration"))); Class<T> userClass = ((AuthApplication<T>) getApplication()).getUserClass(); add(statusPanel("userStatus")); form = adminForm("form", userClass); add(form); TextField<String> username = new RequiredTextField<String>("username"); username.setLabel(new ResourceModel("data.auth.username", "Username")); form.add(new SimpleFormComponentLabel("username-label", username)); form.add(username); TextField<String> password = new RSAPasswordTextField("password", new Model<String>(), form) { @Override public boolean isRequired() { return !isBound(); } @Override protected void onModelChanged() { setPassword((String) getModelObject()); } }; password.setLabel(new ResourceModel("data.auth.password", "Password")); form.add(new SimpleFormComponentLabel("password-label", password)); form.add(password); TextField<String> passwordConfirm = new RSAPasswordTextField("passwordConfirm", new Model<String>(), form) { public boolean isRequired() { return !isBound(); } }; form.add(new EqualPasswordConvertedInputValidator(password, passwordConfirm)); passwordConfirm.setLabel(new ResourceModel("data.auth.passwordConfirm", "Retype Password")); form.add(new SimpleFormComponentLabel("passwordConfirm-label", passwordConfirm)); form.add(passwordConfirm); form.add(new Label("roles-text", new ResourceModel("data.auth.roles", "Roles"))); form.add(new CheckBoxMultipleChoice<String>("roles", rolesModel(), new AbstractReadOnlyModel<List<? extends String>>() { public List<String> getObject() { return getRoleChoices(); } })); form.add(lowFormSocket("lowForm")); form.add(deleteButton("delete")); form.add(new FeedbackPanel("feedback")); add(new UnbindLink<T>("add", form, getBindingModel()) .add(new Label("text", new ResourceModel("data.auth.user_add", "Add new user")))); add(new ModelSourceListPanel<T>("users", form, "username", userList(userClass))); } protected T getUser() { return form.getModelObject(); } protected void setPassword(String password) { if (password != null) getUser().getPassword().change(password); } @SuppressWarnings("unchecked") protected BindingModel<T> getBindingModel() { return (BindingModel<T>) ((IChainingModel)form.getModel()).getChainedModel(); } protected boolean isBound() { return getBindingModel().isBound(); } protected abstract Form<T> adminForm(String id, Class<T> userClass); protected abstract Button deleteButton(String id); protected abstract DataUserStatusPanelBase statusPanel(String id); protected abstract IModel<List<T>> userList(Class<T> userClass); protected Component lowFormSocket(String id) { return new NullPlug(id); } protected IModel<Collection<String>> rolesModel() { return null; } protected List<String> getRoleChoices() { return Arrays.asList(Roles.USER, Roles.ADMIN); } }