/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geogig.geoserver.web.security; import static com.google.common.collect.Lists.newArrayList; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.resource.PackageResourceReference; import org.geogig.geoserver.config.ConfigStore; import org.geogig.geoserver.config.WhitelistRule; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.web.GeoServerApplication; import org.geoserver.web.wicket.GeoServerDataProvider; import org.geoserver.web.wicket.GeoServerDataProvider.Property; import org.geoserver.web.wicket.GeoServerTablePanel; import org.geoserver.web.wicket.ImageAjaxLink; import com.google.common.collect.ImmutableList; public class WhitelistRulePanel extends GeoServerTablePanel<WhitelistRule> { private static final long serialVersionUID = 6946747039214324528L; private final ModalWindow window; private final WhitelistRulesProvider provider; public WhitelistRulePanel(String id, ModalWindow window) { super(id, new WhitelistRulesProvider()); super.setOutputMarkupId(true); super.setSelectable(false); super.setSortable(true); super.setFilterable(true); super.setFilterVisible(true); super.setPageable(true); this.provider = (WhitelistRulesProvider) super.getDataProvider(); this.window = window; } public void save() { provider.save(); } public void add(WhitelistRule rule) { provider.add(rule); } public List<WhitelistRule> getRules() { return provider.getItems(); } @SuppressWarnings("rawtypes") @Override public Component getComponentForProperty(String id, final IModel<WhitelistRule> model, Property<WhitelistRule> property) { if (property == WhitelistRulesProvider.NAME) { return new Label(id, property.getModel(model)); } else if (property == WhitelistRulesProvider.PATTERN) { return new Label(id, property.getModel(model)); } else if (property == WhitelistRulesProvider.REQUIRE_SSL) { final WhitelistRule rule = (WhitelistRule) model.getObject(); @SuppressWarnings("deprecation") Fragment fragment = new Fragment(id, "image.cell", this); if (rule.isRequireSSL()) { fragment.add(new Image("display", new PackageResourceReference(getClass(), "../lock.png"))); } else { fragment.add(new Image("display", new PackageResourceReference(getClass(), "../lock_open.png"))); } return fragment; } else if (property == WhitelistRulesProvider.EDIT) { ImageAjaxLink link = new ImageAjaxLink(id, new PackageResourceReference( GeoServerApplication.class, "img/icons/silk/pencil.png")) { private static final long serialVersionUID = 4467715973193154831L; @Override public void onClick(AjaxRequestTarget target) { window.setInitialHeight(360); window.setInitialWidth(400); window.setTitle(new Model<>("Edit whitelist rule")); window.setContent(new WhitelistRuleEditor(window.getContentId(), model, window, WhitelistRulePanel.this, false)); window.show(target); } }; return link; } else if (property == WhitelistRulesProvider.REMOVE) { final WhitelistRule rule = (WhitelistRule) model.getObject(); ImageAjaxLink link = new ImageAjaxLink(id, new PackageResourceReference( GeoServerApplication.class, "img/icons/silk/delete.png")) { private static final long serialVersionUID = 9069782618988848563L; @Override protected void onClick(AjaxRequestTarget target) { provider.remove(rule); provider.save(); target.add(WhitelistRulePanel.this); } }; // link.getImage().add(new AttributeModifier("alt", true, new // ParamResourceModel("AbstractLayerGroupPage.th.remove", link))); return link; } else { throw new IllegalArgumentException("Property " + property + " is not associated with this component."); } } private static class WhitelistRulesProvider extends GeoServerDataProvider<WhitelistRule> { private static final long serialVersionUID = 7545140184962032147L; private List<WhitelistRule> rules; @Override protected List<Property<WhitelistRule>> getProperties() { return PROPERTIES; } public void add(WhitelistRule rule) { getItems().add(rule); } public void remove(WhitelistRule rule) { getItems().remove(rule); } public void save() { final ConfigStore configStore; configStore = (ConfigStore) GeoServerExtensions.bean("geogigConfigStore"); // make sure rules is set getItems(); configStore.saveWhitelist(rules); } @Override protected List<WhitelistRule> getItems() { if (rules == null) { ConfigStore configStore = (ConfigStore) GeoServerExtensions .bean("geogigConfigStore"); try { rules = new ArrayList<>(configStore.getWhitelist()); } catch (IOException e) { rules = newArrayList(); } } return rules; } private static final Property<WhitelistRule> EDIT = new PropertyPlaceholder<>(""); private static final Property<WhitelistRule> REMOVE = new PropertyPlaceholder<>(""); private static final Property<WhitelistRule> NAME = new BeanProperty<>("Name", "name"); private static final Property<WhitelistRule> PATTERN = new BeanProperty<>("Pattern", "pattern"); private static final Property<WhitelistRule> REQUIRE_SSL = new BeanProperty<>( "Require SSL", "requireSSL"); private static final List<Property<WhitelistRule>> PROPERTIES = ImmutableList.of( NAME, PATTERN, REQUIRE_SSL, EDIT, REMOVE); } }