package org.wildfly.swarm.undertow.runtime; import static org.wildfly.swarm.spi.api.Defaultable.bool; import static org.wildfly.swarm.spi.api.Defaultable.string; import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.inject.Singleton; import org.jboss.modules.Module; import org.jboss.modules.ModuleIdentifier; import org.wildfly.swarm.SwarmInfo; import org.wildfly.swarm.bootstrap.util.TempFileManager; import org.wildfly.swarm.config.runtime.AttributeDocumentation; import org.wildfly.swarm.internal.SwarmMessages; import org.wildfly.swarm.spi.api.Defaultable; import org.wildfly.swarm.spi.api.annotations.Configurable; import org.wildfly.swarm.undertow.UndertowFraction; import org.wildfly.swarm.undertow.descriptors.CertInfo; /** * @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a> */ @ApplicationScoped public class CertInfoProducer { public static final String JBOSS_DATA_DIR = "jboss.server.data.dir"; @Inject UndertowFraction undertow; @AttributeDocumentation("Should a self-signed certificate be generated") @Configurable("swarm.https.certificate.generate") Defaultable<Boolean> generateSelfCertificate = bool(false); @AttributeDocumentation("Hostname for the generated self-signed certificate") @Configurable("swarm.https.certificate.generate.host") Defaultable<String> selfCertificateHost = string("localhost"); @AttributeDocumentation("Should an embedded keystore be created") @Configurable("swarm.https.keystore.embedded") Defaultable<Boolean> embeddedKeystore = bool(false); @Produces @Singleton public CertInfo produceCertInfo() { if (generateSelfCertificate.get()) { if (SwarmInfo.isProduct()) { throw SwarmMessages.MESSAGES.generateSelfSignedCertificateNotSupported(); } checkDataDir(); return new CertInfo(selfCertificateHost.get(), JBOSS_DATA_DIR); } else { String keystorePath = undertow.keystorePath(); if (embeddedKeystore.get()) { checkDataDir(); Path dataDir = Paths.get(System.getProperty(JBOSS_DATA_DIR)); Path certDestination = dataDir.resolve(keystorePath); try { URL jks = ClassLoader.getSystemClassLoader().getResource(keystorePath); if (jks == null) { Module appModule = Module.getCallerModuleLoader().loadModule(ModuleIdentifier.create("swarm.application")); jks = appModule.getClassLoader().getResource(keystorePath); } if (jks == null) { throw new RuntimeException(String.format("Unable to locate embedded keystore %s in classpath", keystorePath)); } Files.copy(jks.openStream(), certDestination); keystorePath = certDestination.toString(); } catch (Exception ie) { throw new RuntimeException("Error copying embedded certificate", ie); } } String keystorePassword = undertow.keystorePassword(); String keyPassword = undertow.keyPassword(); String keystoreAlias = undertow.alias(); return new CertInfo(keystorePath, keystorePassword, keyPassword, keystoreAlias); } } protected void checkDataDir() { // Remove when SWARM-634 is fixed if (System.getProperty(JBOSS_DATA_DIR) == null) { File tmpDir = null; try { tmpDir = TempFileManager.INSTANCE.newTempDirectory("wildfly-swarm-data", ".d"); System.setProperty(JBOSS_DATA_DIR, tmpDir.getAbsolutePath()); } catch (IOException e) { // Ignore } } } }