blob: 6c86b8059ce6cdbd7449aa99b1b5b051f900437a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.client.console.wizards;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.SyncopeWebApplication;
import org.apache.syncope.client.console.panels.SAML2IdPsDirectoryPanel;
import org.apache.syncope.client.console.rest.ImplementationRestClient;
import org.apache.syncope.client.console.rest.SAML2IdPsRestClient;
import org.apache.syncope.client.console.wizards.mapping.JEXLTransformersTogglePanel;
import org.apache.syncope.client.console.wizards.mapping.ItemTransformersTogglePanel;
import org.apache.syncope.client.console.wizards.mapping.SAML2IdPMappingPanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
import org.apache.syncope.client.ui.commons.wizards.AjaxWizardBuilder;
import org.apache.syncope.common.lib.to.EntityTO;
import org.apache.syncope.common.lib.to.ItemTO;
import org.apache.syncope.common.lib.to.SAML2SP4UIIdPTO;
import org.apache.syncope.common.lib.types.SAML2BindingType;
import org.apache.syncope.common.lib.types.SAML2SP4UIImplementationType;
import org.apache.wicket.Component;
import org.apache.wicket.PageReference;
import org.apache.wicket.extensions.wizard.WizardModel;
import org.apache.wicket.extensions.wizard.WizardStep;
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.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.model.util.ListModel;
public class SAML2IdPWizardBuilder extends AjaxWizardBuilder<SAML2SP4UIIdPTO> {
private static final long serialVersionUID = 5952696913893950460L;
private final SAML2IdPsDirectoryPanel directoryPanel;
private final IModel<List<String>> idpActions = new LoadableDetachableModel<>() {
private static final long serialVersionUID = 5275935387613157437L;
@Override
protected List<String> load() {
return ImplementationRestClient.list(SAML2SP4UIImplementationType.IDP_ACTIONS).stream().
map(EntityTO::getKey).sorted().collect(Collectors.toList());
}
};
private final IModel<List<String>> requestedAuthnContextProviders = new LoadableDetachableModel<>() {
private static final long serialVersionUID = 4659376149825914247L;
@Override
protected List<String> load() {
return ImplementationRestClient.list(SAML2SP4UIImplementationType.REQUESTED_AUTHN_CONTEXT_PROVIDER).
stream().map(EntityTO::getKey).sorted().collect(Collectors.toList());
}
};
public SAML2IdPWizardBuilder(
final SAML2IdPsDirectoryPanel directoryPanel, final SAML2SP4UIIdPTO idpTO, final PageReference pageRef) {
super(idpTO, pageRef);
this.directoryPanel = directoryPanel;
}
@Override
protected WizardModel buildModelSteps(final SAML2SP4UIIdPTO modelObject, final WizardModel wizardModel) {
wizardModel.add(new IdP(modelObject));
Mapping mapping = new Mapping();
mapping.setOutputMarkupId(true);
ItemTransformersTogglePanel mapItemTransformers = new ItemTransformersTogglePanel(mapping, pageRef);
addOuterObject(mapItemTransformers);
JEXLTransformersTogglePanel jexlTransformers = new JEXLTransformersTogglePanel(mapping, pageRef);
addOuterObject(jexlTransformers);
mapping.add(new SAML2IdPMappingPanel("mapping", modelObject, mapItemTransformers, jexlTransformers));
wizardModel.add(mapping);
return wizardModel;
}
@Override
protected long getMaxWaitTimeInSeconds() {
return SyncopeWebApplication.get().getMaxWaitTimeInSeconds();
}
@Override
protected void sendError(final Exception exception) {
SyncopeConsoleSession.get().onException(exception);
}
@Override
protected void sendWarning(final String message) {
SyncopeConsoleSession.get().warn(message);
}
@Override
protected Future<Pair<Serializable, Serializable>> execute(
final Callable<Pair<Serializable, Serializable>> future) {
return SyncopeConsoleSession.get().execute(future);
}
private final class IdP extends WizardStep {
private static final long serialVersionUID = 854012593185195024L;
IdP(final SAML2SP4UIIdPTO idpTO) {
super(StringUtils.EMPTY, StringUtils.EMPTY);
List<Component> fields = new ArrayList<>();
FieldPanel<String> name = new AjaxTextFieldPanel(
"field", "name", new PropertyModel<>(idpTO, "name"), false);
name.setRequired(true);
fields.add(name);
AjaxCheckBoxPanel createUnmatching = new AjaxCheckBoxPanel(
"field", "createUnmatching", new PropertyModel<>(idpTO, "createUnmatching"), false);
fields.add(createUnmatching);
AjaxCheckBoxPanel selfRegUnmatching = new AjaxCheckBoxPanel(
"field", "selfRegUnmatching", new PropertyModel<>(idpTO, "selfRegUnmatching"), false);
fields.add(selfRegUnmatching);
AjaxCheckBoxPanel updateMatching = new AjaxCheckBoxPanel(
"field", "updateMatching", new PropertyModel<>(idpTO, "updateMatching"), false);
fields.add(updateMatching);
AjaxDropDownChoicePanel<SAML2BindingType> bindingType =
new AjaxDropDownChoicePanel<>("field", "bindingType",
new PropertyModel<>(idpTO, "bindingType"), false);
bindingType.setChoices(List.of(SAML2BindingType.values()));
fields.add(bindingType);
AjaxTextFieldPanel requestedAuthnContextProvider = new AjaxTextFieldPanel(
"field", "requestedAuthnContextProvider",
new PropertyModel<>(idpTO, "requestedAuthnContextProvider"));
requestedAuthnContextProvider.setChoices(
requestedAuthnContextProviders.getObject());
fields.add(requestedAuthnContextProvider);
AjaxPalettePanel<String> actions = new AjaxPalettePanel.Builder<String>().
setAllowMoveAll(true).setAllowOrder(true).
setName(new StringResourceModel("actions", directoryPanel).getString()).
build("field",
new PropertyModel<>(idpTO, "actions"),
new ListModel<>(idpActions.getObject()));
actions.setOutputMarkupId(true);
fields.add(actions);
add(new ListView<>("fields", fields) {
private static final long serialVersionUID = -9180479401817023838L;
@Override
protected void populateItem(final ListItem<Component> item) {
item.add(item.getModelObject());
}
});
}
}
/**
* Mapping definition step.
*/
private static final class Mapping extends WizardStep {
private static final long serialVersionUID = 3454904947720856253L;
Mapping() {
setTitleModel(Model.of("Mapping"));
setSummaryModel(Model.of(StringUtils.EMPTY));
}
}
@Override
protected Serializable onApplyInternal(final SAML2SP4UIIdPTO modelObject) {
long connObjectKeyCount = modelObject.getItems().stream().filter(ItemTO::isConnObjectKey).count();
if (connObjectKeyCount != 1) {
throw new IllegalArgumentException(
new StringResourceModel("connObjectKeyValidation", directoryPanel).getString());
}
SAML2IdPsRestClient.update(modelObject);
return modelObject;
}
}