/*
* JBoss, Home of Professional Open Source
* Copyright 2014, JBoss Inc., and individual contributors as indicated
* by the @authors tag.
*
* 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.jboss.as.test.manualmode.vault;
import java.io.File;
import javax.inject.Inject;
import org.jboss.as.controller.Extension;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.model.test.ModelTestUtils;
import org.jboss.as.server.controller.resources.VaultResourceDefinition;
import org.jboss.as.server.services.security.AbstractVaultReader;
import org.jboss.as.test.integration.security.PicketBoxModuleUtil;
import org.jboss.as.test.manualmode.vault.module.CustomSecurityVault;
import org.jboss.as.test.manualmode.vault.module.RuntimeVaultReader;
import org.jboss.as.test.manualmode.vault.module.TestVaultExtension;
import org.jboss.as.test.manualmode.vault.module.TestVaultParser;
import org.jboss.as.test.manualmode.vault.module.TestVaultRemoveHandler;
import org.jboss.as.test.manualmode.vault.module.TestVaultResolveExpressionHandler;
import org.jboss.as.test.manualmode.vault.module.TestVaultSubsystemResourceDescription;
import org.jboss.as.test.module.util.TestModule;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ValueExpression;
import org.jboss.shrinkwrap.api.ArchivePath;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.core.testrunner.ManagementClient;
import org.wildfly.core.testrunner.ServerControl;
import org.wildfly.core.testrunner.ServerController;
import org.wildfly.core.testrunner.WildflyTestRunner;
import org.xnio.IoUtils;
/**
* @author <a href="mailto:kabir.khan@jboss.com">Kabir Khan</a>
*/
@RunWith(WildflyTestRunner.class)
@ServerControl(manual = true)
//@Ignore("this can only work in core, unless we provide AbstractVaultReader which is currently only present in security subsystem")
public class CustomVaultInModuleTestCase {
private static final String MODULE_NAME = "test.custom.vault.in.module";
@Inject
private static ServerController containerController;
private static TestModule testModule;
private static TestModule picketLink;
private static TestModule securityModule;
@Test
public void testCustomVault() throws Exception {
ModelControllerClient client = containerController.getClient().getControllerClient();
ModelNode op = createResolveExpressionOp("${VAULT::Testing::Stuff::thing}");
ModelNode result = client.execute(op);
Assert.assertEquals("123_Testing_Stuff_thing", ModelTestUtils.checkResultAndGetContents(result).asString());
op = createResolveExpressionOp("${VAULT::Another::Something::whatever}");
result = client.execute(op);
Assert.assertEquals("Hello_Another_Something_whatever", ModelTestUtils.checkResultAndGetContents(result).asString());
op = createResolveExpressionOp("${VAULT::Nothing::is::here}");
ModelTestUtils.checkFailed(client.execute(op));
}
@BeforeClass
public static void setupServer() throws Exception {
createTestModule();
setupServerWithVault();
}
@AfterClass
public static void tearDownServer() throws Exception {
ModelControllerClient client = null;
try {
client = containerController.getClient().getControllerClient();
ModelNode vaultResult = client.execute(Util.createRemoveOperation(PathAddress.pathAddress(VaultResourceDefinition.PATH)));
ModelNode subsystemResult = client.execute(Util.createRemoveOperation(PathAddress.pathAddress(TestVaultSubsystemResourceDescription.PATH)));
ModelNode extensionResult = client.execute(Util.createRemoveOperation(PathAddress.pathAddress(ModelDescriptionConstants.EXTENSION, MODULE_NAME)));
ModelTestUtils.checkOutcome(vaultResult);
ModelTestUtils.checkOutcome(subsystemResult);
ModelTestUtils.checkOutcome(extensionResult);
} finally {
containerController.stop();
testModule.remove();
picketLink.remove();
securityModule.remove();
IoUtils.safeClose(client);
}
containerController.stop();
}
private static void createTestModule() throws Exception {
File moduleXml = new File(CustomSecurityVault.class.getResource(CustomVaultInModuleTestCase.class.getSimpleName() + "-module.xml").toURI());
testModule = new TestModule(MODULE_NAME, moduleXml);
JavaArchive archive = testModule.addResource("test-custom-vault-in-module.jar")
.addClass(CustomSecurityVault.class)
.addClass(TestVaultExtension.class)
.addClass(TestVaultParser.class)
.addClass(TestVaultRemoveHandler.class)
.addClass(TestVaultResolveExpressionHandler.class)
.addClass(TestVaultSubsystemResourceDescription.class);
ArchivePath path = ArchivePaths.create("/");
path = ArchivePaths.create(path, "services");
path = ArchivePaths.create(path, Extension.class.getName());
archive.addAsManifestResource(CustomSecurityVault.class.getPackage(), Extension.class.getName(), path);
testModule.create(true);
//create fake security subsystem module to have vault reader registered
moduleXml = new File(CustomSecurityVault.class.getResource("security-module.xml").toURI());
securityModule = new TestModule("org.jboss.as.security", moduleXml);
archive = securityModule.addResource("custom-vault-reader.jar")
.addClass(RuntimeVaultReader.class);
archive.addAsServiceProvider(AbstractVaultReader.class, RuntimeVaultReader.class);
securityModule.create(true);
picketLink = PicketBoxModuleUtil.createTestModule();
}
private static void setupServerWithVault() throws Exception {
containerController.start();
ManagementClient managementClient = containerController.getClient();
ModelControllerClient client = managementClient.getControllerClient();
//Add the vault
final ModelNode addVault = Util.createAddOperation(PathAddress.pathAddress(VaultResourceDefinition.PATH));
addVault.get(ModelDescriptionConstants.MODULE).set(MODULE_NAME);
addVault.get(ModelDescriptionConstants.CODE).set(CustomSecurityVault.class.getName());
final ModelNode options = new ModelNode();
options.get("Testing").set("123");
options.get("Another").set("Hello");
addVault.get(ModelDescriptionConstants.VAULT_OPTIONS).set(options);
ModelTestUtils.checkOutcome(client.execute(addVault));
//Add the extension
final ModelNode addExtension = Util.createAddOperation(PathAddress.pathAddress(ModelDescriptionConstants.EXTENSION, MODULE_NAME));
ModelTestUtils.checkOutcome(client.execute(addExtension));
final ModelNode addSubsystem = Util.createAddOperation(PathAddress.pathAddress(TestVaultSubsystemResourceDescription.PATH));
ModelTestUtils.checkOutcome(client.execute(addSubsystem));
}
private ModelNode createResolveExpressionOp(String expression) {
ModelNode op = Util.createOperation(TestVaultResolveExpressionHandler.RESOLVE.getName(), PathAddress.pathAddress(TestVaultSubsystemResourceDescription.PATH));
op.get(TestVaultResolveExpressionHandler.PARAM_EXPRESSION.getName()).set(new ValueExpression(expression));
return op;
}
}