diff --git a/network-management/src/main/kotlin/com/r3/corda/networkmanage/doorman/DoormanParameters.kt b/network-management/src/main/kotlin/com/r3/corda/networkmanage/doorman/DoormanParameters.kt index 3361a85b06..0fd23fbc03 100644 --- a/network-management/src/main/kotlin/com/r3/corda/networkmanage/doorman/DoormanParameters.kt +++ b/network-management/src/main/kotlin/com/r3/corda/networkmanage/doorman/DoormanParameters.kt @@ -102,7 +102,7 @@ fun parseParameters(vararg args: String): NetworkManagementServerParameters { val config = argConfig.withFallback(ConfigFactory.parseFile(configFile.toFile(), ConfigParseOptions.defaults().setAllowMissing(true))) .resolve() - .parseAs() + .parseAs(false) // Make sure trust store password is only specified in root keygen mode. if (config.mode != Mode.ROOT_KEYGEN) { diff --git a/network-management/src/main/kotlin/com/r3/corda/networkmanage/hsm/configuration/Configuration.kt b/network-management/src/main/kotlin/com/r3/corda/networkmanage/hsm/configuration/Configuration.kt index 37eb8e9a65..d40e1e9428 100644 --- a/network-management/src/main/kotlin/com/r3/corda/networkmanage/hsm/configuration/Configuration.kt +++ b/network-management/src/main/kotlin/com/r3/corda/networkmanage/hsm/configuration/Configuration.kt @@ -73,5 +73,5 @@ fun parseParameters(vararg args: String): Parameters { require(configFile.isRegularFile()) { "Config file $configFile does not exist" } val config = argConfig.withFallback(ConfigFactory.parseFile(configFile.toFile(), ConfigParseOptions.defaults().setAllowMissing(true))).resolve() - return config.parseAs() + return config.parseAs(false) } \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/config/ConfigUtilities.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/config/ConfigUtilities.kt index dbf880905b..f3b91016d0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/config/ConfigUtilities.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/config/ConfigUtilities.kt @@ -36,25 +36,27 @@ operator fun Config.getValue(receiver: Any, metadata: KProperty<*>): T return getValueInternal(metadata.name, metadata.returnType) } -fun Config.parseAs(clazz: KClass): T { +fun Config.parseAs(clazz: KClass, strict: Boolean = true): T { require(clazz.isData) { "Only Kotlin data classes can be parsed. Offending: ${clazz.qualifiedName}" } val constructor = clazz.primaryConstructor!! val parameters = constructor.parameters - val parameterNames = parameters.flatMap { param -> - mutableSetOf().apply { - param.name?.let(this::add) - clazz.memberProperties.singleOrNull { it.name == param.name }?.let { matchingProperty -> - matchingProperty.annotations.filterIsInstance().map { it.value }.forEach { this.add(it) } + if (strict) { + val parameterNames = parameters.flatMap { param -> + mutableSetOf().apply { + param.name?.let(this::add) + clazz.memberProperties.singleOrNull { it.name == param.name }?.let { matchingProperty -> + matchingProperty.annotations.filterIsInstance().map { it.value }.forEach { this.add(it) } + } } } - } - val unknownConfigurationKeys = this.entrySet() - .mapNotNull { it.key.split(".").firstOrNull() } - .filterNot { it == CUSTOM_NODE_PROPERTIES_ROOT } - .filterNot(parameterNames::contains) - .toSortedSet() - if (unknownConfigurationKeys.isNotEmpty()) { - throw UnknownConfigurationKeysException.of(unknownConfigurationKeys) + val unknownConfigurationKeys = this.entrySet() + .mapNotNull { it.key.split(".").firstOrNull() } + .filterNot { it == CUSTOM_NODE_PROPERTIES_ROOT } + .filterNot(parameterNames::contains) + .toSortedSet() + if (unknownConfigurationKeys.isNotEmpty()) { + throw UnknownConfigurationKeysException.of(unknownConfigurationKeys) + } } val args = parameters.filterNot { it.isOptional && !hasPath(it.name!!) }.associateBy({ it }) { param -> // Get the matching property for this parameter @@ -79,7 +81,7 @@ class UnknownConfigurationKeysException private constructor(val unknownKeys: Set } } -inline fun Config.parseAs(): T = parseAs(T::class) +inline fun Config.parseAs(strict: Boolean = true): T = parseAs(T::class, strict) fun Config.toProperties(): Properties { return entrySet().associateByTo(