From 9f5e6d39212e95c046154986d7beea51bc4e1ead Mon Sep 17 00:00:00 2001 From: Patrick Kuo Date: Fri, 20 Jan 2017 17:16:55 +0000 Subject: [PATCH] Added Certificate setting to the login screen (#172) * Added Certificate setting to the login screen, user can now specify certificates path and keystore/truststore password in the certificate setting screen. --- .../net/corda/explorer/model/SettingsModel.kt | 17 +++-- .../net/corda/explorer/views/LoginView.kt | 65 ++++++++++++++++++- .../net/corda/explorer/css/corda.css | 12 ++++ .../net/corda/explorer/views/LoginView.fxml | 22 +++++-- 4 files changed, 102 insertions(+), 14 deletions(-) diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/model/SettingsModel.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/model/SettingsModel.kt index d437eca4a1..e41d3f629f 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/model/SettingsModel.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/model/SettingsModel.kt @@ -5,6 +5,9 @@ import javafx.beans.Observable import javafx.beans.property.ObjectProperty import javafx.beans.property.SimpleObjectProperty import net.corda.core.contracts.currency +import net.corda.core.createDirectories +import net.corda.core.div +import net.corda.core.exists import tornadofx.Component import java.nio.file.Files import java.nio.file.Path @@ -16,10 +19,8 @@ import kotlin.reflect.jvm.javaType class SettingsModel(path: Path = Paths.get("conf")) : Component(), Observable { // Using CordaExplorer as config file name instead of TornadoFX default. - private val path = { - if (!Files.exists(path)) Files.createDirectories(path) - path.resolve("CordaExplorer.properties") - }() + private val path = path.apply { if (!exists()) createDirectories() } / "CordaExplorer.properties" + private val listeners = mutableListOf() // Delegate to config. @@ -29,6 +30,9 @@ class SettingsModel(path: Path = Paths.get("conf")) : Component(), Observable { private var username: String by config private var reportingCurrency: Currency by config private var fullscreen: Boolean by config + private var certificatesDir: Path by config + private var keyStorePassword: String by config + private var trustStorePassword: String by config // Create observable Properties. val reportingCurrencyProperty = writableConfigProperty(SettingsModel::reportingCurrency) @@ -37,6 +41,10 @@ class SettingsModel(path: Path = Paths.get("conf")) : Component(), Observable { val portProperty = writableConfigProperty(SettingsModel::port) val usernameProperty = writableConfigProperty(SettingsModel::username) val fullscreenProperty = writableConfigProperty(SettingsModel::fullscreen) + val certificatesDirProperty = writableConfigProperty(SettingsModel::certificatesDir) + // TODO : We should encrypt all passwords in config file. + val keyStorePasswordProperty = writableConfigProperty(SettingsModel::keyStorePassword) + val trustStorePasswordProperty = writableConfigProperty(SettingsModel::trustStorePassword) init { load() @@ -59,6 +67,7 @@ class SettingsModel(path: Path = Paths.get("conf")) : Component(), Observable { Int::class.java -> string(metadata.name, "0").toInt() as T Boolean::class.java -> boolean(metadata.name) as T Currency::class.java -> currency(string(metadata.name, "USD")) as T + Path::class.java -> Paths.get(string(metadata.name, "")).toAbsolutePath() as T else -> throw IllegalArgumentException("Unsupported type ${metadata.returnType}") } } diff --git a/tools/explorer/src/main/kotlin/net/corda/explorer/views/LoginView.kt b/tools/explorer/src/main/kotlin/net/corda/explorer/views/LoginView.kt index 918d4df39a..0fe2f6afac 100644 --- a/tools/explorer/src/main/kotlin/net/corda/explorer/views/LoginView.kt +++ b/tools/explorer/src/main/kotlin/net/corda/explorer/views/LoginView.kt @@ -1,14 +1,20 @@ package net.corda.explorer.views import com.google.common.net.HostAndPort +import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon +import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView import javafx.beans.property.SimpleIntegerProperty import javafx.scene.control.* +import net.corda.client.fxutils.map import net.corda.client.model.NodeMonitorModel import net.corda.client.model.objectProperty +import net.corda.core.exists import net.corda.explorer.model.SettingsModel +import net.corda.node.services.config.NodeSSLConfiguration import net.corda.node.services.config.configureTestSSL import org.controlsfx.dialog.ExceptionDialog -import tornadofx.View +import tornadofx.* +import java.nio.file.Path import kotlin.system.exitProcess class LoginView : View() { @@ -20,6 +26,7 @@ class LoginView : View() { private val passwordTextField by fxid() private val rememberMeCheckBox by fxid() private val fullscreenCheckBox by fxid() + private val certificateButton by fxid