Repository: nifi Updated Branches: refs/heads/master 567535c3d -> d4bbd647c
NIFI-2586 - Javadocs, ExitCode cleanup, password generation improvement, setting cluster secure to true, making properties writer more flexible This closes #879. Signed-off-by: Bryan Bende <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/d4bbd647 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/d4bbd647 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/d4bbd647 Branch: refs/heads/master Commit: d4bbd647c5df38da4e9b371fbd99d38ac7605957 Parents: 567535c Author: Bryan Rosander <[email protected]> Authored: Tue Aug 16 17:38:08 2016 -0400 Committer: Bryan Bende <[email protected]> Committed: Thu Aug 18 09:26:32 2016 -0400 ---------------------------------------------------------------------- .../main/resources/classpath/overlay.properties | 22 +++++++- .../apache/nifi/toolkit/tls/TlsToolkitMain.java | 15 ++++- .../tls/commandLine/BaseCommandLine.java | 46 +++++++++++++++- .../commandLine/CommandLineParseException.java | 14 ++++- .../nifi/toolkit/tls/commandLine/ExitCode.java | 42 ++++++++++++++ .../tls/configuration/StandaloneConfig.java | 3 + .../tls/configuration/TlsClientConfig.java | 3 + .../toolkit/tls/configuration/TlsConfig.java | 3 + .../toolkit/tls/manager/BaseTlsManager.java | 58 ++++++++++++++++---- .../manager/TlsCertificateAuthorityManager.java | 11 ++++ .../toolkit/tls/manager/TlsClientManager.java | 2 +- .../tls/manager/writer/ConfigurationWriter.java | 16 +++++- .../manager/writer/JsonConfigurationWriter.java | 11 ++-- .../NifiPropertiesTlsClientConfigWriter.java | 43 +++++++++------ .../tls/properties/NiFiPropertiesWriter.java | 17 ++++++ .../properties/NiFiPropertiesWriterFactory.java | 8 +++ .../BaseCertificateAuthorityCommandLine.java | 3 + .../client/TlsCertificateAuthorityClient.java | 2 +- ...lsCertificateAuthorityClientCommandLine.java | 5 +- .../server/TlsCertificateAuthorityService.java | 2 +- ...sCertificateAuthorityServiceCommandLine.java | 5 +- .../tls/standalone/TlsToolkitStandalone.java | 2 +- .../TlsToolkitStandaloneCommandLine.java | 10 +++- .../nifi/toolkit/tls/util/PasswordUtil.java | 6 +- .../nifi/toolkit/tls/TlsToolkitMainTest.java | 17 ++++++ ...NifiPropertiesTlsClientConfigWriterTest.java | 15 ++--- ...rtificateAuthorityClientCommandLineTest.java | 4 +- .../TlsToolkitStandaloneCommandLineTest.java | 10 ++-- .../nifi/toolkit/tls/util/PasswordUtilTest.java | 5 +- .../src/test/resources/overlay.properties | 22 +++++++- 30 files changed, 354 insertions(+), 68 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties b/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties index c4d02c2..2084bf3 100644 --- a/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties +++ b/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties @@ -15,9 +15,27 @@ # limitations under the License. # +# This properties file specifies how to update the provided nifi.properties + # Comma separated list of properties to put the hostname into -hostname.properties=nifi.remote.input.host,nifi.web.https.host,nifi.cluster.node.address +hostname.properties= \ + nifi.remote.input.host, \ + nifi.web.https.host, \ + nifi.cluster.node.address + +# Comma separated list of properties to increment (must also be defined in this file) +incrementing.properties= \ + nifi.web.https.port, \ + nifi.remote.input.socket.port, \ + nifi.cluster.node.protocol.port nifi.web.https.port=9443 nifi.remote.input.socket.port=10443 -nifi.cluster.node.protocol.port=11443 \ No newline at end of file +nifi.cluster.node.protocol.port=11443 + +# Properties to set verbatim +nifi.remote.input.secure=true +nifi.cluster.protocol.is.secure=true + +nifi.web.http.host= +nifi.web.http.port= \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java index 4614558..c0dc4b2 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java @@ -25,11 +25,12 @@ import org.apache.nifi.toolkit.tls.standalone.TlsToolkitStandaloneCommandLine; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; /** - * Command line entry point + * Command line entry point that looks through a map of possible services to delegate to */ public class TlsToolkitMain { public static final String DESCRIPTION = "DESCRIPTION"; @@ -43,6 +44,11 @@ public class TlsToolkitMain { mainMap.put("client", TlsCertificateAuthorityClientCommandLine.class); } + /** + * Callthrough to doMain + * + * @param args the command line arguments + */ public static void main(String[] args) { new TlsToolkitMain().doMain(args); } @@ -85,6 +91,11 @@ public class TlsToolkitMain { } } + /** + * Invokes the main of the relevant service + * + * @param args the command line arguments + */ public void doMain(String[] args) { if (args.length < 1) { printUsageAndExit("Expected at least a service argument.", ExitCode.INVALID_ARGS); @@ -93,7 +104,7 @@ public class TlsToolkitMain { String service = args[0].toLowerCase(); try { - getMain(service).invoke(null, (Object) args); + getMain(service).invoke(null, (Object) Arrays.copyOfRange(args, 1, args.length, String[].class)); } catch (IllegalAccessException e) { printUsageAndExit("Service " + service + " has invalid main method.", ExitCode.SERVICE_ERROR); } catch (InvocationTargetException e) { http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java index 763f715..7905e0f 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java @@ -26,6 +26,9 @@ import org.apache.commons.cli.ParseException; import org.apache.nifi.toolkit.tls.TlsToolkitMain; import org.apache.nifi.toolkit.tls.configuration.TlsConfig; +/** + * Base class with common CLI parsing functionality as well as arguments shared by multiple entry points + */ public abstract class BaseCommandLine { public static final String HELP_ARG = "help"; public static final String JAVA_HOME = "JAVA_HOME"; @@ -112,7 +115,7 @@ public abstract class BaseCommandLine { protected <T> T printUsageAndThrow(String errorMessage, ExitCode exitCode) throws CommandLineParseException { printUsage(errorMessage); - throw new CommandLineParseException(errorMessage, exitCode.ordinal()); + throw new CommandLineParseException(errorMessage, exitCode); } protected int getIntValue(CommandLine commandLine, String arg, int defaultVal) throws CommandLineParseException { @@ -123,30 +126,65 @@ public abstract class BaseCommandLine { } } + /** + * Returns the number of bits used when generating KeyPairs + * + * @return the number of bits used when generating KeyPairs + */ public int getKeySize() { return keySize; } + /** + * Returns the algorithm used when generating KeyPairs + * + * @return the algorithm used when generating KeyPairs + */ public String getKeyAlgorithm() { return keyAlgorithm; } + /** + * Returns the CA Hostname + * + * @return the CA Hostname + */ public String getCertificateAuthorityHostname() { return certificateAuthorityHostname; } + /** + * Returns the type to use for KeyStores + * + * @return the type to use for KeyStores + */ public String getKeyStoreType() { return keyStoreType; } + /** + * Returns the number of Certificates should be valid for + * + * @return the number of Certificates should be valid for + */ public int getDays() { return days; } + /** + * Returns the signing algorithm to use for cryptographic operations + * + * @return the signing algorithm to use for cryptographic operations + */ public String getSigningAlgorithm() { return signingAlgorithm; } + /** + * Returns true if different passwords should be used for KeyStore and individual Key entries + * + * @return true if different passwords should be used for KeyStore and individual Key entries + */ public boolean differentPasswordForKeyAndKeystore() { return differentPasswordForKeyAndKeystore; } @@ -172,6 +210,12 @@ public abstract class BaseCommandLine { return commandLine; } + /** + * Parses the command line arguments + * + * @param args the command line arguments + * @throws CommandLineParseException if the arguments cannot be parsed + */ public void parse(String... args) throws CommandLineParseException { doParse(args); } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java index d09cc08..21d7083 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java @@ -17,15 +17,23 @@ package org.apache.nifi.toolkit.tls.commandLine; +/** + * Exception for errors while parsing the command line + */ public class CommandLineParseException extends Exception { - private final int exitCode; + private final ExitCode exitCode; - public CommandLineParseException(String message, int exitCode) { + public CommandLineParseException(String message, ExitCode exitCode) { super(message); this.exitCode = exitCode; } - public int getExitCode() { + /** + * Returns the exit code to use + * + * @return the exit code to use + */ + public ExitCode getExitCode() { return exitCode; } } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java index f06ac2d..6ff733c 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java @@ -17,15 +17,57 @@ package org.apache.nifi.toolkit.tls.commandLine; +/** + * Possible exit codes + */ public enum ExitCode { + /** + * Tool ran successfully + */ SUCCESS, + + /** + * Tool exited after printing help + */ HELP, + + /** + * Invalid arguments passed in via command line + */ INVALID_ARGS, + + /** + * Error invoking service + */ SERVICE_ERROR, + + /** + * Unable to parse command line + */ ERROR_PARSING_COMMAND_LINE, + + /** + * Unable to generate configuration + */ ERROR_GENERATING_CONFIG, + + /** + * Specified wrong number of passwords + */ ERROR_INCORRECT_NUMBER_OF_PASSWORDS, + + /** + * Expected an integer for an argument + */ ERROR_PARSING_INT_ARG, + + /** + * Did not specify token + */ ERROR_TOKEN_ARG_EMPTY, + + /** + * Unable to read nifi.properties + */ ERROR_READING_NIFI_PROPERTIES } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java index 740a9a2..7ac44a4 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java @@ -22,6 +22,9 @@ import org.apache.nifi.toolkit.tls.properties.NiFiPropertiesWriterFactory; import java.io.File; import java.util.List; +/** + * Configuration object of the standalone service + */ public class StandaloneConfig extends TlsConfig { private File baseDir; private NiFiPropertiesWriterFactory niFiPropertiesWriterFactory; http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java index 78ca9d6..927771d 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java @@ -22,6 +22,9 @@ import org.apache.nifi.util.StringUtils; import java.security.NoSuchAlgorithmException; +/** + * Configuration object for CA client + */ public class TlsClientConfig extends TlsConfig { private String trustStore; private String trustStorePassword; http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java index 8aa3e40..255a546 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java @@ -20,6 +20,9 @@ package org.apache.nifi.toolkit.tls.configuration; import org.apache.nifi.security.util.CertificateUtils; import org.apache.nifi.util.StringUtils; +/** + * Configuration object for CA server + */ public class TlsConfig { public static final String DEFAULT_HOSTNAME = "localhost"; public static final String DEFAULT_KEY_STORE_TYPE = "jks"; http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java index 6215fc0..965481e 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java @@ -34,13 +34,14 @@ import java.security.GeneralSecurityException; import java.security.KeyPair; import java.security.KeyStore; import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; -import java.security.UnrecoverableEntryException; import java.security.cert.Certificate; import java.util.ArrayList; import java.util.List; +/** + * Base class for managing KeyStores and Certificates + */ public class BaseTlsManager { public static final String PKCS_12 = "PKCS12"; private final TlsConfig tlsConfig; @@ -63,24 +64,47 @@ public class BaseTlsManager { this.configurationWriters = new ArrayList<>(); } + /** + * Returns the KeyStore + * + * @return the KeyStore + */ public KeyStore getKeyStore() { return keyStore; } - public KeyStore.Entry getEntry(String alias) throws UnrecoverableEntryException, NoSuchAlgorithmException, KeyStoreException { + /** + * Returns an entry from the KeyStore with the given alias + * + * @param alias the alias + * @return an entry from the KeyStore with the given alias + * @throws GeneralSecurityException if there is a problem retrieving the entry + */ + public KeyStore.Entry getEntry(String alias) throws GeneralSecurityException { String keyPassword = getKeyPassword(); return keyStore.getEntry(alias, new KeyStore.PasswordProtection(keyPassword == null ? null : keyPassword.toCharArray())); } - public KeyStore.Entry addPrivateKeyToKeyStore(KeyPair keyPair, String alias, Certificate... certificates) throws GeneralSecurityException, IOException { - return addPrivateKeyToKeyStore(keyStore, keyPair, alias, getKeyPassword(), certificates); - } - - private KeyStore.Entry addPrivateKeyToKeyStore(KeyStore keyStore, KeyPair keyPair, String alias, String passphrase, Certificate... certificates) throws GeneralSecurityException, IOException { + /** + * Adds the private key of the KeyPair to the KeyStore and returns the entry + * + * @param keyPair the KeyPair + * @param alias the alias + * @param certificates the certificate chain + * @return the entry + * @throws GeneralSecurityException if there is a problem performing the operation + */ + public KeyStore.Entry addPrivateKeyToKeyStore(KeyPair keyPair, String alias, Certificate... certificates) throws GeneralSecurityException { + String passphrase = getKeyPassword(); keyStore.setKeyEntry(alias, keyPair.getPrivate(), passphrase == null ? null : passphrase.toCharArray(), certificates); return getEntry(alias); } + /** + * Sets a flag indicating whether to use a different key and keystore password + * + * @param differentKeyAndKeyStorePassword a flag indicating whether to use a different key and keystore password + */ public void setDifferentKeyAndKeyStorePassword(boolean differentKeyAndKeyStorePassword) { this.differentKeyAndKeyStorePassword = differentKeyAndKeyStorePassword; } @@ -134,24 +158,36 @@ public class BaseTlsManager { return result; } + /** + * Writes the KeyStore and configuration information + * + * @param outputStreamFactory factory interface for creating output streams + * @throws IOException if there is an IO problem while writing + * @throws GeneralSecurityException if there is a security problem while writing + */ public void write(OutputStreamFactory outputStreamFactory) throws IOException, GeneralSecurityException { String keyStorePassword = getKeyStorePassword(); tlsConfig.setKeyStorePassword(TlsHelper.writeKeyStore(keyStore, outputStreamFactory, new File(tlsConfig.getKeyStore()), keyStorePassword, keyStorePasswordGenerated)); for (ConfigurationWriter<TlsConfig> configurationWriter : configurationWriters) { - configurationWriter.write(tlsConfig); + configurationWriter.write(tlsConfig, outputStreamFactory); } } - public PasswordUtil getPasswordUtil() { + protected PasswordUtil getPasswordUtil() { return passwordUtil; } + /** + * Adds a ConfigurationWriter which will have an opportunity to write configuration information + * + * @param configurationWriter a ConfigurationWriter which will have an opportunity to write configuration information + */ public void addConfigurationWriter(ConfigurationWriter<TlsConfig> configurationWriter) { configurationWriters.add(configurationWriter); } - public TlsConfig getTlsConfig() { + protected TlsConfig getTlsConfig() { return tlsConfig; } } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java index 2fa0534..8352213 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java @@ -28,11 +28,22 @@ import java.security.KeyPair; import java.security.KeyStore; import java.security.cert.X509Certificate; +/** + * KeyStore manager capable of reading or instantiating a CA Certificate + */ public class TlsCertificateAuthorityManager extends BaseTlsManager { public TlsCertificateAuthorityManager(TlsConfig tlsConfig) throws GeneralSecurityException, IOException { super(tlsConfig); } + /** + * Reads the CA from the KeyStore, creating one and putting it into the KeyStore if not present + * + * @return the PrivateKeyEntry for the CA + * + * @throws GeneralSecurityException if there is a security problem + * @throws IOException if there is an IO problem + */ public KeyStore.PrivateKeyEntry getOrGenerateCertificateAuthority() throws GeneralSecurityException, IOException { KeyStore.Entry entry = getEntry(TlsToolkitStandalone.NIFI_KEY); if (entry == null) { http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java index 3113701..7df80ab 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java @@ -86,7 +86,7 @@ public class TlsClientManager extends BaseTlsManager { tlsClientConfig.setTrustStorePassword(trustStorePassword); for (ConfigurationWriter<TlsClientConfig> configurationWriter : configurationWriters) { - configurationWriter.write(tlsClientConfig); + configurationWriter.write(tlsClientConfig, outputStreamFactory); } if (certificateAuthorityDirectory != null) { http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java index e669d7e..435bfd5 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java @@ -17,8 +17,22 @@ package org.apache.nifi.toolkit.tls.manager.writer; +import org.apache.nifi.toolkit.tls.util.OutputStreamFactory; + import java.io.IOException; +/** + * Class that can write out configuration information on the given object + * + * @param <T> the type of Object to write information about + */ public interface ConfigurationWriter<T> { - void write(T t) throws IOException; + /** + * Writes configuration information about the given object + * + * @param t the object + * @param outputStreamFactory an OutputStreamFactory + * @throws IOException if there is an IO problem + */ + void write(T t, OutputStreamFactory outputStreamFactory) throws IOException; } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java index 475553b..77bdc34 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java @@ -25,19 +25,22 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; +/** + * Will write the object in JSON format + * + * @param <T> the type of object + */ public class JsonConfigurationWriter<T> implements ConfigurationWriter<T> { private final ObjectWriter objectWriter; - private final OutputStreamFactory outputStreamFactory; private final File file; - public JsonConfigurationWriter(ObjectMapper objectMapper, OutputStreamFactory outputStreamFactory, File file) { + public JsonConfigurationWriter(ObjectMapper objectMapper, File file) { this.objectWriter = objectMapper.writerWithDefaultPrettyPrinter(); - this.outputStreamFactory = outputStreamFactory; this.file = file; } @Override - public void write(T tlsConfig) throws IOException { + public void write(T tlsConfig, OutputStreamFactory outputStreamFactory) throws IOException { try (OutputStream stream = outputStreamFactory.create(file)) { objectWriter.writeValue(stream, tlsConfig); } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java index c2ecca4..9d24c5a 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java @@ -37,34 +37,37 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +/** + * Will write a nifi.properties file appropriate for the given client config + */ public class NifiPropertiesTlsClientConfigWriter implements ConfigurationWriter<TlsClientConfig> { public static final String HOSTNAME_PROPERTIES = "hostname.properties"; public static final String OVERLAY_PROPERTIES = "overlay.properties"; + public static final String INCREMENTING_PROPERTIES = "incrementing.properties"; public static final String CONF = "./conf/"; private final NiFiPropertiesWriterFactory niFiPropertiesWriterFactory; - private final OutputStreamFactory outputStreamFactory; private final File outputFile; private final String hostname; private final int hostNum; private final Properties overlayProperties; - private final Set<String> explicitProperties; + private final Set<String> metaProperties; - public NifiPropertiesTlsClientConfigWriter(NiFiPropertiesWriterFactory niFiPropertiesWriterFactory, OutputStreamFactory outputStreamFactory, File outputFile, String hostname, int hostNum) - throws IOException { + public NifiPropertiesTlsClientConfigWriter(NiFiPropertiesWriterFactory niFiPropertiesWriterFactory, File outputFile, String hostname, int hostNum) throws IOException { this.niFiPropertiesWriterFactory = niFiPropertiesWriterFactory; - this.outputStreamFactory = outputStreamFactory; this.outputFile = outputFile; this.hostname = hostname; this.hostNum = hostNum; this.overlayProperties = new Properties(); this.overlayProperties.load(getClass().getClassLoader().getResourceAsStream(OVERLAY_PROPERTIES)); - HashSet<String> explicitProperties = new HashSet<>(); - explicitProperties.add(HOSTNAME_PROPERTIES); - this.explicitProperties = Collections.unmodifiableSet(explicitProperties); + HashSet<String> metaProperties = new HashSet<>(); + metaProperties.add(HOSTNAME_PROPERTIES); + metaProperties.add(INCREMENTING_PROPERTIES); + getIncrementingPropertiesStream().forEach(metaProperties::add); + this.metaProperties = Collections.unmodifiableSet(metaProperties); } @Override - public void write(TlsClientConfig tlsClientConfig) throws IOException { + public void write(TlsClientConfig tlsClientConfig, OutputStreamFactory outputStreamFactory) throws IOException { NiFiPropertiesWriter niFiPropertiesWriter = niFiPropertiesWriterFactory.create(); updateProperties(niFiPropertiesWriter, tlsClientConfig); try (OutputStream stream = outputStreamFactory.create(outputFile)) { @@ -82,21 +85,19 @@ public class NifiPropertiesTlsClientConfigWriter implements ConfigurationWriter< niFiPropertiesWriter.setPropertyValue(NiFiProperties.SECURITY_TRUSTSTORE_TYPE, tlsClientConfig.getTrustStoreType()); niFiPropertiesWriter.setPropertyValue(NiFiProperties.SECURITY_TRUSTSTORE_PASSWD, tlsClientConfig.getTrustStorePassword()); - niFiPropertiesWriter.setPropertyValue(NiFiProperties.WEB_HTTP_HOST, ""); - niFiPropertiesWriter.setPropertyValue(NiFiProperties.WEB_HTTP_PORT, ""); - niFiPropertiesWriter.setPropertyValue(NiFiProperties.SITE_TO_SITE_SECURE, "true"); - getHostnamePropertyStream().forEach(s -> niFiPropertiesWriter.setPropertyValue(s, hostname)); - getPropertyPortMap().entrySet().forEach(nameToPortEntry -> niFiPropertiesWriter.setPropertyValue(nameToPortEntry.getKey(), Integer.toString(nameToPortEntry.getValue()))); + overlayProperties.stringPropertyNames().stream().filter(s -> !metaProperties.contains(s)).forEach(s -> niFiPropertiesWriter.setPropertyValue(s, overlayProperties.getProperty(s))); + + getIncrementingPropertyMap().entrySet().forEach(nameToIntegerEntry -> niFiPropertiesWriter.setPropertyValue(nameToIntegerEntry.getKey(), Integer.toString(nameToIntegerEntry.getValue()))); } protected Properties getOverlayProperties() { return overlayProperties; } - protected Map<String, Integer> getPropertyPortMap() { - return overlayProperties.stringPropertyNames().stream().filter(s -> !explicitProperties.contains(s)).collect(Collectors.toMap(Function.identity(), portProperty -> { + protected Map<String, Integer> getIncrementingPropertyMap() { + return getIncrementingPropertiesStream().collect(Collectors.toMap(Function.identity(), portProperty -> { String portVal = overlayProperties.getProperty(portProperty); int startingPort; try { @@ -108,8 +109,16 @@ public class NifiPropertiesTlsClientConfigWriter implements ConfigurationWriter< })); } + protected Stream<String> getIncrementingPropertiesStream() { + return getCommaSeparatedPropertyStream(INCREMENTING_PROPERTIES); + } + protected Stream<String> getHostnamePropertyStream() { - String hostnamePropertyString = overlayProperties.getProperty(HOSTNAME_PROPERTIES); + return getCommaSeparatedPropertyStream(HOSTNAME_PROPERTIES); + } + + private Stream<String> getCommaSeparatedPropertyStream(String property) { + String hostnamePropertyString = overlayProperties.getProperty(property); if (!StringUtils.isEmpty(hostnamePropertyString)) { return Arrays.stream(hostnamePropertyString.split(",")).map(String::trim); } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java index 61cbc67..1908461 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java @@ -28,6 +28,11 @@ import java.util.List; import java.util.Map; import java.util.Set; +/** + * Class capable of writing out updated NiFi properties. It keeps a list of original lines and a map of updates to apply. + * + * It first writes all the original properties (with updated values if they exist) and then adds any new properties at the end. + */ public class NiFiPropertiesWriter { private final List<String> lines; private final Map<String, String> updatedValues; @@ -37,10 +42,22 @@ public class NiFiPropertiesWriter { this.updatedValues = new HashMap<>(); } + /** + * Sets a property value + * + * @param key the property key + * @param value the property value + */ public void setPropertyValue(String key, String value) { updatedValues.put(key, value); } + /** + * Write an updated nifi.properties to the given OutputStream + * + * @param outputStream the output stream + * @throws IOException if there is an IO error + */ public void writeNiFiProperties(OutputStream outputStream) throws IOException { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream))) { Map<String, String> remainingValues = new HashMap<>(updatedValues); http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java index cf8212c..cf2383c 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java @@ -27,6 +27,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +/** + * Factory for creating NifiPropertiesWriters so that the lines only have to be read once + */ public class NiFiPropertiesWriterFactory { private final List<String> lines; @@ -45,6 +48,11 @@ public class NiFiPropertiesWriterFactory { this.lines = Collections.unmodifiableList(lines); } + /** + * Returns a NifiPropertiesWriter with based on the read nifi.properties + * + * @return a NifiPropertiesWriter with based on the read nifi.properties + */ public NiFiPropertiesWriter create() { return new NiFiPropertiesWriter(lines); } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java index 97fa45b..47ebd17 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java @@ -26,6 +26,9 @@ import org.apache.nifi.util.StringUtils; import java.io.File; +/** + * Common base argument logic for the CA server and client + */ public abstract class BaseCertificateAuthorityCommandLine extends BaseCommandLine { public static final String TOKEN_ARG = "token"; public static final String CONFIG_JSON_ARG = "configJson"; http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java index c0e2301..2068c98 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java @@ -66,7 +66,7 @@ public class TlsCertificateAuthorityClient { } if (!StringUtils.isEmpty(configJson)) { - tlsClientManager.addClientConfigurationWriter(new JsonConfigurationWriter<>(new ObjectMapper(), outputStreamFactory, new File(configJson))); + tlsClientManager.addClientConfigurationWriter(new JsonConfigurationWriter<>(new ObjectMapper(), new File(configJson))); } if (tlsClientManager.getEntry(TlsToolkitStandalone.NIFI_KEY) == null) { http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java index dd432c3..83b28be 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java @@ -35,6 +35,9 @@ import java.io.InputStream; import java.net.InetAddress; import java.net.UnknownHostException; +/** + * Command line parser for a TlsClientConfig object and a main entry point to invoke the parser and run the CA client + */ public class TlsCertificateAuthorityClientCommandLine extends BaseCertificateAuthorityCommandLine { public static final String DESCRIPTION = "Generates a private key and gets it signed by the certificate authority."; public static final String CERTIFICATE_DIRECTORY = "certificateDirectory"; @@ -61,7 +64,7 @@ public class TlsCertificateAuthorityClientCommandLine extends BaseCertificateAut try { tlsCertificateAuthorityClientCommandLine.parse(args); } catch (CommandLineParseException e) { - System.exit(e.getExitCode()); + System.exit(e.getExitCode().ordinal()); } new TlsCertificateAuthorityClient().generateCertificateAndGetItSigned(tlsCertificateAuthorityClientCommandLine.createClientConfig(), tlsCertificateAuthorityClientCommandLine.getCertificateDirectory(), tlsCertificateAuthorityClientCommandLine.getConfigJson(), http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java index d21ea36..18c4f65 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java @@ -93,7 +93,7 @@ public class TlsCertificateAuthorityService { BaseCertificateAuthorityCommandLine.USE_CONFIG_JSON_ARG); throw e; } - tlsManager.addConfigurationWriter(new JsonConfigurationWriter<>(objectMapper, outputStreamFactory, new File(configJson))); + tlsManager.addConfigurationWriter(new JsonConfigurationWriter<>(objectMapper, new File(configJson))); KeyStore.PrivateKeyEntry privateKeyEntry = tlsManager.getOrGenerateCertificateAuthority(); KeyPair keyPair = new KeyPair(privateKeyEntry.getCertificate().getPublicKey(), privateKeyEntry.getPrivateKey()); http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java index 2b1db39..948409a 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java @@ -30,6 +30,9 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +/** + * Command line parser for a TlsConfig object and a main entry point to invoke the parser and run the CA server + */ public class TlsCertificateAuthorityServiceCommandLine extends BaseCertificateAuthorityCommandLine { public static final String DESCRIPTION = "Acts as a Certificate Authority that can be used by clients to get Certificates"; public static final String NIFI_CA_KEYSTORE = "nifi-ca-" + KEYSTORE; @@ -51,7 +54,7 @@ public class TlsCertificateAuthorityServiceCommandLine extends BaseCertificateAu try { tlsCertificateAuthorityServiceCommandLine.parse(args); } catch (CommandLineParseException e) { - System.exit(e.getExitCode()); + System.exit(e.getExitCode().ordinal()); } TlsCertificateAuthorityService tlsCertificateAuthorityService = new TlsCertificateAuthorityService(); tlsCertificateAuthorityService.start(tlsCertificateAuthorityServiceCommandLine.createConfig(), tlsCertificateAuthorityServiceCommandLine.getConfigJson(), http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java index 8dc5186..5129288 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java @@ -183,7 +183,7 @@ public class TlsToolkitStandalone { tlsClientManager.addPrivateKeyToKeyStore(keyPair, NIFI_KEY, CertificateUtils.generateIssuedCertificate(TlsConfig.calcDefaultDn(hostname), keyPair.getPublic(), certificate, caKeyPair, signingAlgorithm, days), certificate); tlsClientManager.setCertificateEntry(NIFI_CERT, certificate); - tlsClientManager.addClientConfigurationWriter(new NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, outputStreamFactory, new File(hostDir, "nifi.properties"), + tlsClientManager.addClientConfigurationWriter(new NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, new File(hostDir, "nifi.properties"), hostname, instanceDefinition.getNumber())); tlsClientManager.write(outputStreamFactory); if (logger.isInfoEnabled()) { http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java index 4ba0746..f6d761f 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java @@ -42,6 +42,9 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; +/** + * Command line parser for a StandaloneConfig object and a main entry point to invoke the parser and run the standalone generator + */ public class TlsToolkitStandaloneCommandLine extends BaseCommandLine { public static final String OUTPUT_DIRECTORY_ARG = "outputDirectory"; public static final String NIFI_PROPERTIES_FILE_ARG = "nifiPropertiesFile"; @@ -95,7 +98,7 @@ public class TlsToolkitStandaloneCommandLine extends BaseCommandLine { try { tlsToolkitStandaloneCommandLine.parse(args); } catch (CommandLineParseException e) { - System.exit(e.getExitCode()); + System.exit(e.getExitCode().ordinal()); } try { new TlsToolkitStandalone().createNifiKeystoresAndTrustStores(tlsToolkitStandaloneCommandLine.createConfig()); @@ -181,6 +184,11 @@ public class TlsToolkitStandaloneCommandLine extends BaseCommandLine { } } + /** + * Creates the StandaloneConfig for use in running TlsToolkitStandalone + * + * @return the StandaloneConfig for use in running TlsToolkitStandalone + */ public StandaloneConfig createConfig() { StandaloneConfig standaloneConfig = new StandaloneConfig(); http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java index 2c7a6aa..fb49455 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java @@ -17,7 +17,6 @@ package org.apache.nifi.toolkit.tls.util; -import java.math.BigInteger; import java.security.SecureRandom; import java.util.Base64; import java.util.concurrent.atomic.AtomicInteger; @@ -35,8 +34,9 @@ public class PasswordUtil { } public String generatePassword() { - // [see http://stackoverflow.com/questions/41107/how-to-generate-a-random-alpha-numeric-string#answer-41156] - String string = Base64.getEncoder().encodeToString(new BigInteger(256, secureRandom).toByteArray()); + byte[] bytes = new byte[32]; + secureRandom.nextBytes(bytes); + String string = Base64.getEncoder().encodeToString(bytes); while (string.endsWith("=")) { string = string.substring(0, string.length() - 1); } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java index c9a74dd..971b6f2 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java @@ -25,6 +25,7 @@ import org.junit.Test; import java.io.IOException; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -96,6 +97,14 @@ public class TlsToolkitMainTest { systemExitCapturer.runAndAssertExitCode(() -> tlsToolkitMain.doMain(new String[]{noMain}), ExitCode.SERVICE_ERROR); } + @Test + public void testRemovesServiceArg() { + String storingMain = "storingmain"; + tlsToolkitMain.getMainMap().put(storingMain, StoringMain.class); + tlsToolkitMain.doMain(new String[]{storingMain, "-h"}); + assertArrayEquals(new String[]{"-h"}, StoringMain.args); + } + private static class PrivateMain { private static void main(String[] args) { @@ -111,4 +120,12 @@ public class TlsToolkitMainTest { private static class NoMain { } + + private static class StoringMain { + private static String[] args; + + public static void main(String[] args) { + StoringMain.args = args; + } + } } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java index c96d906..29e39b6 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java @@ -92,27 +92,27 @@ public class NifiPropertiesTlsClientConfigWriterTest { niFiPropertiesWriter = new NiFiPropertiesWriter(new ArrayList<>()); when(niFiPropertiesWriterFactory.create()).thenReturn(niFiPropertiesWriter); - nifiPropertiesTlsClientConfigWriter = new NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, outputStreamFactory, outputFile, testHostname, hostNum); + nifiPropertiesTlsClientConfigWriter = new NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, outputFile, testHostname, hostNum); overlayProperties = nifiPropertiesTlsClientConfigWriter.getOverlayProperties(); } @Test public void testDefaults() throws IOException { - nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig); + nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig, outputStreamFactory); testHostnamesAndPorts(); - assertNotEquals(0, nifiPropertiesTlsClientConfigWriter.getPropertyPortMap().size()); + assertNotEquals(0, nifiPropertiesTlsClientConfigWriter.getIncrementingPropertyMap().size()); } @Test(expected = NumberFormatException.class) public void testBadPortNum() throws IOException { - nifiPropertiesTlsClientConfigWriter.getOverlayProperties().setProperty(nifiPropertiesTlsClientConfigWriter.getPropertyPortMap().keySet().iterator().next(), "notAnInt"); - nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig); + nifiPropertiesTlsClientConfigWriter.getOverlayProperties().setProperty(nifiPropertiesTlsClientConfigWriter.getIncrementingPropertyMap().keySet().iterator().next(), "notAnInt"); + nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig, outputStreamFactory); } @Test public void testNoHostnameProperties() throws IOException { nifiPropertiesTlsClientConfigWriter.getOverlayProperties().setProperty(NifiPropertiesTlsClientConfigWriter.HOSTNAME_PROPERTIES, ""); - nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig); + nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig, outputStreamFactory); testHostnamesAndPorts(); Properties nifiProperties = getNifiProperties(); nifiProperties.stringPropertyNames().forEach(s -> assertNotEquals(testHostname, nifiProperties.getProperty(s))); @@ -133,9 +133,10 @@ public class NifiPropertiesTlsClientConfigWriterTest { assertEquals("", nifiProperties.getProperty(NiFiProperties.WEB_HTTP_HOST)); assertEquals("", nifiProperties.getProperty(NiFiProperties.WEB_HTTP_PORT)); assertEquals(Boolean.toString(true), nifiProperties.getProperty(NiFiProperties.SITE_TO_SITE_SECURE)); + assertEquals(Boolean.toString(true), nifiProperties.getProperty(NiFiProperties.CLUSTER_PROTOCOL_IS_SECURE)); nifiPropertiesTlsClientConfigWriter.getHostnamePropertyStream().forEach(s -> assertEquals(testHostname, nifiProperties.getProperty(s))); - nifiPropertiesTlsClientConfigWriter.getPropertyPortMap().entrySet().forEach(propertyToPortEntry -> { + nifiPropertiesTlsClientConfigWriter.getIncrementingPropertyMap().entrySet().forEach(propertyToPortEntry -> { assertEquals(Integer.toString(propertyToPortEntry.getValue()), nifiProperties.getProperty(propertyToPortEntry.getKey())); assertEquals(Integer.parseInt(overlayProperties.getProperty(propertyToPortEntry.getKey())) + hostNum - 1, propertyToPortEntry.getValue().intValue()); }); http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java index 40a8268..3770cb7 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java @@ -49,7 +49,7 @@ public class TlsCertificateAuthorityClientCommandLineTest { tlsCertificateAuthorityClientCommandLine.parse(new String[0]); fail("Expected failure with no token argument"); } catch (CommandLineParseException e) { - assertEquals(ExitCode.ERROR_TOKEN_ARG_EMPTY.ordinal(), e.getExitCode()); + assertEquals(ExitCode.ERROR_TOKEN_ARG_EMPTY, e.getExitCode()); } } @@ -95,7 +95,7 @@ public class TlsCertificateAuthorityClientCommandLineTest { tlsCertificateAuthorityClientCommandLine.parse("-h"); fail("Expected exception"); } catch (CommandLineParseException e) { - assertEquals(ExitCode.HELP.ordinal(), e.getExitCode()); + assertEquals(ExitCode.HELP, e.getExitCode()); } } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java index a284318..d174748 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java @@ -69,7 +69,7 @@ public class TlsToolkitStandaloneCommandLineTest { tlsToolkitStandaloneCommandLine.parse("-h"); fail("Expected usage and help exit"); } catch (CommandLineParseException e) { - Assert.assertEquals(ExitCode.HELP.ordinal(), e.getExitCode()); + Assert.assertEquals(ExitCode.HELP, e.getExitCode()); } } @@ -79,7 +79,7 @@ public class TlsToolkitStandaloneCommandLineTest { tlsToolkitStandaloneCommandLine.parse("--unknownArg"); fail("Expected error parsing command line"); } catch (CommandLineParseException e) { - assertEquals(ExitCode.ERROR_PARSING_COMMAND_LINE.ordinal(), e.getExitCode()); + assertEquals(ExitCode.ERROR_PARSING_COMMAND_LINE, e.getExitCode()); } } @@ -96,7 +96,7 @@ public class TlsToolkitStandaloneCommandLineTest { tlsToolkitStandaloneCommandLine.parse("-k", "badVal"); fail("Expected bad keysize exit code"); } catch (CommandLineParseException e) { - assertEquals(ExitCode.ERROR_PARSING_INT_ARG.ordinal(), e.getExitCode()); + assertEquals(ExitCode.ERROR_PARSING_INT_ARG, e.getExitCode()); } } @@ -119,7 +119,7 @@ public class TlsToolkitStandaloneCommandLineTest { try { tlsToolkitStandaloneCommandLine.parse("-d", "badVal"); } catch (CommandLineParseException e) { - assertEquals(ExitCode.ERROR_PARSING_INT_ARG.ordinal(), e.getExitCode()); + assertEquals(ExitCode.ERROR_PARSING_INT_ARG, e.getExitCode()); } } @@ -175,7 +175,7 @@ public class TlsToolkitStandaloneCommandLineTest { tlsToolkitStandaloneCommandLine.parse("-f", "/this/file/should/not/exist.txt"); fail("Expected error when unable to read file"); } catch (CommandLineParseException e) { - assertEquals(ExitCode.ERROR_READING_NIFI_PROPERTIES.ordinal(), e.getExitCode()); + assertEquals(ExitCode.ERROR_READING_NIFI_PROPERTIES, e.getExitCode()); } } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java index f08c32c..b4cbf7d 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java +++ b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java @@ -45,7 +45,10 @@ public class PasswordUtilTest { System.arraycopy(val, 0, bytes, bytes.length - val.length, val.length); return null; }).when(secureRandom).nextBytes(any(byte[].class)); - String expected = Base64.getEncoder().encodeToString(BigInteger.valueOf(Integer.valueOf(value).longValue()).toByteArray()).split("=")[0]; + byte[] expectedBytes = new byte[32]; + byte[] numberBytes = BigInteger.valueOf(Integer.valueOf(value).longValue()).toByteArray(); + System.arraycopy(numberBytes, 0, expectedBytes, expectedBytes.length - numberBytes.length, numberBytes.length); + String expected = Base64.getEncoder().encodeToString(expectedBytes).split("=")[0]; String actual = passwordUtil.generatePassword(); assertEquals(expected, actual); } http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties b/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties index c4d02c2..2084bf3 100644 --- a/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties +++ b/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties @@ -15,9 +15,27 @@ # limitations under the License. # +# This properties file specifies how to update the provided nifi.properties + # Comma separated list of properties to put the hostname into -hostname.properties=nifi.remote.input.host,nifi.web.https.host,nifi.cluster.node.address +hostname.properties= \ + nifi.remote.input.host, \ + nifi.web.https.host, \ + nifi.cluster.node.address + +# Comma separated list of properties to increment (must also be defined in this file) +incrementing.properties= \ + nifi.web.https.port, \ + nifi.remote.input.socket.port, \ + nifi.cluster.node.protocol.port nifi.web.https.port=9443 nifi.remote.input.socket.port=10443 -nifi.cluster.node.protocol.port=11443 \ No newline at end of file +nifi.cluster.node.protocol.port=11443 + +# Properties to set verbatim +nifi.remote.input.secure=true +nifi.cluster.protocol.is.secure=true + +nifi.web.http.host= +nifi.web.http.port= \ No newline at end of file
