/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.security.web; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponentPanel; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.security.AuthenticationKeyFilterConfig; import org.geoserver.security.AuthenticationKeyMapper; import org.geoserver.security.GeoServerAuthenticationKeyFilter; import org.geoserver.security.web.auth.AuthenticationFilterPanel; import org.geoserver.security.web.usergroup.UserGroupServiceChoice; import org.geoserver.web.util.MapModel; import org.geoserver.web.wicket.GeoServerDialog; import org.geoserver.web.wicket.HelpLink; import org.geotools.util.logging.Logging; /** * Configuration panel for {@link GeoServerAuthenticationKeyFilter}. * * @author mcr */ public class AuthenticationKeyFilterPanel extends AuthenticationFilterPanel<AuthenticationKeyFilterConfig> { private static final long serialVersionUID = 1; static Logger LOGGER = Logging.getLogger("org.geoserver.security"); GeoServerDialog dialog; IModel<AuthenticationKeyFilterConfig> model; public AuthenticationKeyFilterPanel(String id, IModel<AuthenticationKeyFilterConfig> model) { super(id, model); dialog = (GeoServerDialog) get("dialog"); this.model=model; add(new HelpLink("authKeyParametersHelp",this).setDialog(dialog)); add(new TextField<String>("authKeyParamName")); Map<String, String> parameters = model.getObject().getMapperParameters(); final ParamsPanel paramsPanel = createParamsPanel("authKeyMapperParamsPanel", model.getObject().getAuthKeyMapperName() ,parameters); AuthenticationKeyMapperChoice authenticationKeyMapperChoice = new AuthenticationKeyMapperChoice("authKeyMapperName"); authenticationKeyMapperChoice.add(new AjaxFormComponentUpdatingBehavior("change") { protected void onUpdate(AjaxRequestTarget target) { String newSelection = (String) getFormComponent().getConvertedInput(); Map<String, String> parameters = getMapperParameters(newSelection); AuthenticationKeyFilterPanel.this.model.getObject().setMapperParameters(parameters); paramsPanel.updateParameters(newSelection, parameters); target.add(paramsPanel); } }); add(authenticationKeyMapperChoice); add(new UserGroupServiceChoice("userGroupServiceName")); add(new WebMarkupContainer("authKeyMapperParamsContainer") .add(paramsPanel).setOutputMarkupId(true)); add(new AjaxSubmitLink("synchronize") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { //AuthenticationKeyFilterPanel.this.updateModel(); AuthenticationKeyFilterConfig config = AuthenticationKeyFilterPanel.this.model.getObject(); getSecurityManager().saveFilter(config); AuthenticationKeyMapper mapper = (AuthenticationKeyMapper) GeoServerExtensions.bean(config.getAuthKeyMapperName()); mapper.setSecurityManager(getSecurityManager()); mapper.setUserGroupServiceName(config.getUserGroupServiceName()); int numberOfNewKeys=mapper.synchronize(); info(new StringResourceModel("synchronizeSuccessful",AuthenticationKeyFilterPanel.this).setParameters(numberOfNewKeys).getObject()); } catch(Exception e) { error(e); LOGGER.log(Level.WARNING, "Authentication key error ", e); } finally { target.add(getPage().get("feedback")); } } }.setDefaultFormProcessing(true)); } class ParamsPanel extends FormComponentPanel { public ParamsPanel(String id, String authMapperName, Map<String, String> parameters) { super(id, new Model()); updateParameters(authMapperName, parameters); } private void updateParameters(final String authMapperName, final Map<String, String> parameters) { removeAll(); add(new ListView<String>("parametersList", new Model(new ArrayList<String>(parameters.keySet()))) { @Override protected void populateItem(ListItem<String> item) { item.add(new Label("parameterName", new StringResourceModel( "AuthenticationKeyFilterPanel." + authMapperName + "." + item.getModel().getObject(), this, null))); item.add(new TextField<String>("parameterField", new MapModel(parameters, item.getModel().getObject()))); } }); } public void resetModel() { } } private ParamsPanel createParamsPanel(String id, String authKeyMapperName, Map<String, String> parameters) { ParamsPanel paramsPanel = new ParamsPanel(id, authKeyMapperName, parameters); paramsPanel.setOutputMarkupId(true); return paramsPanel; } private Map<String, String> getMapperParameters(String authKeyMapperName) { if(authKeyMapperName != null) { AuthenticationKeyMapper mapper = (AuthenticationKeyMapper)GeoServerExtensions.bean(authKeyMapperName); if(mapper != null) { return mapper.getMapperConfiguration(); } } return new HashMap<String, String>(); } }