mirror of
https://github.com/corda/corda.git
synced 2025-06-18 15:18:16 +00:00
Revert "Non-ssl artemis acceptor for RPC connection. (#271)"
This reverts commit f0d82e4918
.
This commit is contained in:
@ -14,6 +14,7 @@ import net.corda.client.model.Models
|
||||
import net.corda.client.model.observableValue
|
||||
import net.corda.core.contracts.GBP
|
||||
import net.corda.core.contracts.USD
|
||||
import net.corda.core.messaging.startFlow
|
||||
import net.corda.core.node.services.ServiceInfo
|
||||
import net.corda.core.node.services.ServiceType
|
||||
import net.corda.explorer.model.CordaViewModel
|
||||
@ -27,6 +28,7 @@ import net.corda.flows.IssuerFlow.IssuanceRequester
|
||||
import net.corda.node.driver.PortAllocation
|
||||
import net.corda.node.driver.driver
|
||||
import net.corda.node.services.User
|
||||
import net.corda.node.services.messaging.ArtemisMessagingComponent
|
||||
import net.corda.node.services.startFlowPermission
|
||||
import net.corda.node.services.transactions.SimpleNotaryService
|
||||
import org.apache.commons.lang.SystemUtils
|
||||
@ -139,7 +141,7 @@ fun main(args: Array<String>) {
|
||||
val issuerNodeUSD = issuerUSD.get()
|
||||
|
||||
arrayOf(notaryNode, aliceNode, bobNode, issuerNodeGBP, issuerNodeUSD).forEach {
|
||||
println("${it.nodeInfo.legalIdentity} started on ${it.configuration.rpcAddress}")
|
||||
println("${it.nodeInfo.legalIdentity} started on ${ArtemisMessagingComponent.toHostAndPort(it.nodeInfo.address)}")
|
||||
}
|
||||
|
||||
val parser = OptionParser("S")
|
||||
|
@ -30,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)
|
||||
@ -38,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()
|
||||
|
@ -5,16 +5,16 @@ import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon
|
||||
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView
|
||||
import javafx.beans.property.SimpleIntegerProperty
|
||||
import javafx.scene.control.*
|
||||
import javafx.stage.FileChooser
|
||||
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.SSLConfiguration
|
||||
import net.corda.node.services.config.configureTestSSL
|
||||
import org.controlsfx.dialog.ExceptionDialog
|
||||
import tornadofx.*
|
||||
import java.nio.file.Path
|
||||
import java.nio.file.Paths
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class LoginView : View() {
|
||||
@ -26,6 +26,7 @@ class LoginView : View() {
|
||||
private val passwordTextField by fxid<PasswordField>()
|
||||
private val rememberMeCheckBox by fxid<CheckBox>()
|
||||
private val fullscreenCheckBox by fxid<CheckBox>()
|
||||
private val certificateButton by fxid<Button>()
|
||||
private val portProperty = SimpleIntegerProperty()
|
||||
|
||||
private val rememberMe by objectProperty(SettingsModel::rememberMeProperty)
|
||||
@ -33,6 +34,9 @@ class LoginView : View() {
|
||||
private val host by objectProperty(SettingsModel::hostProperty)
|
||||
private val port by objectProperty(SettingsModel::portProperty)
|
||||
private val fullscreen by objectProperty(SettingsModel::fullscreenProperty)
|
||||
private val certificatesDir by objectProperty(SettingsModel::certificatesDirProperty)
|
||||
private val keyStorePasswordProperty by objectProperty(SettingsModel::keyStorePasswordProperty)
|
||||
private val trustStorePasswordProperty by objectProperty(SettingsModel::trustStorePasswordProperty)
|
||||
|
||||
fun login() {
|
||||
val status = Dialog<LoginStatus>().apply {
|
||||
@ -42,7 +46,7 @@ class LoginView : View() {
|
||||
ButtonBar.ButtonData.OK_DONE -> try {
|
||||
root.isDisable = true
|
||||
// TODO : Run this async to avoid UI lockup.
|
||||
getModel<NodeMonitorModel>().register(HostAndPort.fromParts(hostTextField.text, portProperty.value), usernameTextField.text, passwordTextField.text)
|
||||
getModel<NodeMonitorModel>().register(HostAndPort.fromParts(hostTextField.text, portProperty.value), configureSSL(), usernameTextField.text, passwordTextField.text)
|
||||
if (!rememberMe.value) {
|
||||
username.value = ""
|
||||
host.value = ""
|
||||
@ -75,6 +79,18 @@ class LoginView : View() {
|
||||
if (status != LoginStatus.loggedIn) login()
|
||||
}
|
||||
|
||||
private fun configureSSL(): SSLConfiguration {
|
||||
val sslConfig = object : SSLConfiguration {
|
||||
override val certificatesDirectory: Path get() = certificatesDir.get()
|
||||
override val keyStorePassword: String get() = keyStorePasswordProperty.get()
|
||||
override val trustStorePassword: String get() = trustStorePasswordProperty.get()
|
||||
}
|
||||
// TODO : Don't use dev certificates.
|
||||
return if (sslConfig.keyStoreFile.exists()) sslConfig else configureTestSSL().apply {
|
||||
alert(Alert.AlertType.WARNING, "", "KeyStore not found in certificates directory.\nDEV certificates will be used by default.")
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
// Restrict text field to Integer only.
|
||||
portTextField.textFormatter = intFormatter().apply { portProperty.bind(this.valueProperty()) }
|
||||
@ -83,6 +99,44 @@ class LoginView : View() {
|
||||
usernameTextField.textProperty().bindBidirectional(username)
|
||||
hostTextField.textProperty().bindBidirectional(host)
|
||||
portTextField.textProperty().bindBidirectional(port)
|
||||
certificateButton.setOnAction {
|
||||
Dialog<ButtonType>().apply {
|
||||
title = "Certificates Settings"
|
||||
initOwner(root.scene.window)
|
||||
dialogPane.content = gridpane {
|
||||
vgap = 10.0
|
||||
hgap = 5.0
|
||||
row("Certificates Directory :") {
|
||||
textfield {
|
||||
prefWidth = 400.0
|
||||
textProperty().bind(certificatesDir.map(Path::toString))
|
||||
isEditable = false
|
||||
}
|
||||
button {
|
||||
graphic = FontAwesomeIconView(FontAwesomeIcon.FOLDER_OPEN_ALT)
|
||||
maxHeight = Double.MAX_VALUE
|
||||
setOnAction {
|
||||
chooseDirectory(owner = dialogPane.scene.window) {
|
||||
initialDirectoryProperty().bind(certificatesDir.map(Path::toFile))
|
||||
}?.let {
|
||||
certificatesDir.set(it.toPath())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
row("KeyStore Password :") { passwordfield(keyStorePasswordProperty) }
|
||||
row("TrustStore Password :") { passwordfield(trustStorePasswordProperty) }
|
||||
}
|
||||
dialogPane.buttonTypes.addAll(ButtonType.APPLY, ButtonType.CANCEL)
|
||||
}.showAndWait().get().let {
|
||||
when (it) {
|
||||
ButtonType.APPLY -> getModel<SettingsModel>().commit()
|
||||
// Discard changes.
|
||||
else -> getModel<SettingsModel>().load()
|
||||
}
|
||||
}
|
||||
}
|
||||
certificateButton.tooltip("Certificate Configuration")
|
||||
}
|
||||
|
||||
private enum class LoginStatus {
|
||||
|
@ -26,15 +26,23 @@
|
||||
<Label text="Corda Node :" GridPane.halignment="RIGHT"/>
|
||||
<TextField fx:id="hostTextField" promptText="Host" GridPane.columnIndex="1"/>
|
||||
<TextField fx:id="portTextField" prefWidth="100" promptText="Port" GridPane.columnIndex="2"/>
|
||||
<Button id="certificateButton" fx:id="certificateButton" GridPane.columnIndex="3" styleClass="certificateButton">
|
||||
<padding>
|
||||
<Insets right="6"/>
|
||||
</padding>
|
||||
<graphic>
|
||||
<FontAwesomeIconView styleClass="certificateIcon" glyphName="LOCK" glyphSize="20"/>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Label text="Username :" GridPane.rowIndex="1" GridPane.halignment="RIGHT"/>
|
||||
<TextField fx:id="usernameTextField" promptText="Username" GridPane.columnIndex="1"
|
||||
GridPane.columnSpan="2" GridPane.rowIndex="1"/>
|
||||
GridPane.columnSpan="3" GridPane.rowIndex="1"/>
|
||||
|
||||
<Label text="Password :" GridPane.rowIndex="2" GridPane.halignment="RIGHT"/>
|
||||
<PasswordField fx:id="passwordTextField" promptText="Password" GridPane.columnIndex="1"
|
||||
GridPane.columnSpan="2" GridPane.rowIndex="2"/>
|
||||
GridPane.columnSpan="3" GridPane.rowIndex="2"/>
|
||||
|
||||
<HBox spacing="20" GridPane.columnIndex="1" GridPane.rowIndex="3" GridPane.columnSpan="2">
|
||||
<HBox spacing="20" GridPane.columnIndex="1" GridPane.rowIndex="3" GridPane.columnSpan="3">
|
||||
<CheckBox fx:id="rememberMeCheckBox" text="Remember me"/>
|
||||
<CheckBox fx:id="fullscreenCheckBox" text="Fullscreen mode"/>
|
||||
</HBox>
|
||||
|
Reference in New Issue
Block a user