KEYCLOAK-9599 Remove Wildfly 8 adapter
This commit is contained in:
parent
3bbab225c8
commit
9a5b85910a
54 changed files with 1 additions and 4002 deletions
|
@ -34,18 +34,4 @@
|
||||||
<module>wildfly-adapter</module>
|
<module>wildfly-adapter</module>
|
||||||
<module>wildfly-subsystem</module>
|
<module>wildfly-subsystem</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<profiles>
|
|
||||||
<profile>
|
|
||||||
<id>community</id>
|
|
||||||
<activation>
|
|
||||||
<property>
|
|
||||||
<name>!product</name>
|
|
||||||
</property>
|
|
||||||
</activation>
|
|
||||||
<modules>
|
|
||||||
<module>wf8-subsystem</module>
|
|
||||||
</modules>
|
|
||||||
</profile>
|
|
||||||
</profiles>
|
|
||||||
</project>
|
</project>
|
|
@ -1,110 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-parent</artifactId>
|
|
||||||
<version>7.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>keycloak-wf8-subsystem</artifactId>
|
|
||||||
<name>Keycloak Wildfly 8 Adapter Subsystem</name>
|
|
||||||
<description/>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<wildfly.version>8.2.0.Final</wildfly.version>
|
|
||||||
<wildfly.core.version>8.2.0.Final</wildfly.core.version>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<redirectTestOutputToFile>false</redirectTestOutputToFile>
|
|
||||||
<enableAssertions>true</enableAssertions>
|
|
||||||
<systemProperties>
|
|
||||||
<property>
|
|
||||||
<name>jboss.home</name>
|
|
||||||
<value>${jboss.home}</value>
|
|
||||||
</property>
|
|
||||||
</systemProperties>
|
|
||||||
<includes>
|
|
||||||
<include>**/*TestCase.java</include>
|
|
||||||
</includes>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.wildfly</groupId>
|
|
||||||
<artifactId>wildfly-controller</artifactId>
|
|
||||||
<version>${wildfly.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.wildfly</groupId>
|
|
||||||
<artifactId>wildfly-server</artifactId>
|
|
||||||
<version>${wildfly.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.wildfly</groupId>
|
|
||||||
<artifactId>wildfly-web-common</artifactId>
|
|
||||||
<version>${wildfly.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jboss.logging</groupId>
|
|
||||||
<artifactId>jboss-logging-annotations</artifactId>
|
|
||||||
<version>${jboss.logging.tools.wf8.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jboss.logging</groupId>
|
|
||||||
<artifactId>jboss-logging-processor</artifactId>
|
|
||||||
<version>${jboss.logging.tools.wf8.version}</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.wildfly</groupId>
|
|
||||||
<artifactId>wildfly-subsystem-test-framework</artifactId>
|
|
||||||
<version>${wildfly.version}</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wildfly-adapter</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractAddStepHandler;
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.as.controller.ServiceVerificationHandler;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.msc.service.ServiceController;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a credential to a deployment.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class CredentialAddHandler extends AbstractAddStepHandler {
|
|
||||||
|
|
||||||
public CredentialAddHandler(AttributeDefinition... attributes) {
|
|
||||||
super(attributes);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.addCredential(operation, context.resolveExpressions(model));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.PathElement;
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
|
|
||||||
import org.jboss.as.controller.SimpleResourceDefinition;
|
|
||||||
import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
|
|
||||||
import org.jboss.as.controller.operations.validation.StringLengthValidator;
|
|
||||||
import org.jboss.as.controller.registry.ManagementResourceRegistration;
|
|
||||||
import org.jboss.dmr.ModelType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines attributes and operations for a credential.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class CredentialDefinition extends SimpleResourceDefinition {
|
|
||||||
|
|
||||||
public static final String TAG_NAME = "credential";
|
|
||||||
|
|
||||||
protected static final AttributeDefinition VALUE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("value", ModelType.STRING, false)
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, false, true))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
public CredentialDefinition() {
|
|
||||||
super(PathElement.pathElement(TAG_NAME),
|
|
||||||
KeycloakExtension.getResourceDescriptionResolver(TAG_NAME),
|
|
||||||
new CredentialAddHandler(VALUE),
|
|
||||||
CredentialRemoveHandler.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
|
|
||||||
super.registerOperations(resourceRegistration);
|
|
||||||
resourceRegistration.registerOperationHandler(GenericSubsystemDescribeHandler.DEFINITION, GenericSubsystemDescribeHandler.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
|
|
||||||
super.registerAttributes(resourceRegistration);
|
|
||||||
resourceRegistration.registerReadWriteAttribute(VALUE, null, new CredentialReadWriteAttributeHandler());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractWriteAttributeHandler;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update a credential value.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class CredentialReadWriteAttributeHandler extends AbstractWriteAttributeHandler<KeycloakAdapterConfigService> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
|
|
||||||
ModelNode resolvedValue, ModelNode currentValue, AbstractWriteAttributeHandler.HandbackHolder<KeycloakAdapterConfigService> hh) throws OperationFailedException {
|
|
||||||
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.updateCredential(operation, attributeName, resolvedValue);
|
|
||||||
|
|
||||||
hh.setHandback(ckService);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
|
|
||||||
ModelNode valueToRestore, ModelNode valueToRevert, KeycloakAdapterConfigService ckService) throws OperationFailedException {
|
|
||||||
ckService.updateCredential(operation, attributeName, valueToRestore);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractRemoveStepHandler;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a credential from a deployment.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public final class CredentialRemoveHandler extends AbstractRemoveStepHandler {
|
|
||||||
|
|
||||||
public static CredentialRemoveHandler INSTANCE = new CredentialRemoveHandler();
|
|
||||||
|
|
||||||
private CredentialRemoveHandler() {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.removeCredential(operation);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,129 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.server.deployment.DeploymentPhaseContext;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnit;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
|
||||||
import org.jboss.as.web.common.WarMetaData;
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
import org.jboss.metadata.javaee.spec.ParamValueMetaData;
|
|
||||||
import org.jboss.metadata.web.jboss.JBossWebMetaData;
|
|
||||||
import org.jboss.metadata.web.spec.LoginConfigMetaData;
|
|
||||||
import org.keycloak.subsystem.wf8.logging.KeycloakLogger;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pass authentication data (keycloak.json) as a servlet context param so it can be read by the KeycloakServletExtension.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class KeycloakAdapterConfigDeploymentProcessor implements DeploymentUnitProcessor {
|
|
||||||
protected Logger log = Logger.getLogger(KeycloakAdapterConfigDeploymentProcessor.class);
|
|
||||||
|
|
||||||
// This param name is defined again in Keycloak Undertow Integration class
|
|
||||||
// org.keycloak.adapters.undertow.KeycloakServletExtension. We have this value in
|
|
||||||
// two places to avoid dependency between Keycloak Subsystem and Keyclaok Undertow Integration.
|
|
||||||
public static final String AUTH_DATA_PARAM_NAME = "org.keycloak.json.adapterConfig";
|
|
||||||
|
|
||||||
// not sure if we need this yet, keeping here just in case
|
|
||||||
protected void addSecurityDomain(DeploymentUnit deploymentUnit, KeycloakAdapterConfigService service) {
|
|
||||||
if (!service.isSecureDeployment(deploymentUnit)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
|
|
||||||
if (warMetaData == null) return;
|
|
||||||
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
|
||||||
if (webMetaData == null) return;
|
|
||||||
|
|
||||||
LoginConfigMetaData loginConfig = webMetaData.getLoginConfig();
|
|
||||||
if (loginConfig == null || !loginConfig.getAuthMethod().equalsIgnoreCase("KEYCLOAK")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
webMetaData.setSecurityDomain("keycloak");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
|
|
||||||
DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
|
||||||
|
|
||||||
KeycloakAdapterConfigService service = KeycloakAdapterConfigService.getInstance();
|
|
||||||
if (service.isSecureDeployment(deploymentUnit) && service.isDeploymentConfigured(deploymentUnit)) {
|
|
||||||
addKeycloakAuthData(phaseContext, service);
|
|
||||||
}
|
|
||||||
|
|
||||||
// FYI, Undertow Extension will find deployments that have auth-method set to KEYCLOAK
|
|
||||||
|
|
||||||
// todo notsure if we need this
|
|
||||||
// addSecurityDomain(deploymentUnit, service);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addKeycloakAuthData(DeploymentPhaseContext phaseContext, KeycloakAdapterConfigService service) throws DeploymentUnitProcessingException {
|
|
||||||
DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
|
||||||
WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
|
|
||||||
if (warMetaData == null) {
|
|
||||||
throw new DeploymentUnitProcessingException("WarMetaData not found for " + deploymentUnit.getName() + ". Make sure you have specified a WAR as your secure-deployment in the Keycloak subsystem.");
|
|
||||||
}
|
|
||||||
|
|
||||||
addJSONData(service.getJSON(deploymentUnit), warMetaData);
|
|
||||||
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
|
||||||
if (webMetaData == null) {
|
|
||||||
webMetaData = new JBossWebMetaData();
|
|
||||||
warMetaData.setMergedJBossWebMetaData(webMetaData);
|
|
||||||
}
|
|
||||||
|
|
||||||
LoginConfigMetaData loginConfig = webMetaData.getLoginConfig();
|
|
||||||
if (loginConfig == null) {
|
|
||||||
loginConfig = new LoginConfigMetaData();
|
|
||||||
webMetaData.setLoginConfig(loginConfig);
|
|
||||||
}
|
|
||||||
loginConfig.setAuthMethod("KEYCLOAK");
|
|
||||||
loginConfig.setRealmName(service.getRealmName(deploymentUnit));
|
|
||||||
KeycloakLogger.ROOT_LOGGER.deploymentSecured(deploymentUnit.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addJSONData(String json, WarMetaData warMetaData) {
|
|
||||||
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
|
||||||
if (webMetaData == null) {
|
|
||||||
webMetaData = new JBossWebMetaData();
|
|
||||||
warMetaData.setMergedJBossWebMetaData(webMetaData);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ParamValueMetaData> contextParams = webMetaData.getContextParams();
|
|
||||||
if (contextParams == null) {
|
|
||||||
contextParams = new ArrayList<ParamValueMetaData>();
|
|
||||||
}
|
|
||||||
|
|
||||||
ParamValueMetaData param = new ParamValueMetaData();
|
|
||||||
param.setParamName(AUTH_DATA_PARAM_NAME);
|
|
||||||
param.setParamValue(json);
|
|
||||||
contextParams.add(param);
|
|
||||||
|
|
||||||
webMetaData.setContextParams(contextParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void undeploy(DeploymentUnit du) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,230 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnit;
|
|
||||||
import org.jboss.as.web.common.WarMetaData;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.dmr.Property;
|
|
||||||
import org.jboss.metadata.web.jboss.JBossWebMetaData;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADDRESS;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This service keeps track of the entire Keycloak management model so as to provide
|
|
||||||
* adapter configuration to each deployment at deploy time.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public final class KeycloakAdapterConfigService {
|
|
||||||
|
|
||||||
private static final String CREDENTIALS_JSON_NAME = "credentials";
|
|
||||||
|
|
||||||
private static final KeycloakAdapterConfigService INSTANCE = new KeycloakAdapterConfigService();
|
|
||||||
|
|
||||||
public static KeycloakAdapterConfigService getInstance() {
|
|
||||||
return INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Map<String, ModelNode> realms = new HashMap<String, ModelNode>();
|
|
||||||
|
|
||||||
// keycloak-secured deployments
|
|
||||||
private final Map<String, ModelNode> secureDeployments = new HashMap<String, ModelNode>();
|
|
||||||
|
|
||||||
|
|
||||||
private KeycloakAdapterConfigService() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addRealm(ModelNode operation, ModelNode model) {
|
|
||||||
this.realms.put(realmNameFromOp(operation), model.clone());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRealm(ModelNode operation, String attrName, ModelNode resolvedValue) {
|
|
||||||
ModelNode realm = this.realms.get(realmNameFromOp(operation));
|
|
||||||
realm.get(attrName).set(resolvedValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeRealm(ModelNode operation) {
|
|
||||||
this.realms.remove(realmNameFromOp(operation));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addSecureDeployment(ModelNode operation, ModelNode model) {
|
|
||||||
ModelNode deployment = model.clone();
|
|
||||||
this.secureDeployments.put(deploymentNameFromOp(operation), deployment);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateSecureDeployment(ModelNode operation, String attrName, ModelNode resolvedValue) {
|
|
||||||
ModelNode deployment = this.secureDeployments.get(deploymentNameFromOp(operation));
|
|
||||||
deployment.get(attrName).set(resolvedValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeSecureDeployment(ModelNode operation) {
|
|
||||||
this.secureDeployments.remove(deploymentNameFromOp(operation));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addCredential(ModelNode operation, ModelNode model) {
|
|
||||||
ModelNode credentials = credentialsFromOp(operation);
|
|
||||||
if (!credentials.isDefined()) {
|
|
||||||
credentials = new ModelNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
String credentialName = credentialNameFromOp(operation);
|
|
||||||
if (!credentialName.contains(".")) {
|
|
||||||
credentials.get(credentialName).set(model.get("value").asString());
|
|
||||||
} else {
|
|
||||||
String[] parts = credentialName.split("\\.");
|
|
||||||
String provider = parts[0];
|
|
||||||
String property = parts[1];
|
|
||||||
ModelNode credential = credentials.get(provider);
|
|
||||||
if (!credential.isDefined()) {
|
|
||||||
credential = new ModelNode();
|
|
||||||
}
|
|
||||||
credential.get(property).set(model.get("value").asString());
|
|
||||||
credentials.set(provider, credential);
|
|
||||||
}
|
|
||||||
|
|
||||||
ModelNode deployment = this.secureDeployments.get(deploymentNameFromOp(operation));
|
|
||||||
deployment.get(CREDENTIALS_JSON_NAME).set(credentials);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeCredential(ModelNode operation) {
|
|
||||||
ModelNode credentials = credentialsFromOp(operation);
|
|
||||||
if (!credentials.isDefined()) {
|
|
||||||
throw new RuntimeException("Can not remove credential. No credential defined for deployment in op " + operation.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
String credentialName = credentialNameFromOp(operation);
|
|
||||||
credentials.remove(credentialName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateCredential(ModelNode operation, String attrName, ModelNode resolvedValue) {
|
|
||||||
ModelNode credentials = credentialsFromOp(operation);
|
|
||||||
if (!credentials.isDefined()) {
|
|
||||||
throw new RuntimeException("Can not update credential. No credential defined for deployment in op " + operation.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
String credentialName = credentialNameFromOp(operation);
|
|
||||||
credentials.get(credentialName).set(resolvedValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ModelNode credentialsFromOp(ModelNode operation) {
|
|
||||||
ModelNode deployment = this.secureDeployments.get(deploymentNameFromOp(operation));
|
|
||||||
return deployment.get(CREDENTIALS_JSON_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String realmNameFromOp(ModelNode operation) {
|
|
||||||
return valueFromOpAddress(RealmDefinition.TAG_NAME, operation);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String deploymentNameFromOp(ModelNode operation) {
|
|
||||||
return valueFromOpAddress(SecureDeploymentDefinition.TAG_NAME, operation);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String credentialNameFromOp(ModelNode operation) {
|
|
||||||
return valueFromOpAddress(CredentialDefinition.TAG_NAME, operation);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String valueFromOpAddress(String addrElement, ModelNode operation) {
|
|
||||||
String deploymentName = getValueOfAddrElement(operation.get(ADDRESS), addrElement);
|
|
||||||
if (deploymentName == null) throw new RuntimeException("Can't find '" + addrElement + "' in address " + operation.toString());
|
|
||||||
return deploymentName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getValueOfAddrElement(ModelNode address, String elementName) {
|
|
||||||
for (ModelNode element : address.asList()) {
|
|
||||||
if (element.has(elementName)) return element.get(elementName).asString();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRealmName(DeploymentUnit deploymentUnit) {
|
|
||||||
ModelNode deployment = getSecureDeployment(deploymentUnit);
|
|
||||||
return deployment.get(RealmDefinition.TAG_NAME).asString();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isDeploymentConfigured(DeploymentUnit deploymentUnit) {
|
|
||||||
ModelNode deployment = getSecureDeployment(deploymentUnit);
|
|
||||||
if (! deployment.isDefined()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ModelNode resource = deployment.get(SecureDeploymentDefinition.RESOURCE.getName());
|
|
||||||
return resource.isDefined();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getJSON(DeploymentUnit deploymentUnit) {
|
|
||||||
ModelNode deployment = getSecureDeployment(deploymentUnit);
|
|
||||||
String realmName = deployment.get(RealmDefinition.TAG_NAME).asString();
|
|
||||||
ModelNode realm = this.realms.get(realmName);
|
|
||||||
|
|
||||||
ModelNode json = new ModelNode();
|
|
||||||
json.get(RealmDefinition.TAG_NAME).set(realmName);
|
|
||||||
|
|
||||||
// Realm values set first. Some can be overridden by deployment values.
|
|
||||||
if (realm != null) setJSONValues(json, realm);
|
|
||||||
setJSONValues(json, deployment);
|
|
||||||
return json.toJSONString(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setJSONValues(ModelNode json, ModelNode values) {
|
|
||||||
for (Property prop : values.asPropertyList()) {
|
|
||||||
String name = prop.getName();
|
|
||||||
ModelNode value = prop.getValue();
|
|
||||||
if (value.isDefined()) {
|
|
||||||
json.get(name).set(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSecureDeployment(DeploymentUnit deploymentUnit) {
|
|
||||||
//log.info("********* CHECK KEYCLOAK DEPLOYMENT: deployments.size()" + deployments.size());
|
|
||||||
|
|
||||||
String deploymentName = preferredDeploymentName(deploymentUnit);
|
|
||||||
return this.secureDeployments.containsKey(deploymentName);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ModelNode getSecureDeployment(DeploymentUnit deploymentUnit) {
|
|
||||||
String deploymentName = preferredDeploymentName(deploymentUnit);
|
|
||||||
return this.secureDeployments.containsKey(deploymentName)
|
|
||||||
? this.secureDeployments.get(deploymentName)
|
|
||||||
: new ModelNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
// KEYCLOAK-3273: prefer module name if available
|
|
||||||
private String preferredDeploymentName(DeploymentUnit deploymentUnit) {
|
|
||||||
String deploymentName = deploymentUnit.getName();
|
|
||||||
WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
|
|
||||||
if (warMetaData == null) {
|
|
||||||
return deploymentName;
|
|
||||||
}
|
|
||||||
|
|
||||||
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
|
||||||
if (webMetaData == null) {
|
|
||||||
return deploymentName;
|
|
||||||
}
|
|
||||||
|
|
||||||
String moduleName = webMetaData.getModuleName();
|
|
||||||
if (moduleName != null) return moduleName + ".war";
|
|
||||||
|
|
||||||
return deploymentName;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,85 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.server.deployment.Attachments;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentPhaseContext;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnit;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
|
||||||
import org.jboss.as.server.deployment.module.ModuleDependency;
|
|
||||||
import org.jboss.as.server.deployment.module.ModuleSpecification;
|
|
||||||
import org.jboss.as.web.common.WarMetaData;
|
|
||||||
import org.jboss.metadata.web.jboss.JBossWebMetaData;
|
|
||||||
import org.jboss.metadata.web.spec.LoginConfigMetaData;
|
|
||||||
import org.jboss.modules.Module;
|
|
||||||
import org.jboss.modules.ModuleIdentifier;
|
|
||||||
import org.jboss.modules.ModuleLoader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public abstract class KeycloakDependencyProcessor implements DeploymentUnitProcessor {
|
|
||||||
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_JBOSS_CORE_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-jboss-adapter-core");
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_CORE_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-adapter-core");
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_CORE = ModuleIdentifier.create("org.keycloak.keycloak-core");
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_COMMON = ModuleIdentifier.create("org.keycloak.keycloak-common");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
|
|
||||||
final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
|
||||||
|
|
||||||
if (!KeycloakAdapterConfigService.getInstance().isSecureDeployment(deploymentUnit)) {
|
|
||||||
WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
|
|
||||||
if (warMetaData == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
|
||||||
if (webMetaData == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LoginConfigMetaData loginConfig = webMetaData.getLoginConfig();
|
|
||||||
if (loginConfig == null) return;
|
|
||||||
if (loginConfig.getAuthMethod() == null) return;
|
|
||||||
if (!loginConfig.getAuthMethod().equals("KEYCLOAK")) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION);
|
|
||||||
final ModuleLoader moduleLoader = Module.getBootModuleLoader();
|
|
||||||
addCommonModules(moduleSpecification, moduleLoader);
|
|
||||||
addPlatformSpecificModules(moduleSpecification, moduleLoader);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addCommonModules(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader) {
|
|
||||||
// ModuleDependency(ModuleLoader moduleLoader, ModuleIdentifier identifier, boolean optional, boolean export, boolean importServices, boolean userSpecified)
|
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_JBOSS_CORE_ADAPTER, false, false, false, false));
|
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_CORE_ADAPTER, false, false, false, false));
|
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_CORE, false, false, false, false));
|
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_COMMON, false, false, false, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract protected void addPlatformSpecificModules(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void undeploy(DeploymentUnit du) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.server.deployment.module.ModuleDependency;
|
|
||||||
import org.jboss.as.server.deployment.module.ModuleSpecification;
|
|
||||||
import org.jboss.modules.ModuleIdentifier;
|
|
||||||
import org.jboss.modules.ModuleLoader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add platform-specific modules for WildFly.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class KeycloakDependencyProcessorWildFly extends KeycloakDependencyProcessor {
|
|
||||||
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_WILDFLY_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-wildfly-adapter");
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_UNDERTOW_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-undertow-adapter");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addPlatformSpecificModules(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader) {
|
|
||||||
// ModuleDependency(ModuleLoader moduleLoader, ModuleIdentifier identifier, boolean optional, boolean export, boolean importServices, boolean userSpecified)
|
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_WILDFLY_ADAPTER, false, false, true, false));
|
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_UNDERTOW_ADAPTER, false, false, false, false));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.Extension;
|
|
||||||
import org.jboss.as.controller.ExtensionContext;
|
|
||||||
import org.jboss.as.controller.PathElement;
|
|
||||||
import org.jboss.as.controller.ResourceDefinition;
|
|
||||||
import org.jboss.as.controller.SubsystemRegistration;
|
|
||||||
import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver;
|
|
||||||
import org.jboss.as.controller.parsing.ExtensionParsingContext;
|
|
||||||
import org.jboss.as.controller.registry.ManagementResourceRegistration;
|
|
||||||
import org.keycloak.subsystem.wf8.logging.KeycloakLogger;
|
|
||||||
|
|
||||||
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main Extension class for the subsystem.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class KeycloakExtension implements Extension {
|
|
||||||
|
|
||||||
public static final String SUBSYSTEM_NAME = "keycloak";
|
|
||||||
public static final String NAMESPACE = "urn:jboss:domain:keycloak:1.1";
|
|
||||||
private static final KeycloakSubsystemParser PARSER = new KeycloakSubsystemParser();
|
|
||||||
static final PathElement PATH_SUBSYSTEM = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
|
|
||||||
private static final String RESOURCE_NAME = KeycloakExtension.class.getPackage().getName() + ".LocalDescriptions";
|
|
||||||
private static final int MANAGEMENT_API_MAJOR_VERSION = 1;
|
|
||||||
private static final int MANAGEMENT_API_MINOR_VERSION = 0;
|
|
||||||
private static final int MANAGEMENT_API_MICRO_VERSION = 0;
|
|
||||||
static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
|
|
||||||
private static final ResourceDefinition KEYCLOAK_SUBSYSTEM_RESOURCE = new KeycloakSubsystemDefinition();
|
|
||||||
static final RealmDefinition REALM_DEFINITION = new RealmDefinition();
|
|
||||||
static final SecureDeploymentDefinition SECURE_DEPLOYMENT_DEFINITION = new SecureDeploymentDefinition();
|
|
||||||
static final CredentialDefinition CREDENTIAL_DEFINITION = new CredentialDefinition();
|
|
||||||
|
|
||||||
public static StandardResourceDescriptionResolver getResourceDescriptionResolver(final String... keyPrefix) {
|
|
||||||
StringBuilder prefix = new StringBuilder(SUBSYSTEM_NAME);
|
|
||||||
for (String kp : keyPrefix) {
|
|
||||||
prefix.append('.').append(kp);
|
|
||||||
}
|
|
||||||
return new StandardResourceDescriptionResolver(prefix.toString(), RESOURCE_NAME, KeycloakExtension.class.getClassLoader(), true, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void initializeParsers(final ExtensionParsingContext context) {
|
|
||||||
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, KeycloakExtension.NAMESPACE, PARSER);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void initialize(final ExtensionContext context) {
|
|
||||||
KeycloakLogger.ROOT_LOGGER.debug("Activating Keycloak Extension");
|
|
||||||
final SubsystemRegistration subsystem = context.registerSubsystem(SUBSYSTEM_NAME, MANAGEMENT_API_MAJOR_VERSION, MANAGEMENT_API_MINOR_VERSION, MANAGEMENT_API_MICRO_VERSION);
|
|
||||||
|
|
||||||
ManagementResourceRegistration registration = subsystem.registerSubsystemModel(KEYCLOAK_SUBSYSTEM_RESOURCE);
|
|
||||||
registration.registerSubModel(REALM_DEFINITION);
|
|
||||||
ManagementResourceRegistration secureDeploymentRegistration = registration.registerSubModel(SECURE_DEPLOYMENT_DEFINITION);
|
|
||||||
secureDeploymentRegistration.registerSubModel(CREDENTIAL_DEFINITION);
|
|
||||||
|
|
||||||
subsystem.registerXMLElementWriter(PARSER);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractBoottimeAddStepHandler;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.ServiceVerificationHandler;
|
|
||||||
import org.jboss.as.server.AbstractDeploymentChainStep;
|
|
||||||
import org.jboss.as.server.DeploymentProcessorTarget;
|
|
||||||
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
|
||||||
import org.jboss.as.server.deployment.Phase;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.msc.service.ServiceController;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Keycloak subsystem add update handler.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
class KeycloakSubsystemAdd extends AbstractBoottimeAddStepHandler {
|
|
||||||
|
|
||||||
static final KeycloakSubsystemAdd INSTANCE = new KeycloakSubsystemAdd();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performBoottime(final OperationContext context, ModelNode operation, final ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) {
|
|
||||||
context.addStep(new AbstractDeploymentChainStep() {
|
|
||||||
@Override
|
|
||||||
protected void execute(DeploymentProcessorTarget processorTarget) {
|
|
||||||
processorTarget.addDeploymentProcessor(KeycloakExtension.SUBSYSTEM_NAME, Phase.DEPENDENCIES, 0, chooseDependencyProcessor());
|
|
||||||
processorTarget.addDeploymentProcessor(KeycloakExtension.SUBSYSTEM_NAME,
|
|
||||||
Phase.POST_MODULE, // PHASE
|
|
||||||
Phase.POST_MODULE_VALIDATOR_FACTORY - 1, // PRIORITY
|
|
||||||
chooseConfigDeploymentProcessor());
|
|
||||||
}
|
|
||||||
}, OperationContext.Stage.RUNTIME);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DeploymentUnitProcessor chooseDependencyProcessor() {
|
|
||||||
return new KeycloakDependencyProcessorWildFly();
|
|
||||||
}
|
|
||||||
|
|
||||||
private DeploymentUnitProcessor chooseConfigDeploymentProcessor() {
|
|
||||||
return new KeycloakAdapterConfigDeploymentProcessor();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.ReloadRequiredRemoveStepHandler;
|
|
||||||
import org.jboss.as.controller.SimpleResourceDefinition;
|
|
||||||
import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
|
|
||||||
import org.jboss.as.controller.registry.ManagementResourceRegistration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Definition of subsystem=keycloak.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class KeycloakSubsystemDefinition extends SimpleResourceDefinition {
|
|
||||||
protected KeycloakSubsystemDefinition() {
|
|
||||||
super(KeycloakExtension.SUBSYSTEM_PATH,
|
|
||||||
KeycloakExtension.getResourceDescriptionResolver("subsystem"),
|
|
||||||
KeycloakSubsystemAdd.INSTANCE,
|
|
||||||
ReloadRequiredRemoveStepHandler.INSTANCE
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
|
|
||||||
super.registerOperations(resourceRegistration);
|
|
||||||
resourceRegistration.registerOperationHandler(GenericSubsystemDescribeHandler.DEFINITION, GenericSubsystemDescribeHandler.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,295 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.PathAddress;
|
|
||||||
import org.jboss.as.controller.PathElement;
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinition;
|
|
||||||
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
|
|
||||||
import org.jboss.as.controller.operations.common.Util;
|
|
||||||
import org.jboss.as.controller.parsing.ParseUtils;
|
|
||||||
import org.jboss.as.controller.persistence.SubsystemMarshallingContext;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.dmr.Property;
|
|
||||||
import org.jboss.staxmapper.XMLElementReader;
|
|
||||||
import org.jboss.staxmapper.XMLElementWriter;
|
|
||||||
import org.jboss.staxmapper.XMLExtendedStreamReader;
|
|
||||||
import org.jboss.staxmapper.XMLExtendedStreamWriter;
|
|
||||||
|
|
||||||
import javax.xml.stream.XMLStreamConstants;
|
|
||||||
import javax.xml.stream.XMLStreamException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The subsystem parser, which uses stax to read and write to and from xml
|
|
||||||
*/
|
|
||||||
class KeycloakSubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>, XMLElementWriter<SubsystemMarshallingContext> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void readElement(final XMLExtendedStreamReader reader, final List<ModelNode> list) throws XMLStreamException {
|
|
||||||
// Require no attributes
|
|
||||||
ParseUtils.requireNoAttributes(reader);
|
|
||||||
ModelNode addKeycloakSub = Util.createAddOperation(PathAddress.pathAddress(KeycloakExtension.PATH_SUBSYSTEM));
|
|
||||||
list.add(addKeycloakSub);
|
|
||||||
|
|
||||||
while (reader.hasNext() && nextTag(reader) != END_ELEMENT) {
|
|
||||||
if (reader.getLocalName().equals(RealmDefinition.TAG_NAME)) {
|
|
||||||
readRealm(reader, list);
|
|
||||||
}
|
|
||||||
else if (reader.getLocalName().equals(SecureDeploymentDefinition.TAG_NAME)) {
|
|
||||||
readDeployment(reader, list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// used for debugging
|
|
||||||
private int nextTag(XMLExtendedStreamReader reader) throws XMLStreamException {
|
|
||||||
return reader.nextTag();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void readRealm(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {
|
|
||||||
String realmName = readNameAttribute(reader);
|
|
||||||
ModelNode addRealm = new ModelNode();
|
|
||||||
addRealm.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.ADD);
|
|
||||||
PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, KeycloakExtension.SUBSYSTEM_NAME),
|
|
||||||
PathElement.pathElement(RealmDefinition.TAG_NAME, realmName));
|
|
||||||
addRealm.get(ModelDescriptionConstants.OP_ADDR).set(addr.toModelNode());
|
|
||||||
|
|
||||||
while (reader.hasNext() && nextTag(reader) != END_ELEMENT) {
|
|
||||||
String tagName = reader.getLocalName();
|
|
||||||
SimpleAttributeDefinition def = RealmDefinition.lookup(tagName);
|
|
||||||
if (def == null) throw new XMLStreamException("Unknown realm tag " + tagName);
|
|
||||||
def.parseAndSetParameter(reader.getElementText(), addRealm, reader);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SharedAttributeDefinitons.validateTruststoreSetIfRequired(addRealm)) {
|
|
||||||
//TODO: externalize the message
|
|
||||||
throw new XMLStreamException("truststore and truststore-password must be set if ssl-required is not none and disable-trust-manager is false.");
|
|
||||||
}
|
|
||||||
|
|
||||||
list.add(addRealm);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void readDeployment(XMLExtendedStreamReader reader, List<ModelNode> resourcesToAdd) throws XMLStreamException {
|
|
||||||
String name = readNameAttribute(reader);
|
|
||||||
ModelNode addSecureDeployment = new ModelNode();
|
|
||||||
addSecureDeployment.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.ADD);
|
|
||||||
PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, KeycloakExtension.SUBSYSTEM_NAME),
|
|
||||||
PathElement.pathElement(SecureDeploymentDefinition.TAG_NAME, name));
|
|
||||||
addSecureDeployment.get(ModelDescriptionConstants.OP_ADDR).set(addr.toModelNode());
|
|
||||||
List<ModelNode> credentialsToAdd = new ArrayList<ModelNode>();
|
|
||||||
while (reader.hasNext() && nextTag(reader) != END_ELEMENT) {
|
|
||||||
String tagName = reader.getLocalName();
|
|
||||||
if (tagName.equals(CredentialDefinition.TAG_NAME)) {
|
|
||||||
readCredential(reader, addr, credentialsToAdd);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
SimpleAttributeDefinition def = SecureDeploymentDefinition.lookup(tagName);
|
|
||||||
if (def == null) throw new XMLStreamException("Unknown secure-deployment tag " + tagName);
|
|
||||||
def.parseAndSetParameter(reader.getElementText(), addSecureDeployment, reader);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO need to check realm-ref first.
|
|
||||||
if (!SharedAttributeDefinitons.validateTruststoreSetIfRequired(addSecureDeployment)) {
|
|
||||||
//TODO: externalize the message
|
|
||||||
throw new XMLStreamException("truststore and truststore-password must be set if ssl-required is not none and disable-trust-manager is false.");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Must add credentials after the deployment is added.
|
|
||||||
resourcesToAdd.add(addSecureDeployment);
|
|
||||||
resourcesToAdd.addAll(credentialsToAdd);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void readCredential(XMLExtendedStreamReader reader, PathAddress parent, List<ModelNode> credentialsToAdd) throws XMLStreamException {
|
|
||||||
String name = readNameAttribute(reader);
|
|
||||||
|
|
||||||
Map<String, String> values = new HashMap<>();
|
|
||||||
String textValue = null;
|
|
||||||
while (reader.hasNext()) {
|
|
||||||
int next = reader.next();
|
|
||||||
if (next == CHARACTERS) {
|
|
||||||
// text value of credential element (like for "secret" )
|
|
||||||
String text = reader.getText();
|
|
||||||
if (text == null || text.trim().isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
textValue = text;
|
|
||||||
} else if (next == START_ELEMENT) {
|
|
||||||
String key = reader.getLocalName();
|
|
||||||
reader.next();
|
|
||||||
String value = reader.getText();
|
|
||||||
reader.next();
|
|
||||||
|
|
||||||
values.put(key, value);
|
|
||||||
} else if (next == END_ELEMENT) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (textValue != null) {
|
|
||||||
ModelNode addCredential = getCredentialToAdd(parent, name, textValue);
|
|
||||||
credentialsToAdd.add(addCredential);
|
|
||||||
} else {
|
|
||||||
for (Map.Entry<String, String> entry : values.entrySet()) {
|
|
||||||
ModelNode addCredential = getCredentialToAdd(parent, name + "." + entry.getKey(), entry.getValue());
|
|
||||||
credentialsToAdd.add(addCredential);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ModelNode getCredentialToAdd(PathAddress parent, String name, String value) {
|
|
||||||
ModelNode addCredential = new ModelNode();
|
|
||||||
addCredential.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.ADD);
|
|
||||||
PathAddress addr = PathAddress.pathAddress(parent, PathElement.pathElement(CredentialDefinition.TAG_NAME, name));
|
|
||||||
addCredential.get(ModelDescriptionConstants.OP_ADDR).set(addr.toModelNode());
|
|
||||||
addCredential.get(CredentialDefinition.VALUE.getName()).set(value);
|
|
||||||
return addCredential;
|
|
||||||
}
|
|
||||||
|
|
||||||
// expects that the current tag will have one single attribute called "name"
|
|
||||||
private String readNameAttribute(XMLExtendedStreamReader reader) throws XMLStreamException {
|
|
||||||
String name = null;
|
|
||||||
for (int i = 0; i < reader.getAttributeCount(); i++) {
|
|
||||||
String attr = reader.getAttributeLocalName(i);
|
|
||||||
if (attr.equals("name")) {
|
|
||||||
name = reader.getAttributeValue(i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
throw ParseUtils.unexpectedAttribute(reader, i);
|
|
||||||
}
|
|
||||||
if (name == null) {
|
|
||||||
throw ParseUtils.missingRequired(reader, Collections.singleton("name"));
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void writeContent(final XMLExtendedStreamWriter writer, final SubsystemMarshallingContext context) throws XMLStreamException {
|
|
||||||
context.startSubsystemElement(KeycloakExtension.NAMESPACE, false);
|
|
||||||
writeRealms(writer, context);
|
|
||||||
writeSecureDeployments(writer, context);
|
|
||||||
writer.writeEndElement();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeRealms(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException {
|
|
||||||
if (!context.getModelNode().get(RealmDefinition.TAG_NAME).isDefined()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (Property realm : context.getModelNode().get(RealmDefinition.TAG_NAME).asPropertyList()) {
|
|
||||||
writer.writeStartElement(RealmDefinition.TAG_NAME);
|
|
||||||
writer.writeAttribute("name", realm.getName());
|
|
||||||
ModelNode realmElements = realm.getValue();
|
|
||||||
for (AttributeDefinition element : RealmDefinition.ALL_ATTRIBUTES) {
|
|
||||||
element.marshallAsElement(realmElements, writer);
|
|
||||||
}
|
|
||||||
|
|
||||||
writer.writeEndElement();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeSecureDeployments(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException {
|
|
||||||
if (!context.getModelNode().get(SecureDeploymentDefinition.TAG_NAME).isDefined()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (Property deployment : context.getModelNode().get(SecureDeploymentDefinition.TAG_NAME).asPropertyList()) {
|
|
||||||
writer.writeStartElement(SecureDeploymentDefinition.TAG_NAME);
|
|
||||||
writer.writeAttribute("name", deployment.getName());
|
|
||||||
ModelNode deploymentElements = deployment.getValue();
|
|
||||||
for (AttributeDefinition element : SecureDeploymentDefinition.ALL_ATTRIBUTES) {
|
|
||||||
element.marshallAsElement(deploymentElements, writer);
|
|
||||||
}
|
|
||||||
|
|
||||||
ModelNode credentials = deploymentElements.get(CredentialDefinition.TAG_NAME);
|
|
||||||
if (credentials.isDefined()) {
|
|
||||||
writeCredentials(writer, credentials);
|
|
||||||
}
|
|
||||||
|
|
||||||
writer.writeEndElement();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeCredentials(XMLExtendedStreamWriter writer, ModelNode credentials) throws XMLStreamException {
|
|
||||||
Map<String, Object> parsed = new LinkedHashMap<>();
|
|
||||||
for (Property credential : credentials.asPropertyList()) {
|
|
||||||
String credName = credential.getName();
|
|
||||||
String credValue = credential.getValue().get(CredentialDefinition.VALUE.getName()).asString();
|
|
||||||
|
|
||||||
if (credName.contains(".")) {
|
|
||||||
String[] parts = credName.split("\\.");
|
|
||||||
String provider = parts[0];
|
|
||||||
String propKey = parts[1];
|
|
||||||
|
|
||||||
Map<String, String> currentProviderMap = (Map<String, String>) parsed.get(provider);
|
|
||||||
if (currentProviderMap == null) {
|
|
||||||
currentProviderMap = new LinkedHashMap<>();
|
|
||||||
parsed.put(provider, currentProviderMap);
|
|
||||||
}
|
|
||||||
currentProviderMap.put(propKey, credValue);
|
|
||||||
} else {
|
|
||||||
parsed.put(credName, credValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Map.Entry<String, Object> entry : parsed.entrySet()) {
|
|
||||||
writer.writeStartElement(CredentialDefinition.TAG_NAME);
|
|
||||||
writer.writeAttribute("name", entry.getKey());
|
|
||||||
|
|
||||||
Object value = entry.getValue();
|
|
||||||
if (value instanceof String) {
|
|
||||||
writeCharacters(writer, (String) value);
|
|
||||||
} else {
|
|
||||||
Map<String, String> credentialProps = (Map<String, String>) value;
|
|
||||||
for (Map.Entry<String, String> prop : credentialProps.entrySet()) {
|
|
||||||
writer.writeStartElement(prop.getKey());
|
|
||||||
writeCharacters(writer, prop.getValue());
|
|
||||||
writer.writeEndElement();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writer.writeEndElement();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// code taken from org.jboss.as.controller.AttributeMarshaller
|
|
||||||
private void writeCharacters(XMLExtendedStreamWriter writer, String content) throws XMLStreamException {
|
|
||||||
if (content.indexOf('\n') > -1) {
|
|
||||||
// Multiline content. Use the overloaded variant that staxmapper will format
|
|
||||||
writer.writeCharacters(content);
|
|
||||||
} else {
|
|
||||||
// Staxmapper will just output the chars without adding newlines if this is used
|
|
||||||
char[] chars = content.toCharArray();
|
|
||||||
writer.writeCharacters(chars, 0, chars.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,66 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractAddStepHandler;
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.as.controller.ServiceVerificationHandler;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.msc.service.ServiceController;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
|
|
||||||
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a new realm.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public final class RealmAddHandler extends AbstractAddStepHandler {
|
|
||||||
|
|
||||||
public static RealmAddHandler INSTANCE = new RealmAddHandler();
|
|
||||||
|
|
||||||
private RealmAddHandler() {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
|
|
||||||
// TODO: localize exception. get id number
|
|
||||||
if (!operation.get(OP).asString().equals(ADD)) {
|
|
||||||
throw new OperationFailedException("Unexpected operation for add realm. operation=" + operation.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (AttributeDefinition attrib : RealmDefinition.ALL_ATTRIBUTES) {
|
|
||||||
attrib.validateAndSet(operation, model);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SharedAttributeDefinitons.validateTruststoreSetIfRequired(model.clone())) {
|
|
||||||
//TODO: externalize message
|
|
||||||
throw new OperationFailedException("truststore and truststore-password must be set if ssl-required is not none and disable-trust-manager is false.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.addRealm(operation, context.resolveExpressions(model));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,87 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.PathElement;
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinition;
|
|
||||||
import org.jboss.as.controller.SimpleResourceDefinition;
|
|
||||||
import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
|
|
||||||
import org.jboss.as.controller.registry.ManagementResourceRegistration;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines attributes and operations for the Realm
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class RealmDefinition extends SimpleResourceDefinition {
|
|
||||||
|
|
||||||
public static final String TAG_NAME = "realm";
|
|
||||||
|
|
||||||
|
|
||||||
protected static final List<SimpleAttributeDefinition> REALM_ONLY_ATTRIBUTES = new ArrayList<SimpleAttributeDefinition>();
|
|
||||||
static {
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static final List<SimpleAttributeDefinition> ALL_ATTRIBUTES = new ArrayList<SimpleAttributeDefinition>();
|
|
||||||
static {
|
|
||||||
ALL_ATTRIBUTES.addAll(REALM_ONLY_ATTRIBUTES);
|
|
||||||
ALL_ATTRIBUTES.addAll(SharedAttributeDefinitons.ATTRIBUTES);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Map<String, SimpleAttributeDefinition> DEFINITION_LOOKUP = new HashMap<String, SimpleAttributeDefinition>();
|
|
||||||
static {
|
|
||||||
for (SimpleAttributeDefinition def : ALL_ATTRIBUTES) {
|
|
||||||
DEFINITION_LOOKUP.put(def.getXmlName(), def);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final RealmWriteAttributeHandler realmAttrHandler = new RealmWriteAttributeHandler(ALL_ATTRIBUTES.toArray(new SimpleAttributeDefinition[0]));
|
|
||||||
|
|
||||||
public RealmDefinition() {
|
|
||||||
super(PathElement.pathElement("realm"),
|
|
||||||
KeycloakExtension.getResourceDescriptionResolver("realm"),
|
|
||||||
RealmAddHandler.INSTANCE,
|
|
||||||
RealmRemoveHandler.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
|
|
||||||
super.registerOperations(resourceRegistration);
|
|
||||||
resourceRegistration.registerOperationHandler(GenericSubsystemDescribeHandler.DEFINITION, GenericSubsystemDescribeHandler.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
|
|
||||||
super.registerAttributes(resourceRegistration);
|
|
||||||
|
|
||||||
for (AttributeDefinition attrDef : ALL_ATTRIBUTES) {
|
|
||||||
//TODO: use subclass of realmAttrHandler that can call RealmDefinition.validateTruststoreSetIfRequired
|
|
||||||
resourceRegistration.registerReadWriteAttribute(attrDef, null, realmAttrHandler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static SimpleAttributeDefinition lookup(String name) {
|
|
||||||
return DEFINITION_LOOKUP.get(name);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractRemoveStepHandler;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a realm.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public final class RealmRemoveHandler extends AbstractRemoveStepHandler {
|
|
||||||
|
|
||||||
public static RealmRemoveHandler INSTANCE = new RealmRemoveHandler();
|
|
||||||
|
|
||||||
private RealmRemoveHandler() {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.removeRealm(operation);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractWriteAttributeHandler;
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update an attribute on a realm.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class RealmWriteAttributeHandler extends AbstractWriteAttributeHandler<KeycloakAdapterConfigService> {
|
|
||||||
|
|
||||||
public RealmWriteAttributeHandler(AttributeDefinition... definitions) {
|
|
||||||
super(definitions);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
|
|
||||||
ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<KeycloakAdapterConfigService> hh) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.updateRealm(operation, attributeName, resolvedValue);
|
|
||||||
|
|
||||||
hh.setHandback(ckService);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
|
|
||||||
ModelNode valueToRestore, ModelNode valueToRevert, KeycloakAdapterConfigService ckService) throws OperationFailedException {
|
|
||||||
ckService.updateRealm(operation, attributeName, valueToRestore);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractAddStepHandler;
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.as.controller.ServiceVerificationHandler;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.msc.service.ServiceController;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
|
|
||||||
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a deployment to a realm.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public final class SecureDeploymentAddHandler extends AbstractAddStepHandler {
|
|
||||||
|
|
||||||
public static SecureDeploymentAddHandler INSTANCE = new SecureDeploymentAddHandler();
|
|
||||||
|
|
||||||
private SecureDeploymentAddHandler() {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException {
|
|
||||||
// TODO: localize exception. get id number
|
|
||||||
if (!operation.get(OP).asString().equals(ADD)) {
|
|
||||||
throw new OperationFailedException("Unexpected operation for add secure deployment. operation=" + operation.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (AttributeDefinition attr : SecureDeploymentDefinition.ALL_ATTRIBUTES) {
|
|
||||||
attr.validateAndSet(operation, model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.addSecureDeployment(operation, context.resolveExpressions(model));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,159 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.PathElement;
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinition;
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
|
|
||||||
import org.jboss.as.controller.SimpleResourceDefinition;
|
|
||||||
import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
|
|
||||||
import org.jboss.as.controller.operations.validation.IntRangeValidator;
|
|
||||||
import org.jboss.as.controller.operations.validation.StringLengthValidator;
|
|
||||||
import org.jboss.as.controller.registry.ManagementResourceRegistration;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.dmr.ModelType;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines attributes and operations for a secure-deployment.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class SecureDeploymentDefinition extends SimpleResourceDefinition {
|
|
||||||
|
|
||||||
public static final String TAG_NAME = "secure-deployment";
|
|
||||||
|
|
||||||
protected static final SimpleAttributeDefinition REALM =
|
|
||||||
new SimpleAttributeDefinitionBuilder("realm", ModelType.STRING, true)
|
|
||||||
.setXmlName("realm")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition RESOURCE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("resource", ModelType.STRING, true)
|
|
||||||
.setXmlName("resource")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition USE_RESOURCE_ROLE_MAPPINGS =
|
|
||||||
new SimpleAttributeDefinitionBuilder("use-resource-role-mappings", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("use-resource-role-mappings")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition BEARER_ONLY =
|
|
||||||
new SimpleAttributeDefinitionBuilder("bearer-only", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("bearer-only")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition ENABLE_BASIC_AUTH =
|
|
||||||
new SimpleAttributeDefinitionBuilder("enable-basic-auth", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("enable-basic-auth")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition PUBLIC_CLIENT =
|
|
||||||
new SimpleAttributeDefinitionBuilder("public-client", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("public-client")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition TURN_OFF_CHANGE_SESSION =
|
|
||||||
new SimpleAttributeDefinitionBuilder("turn-off-change-session-id-on-login", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("turn-off-change-session-id-on-login")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition TOKEN_MINIMUM_TIME_TO_LIVE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("token-minimum-time-to-live", ModelType.INT, true)
|
|
||||||
.setXmlName("token-minimum-time-to-live")
|
|
||||||
.setValidator(new IntRangeValidator(-1, true))
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition MIN_TIME_BETWEEN_JWKS_REQUESTS =
|
|
||||||
new SimpleAttributeDefinitionBuilder("min-time-between-jwks-requests", ModelType.INT, true)
|
|
||||||
.setXmlName("min-time-between-jwks-requests")
|
|
||||||
.setValidator(new IntRangeValidator(-1, true))
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition PUBLIC_KEY_CACHE_TTL =
|
|
||||||
new SimpleAttributeDefinitionBuilder("public-key-cache-ttl", ModelType.INT, true)
|
|
||||||
.setXmlName("public-key-cache-ttl")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new IntRangeValidator(-1, true))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
protected static final List<SimpleAttributeDefinition> DEPLOYMENT_ONLY_ATTRIBUTES = new ArrayList<SimpleAttributeDefinition>();
|
|
||||||
static {
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(REALM);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(RESOURCE);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(USE_RESOURCE_ROLE_MAPPINGS);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(BEARER_ONLY);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(ENABLE_BASIC_AUTH);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(PUBLIC_CLIENT);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(TURN_OFF_CHANGE_SESSION);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(TOKEN_MINIMUM_TIME_TO_LIVE);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(MIN_TIME_BETWEEN_JWKS_REQUESTS);
|
|
||||||
DEPLOYMENT_ONLY_ATTRIBUTES.add(PUBLIC_KEY_CACHE_TTL);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static final List<SimpleAttributeDefinition> ALL_ATTRIBUTES = new ArrayList<SimpleAttributeDefinition>();
|
|
||||||
static {
|
|
||||||
ALL_ATTRIBUTES.addAll(DEPLOYMENT_ONLY_ATTRIBUTES);
|
|
||||||
ALL_ATTRIBUTES.addAll(SharedAttributeDefinitons.ATTRIBUTES);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Map<String, SimpleAttributeDefinition> DEFINITION_LOOKUP = new HashMap<String, SimpleAttributeDefinition>();
|
|
||||||
static {
|
|
||||||
for (SimpleAttributeDefinition def : ALL_ATTRIBUTES) {
|
|
||||||
DEFINITION_LOOKUP.put(def.getXmlName(), def);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static SecureDeploymentWriteAttributeHandler attrHandler = new SecureDeploymentWriteAttributeHandler(ALL_ATTRIBUTES);
|
|
||||||
|
|
||||||
public SecureDeploymentDefinition() {
|
|
||||||
super(PathElement.pathElement(TAG_NAME),
|
|
||||||
KeycloakExtension.getResourceDescriptionResolver(TAG_NAME),
|
|
||||||
SecureDeploymentAddHandler.INSTANCE,
|
|
||||||
SecureDeploymentRemoveHandler.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
|
|
||||||
super.registerOperations(resourceRegistration);
|
|
||||||
resourceRegistration.registerOperationHandler(GenericSubsystemDescribeHandler.DEFINITION, GenericSubsystemDescribeHandler.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
|
|
||||||
super.registerAttributes(resourceRegistration);
|
|
||||||
for (AttributeDefinition attrDef : ALL_ATTRIBUTES) {
|
|
||||||
resourceRegistration.registerReadWriteAttribute(attrDef, null, attrHandler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SimpleAttributeDefinition lookup(String name) {
|
|
||||||
return DEFINITION_LOOKUP.get(name);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractRemoveStepHandler;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a secure-deployment from a realm.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public final class SecureDeploymentRemoveHandler extends AbstractRemoveStepHandler {
|
|
||||||
|
|
||||||
public static SecureDeploymentRemoveHandler INSTANCE = new SecureDeploymentRemoveHandler();
|
|
||||||
|
|
||||||
private SecureDeploymentRemoveHandler() {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
ckService.removeSecureDeployment(operation);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.AbstractWriteAttributeHandler;
|
|
||||||
import org.jboss.as.controller.AttributeDefinition;
|
|
||||||
import org.jboss.as.controller.OperationContext;
|
|
||||||
import org.jboss.as.controller.OperationFailedException;
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinition;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update an attribute on a secure-deployment.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class SecureDeploymentWriteAttributeHandler extends AbstractWriteAttributeHandler<KeycloakAdapterConfigService> {
|
|
||||||
|
|
||||||
public SecureDeploymentWriteAttributeHandler(List<SimpleAttributeDefinition> definitions) {
|
|
||||||
this(definitions.toArray(new AttributeDefinition[definitions.size()]));
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureDeploymentWriteAttributeHandler(AttributeDefinition... definitions) {
|
|
||||||
super(definitions);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean applyUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
|
|
||||||
ModelNode resolvedValue, ModelNode currentValue, HandbackHolder<KeycloakAdapterConfigService> hh) throws OperationFailedException {
|
|
||||||
KeycloakAdapterConfigService ckService = KeycloakAdapterConfigService.getInstance();
|
|
||||||
hh.setHandback(ckService);
|
|
||||||
ckService.updateSecureDeployment(operation, attributeName, resolvedValue);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void revertUpdateToRuntime(OperationContext context, ModelNode operation, String attributeName,
|
|
||||||
ModelNode valueToRestore, ModelNode valueToRevert, KeycloakAdapterConfigService ckService) throws OperationFailedException {
|
|
||||||
ckService.updateSecureDeployment(operation, attributeName, valueToRestore);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,265 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinition;
|
|
||||||
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
|
|
||||||
import org.jboss.as.controller.operations.validation.IntRangeValidator;
|
|
||||||
import org.jboss.as.controller.operations.validation.StringLengthValidator;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.jboss.dmr.ModelType;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines attributes that can be present in both a realm and an application (secure-deployment).
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class SharedAttributeDefinitons {
|
|
||||||
|
|
||||||
protected static final SimpleAttributeDefinition REALM_PUBLIC_KEY =
|
|
||||||
new SimpleAttributeDefinitionBuilder("realm-public-key", ModelType.STRING, true)
|
|
||||||
.setXmlName("realm-public-key")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition AUTH_SERVER_URL =
|
|
||||||
new SimpleAttributeDefinitionBuilder("auth-server-url", ModelType.STRING, true)
|
|
||||||
.setXmlName("auth-server-url")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition SSL_REQUIRED =
|
|
||||||
new SimpleAttributeDefinitionBuilder("ssl-required", ModelType.STRING, true)
|
|
||||||
.setXmlName("ssl-required")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode("external"))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition ALLOW_ANY_HOSTNAME =
|
|
||||||
new SimpleAttributeDefinitionBuilder("allow-any-hostname", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("allow-any-hostname")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition DISABLE_TRUST_MANAGER =
|
|
||||||
new SimpleAttributeDefinitionBuilder("disable-trust-manager", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("disable-trust-manager")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition TRUSTSTORE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("truststore", ModelType.STRING, true)
|
|
||||||
.setXmlName("truststore")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition TRUSTSTORE_PASSWORD =
|
|
||||||
new SimpleAttributeDefinitionBuilder("truststore-password", ModelType.STRING, true)
|
|
||||||
.setXmlName("truststore-password")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CONNECTION_POOL_SIZE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("connection-pool-size", ModelType.INT, true)
|
|
||||||
.setXmlName("connection-pool-size")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new IntRangeValidator(0, true))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
protected static final SimpleAttributeDefinition ENABLE_CORS =
|
|
||||||
new SimpleAttributeDefinitionBuilder("enable-cors", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("enable-cors")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CLIENT_KEYSTORE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("client-keystore", ModelType.STRING, true)
|
|
||||||
.setXmlName("client-keystore")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CLIENT_KEYSTORE_PASSWORD =
|
|
||||||
new SimpleAttributeDefinitionBuilder("client-keystore-password", ModelType.STRING, true)
|
|
||||||
.setXmlName("client-keystore-password")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CLIENT_KEY_PASSWORD =
|
|
||||||
new SimpleAttributeDefinitionBuilder("client-key-password", ModelType.STRING, true)
|
|
||||||
.setXmlName("client-key-password")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CORS_MAX_AGE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("cors-max-age", ModelType.INT, true)
|
|
||||||
.setXmlName("cors-max-age")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new IntRangeValidator(-1, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CORS_ALLOWED_HEADERS =
|
|
||||||
new SimpleAttributeDefinitionBuilder("cors-allowed-headers", ModelType.STRING, true)
|
|
||||||
.setXmlName("cors-allowed-headers")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CORS_ALLOWED_METHODS =
|
|
||||||
new SimpleAttributeDefinitionBuilder("cors-allowed-methods", ModelType.STRING, true)
|
|
||||||
.setXmlName("cors-allowed-methods")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition CORS_EXPOSED_HEADERS =
|
|
||||||
new SimpleAttributeDefinitionBuilder("cors-exposed-headers", ModelType.STRING, true)
|
|
||||||
.setXmlName("cors-exposed-headers")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition EXPOSE_TOKEN =
|
|
||||||
new SimpleAttributeDefinitionBuilder("expose-token", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("expose-token")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition AUTH_SERVER_URL_FOR_BACKEND_REQUESTS =
|
|
||||||
new SimpleAttributeDefinitionBuilder("auth-server-url-for-backend-requests", ModelType.STRING, true)
|
|
||||||
.setXmlName("auth-server-url-for-backend-requests")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition ALWAYS_REFRESH_TOKEN =
|
|
||||||
new SimpleAttributeDefinitionBuilder("always-refresh-token", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("always-refresh-token")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition REGISTER_NODE_AT_STARTUP =
|
|
||||||
new SimpleAttributeDefinitionBuilder("register-node-at-startup", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("register-node-at-startup")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition REGISTER_NODE_PERIOD =
|
|
||||||
new SimpleAttributeDefinitionBuilder("register-node-period", ModelType.INT, true)
|
|
||||||
.setXmlName("register-node-period")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new IntRangeValidator(-1, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition TOKEN_STORE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("token-store", ModelType.STRING, true)
|
|
||||||
.setXmlName("token-store")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
protected static final SimpleAttributeDefinition PRINCIPAL_ATTRIBUTE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("principal-attribute", ModelType.STRING, true)
|
|
||||||
.setXmlName("principal-attribute")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
protected static final SimpleAttributeDefinition AUTODETECT_BEARER_ONLY =
|
|
||||||
new SimpleAttributeDefinitionBuilder("autodetect-bearer-only", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("autodetect-bearer-only")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
protected static final SimpleAttributeDefinition IGNORE_OAUTH_QUERY_PARAMETER =
|
|
||||||
new SimpleAttributeDefinitionBuilder("ignore-oauth-query-parameter", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("ignore-oauth-query-parameter")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
protected static final SimpleAttributeDefinition PROXY_URL =
|
|
||||||
new SimpleAttributeDefinitionBuilder("proxy-url", ModelType.STRING, true)
|
|
||||||
.setXmlName("proxy-url")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, true))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
protected static final SimpleAttributeDefinition VERIFY_TOKEN_AUDIENCE =
|
|
||||||
new SimpleAttributeDefinitionBuilder("verify-token-audience", ModelType.BOOLEAN, true)
|
|
||||||
.setXmlName("verify-token-audience")
|
|
||||||
.setAllowExpression(true)
|
|
||||||
.setDefaultValue(new ModelNode(false))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
protected static final List<SimpleAttributeDefinition> ATTRIBUTES = new ArrayList<SimpleAttributeDefinition>();
|
|
||||||
static {
|
|
||||||
ATTRIBUTES.add(REALM_PUBLIC_KEY);
|
|
||||||
ATTRIBUTES.add(AUTH_SERVER_URL);
|
|
||||||
ATTRIBUTES.add(TRUSTSTORE);
|
|
||||||
ATTRIBUTES.add(TRUSTSTORE_PASSWORD);
|
|
||||||
ATTRIBUTES.add(SSL_REQUIRED);
|
|
||||||
ATTRIBUTES.add(ALLOW_ANY_HOSTNAME);
|
|
||||||
ATTRIBUTES.add(DISABLE_TRUST_MANAGER);
|
|
||||||
ATTRIBUTES.add(CONNECTION_POOL_SIZE);
|
|
||||||
ATTRIBUTES.add(ENABLE_CORS);
|
|
||||||
ATTRIBUTES.add(CLIENT_KEYSTORE);
|
|
||||||
ATTRIBUTES.add(CLIENT_KEYSTORE_PASSWORD);
|
|
||||||
ATTRIBUTES.add(CLIENT_KEY_PASSWORD);
|
|
||||||
ATTRIBUTES.add(CORS_MAX_AGE);
|
|
||||||
ATTRIBUTES.add(CORS_ALLOWED_HEADERS);
|
|
||||||
ATTRIBUTES.add(CORS_ALLOWED_METHODS);
|
|
||||||
ATTRIBUTES.add(CORS_EXPOSED_HEADERS);
|
|
||||||
ATTRIBUTES.add(EXPOSE_TOKEN);
|
|
||||||
ATTRIBUTES.add(AUTH_SERVER_URL_FOR_BACKEND_REQUESTS);
|
|
||||||
ATTRIBUTES.add(ALWAYS_REFRESH_TOKEN);
|
|
||||||
ATTRIBUTES.add(REGISTER_NODE_AT_STARTUP);
|
|
||||||
ATTRIBUTES.add(REGISTER_NODE_PERIOD);
|
|
||||||
ATTRIBUTES.add(TOKEN_STORE);
|
|
||||||
ATTRIBUTES.add(PRINCIPAL_ATTRIBUTE);
|
|
||||||
ATTRIBUTES.add(AUTODETECT_BEARER_ONLY);
|
|
||||||
ATTRIBUTES.add(IGNORE_OAUTH_QUERY_PARAMETER);
|
|
||||||
ATTRIBUTES.add(PROXY_URL);
|
|
||||||
ATTRIBUTES.add(VERIFY_TOKEN_AUDIENCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* truststore and truststore-password must be set if ssl-required is not none and disable-trust-manager is false.
|
|
||||||
*
|
|
||||||
* @param attributes The full set of attributes.
|
|
||||||
*
|
|
||||||
* @return <code>true</code> if the attributes are valid, <code>false</code> otherwise.
|
|
||||||
*/
|
|
||||||
public static boolean validateTruststoreSetIfRequired(ModelNode attributes) {
|
|
||||||
if (isSet(attributes, DISABLE_TRUST_MANAGER)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isSet(attributes, SSL_REQUIRED) && attributes.get(SSL_REQUIRED.getName()).asString().equals("none")) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return isSet(attributes, TRUSTSTORE) && isSet(attributes, TRUSTSTORE_PASSWORD);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isSet(ModelNode attributes, SimpleAttributeDefinition def) {
|
|
||||||
ModelNode attribute = attributes.get(def.getName());
|
|
||||||
|
|
||||||
if (def.getType() == ModelType.BOOLEAN) {
|
|
||||||
return attribute.isDefined() && attribute.asBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
return attribute.isDefined() && !attribute.asString().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.logging;
|
|
||||||
|
|
||||||
import org.jboss.logging.BasicLogger;
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
import org.jboss.logging.annotations.LogMessage;
|
|
||||||
import org.jboss.logging.annotations.Message;
|
|
||||||
import org.jboss.logging.annotations.MessageLogger;
|
|
||||||
|
|
||||||
import static org.jboss.logging.Logger.Level.INFO;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This interface to be fleshed out later when error messages are fully externalized.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
@MessageLogger(projectCode = "KEYCLOAK")
|
|
||||||
public interface KeycloakLogger extends BasicLogger {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A logger with a category of the package name.
|
|
||||||
*/
|
|
||||||
KeycloakLogger ROOT_LOGGER = Logger.getMessageLogger(KeycloakLogger.class, "org.jboss.keycloak");
|
|
||||||
|
|
||||||
@LogMessage(level = INFO)
|
|
||||||
@Message(value = "Keycloak subsystem override for deployment %s")
|
|
||||||
void deploymentSecured(String deployment);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.logging;
|
|
||||||
|
|
||||||
import org.jboss.logging.Messages;
|
|
||||||
import org.jboss.logging.annotations.MessageBundle;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This interface to be fleshed out later when error messages are fully externalized.
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2012 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
@MessageBundle(projectCode = "KEYCLOAK")
|
|
||||||
public interface KeycloakMessages {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The messages
|
|
||||||
*/
|
|
||||||
KeycloakMessages MESSAGES = Messages.getBundle(KeycloakMessages.class);
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
# and other contributors as indicated by the @author tags.
|
|
||||||
#
|
|
||||||
# Licensed 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
org.keycloak.subsystem.wf8.extension.KeycloakExtension
|
|
|
@ -1,101 +0,0 @@
|
||||||
#
|
|
||||||
# Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
# and other contributors as indicated by the @author tags.
|
|
||||||
#
|
|
||||||
# Licensed 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
keycloak.subsystem=Keycloak adapter subsystem
|
|
||||||
keycloak.subsystem.add=Operation Adds Keycloak adapter subsystem
|
|
||||||
keycloak.subsystem.remove=Operation removes Keycloak adapter subsystem
|
|
||||||
keycloak.subsystem.realm=A Keycloak realm.
|
|
||||||
keycloak.subsystem.secure-deployment=A deployment secured by Keycloak.
|
|
||||||
|
|
||||||
keycloak.realm=A Keycloak realm.
|
|
||||||
keycloak.realm.add=Add a realm definition to the subsystem.
|
|
||||||
keycloak.realm.remove=Remove a realm from the subsystem.
|
|
||||||
keycloak.realm.realm-public-key=Public key of the realm
|
|
||||||
keycloak.realm.auth-server-url=Base URL of the Realm Auth Server
|
|
||||||
keycloak.realm.disable-trust-manager=Adapter will not use a trust manager when making adapter HTTPS requests
|
|
||||||
keycloak.realm.ssl-required=Specify if SSL is required (valid values are all, external and none)
|
|
||||||
keycloak.realm.allow-any-hostname=SSL Setting
|
|
||||||
keycloak.realm.truststore=Truststore used for adapter client HTTPS requests
|
|
||||||
keycloak.realm.truststore-password=Password of the Truststore
|
|
||||||
keycloak.realm.connection-pool-size=Connection pool size for the client used by the adapter
|
|
||||||
keycloak.realm.enable-cors=Enable Keycloak CORS support
|
|
||||||
keycloak.realm.client-keystore=n/a
|
|
||||||
keycloak.realm.client-keystore-password=n/a
|
|
||||||
keycloak.realm.client-key-password=n/a
|
|
||||||
keycloak.realm.cors-max-age=CORS max-age header
|
|
||||||
keycloak.realm.cors-allowed-headers=CORS allowed headers
|
|
||||||
keycloak.realm.cors-allowed-methods=CORS allowed methods
|
|
||||||
keycloak.realm.cors-exposed-headers=CORS exposed headers
|
|
||||||
keycloak.realm.expose-token=Enable secure URL that exposes access token
|
|
||||||
keycloak.realm.auth-server-url-for-backend-requests=URL to use to make background calls to auth server
|
|
||||||
keycloak.realm.always-refresh-token=Refresh token on every single web request
|
|
||||||
keycloak.realm.register-node-at-startup=Cluster setting
|
|
||||||
keycloak.realm.register-node-period=how often to re-register node
|
|
||||||
keycloak.realm.token-store=cookie or session storage for auth session data
|
|
||||||
keycloak.realm.principal-attribute=token attribute to use to set Principal name
|
|
||||||
keycloak.realm.autodetect-bearer-only=autodetect bearer-only requests
|
|
||||||
keycloak.realm.ignore-oauth-query-parameter=disable query parameter parsing for access_token
|
|
||||||
keycloak.realm.proxy-url=The URL for the HTTP proxy if one is used.
|
|
||||||
keycloak.realm.verify-token-audience=If true, then during bearer-only authentication, the adapter will verify if token contains this client name (resource) as an audience
|
|
||||||
|
|
||||||
keycloak.secure-deployment=A deployment secured by Keycloak
|
|
||||||
keycloak.secure-deployment.add=Add a deployment to be secured by Keycloak
|
|
||||||
keycloak.secure-deployment.realm=Keycloak realm
|
|
||||||
keycloak.secure-deployment.remove=Remove a deployment to be secured by Keycloak
|
|
||||||
keycloak.secure-deployment.realm-public-key=Public key of the realm
|
|
||||||
keycloak.secure-deployment.auth-server-url=Base URL of the Realm Auth Server
|
|
||||||
keycloak.secure-deployment.disable-trust-manager=Adapter will not use a trust manager when making adapter HTTPS requests
|
|
||||||
keycloak.secure-deployment.ssl-required=Specify if SSL is required (valid values are all, external and none)
|
|
||||||
keycloak.secure-deployment.allow-any-hostname=SSL Setting
|
|
||||||
keycloak.secure-deployment.truststore=Truststore used for adapter client HTTPS requests
|
|
||||||
keycloak.secure-deployment.truststore-password=Password of the Truststore
|
|
||||||
keycloak.secure-deployment.connection-pool-size=Connection pool size for the client used by the adapter
|
|
||||||
keycloak.secure-deployment.resource=Application name
|
|
||||||
keycloak.secure-deployment.use-resource-role-mappings=Use resource level permissions from token
|
|
||||||
keycloak.secure-deployment.credentials=Adapter credentials
|
|
||||||
keycloak.secure-deployment.bearer-only=Bearer Token Auth only
|
|
||||||
keycloak.secure-deployment.enable-basic-auth=Enable Basic Authentication
|
|
||||||
keycloak.secure-deployment.public-client=Public client
|
|
||||||
keycloak.secure-deployment.enable-cors=Enable Keycloak CORS support
|
|
||||||
keycloak.secure-deployment.client-keystore=n/a
|
|
||||||
keycloak.secure-deployment.client-keystore-password=n/a
|
|
||||||
keycloak.secure-deployment.client-key-password=n/a
|
|
||||||
keycloak.secure-deployment.cors-max-age=CORS max-age header
|
|
||||||
keycloak.secure-deployment.cors-allowed-headers=CORS allowed headers
|
|
||||||
keycloak.secure-deployment.cors-allowed-methods=CORS allowed methods
|
|
||||||
keycloak.secure-deployment.cors-exposed-headers=CORS exposed headers
|
|
||||||
keycloak.secure-deployment.expose-token=Enable secure URL that exposes access token
|
|
||||||
keycloak.secure-deployment.auth-server-url-for-backend-requests=URL to use to make background calls to auth server
|
|
||||||
keycloak.secure-deployment.always-refresh-token=Refresh token on every single web request
|
|
||||||
keycloak.secure-deployment.register-node-at-startup=Cluster setting
|
|
||||||
keycloak.secure-deployment.register-node-period=how often to re-register node
|
|
||||||
keycloak.secure-deployment.token-store=cookie or session storage for auth session data
|
|
||||||
keycloak.secure-deployment.principal-attribute=token attribute to use to set Principal name
|
|
||||||
keycloak.secure-deployment.turn-off-change-session-id-on-login=The session id is changed by default on a successful login. Change this to true if you want to turn this off
|
|
||||||
keycloak.secure-deployment.token-minimum-time-to-live=The adapter will refresh the token if the current token is expired OR will expire in 'token-minimum-time-to-live' seconds or less
|
|
||||||
keycloak.secure-deployment.min-time-between-jwks-requests=If adapter recognize token signed by unknown public key, it will try to download new public key from keycloak server. However it won't try to download if already tried it in less than 'min-time-between-jwks-requests' seconds
|
|
||||||
keycloak.secure-deployment.public-key-cache-ttl=Maximum time the downloaded public keys are considered valid. When this time reach, the adapter is forced to download public keys from keycloak server
|
|
||||||
keycloak.secure-deployment.autodetect-bearer-only=autodetect bearer-only requests
|
|
||||||
keycloak.secure-deployment.ignore-oauth-query-parameter=disable query parameter parsing for access_token
|
|
||||||
keycloak.secure-deployment.proxy-url=The URL for the HTTP proxy if one is used.
|
|
||||||
keycloak.secure-deployment.verify-token-audience=If true, then during bearer-only authentication, the adapter will verify if token contains this client name (resource) as an audience
|
|
||||||
keycloak.secure-deployment.credential=Credential value
|
|
||||||
|
|
||||||
keycloak.credential=Credential
|
|
||||||
keycloak.credential.value=Credential value
|
|
||||||
keycloak.credential.add=Credential add
|
|
||||||
keycloak.credential.remove=Credential remove
|
|
|
@ -1,135 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
|
||||||
targetNamespace="urn:jboss:domain:keycloak:1.1"
|
|
||||||
xmlns="urn:jboss:domain:keycloak:1.1"
|
|
||||||
elementFormDefault="qualified"
|
|
||||||
attributeFormDefault="unqualified"
|
|
||||||
version="1.0">
|
|
||||||
|
|
||||||
<!-- The subsystem root element -->
|
|
||||||
<xs:element name="subsystem" type="subsystem-type"/>
|
|
||||||
|
|
||||||
<xs:complexType name="subsystem-type">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>
|
|
||||||
<![CDATA[
|
|
||||||
The Keycloak adapter subsystem, used to register deployments managed by Keycloak
|
|
||||||
]]>
|
|
||||||
</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
|
||||||
<xs:element name="realm" maxOccurs="unbounded" minOccurs="0" type="realm-type"/>
|
|
||||||
<xs:element name="secure-deployment" maxOccurs="unbounded" minOccurs="0" type="secure-deployment-type"/>
|
|
||||||
</xs:choice>
|
|
||||||
</xs:complexType>
|
|
||||||
|
|
||||||
<xs:complexType name="realm-type">
|
|
||||||
<xs:all>
|
|
||||||
<xs:element name="cors-allowed-headers" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="client-keystore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="client-keystore" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="truststore" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="truststore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="enable-cors" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="allow-any-hostname" type="xs:boolean" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="client-key-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="connection-pool-size" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="cors-max-age" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="auth-server-url" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
|
||||||
<xs:element name="expose-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="disable-trust-manager" type="xs:boolean" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="ssl-required" type="xs:string" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="cors-allowed-methods" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="cors-exposed-headers" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="realm-public-key" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
|
||||||
<xs:element name="auth-server-url-for-backend-requests" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="always-refresh-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="register-node-at-startup" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="register-node-period" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="token-store" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="principal-attribute" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="autodetect-bearer-only" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="ignore-oauth-query-parameter" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="proxy-url" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="verify-token-audience" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
</xs:all>
|
|
||||||
<xs:attribute name="name" type="xs:string" use="required">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The name of the realm.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
</xs:complexType>
|
|
||||||
|
|
||||||
<xs:complexType name="secure-deployment-type">
|
|
||||||
<xs:all>
|
|
||||||
<xs:element name="client-keystore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="client-keystore" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="enable-cors" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="allow-any-hostname" type="xs:boolean" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="use-resource-role-mappings" type="xs:boolean" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="cors-max-age" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="auth-server-url" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
|
||||||
<xs:element name="realm" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
|
||||||
<xs:element name="disable-trust-manager" type="xs:boolean" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="cors-allowed-methods" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="bearer-only" type="xs:boolean" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="cors-allowed-headers" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="cors-exposed-headers" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="resource" type="xs:string" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="truststore" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="truststore-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="client-key-password" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="public-client" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="connection-pool-size" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="expose-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="ssl-required" type="xs:string" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="realm-public-key" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
|
||||||
<xs:element name="credential" type="credential-type" minOccurs="1" maxOccurs="1"/>
|
|
||||||
<xs:element name="auth-server-url-for-backend-requests" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="always-refresh-token" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="register-node-at-startup" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="register-node-period" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="token-store" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="principal-attribute" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="enable-basic-auth" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="turn-off-change-session-id-on-login" type="xs:boolean" minOccurs="0" maxOccurs="1" />
|
|
||||||
<xs:element name="token-minimum-time-to-live" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="min-time-between-jwks-requests" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="public-key-cache-ttl" type="xs:integer" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="autodetect-bearer-only" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="ignore-oauth-query-parameter" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="proxy-url" type="xs:string" minOccurs="0" maxOccurs="1"/>
|
|
||||||
<xs:element name="verify-token-audience" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
|
|
||||||
</xs:all>
|
|
||||||
<xs:attribute name="name" type="xs:string" use="required">
|
|
||||||
<xs:annotation>
|
|
||||||
<xs:documentation>The name of the realm.</xs:documentation>
|
|
||||||
</xs:annotation>
|
|
||||||
</xs:attribute>
|
|
||||||
</xs:complexType>
|
|
||||||
|
|
||||||
<xs:complexType name="credential-type" mixed="true">
|
|
||||||
<xs:sequence maxOccurs="unbounded" minOccurs="0">
|
|
||||||
<xs:any processContents="lax"></xs:any>
|
|
||||||
</xs:sequence>
|
|
||||||
<xs:attribute name="name" type="xs:string" use="required" />
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:schema>
|
|
|
@ -1,24 +0,0 @@
|
||||||
<?xml version='1.0' encoding='UTF-8'?>
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Template used by WildFly build when directed to include Keycloak subsystem in a configuration. -->
|
|
||||||
<config>
|
|
||||||
<extension-module>org.keycloak.keycloak-adapter-subsystem</extension-module>
|
|
||||||
<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
|
|
||||||
</subsystem>
|
|
||||||
</config>
|
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
|
||||||
*/
|
|
||||||
public class RealmDefinitionTestCase {
|
|
||||||
|
|
||||||
private ModelNode model;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
model = new ModelNode();
|
|
||||||
model.get("realm").set("demo");
|
|
||||||
model.get("resource").set("customer-portal");
|
|
||||||
model.get("realm-public-key").set("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB");
|
|
||||||
model.get("auth-url").set("http://localhost:8080/auth-server/rest/realms/demo/protocol/openid-connect/login");
|
|
||||||
model.get("code-url").set("http://localhost:8080/auth-server/rest/realms/demo/protocol/openid-connect/access/codes");
|
|
||||||
model.get("expose-token").set(true);
|
|
||||||
ModelNode credential = new ModelNode();
|
|
||||||
credential.get("password").set("password");
|
|
||||||
model.get("credentials").set(credential);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIsTruststoreSetIfRequired() throws Exception {
|
|
||||||
model.get("ssl-required").set("none");
|
|
||||||
model.get("disable-trust-manager").set(true);
|
|
||||||
Assert.assertTrue(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
|
|
||||||
model.get("ssl-required").set("none");
|
|
||||||
model.get("disable-trust-manager").set(false);
|
|
||||||
Assert.assertTrue(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
|
|
||||||
model.get("ssl-required").set("all");
|
|
||||||
model.get("disable-trust-manager").set(true);
|
|
||||||
Assert.assertTrue(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
|
|
||||||
model.get("ssl-required").set("all");
|
|
||||||
model.get("disable-trust-manager").set(false);
|
|
||||||
Assert.assertFalse(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
|
|
||||||
model.get("ssl-required").set("external");
|
|
||||||
model.get("disable-trust-manager").set(false);
|
|
||||||
Assert.assertFalse(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
|
|
||||||
model.get("ssl-required").set("all");
|
|
||||||
model.get("disable-trust-manager").set(false);
|
|
||||||
model.get("truststore").set("foo");
|
|
||||||
Assert.assertFalse(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
|
|
||||||
model.get("ssl-required").set("all");
|
|
||||||
model.get("disable-trust-manager").set(false);
|
|
||||||
model.get("truststore").set("foo");
|
|
||||||
model.get("truststore-password").set("password");
|
|
||||||
Assert.assertTrue(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
|
|
||||||
model.get("ssl-required").set("external");
|
|
||||||
model.get("disable-trust-manager").set(false);
|
|
||||||
model.get("truststore").set("foo");
|
|
||||||
model.get("truststore-password").set("password");
|
|
||||||
Assert.assertTrue(SharedAttributeDefinitons.validateTruststoreSetIfRequired(model));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed 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.keycloak.subsystem.wf8.extension;
|
|
||||||
|
|
||||||
import org.jboss.as.controller.PathAddress;
|
|
||||||
import org.jboss.as.controller.PathElement;
|
|
||||||
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
|
|
||||||
import org.jboss.as.subsystem.test.AbstractSubsystemBaseTest;
|
|
||||||
import org.jboss.dmr.ModelNode;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests all management expects for subsystem, parsing, marshaling, model definition and other
|
|
||||||
* Here is an example that allows you a fine grained controller over what is tested and how. So it can give you ideas what can be done and tested.
|
|
||||||
* If you have no need for advanced testing of subsystem you look at {@link SubsystemBaseParsingTestCase} that testes same stuff but most of the code
|
|
||||||
* is hidden inside of test harness
|
|
||||||
*
|
|
||||||
* @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
|
|
||||||
* @author Tomaz Cerar
|
|
||||||
* @author <a href="marko.strukelj@gmail.com">Marko Strukelj</a>
|
|
||||||
*/
|
|
||||||
public class SubsystemParsingTestCase extends AbstractSubsystemBaseTest {
|
|
||||||
|
|
||||||
public SubsystemParsingTestCase() {
|
|
||||||
super(KeycloakExtension.SUBSYSTEM_NAME, new KeycloakExtension());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testJson() throws Exception {
|
|
||||||
ModelNode node = new ModelNode();
|
|
||||||
node.get("realm").set("demo");
|
|
||||||
node.get("resource").set("customer-portal");
|
|
||||||
node.get("realm-public-key").set("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB");
|
|
||||||
node.get("auth-url").set("http://localhost:8080/auth-server/rest/realms/demo/protocol/openid-connect/login");
|
|
||||||
node.get("code-url").set("http://localhost:8080/auth-server/rest/realms/demo/protocol/openid-connect/access/codes");
|
|
||||||
node.get("ssl-required").set("external");
|
|
||||||
node.get("expose-token").set(true);
|
|
||||||
|
|
||||||
ModelNode jwtCredential = new ModelNode();
|
|
||||||
jwtCredential.get("client-keystore-file").set("/tmp/keystore.jks");
|
|
||||||
jwtCredential.get("client-keystore-password").set("changeit");
|
|
||||||
ModelNode credential = new ModelNode();
|
|
||||||
credential.get("jwt").set(jwtCredential);
|
|
||||||
node.get("credentials").set(credential);
|
|
||||||
|
|
||||||
System.out.println("json=" + node.toJSONString(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testJsonFromSignedJWTCredentials() {
|
|
||||||
KeycloakAdapterConfigService service = KeycloakAdapterConfigService.getInstance();
|
|
||||||
|
|
||||||
PathAddress addr = PathAddress.pathAddress(PathElement.pathElement("subsystem", "keycloak"), PathElement.pathElement("secure-deployment", "foo"));
|
|
||||||
ModelNode deploymentOp = new ModelNode();
|
|
||||||
deploymentOp.get(ModelDescriptionConstants.OP_ADDR).set(addr.toModelNode());
|
|
||||||
ModelNode deployment = new ModelNode();
|
|
||||||
deployment.get("realm").set("demo");
|
|
||||||
deployment.get("resource").set("customer-portal");
|
|
||||||
service.addSecureDeployment(deploymentOp, deployment);
|
|
||||||
|
|
||||||
addCredential(addr, service, "secret", "secret1");
|
|
||||||
addCredential(addr, service, "jwt.client-keystore-file", "/tmp/foo.jks");
|
|
||||||
addCredential(addr, service, "jwt.token-timeout", "10");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addCredential(PathAddress parent, KeycloakAdapterConfigService service, String key, String value) {
|
|
||||||
PathAddress credAddr = PathAddress.pathAddress(parent, PathElement.pathElement("credential", key));
|
|
||||||
ModelNode credOp = new ModelNode();
|
|
||||||
credOp.get(ModelDescriptionConstants.OP_ADDR).set(credAddr.toModelNode());
|
|
||||||
ModelNode credential = new ModelNode();
|
|
||||||
credential.get("value").set(value);
|
|
||||||
service.addCredential(credOp, credential);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getSubsystemXml() throws IOException {
|
|
||||||
return readResource("keycloak-1.1.xml");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
|
|
||||||
<secure-deployment name="web-console">
|
|
||||||
<realm>master</realm>
|
|
||||||
<resource>web-console</resource>
|
|
||||||
<use-resource-role-mappings>true</use-resource-role-mappings>
|
|
||||||
<turn-off-change-session-id-on-login>false</turn-off-change-session-id-on-login>
|
|
||||||
<token-minimum-time-to-live>10</token-minimum-time-to-live>
|
|
||||||
<min-time-between-jwks-requests>20</min-time-between-jwks-requests>
|
|
||||||
<public-key-cache-ttl>3600</public-key-cache-ttl>
|
|
||||||
<realm-public-key>
|
|
||||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4siLKUew0WYxdtq6/rwk4Uj/4amGFFnE/yzIxQVU0PUqz3QBRVkUWpDj0K6ZnS5nzJV/y6DHLEy7hjZTdRDphyF1sq09aDOYnVpzu8o2sIlMM8q5RnUyEfIyUZqwo8pSZDJ90fS0s+IDUJNCSIrAKO3w1lqZDHL6E/YFHXyzkvQIDAQAB
|
|
||||||
</realm-public-key>
|
|
||||||
<auth-server-url>http://localhost:8080/auth</auth-server-url>
|
|
||||||
<ssl-required>EXTERNAL</ssl-required>
|
|
||||||
<proxy-url>http://localhost:9000</proxy-url>
|
|
||||||
<verify-token-audience>true</verify-token-audience>
|
|
||||||
<credential name="secret">0aa31d98-e0aa-404c-b6e0-e771dba1e798</credential>
|
|
||||||
</secure-deployment>
|
|
||||||
<secure-deployment name="http-endpoint">
|
|
||||||
<realm>master</realm>
|
|
||||||
<resource>http-endpoint</resource>
|
|
||||||
<use-resource-role-mappings>true</use-resource-role-mappings>
|
|
||||||
<realm-public-key>
|
|
||||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4siLKUew0WYxdtq6/rwk4Uj/4amGFFnE/yzIxQVU0PUqz3QBRVkUWpDj0K6ZnS5nzJV/y6DHLEy7hjZTdRDphyF1sq09aDOYnVpzu8o2sIlMM8q5RnUyEfIyUZqwo8pSZDJ90fS0s+IDUJNCSIrAKO3w1lqZDHL6E/YFHXyzkvQIDAQAB
|
|
||||||
</realm-public-key>
|
|
||||||
<auth-server-url>http://localhost:8080/auth</auth-server-url>
|
|
||||||
<ssl-required>EXTERNAL</ssl-required>
|
|
||||||
<credential name="jwt">
|
|
||||||
<client-keystore-file>/tmp/keystore.jks</client-keystore-file>
|
|
||||||
</credential>
|
|
||||||
</secure-deployment>
|
|
||||||
</subsystem>
|
|
|
@ -35,7 +35,6 @@
|
||||||
<module>fuse-adapter-zip</module>
|
<module>fuse-adapter-zip</module>
|
||||||
<module>js-adapter-zip</module>
|
<module>js-adapter-zip</module>
|
||||||
<module>osgi</module>
|
<module>osgi</module>
|
||||||
|
|
||||||
<module>wildfly-adapter</module>
|
<module>wildfly-adapter</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
|
@ -53,7 +52,6 @@
|
||||||
<module>jetty92-adapter-zip</module>
|
<module>jetty92-adapter-zip</module>
|
||||||
<module>jetty93-adapter-zip</module>
|
<module>jetty93-adapter-zip</module>
|
||||||
<module>jetty94-adapter-zip</module>
|
<module>jetty94-adapter-zip</module>
|
||||||
<module>wf8-adapter</module>
|
|
||||||
<module>js-adapter-npm-zip</module>
|
<module>js-adapter-npm-zip</module>
|
||||||
</modules>
|
</modules>
|
||||||
</profile>
|
</profile>
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<parent>
|
|
||||||
<artifactId>keycloak-parent</artifactId>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<version>7.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
<name>Keycloak Wildfly 8 Adapter</name>
|
|
||||||
<description/>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>keycloak-wf8-adapter-dist-pom</artifactId>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
|
|
||||||
<modules>
|
|
||||||
<module>wf8-modules</module>
|
|
||||||
<module>wf8-adapter-zip</module>
|
|
||||||
</modules>
|
|
||||||
</project>
|
|
|
@ -1,56 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<assembly>
|
|
||||||
<id>war-dist</id>
|
|
||||||
|
|
||||||
<formats>
|
|
||||||
<format>zip</format>
|
|
||||||
<format>tar.gz</format>
|
|
||||||
</formats>
|
|
||||||
<includeBaseDirectory>false</includeBaseDirectory>
|
|
||||||
|
|
||||||
<fileSets>
|
|
||||||
<fileSet>
|
|
||||||
<directory>${project.build.directory}/unpacked</directory>
|
|
||||||
<includes>
|
|
||||||
<include>org/apache/httpcomponents/**</include>
|
|
||||||
<include>org/keycloak/keycloak-common/**</include>
|
|
||||||
<include>org/keycloak/keycloak-core/**</include>
|
|
||||||
<include>org/keycloak/keycloak-adapter-spi/**</include>
|
|
||||||
<include>org/keycloak/keycloak-adapter-core/**</include>
|
|
||||||
<include>org/keycloak/keycloak-jboss-adapter-core/**</include>
|
|
||||||
<include>org/keycloak/keycloak-undertow-adapter/**</include>
|
|
||||||
<include>org/keycloak/keycloak-wildfly-adapter/**</include>
|
|
||||||
<include>org/keycloak/keycloak-wf8-subsystem/**</include>
|
|
||||||
<include>org/keycloak/keycloak-adapter-subsystem/**</include>
|
|
||||||
<include>org/keycloak/keycloak-servlet-oauth-client/**</include>
|
|
||||||
<include>org/keycloak/keycloak-authz-client/**</include>
|
|
||||||
</includes>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/*.war</exclude>
|
|
||||||
</excludes>
|
|
||||||
<outputDirectory>modules/system/add-ons/keycloak</outputDirectory>
|
|
||||||
</fileSet>
|
|
||||||
</fileSets>
|
|
||||||
<files>
|
|
||||||
<file>
|
|
||||||
<source>../../shared-cli/adapter-install.cli</source>
|
|
||||||
<outputDirectory>bin</outputDirectory>
|
|
||||||
</file>
|
|
||||||
</files>
|
|
||||||
</assembly>
|
|
|
@ -1,93 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<artifactId>keycloak-parent</artifactId>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<version>7.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>keycloak-wf8-adapter-dist</artifactId>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
<name>Keycloak Wildfly 8 Adapter Distro</name>
|
|
||||||
<description/>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wf8-modules</artifactId>
|
|
||||||
<type>zip</type>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-dependency-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>unpack</id>
|
|
||||||
<phase>prepare-package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>unpack</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<artifactItems>
|
|
||||||
<artifactItem>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wf8-modules</artifactId>
|
|
||||||
<type>zip</type>
|
|
||||||
<outputDirectory>${project.build.directory}/unpacked</outputDirectory>
|
|
||||||
</artifactItem>
|
|
||||||
</artifactItems>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>assemble</id>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>single</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<descriptors>
|
|
||||||
<descriptor>assembly.xml</descriptor>
|
|
||||||
</descriptors>
|
|
||||||
<outputDirectory>
|
|
||||||
target
|
|
||||||
</outputDirectory>
|
|
||||||
<workDirectory>
|
|
||||||
target/assembly/work
|
|
||||||
</workDirectory>
|
|
||||||
<appendAssemblyId>false</appendAssemblyId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
|
@ -1,39 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<assembly>
|
|
||||||
<id>dist</id>
|
|
||||||
|
|
||||||
<formats>
|
|
||||||
<format>zip</format>
|
|
||||||
</formats>
|
|
||||||
<includeBaseDirectory>false</includeBaseDirectory>
|
|
||||||
|
|
||||||
<fileSets>
|
|
||||||
<fileSet>
|
|
||||||
<directory>../../</directory>
|
|
||||||
<includes>
|
|
||||||
<include>License.html</include>
|
|
||||||
</includes>
|
|
||||||
<outputDirectory></outputDirectory>
|
|
||||||
</fileSet>
|
|
||||||
<fileSet>
|
|
||||||
<directory>${project.build.directory}/modules</directory>
|
|
||||||
<outputDirectory></outputDirectory>
|
|
||||||
</fileSet>
|
|
||||||
</fileSets>
|
|
||||||
</assembly>
|
|
|
@ -1,97 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project name="module-repository" basedir="." default="all">
|
|
||||||
|
|
||||||
<import file="lib.xml"/>
|
|
||||||
|
|
||||||
<property name="output.dir" value="target"/>
|
|
||||||
|
|
||||||
<target name="all">
|
|
||||||
<antcall target="modules">
|
|
||||||
<param name="mavenized.modules" value="false"/>
|
|
||||||
<param name="output.dir" value="target"/>
|
|
||||||
</antcall>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
|
|
||||||
<target name="modules">
|
|
||||||
|
|
||||||
<!-- server min dependencies -->
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-common">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-common"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-core">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-core"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- subsystems -->
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-adapter-spi">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-adapter-spi"/>
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-undertow-adapter-spi"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-adapter-core">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-adapter-core"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-jboss-adapter-core">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-jboss-adapter-core"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-undertow-adapter">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-undertow-adapter"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-wildfly-adapter">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-wildfly-adapter"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-wf8-subsystem">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-wf8-subsystem"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.keycloak.keycloak-servlet-oauth-client">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-servlet-oauth-client"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<module-def name="org.apache.httpcomponents" slot="4.3">
|
|
||||||
<maven-resource group="org.apache.httpcomponents" artifact="httpclient"/>
|
|
||||||
<maven-resource group="org.apache.httpcomponents" artifact="httpcore"/>
|
|
||||||
<maven-resource group="org.apache.httpcomponents" artifact="httpmime"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
<!-- Authorization -->
|
|
||||||
<module-def name="org.keycloak.keycloak-authz-client">
|
|
||||||
<maven-resource group="org.keycloak" artifact="keycloak-authz-client"/>
|
|
||||||
</module-def>
|
|
||||||
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="clean-target">
|
|
||||||
<delete dir="${output.dir}"/>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="clean" depends="clean-target">
|
|
||||||
<delete file="maven-ant-tasks.jar"/>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
</project>
|
|
|
@ -1,277 +0,0 @@
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project name="module-repository-lib">
|
|
||||||
|
|
||||||
<property name="src.dir" value="src"/>
|
|
||||||
<property name="module.repo.src.dir" value="${src.dir}/main/resources/modules"/>
|
|
||||||
<property name="module.xml" value="module.xml"/>
|
|
||||||
|
|
||||||
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
|
|
||||||
<taskdef name="jandex" classname="org.jboss.jandex.JandexAntTask" />
|
|
||||||
|
|
||||||
<macrodef name="module-def">
|
|
||||||
<attribute name="name"/>
|
|
||||||
<attribute name="slot" default="main"/>
|
|
||||||
<element name="resources" implicit="yes" optional="yes"/>
|
|
||||||
|
|
||||||
<sequential>
|
|
||||||
<echo message="Initializing module -> @{name}"/>
|
|
||||||
<property name="module.repo.output.dir" value="${output.dir}/modules"/>
|
|
||||||
<!-- Figure out the correct module path -->
|
|
||||||
<define-module-dir name="@{name}" slot="@{slot}"/>
|
|
||||||
|
|
||||||
<!-- Make the module output director -->
|
|
||||||
<mkdir dir="${module.repo.output.dir}/${current.module.path}"/>
|
|
||||||
|
|
||||||
<!-- Copy the module.xml and other stuff to the output director -->
|
|
||||||
<copy todir="${module.repo.output.dir}/${current.module.path}" overwrite="true">
|
|
||||||
<fileset dir="${module.repo.src.dir}/${current.module.path}">
|
|
||||||
<include name="**"/>
|
|
||||||
</fileset>
|
|
||||||
</copy>
|
|
||||||
|
|
||||||
<!-- Process the resource -->
|
|
||||||
<resources/>
|
|
||||||
|
|
||||||
<!-- Add keycloak version property to module xml -->
|
|
||||||
<replace file="${module.repo.output.dir}/${current.module.path}/${module.xml}"
|
|
||||||
token="$${project.version}"
|
|
||||||
value="${project.version}"/>
|
|
||||||
|
|
||||||
<!-- Some final cleanup -->
|
|
||||||
<replace file="${module.repo.output.dir}/${current.module.path}/${module.xml}">
|
|
||||||
<replacetoken>
|
|
||||||
<![CDATA[
|
|
||||||
<!-- Insert resources here -->]]></replacetoken>
|
|
||||||
<replacevalue>
|
|
||||||
</replacevalue>
|
|
||||||
</replace>
|
|
||||||
|
|
||||||
</sequential>
|
|
||||||
</macrodef>
|
|
||||||
|
|
||||||
<macrodef name="bundle-def">
|
|
||||||
<attribute name="name"/>
|
|
||||||
<attribute name="slot" default="main"/>
|
|
||||||
<element name="resources" implicit="yes" optional="yes"/>
|
|
||||||
|
|
||||||
<sequential>
|
|
||||||
<echo message="Initializing bundle -> @{name}"/>
|
|
||||||
<property name="bundle.repo.output.dir" value="${output.dir}/bundles/system/layers/base"/>
|
|
||||||
<!-- Figure out the correct bundle path -->
|
|
||||||
<define-bundle-dir name="@{name}" slot="@{slot}" />
|
|
||||||
|
|
||||||
<!-- Make the bundle output director -->
|
|
||||||
<mkdir dir="${bundle.repo.output.dir}/${current.bundle.path}"/>
|
|
||||||
|
|
||||||
<!-- Process the resource -->
|
|
||||||
<resources/>
|
|
||||||
|
|
||||||
</sequential>
|
|
||||||
</macrodef>
|
|
||||||
|
|
||||||
<macrodef name="maven-bundle" >
|
|
||||||
<attribute name="group"/>
|
|
||||||
<attribute name="artifact"/>
|
|
||||||
|
|
||||||
<sequential>
|
|
||||||
<!-- Copy the jar to the bundle dir -->
|
|
||||||
<property name="bundle.repo.output.dir" value="${output.dir}/bundles/system/layers/base"/>
|
|
||||||
<copy todir="${bundle.repo.output.dir}/${current.bundle.path}" failonerror="true">
|
|
||||||
<fileset file="${@{group}:@{artifact}:jar}"/>
|
|
||||||
<mapper type="flatten" />
|
|
||||||
</copy>
|
|
||||||
</sequential>
|
|
||||||
</macrodef>
|
|
||||||
|
|
||||||
<scriptdef name="define-module-dir" language="javascript" manager="bsf">
|
|
||||||
<attribute name="name"/>
|
|
||||||
<attribute name="slot"/>
|
|
||||||
<![CDATA[
|
|
||||||
name = attributes.get("name");
|
|
||||||
name = name.replace(".", "/");
|
|
||||||
project.setProperty("current.module.path", name + "/" + attributes.get("slot"));
|
|
||||||
]]>
|
|
||||||
</scriptdef>
|
|
||||||
|
|
||||||
<scriptdef name="define-bundle-dir" language="javascript" manager="bsf">
|
|
||||||
<attribute name="name"/>
|
|
||||||
<attribute name="slot"/>
|
|
||||||
<![CDATA[
|
|
||||||
name = attributes.get("name");
|
|
||||||
name = name.replace(".", "/");
|
|
||||||
project.setProperty("current.bundle.path", name + "/" + attributes.get("slot"));
|
|
||||||
]]>
|
|
||||||
</scriptdef>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Get the version from the parent directory of the jar. If the parent directory is 'target' this
|
|
||||||
means that the jar is contained in AS build so extract the version from the file name
|
|
||||||
-->
|
|
||||||
<scriptdef name="define-maven-artifact" language="javascript" manager="bsf">
|
|
||||||
<attribute name="group"/>
|
|
||||||
<attribute name="artifact"/>
|
|
||||||
<attribute name="classifier"/>
|
|
||||||
<attribute name="element"/>
|
|
||||||
<attribute name="path"/>
|
|
||||||
<![CDATA[
|
|
||||||
importClass(Packages.java.io.File);
|
|
||||||
group = attributes.get("group");
|
|
||||||
artifact = attributes.get("artifact");
|
|
||||||
classifier = attributes.get("classifier");
|
|
||||||
element = attributes.get("element");
|
|
||||||
path = attributes.get("path");
|
|
||||||
if(path.indexOf('${') != -1) {
|
|
||||||
throw "Module resource root not found, make sure it is listed in build/pom.xml" + path;
|
|
||||||
}
|
|
||||||
fp = new File(path);
|
|
||||||
version = fp.getParentFile().getName();
|
|
||||||
if (version.equals("target")) {
|
|
||||||
version = fp.getName();
|
|
||||||
version = version.substring(artifact.length() + 1);
|
|
||||||
suffix = ".jar";
|
|
||||||
if (classifier) {
|
|
||||||
suffix = "-" + classifier + suffix;
|
|
||||||
}
|
|
||||||
version = version.replace(suffix, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
root = "<" + element + " name=\"" + group + ":" + artifact + ":" + version;
|
|
||||||
if (classifier) {
|
|
||||||
root = root + ":" + classifier;
|
|
||||||
}
|
|
||||||
root = root + "\"/>";
|
|
||||||
project.setProperty("current.maven.root", root);
|
|
||||||
]]>
|
|
||||||
</scriptdef>
|
|
||||||
|
|
||||||
<macrodef name="maven-resource" >
|
|
||||||
<attribute name="group"/>
|
|
||||||
<attribute name="artifact"/>
|
|
||||||
<attribute name="jandex" default="false" />
|
|
||||||
|
|
||||||
<sequential>
|
|
||||||
<if>
|
|
||||||
<equals arg1="${mavenized.modules}" arg2="true"/>
|
|
||||||
<then>
|
|
||||||
<define-maven-artifact group="@{group}" artifact="@{artifact}" element="artifact" path="${@{group}:@{artifact}:jar}"/>
|
|
||||||
<replace file="${module.repo.output.dir}/${current.module.path}/${module.xml}">
|
|
||||||
<replacefilter token="<!-- Insert resources here -->" value="${current.maven.root} <!-- Insert resources here -->"/>
|
|
||||||
</replace>
|
|
||||||
</then>
|
|
||||||
|
|
||||||
<else>
|
|
||||||
<!-- Copy the jar to the module dir -->
|
|
||||||
<copy todir="${module.repo.output.dir}/${current.module.path}" failonerror="true">
|
|
||||||
<fileset file="${@{group}:@{artifact}:jar}"/>
|
|
||||||
<mapper type="flatten" />
|
|
||||||
</copy>
|
|
||||||
|
|
||||||
<basename file="${@{group}:@{artifact}:jar}" property="resourcename.@{group}.@{artifact}"/>
|
|
||||||
<!-- Generate the Jandex Index -->
|
|
||||||
<jandex run="@{jandex}" newJar="true" >
|
|
||||||
<fileset dir="${module.repo.output.dir}/${current.module.path}" />
|
|
||||||
</jandex>
|
|
||||||
<!-- Update the resource entry in module.xml -->
|
|
||||||
<define-resource-root path="${resourcename.@{group}.@{artifact}}" jandex="@{jandex}"/>
|
|
||||||
<replace file="${module.repo.output.dir}/${current.module.path}/${module.xml}">
|
|
||||||
<replacefilter token="<!-- Insert resources here -->" value="${current.resource.root} <!-- Insert resources here -->"/>
|
|
||||||
</replace>
|
|
||||||
</else>
|
|
||||||
</if>
|
|
||||||
</sequential>
|
|
||||||
</macrodef>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<macrodef name="maven-resource-with-classifier" >
|
|
||||||
<attribute name="group"/>
|
|
||||||
<attribute name="artifact"/>
|
|
||||||
<attribute name="classifier"/>
|
|
||||||
<attribute name="jandex" default="false" />
|
|
||||||
|
|
||||||
<sequential>
|
|
||||||
<if>
|
|
||||||
<equals arg1="${mavenized.modules}" arg2="true"/>
|
|
||||||
<then>
|
|
||||||
<define-maven-artifact group="@{group}" artifact="@{artifact}" element="artifact" classifier="@{classifier}" path="${@{group}:@{artifact}:jar:@{classifier}}"/>
|
|
||||||
<replace file="${module.repo.output.dir}/${current.module.path}/${module.xml}">
|
|
||||||
<replacefilter token="<!-- Insert resources here -->" value="${current.maven.root} <!-- Insert resources here -->"/>
|
|
||||||
</replace>
|
|
||||||
</then>
|
|
||||||
<else>
|
|
||||||
<!-- Copy the jar to the module dir -->
|
|
||||||
<copy todir="${module.repo.output.dir}/${current.module.path}" failonerror="true">
|
|
||||||
<fileset file="${@{group}:@{artifact}:jar:@{classifier}}"/>
|
|
||||||
<!-- http://jira.codehaus.org/browse/MANTRUN-159 -->
|
|
||||||
<mapper type="flatten" />
|
|
||||||
</copy>
|
|
||||||
|
|
||||||
<basename file="${@{group}:@{artifact}:jar:@{classifier}}" property="resourcename.@{group}.@{artifact}.@{classifier}"/>
|
|
||||||
|
|
||||||
<!-- Update the resource entry in module.xml -->
|
|
||||||
<define-resource-root path="${resourcename.@{group}.@{artifact}.@{classifier}}"/>
|
|
||||||
<replace file="${module.repo.output.dir}/${current.module.path}/${module.xml}">
|
|
||||||
<replacefilter token="<!-- Insert resources here -->" value="${current.resource.root} <!-- Insert resources here -->"/>
|
|
||||||
</replace>
|
|
||||||
</else>
|
|
||||||
</if>
|
|
||||||
</sequential>
|
|
||||||
</macrodef>
|
|
||||||
|
|
||||||
<macrodef name="extract-native-jar" >
|
|
||||||
<attribute name="group"/>
|
|
||||||
<attribute name="artifact"/>
|
|
||||||
<sequential>
|
|
||||||
<if>
|
|
||||||
<equals arg1="${mavenized.modules}" arg2="true"/>
|
|
||||||
<then>
|
|
||||||
<define-maven-artifact group="@{group}" artifact="@{artifact}" element="native-artifact" path="${@{group}:@{artifact}:jar}"/>
|
|
||||||
<replace file="${module.repo.output.dir}/${current.module.path}/${module.xml}">
|
|
||||||
<replacefilter token="<!-- Insert resources here -->" value="${current.maven.root} <!-- Insert resources here -->"/>
|
|
||||||
</replace>
|
|
||||||
</then>
|
|
||||||
|
|
||||||
<else>
|
|
||||||
<unzip src="${@{group}:@{artifact}:jar}" dest="${module.repo.output.dir}/${current.module.path}">
|
|
||||||
<patternset>
|
|
||||||
<include name="lib/**"/>
|
|
||||||
</patternset>
|
|
||||||
</unzip>
|
|
||||||
</else>
|
|
||||||
</if>
|
|
||||||
</sequential>
|
|
||||||
</macrodef>
|
|
||||||
|
|
||||||
<scriptdef name="define-resource-root" language="javascript" manager="bsf">
|
|
||||||
<attribute name="path"/>
|
|
||||||
<attribute name="jandex"/>
|
|
||||||
<![CDATA[
|
|
||||||
path = attributes.get("path");
|
|
||||||
root = "<resource-root path=\"" + path + "\"/>";
|
|
||||||
if(path.indexOf('${') != -1) {
|
|
||||||
throw "Module resource root not found, make sure it is listed in build/pom.xml" + path;
|
|
||||||
}
|
|
||||||
if(attributes.get("jandex") == "true" ) {
|
|
||||||
root = root + "\n\t<resource-root path=\"" + path.replace(".jar","-jandex.jar") + "\"/>";
|
|
||||||
}
|
|
||||||
project.setProperty("current.resource.root", root);
|
|
||||||
]]>
|
|
||||||
</scriptdef>
|
|
||||||
|
|
||||||
</project>
|
|
|
@ -1,199 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<artifactId>keycloak-parent</artifactId>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<version>7.0.0-SNAPSHOT</version>
|
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>keycloak-wf8-modules</artifactId>
|
|
||||||
|
|
||||||
<name>Keycloak Wildfly 8 Modules</name>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-common</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-adapter-spi</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-undertow-adapter-spi</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-adapter-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-jboss-adapter-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-undertow-adapter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wildfly-adapter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wf8-subsystem</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-servlet-oauth-client</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.httpcomponents</groupId>
|
|
||||||
<artifactId>httpmime</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.httpcomponents</groupId>
|
|
||||||
<artifactId>httpcore</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- Authorization -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-authz-client</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
|
||||||
<inherited>false</inherited>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>build-dist</id>
|
|
||||||
<goals>
|
|
||||||
<goal>run</goal>
|
|
||||||
</goals>
|
|
||||||
<phase>compile</phase>
|
|
||||||
<configuration>
|
|
||||||
<target>
|
|
||||||
<ant antfile="build.xml" inheritRefs="true">
|
|
||||||
<target name="all"/>
|
|
||||||
</ant>
|
|
||||||
</target>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jboss</groupId>
|
|
||||||
<artifactId>jandex</artifactId>
|
|
||||||
<version>1.0.3.Final</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>ant-contrib</groupId>
|
|
||||||
<artifactId>ant-contrib</artifactId>
|
|
||||||
<version>1.0b3</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>ant</groupId>
|
|
||||||
<artifactId>ant</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.ant</groupId>
|
|
||||||
<artifactId>ant-apache-bsf</artifactId>
|
|
||||||
<version>1.9.3</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.bsf</groupId>
|
|
||||||
<artifactId>bsf-api</artifactId>
|
|
||||||
<version>3.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>rhino</groupId>
|
|
||||||
<artifactId>js</artifactId>
|
|
||||||
<version>1.7R2</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>assemble</id>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>single</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<descriptors>
|
|
||||||
<descriptor>assembly.xml</descriptor>
|
|
||||||
</descriptors>
|
|
||||||
<outputDirectory>
|
|
||||||
target
|
|
||||||
</outputDirectory>
|
|
||||||
<workDirectory>
|
|
||||||
target/assembly/work
|
|
||||||
</workDirectory>
|
|
||||||
<appendAssemblyId>false</appendAssemblyId>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>copy-resources</id>
|
|
||||||
<!-- here the phase you need -->
|
|
||||||
<phase>validate</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>copy-resources</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<outputDirectory>${project.build.directory}/modules/org/keycloak/keycloak-adapter-subsystem</outputDirectory>
|
|
||||||
<resources>
|
|
||||||
<resource>
|
|
||||||
<directory>src/main/resources/modules/org/keycloak/keycloak-adapter-subsystem</directory>
|
|
||||||
<filtering>true</filtering>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
|
@ -1,31 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.apache.httpcomponents" slot="4.3">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="org.apache.commons.codec"/>
|
|
||||||
<module name="org.apache.commons.logging"/>
|
|
||||||
<module name="org.apache.james.mime4j"/>
|
|
||||||
</dependencies>
|
|
||||||
</module>
|
|
|
@ -1,40 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-adapter-core">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-annotations"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-core"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-databind"/>
|
|
||||||
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider"/>
|
|
||||||
<module name="org.apache.httpcomponents" slot="4.3" />
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-spi"/>
|
|
||||||
<module name="org.keycloak.keycloak-core"/>
|
|
||||||
<module name="org.keycloak.keycloak-common"/>
|
|
||||||
<module name="org.keycloak.keycloak-authz-client"/>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-adapter-spi">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="org.apache.httpcomponents" slot="4.3" />
|
|
||||||
<module name="javax.servlet.api"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="org.jboss.xnio"/>
|
|
||||||
<module name="io.undertow.core"/>
|
|
||||||
<module name="io.undertow.servlet"/>
|
|
||||||
<module name="org.keycloak.keycloak-common"/>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,33 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-adapter-subsystem">
|
|
||||||
<properties>
|
|
||||||
<property name="jboss.api" value="private"/>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<resources>
|
|
||||||
<resource-root path="."/>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<module name="org.keycloak.keycloak-wf8-subsystem" export="true" services="export"/>
|
|
||||||
</dependencies>
|
|
||||||
</module>
|
|
|
@ -1,42 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ * Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ * and other contributors as indicated by the @author tags.
|
|
||||||
~ *
|
|
||||||
~ * Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-authz-client">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="org.bouncycastle" />
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="javax.activation.api"/>
|
|
||||||
<module name="sun.jdk" optional="true" />
|
|
||||||
<module name="javax.ws.rs.api"/>
|
|
||||||
<module name="org.keycloak.keycloak-core"/>
|
|
||||||
<module name="org.keycloak.keycloak-common"/>
|
|
||||||
<module name="org.apache.httpcomponents" slot="4.3"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-core"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-annotations"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-databind"/>
|
|
||||||
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-common">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="org.bouncycastle" />
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="javax.activation.api"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="sun.jdk" optional="true" />
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,38 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-core">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-annotations"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-core"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-databind"/>
|
|
||||||
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider"/>
|
|
||||||
<module name="org.keycloak.keycloak-common" />
|
|
||||||
<module name="org.bouncycastle" />
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="javax.activation.api"/>
|
|
||||||
<module name="sun.jdk" optional="true" />
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-jboss-adapter-core">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="org.picketbox"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-spi"/>
|
|
||||||
<module name="org.keycloak.keycloak-common"/>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,36 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-servlet-oauth-client">
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="javax.servlet.api"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="org.picketbox"/>
|
|
||||||
<module name="org.apache.httpcomponents" slot="4.3"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-spi"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-core"/>
|
|
||||||
<module name="org.keycloak.keycloak-core"/>
|
|
||||||
<module name="org.keycloak.keycloak-common"/>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,48 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-undertow-adapter">
|
|
||||||
<properties>
|
|
||||||
<property name="jboss.api" value="private"/>
|
|
||||||
</properties>
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="org.bouncycastle" />
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-annotations"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-core"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-databind"/>
|
|
||||||
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider"/>
|
|
||||||
<module name="org.apache.httpcomponents" slot="4.3" />
|
|
||||||
<module name="javax.servlet.api"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="org.jboss.xnio"/>
|
|
||||||
<module name="io.undertow.core"/>
|
|
||||||
<module name="io.undertow.servlet"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-spi"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-core"/>
|
|
||||||
<module name="org.keycloak.keycloak-common"/>
|
|
||||||
<module name="org.keycloak.keycloak-core"/>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -1,43 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-wf8-subsystem">
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<property name="jboss.api" value="private"/>
|
|
||||||
</properties>
|
|
||||||
<resources>
|
|
||||||
<resource-root path="."/>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="org.jboss.staxmapper"/>
|
|
||||||
<module name="org.jboss.as.controller"/>
|
|
||||||
<module name="org.jboss.as.ee"/>
|
|
||||||
<module name="org.jboss.as.server"/>
|
|
||||||
<module name="org.jboss.modules"/>
|
|
||||||
<module name="org.jboss.msc"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="org.jboss.vfs"/>
|
|
||||||
<module name="org.jboss.as.web-common"/>
|
|
||||||
<module name="org.jboss.metadata"/>
|
|
||||||
</dependencies>
|
|
||||||
</module>
|
|
|
@ -1,49 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
~ and other contributors as indicated by the @author tags.
|
|
||||||
~
|
|
||||||
~ Licensed 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-wildfly-adapter">
|
|
||||||
<properties>
|
|
||||||
<property name="jboss.api" value="private"/>
|
|
||||||
</properties>
|
|
||||||
<resources>
|
|
||||||
<!-- Insert resources here -->
|
|
||||||
</resources>
|
|
||||||
<dependencies>
|
|
||||||
<module name="javax.api"/>
|
|
||||||
<module name="org.bouncycastle" />
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-annotations"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-core"/>
|
|
||||||
<module name="com.fasterxml.jackson.core.jackson-databind"/>
|
|
||||||
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider"/>
|
|
||||||
<module name="org.apache.httpcomponents" slot="4.3" />
|
|
||||||
<module name="javax.servlet.api"/>
|
|
||||||
<module name="org.jboss.logging"/>
|
|
||||||
<module name="io.undertow.core"/>
|
|
||||||
<module name="io.undertow.servlet"/>
|
|
||||||
<module name="org.picketbox"/>
|
|
||||||
<module name="org.keycloak.keycloak-undertow-adapter"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-spi"/>
|
|
||||||
<module name="org.keycloak.keycloak-adapter-core"/>
|
|
||||||
<module name="org.keycloak.keycloak-core"/>
|
|
||||||
<module name="org.keycloak.keycloak-common"/>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</module>
|
|
|
@ -13,7 +13,6 @@
|
||||||
keycloak-js-adapter-dist
|
keycloak-js-adapter-dist
|
||||||
keycloak-tomcat7-adapter-dist
|
keycloak-tomcat7-adapter-dist
|
||||||
keycloak-tomcat8-adapter-dist
|
keycloak-tomcat8-adapter-dist
|
||||||
keycloak-wf8-adapter-dist
|
|
||||||
keycloak-wildfly-adapter-dist
|
keycloak-wildfly-adapter-dist
|
||||||
keycloak-fuse-adapter-dist
|
keycloak-fuse-adapter-dist
|
||||||
|
|
||||||
|
@ -25,4 +24,4 @@
|
||||||
keycloak-saml-jetty94-adapter-dist
|
keycloak-saml-jetty94-adapter-dist
|
||||||
keycloak-saml-tomcat7-adapter-dist
|
keycloak-saml-tomcat7-adapter-dist
|
||||||
keycloak-saml-tomcat8-adapter-dist
|
keycloak-saml-tomcat8-adapter-dist
|
||||||
keycloak-saml-wildfly-adapter-dist
|
keycloak-saml-wildfly-adapter-dist
|
||||||
|
|
18
pom.xml
18
pom.xml
|
@ -73,7 +73,6 @@
|
||||||
<javax.mail.version>1.6.2</javax.mail.version>
|
<javax.mail.version>1.6.2</javax.mail.version>
|
||||||
<jboss.logging.version>3.3.2.Final</jboss.logging.version>
|
<jboss.logging.version>3.3.2.Final</jboss.logging.version>
|
||||||
<jboss.logging.tools.version>2.1.0.Final</jboss.logging.tools.version>
|
<jboss.logging.tools.version>2.1.0.Final</jboss.logging.tools.version>
|
||||||
<jboss.logging.tools.wf8.version>1.2.0.Final</jboss.logging.tools.wf8.version>
|
|
||||||
<jboss-jaxrs-api_2.1_spec>1.0.2.Final</jboss-jaxrs-api_2.1_spec>
|
<jboss-jaxrs-api_2.1_spec>1.0.2.Final</jboss-jaxrs-api_2.1_spec>
|
||||||
<jboss-transaction-api_1.2_spec>1.1.1.Final</jboss-transaction-api_1.2_spec>
|
<jboss-transaction-api_1.2_spec>1.1.1.Final</jboss-transaction-api_1.2_spec>
|
||||||
<jboss.spec.javax.xml.bind.jboss-jaxb-api_2.3_spec.version>1.0.1.Final</jboss.spec.javax.xml.bind.jboss-jaxb-api_2.3_spec.version>
|
<jboss.spec.javax.xml.bind.jboss-jaxb-api_2.3_spec.version>1.0.1.Final</jboss.spec.javax.xml.bind.jboss-jaxb-api_2.3_spec.version>
|
||||||
|
@ -925,11 +924,6 @@
|
||||||
<artifactId>keycloak-as7-subsystem</artifactId>
|
<artifactId>keycloak-as7-subsystem</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wf8-subsystem</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-wildfly-subsystem</artifactId>
|
<artifactId>keycloak-wildfly-subsystem</artifactId>
|
||||||
|
@ -1187,12 +1181,6 @@
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
<type>zip</type>
|
<type>zip</type>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wf8-modules</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
<type>zip</type>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-wildfly-modules</artifactId>
|
<artifactId>keycloak-wildfly-modules</artifactId>
|
||||||
|
@ -1264,12 +1252,6 @@
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
<type>zip</type>
|
<type>zip</type>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.keycloak</groupId>
|
|
||||||
<artifactId>keycloak-wf8-adapter-dist</artifactId>
|
|
||||||
<version>${project.version}</version>
|
|
||||||
<type>zip</type>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-tomcat7-adapter-dist</artifactId>
|
<artifactId>keycloak-tomcat7-adapter-dist</artifactId>
|
||||||
|
|
Loading…
Reference in a new issue