mirror of
https://github.com/corda/corda.git
synced 2024-12-28 00:38:55 +00:00
Merge remote-tracking branch 'remotes/open/master' into feature/vkolomeyko/ent-master-merge
# Conflicts: # node/src/integration-test/kotlin/net/corda/node/modes/draining/FlowsDrainingModeContentionTest.kt # node/src/integration-test/kotlin/net/corda/node/persistence/NodeStatePersistenceTests.kt
This commit is contained in:
commit
375b4638ba
@ -20,6 +20,7 @@ import net.corda.core.messaging.CordaRPCOps
|
|||||||
import net.corda.core.serialization.SerializationWhitelist
|
import net.corda.core.serialization.SerializationWhitelist
|
||||||
import net.corda.core.transactions.TransactionBuilder
|
import net.corda.core.transactions.TransactionBuilder
|
||||||
import net.corda.core.utilities.ProgressTracker
|
import net.corda.core.utilities.ProgressTracker
|
||||||
|
import net.corda.webserver.services.WebServerPluginRegistry
|
||||||
import java.util.function.Function
|
import java.util.function.Function
|
||||||
import javax.ws.rs.GET
|
import javax.ws.rs.GET
|
||||||
import javax.ws.rs.Path
|
import javax.ws.rs.Path
|
||||||
|
@ -10,7 +10,14 @@
|
|||||||
|
|
||||||
package net.corda.nodeapi.internal
|
package net.corda.nodeapi.internal
|
||||||
|
|
||||||
|
import net.corda.core.crypto.CompositeKey
|
||||||
import net.corda.core.crypto.Crypto
|
import net.corda.core.crypto.Crypto
|
||||||
|
import net.corda.core.identity.CordaX500Name
|
||||||
|
import net.corda.core.identity.PartyAndCertificate
|
||||||
|
import net.corda.core.node.NodeInfo
|
||||||
|
import net.corda.core.utilities.NetworkHostAndPort
|
||||||
|
import net.corda.nodeapi.internal.crypto.CertificateType
|
||||||
|
import net.corda.nodeapi.internal.crypto.X509Utilities
|
||||||
import net.corda.testing.core.ALICE_NAME
|
import net.corda.testing.core.ALICE_NAME
|
||||||
import net.corda.testing.core.BOB_NAME
|
import net.corda.testing.core.BOB_NAME
|
||||||
import net.corda.testing.core.SerializationEnvironmentRule
|
import net.corda.testing.core.SerializationEnvironmentRule
|
||||||
@ -20,6 +27,9 @@ import org.assertj.core.api.Assertions.assertThat
|
|||||||
import org.assertj.core.api.Assertions.assertThatThrownBy
|
import org.assertj.core.api.Assertions.assertThatThrownBy
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import java.security.KeyPair
|
||||||
|
import java.security.PrivateKey
|
||||||
|
import java.security.PublicKey
|
||||||
import java.security.SignatureException
|
import java.security.SignatureException
|
||||||
|
|
||||||
class SignedNodeInfoTest {
|
class SignedNodeInfoTest {
|
||||||
@ -55,6 +65,19 @@ class SignedNodeInfoTest {
|
|||||||
.hasMessageContaining("Missing signatures")
|
.hasMessageContaining("Missing signatures")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `verifying composite keys only`() {
|
||||||
|
val aliceKeyPair = generateKeyPair()
|
||||||
|
val bobKeyPair = generateKeyPair()
|
||||||
|
val identityKeyPair = generateKeyPair()
|
||||||
|
val compositeKey = CompositeKey.Builder().addKeys(aliceKeyPair.public, bobKeyPair.public).build(threshold = 1)
|
||||||
|
val nodeInfo = createNodeInfoWithSingleIdentity(ALICE_NAME, aliceKeyPair, compositeKey)
|
||||||
|
val signedNodeInfo = nodeInfo.signWith(listOf(identityKeyPair.private))
|
||||||
|
assertThatThrownBy { signedNodeInfo.verified() }
|
||||||
|
.isInstanceOf(IllegalArgumentException::class.java)
|
||||||
|
.hasMessageContaining("At least one identity with a non-composite key needs to be specified.")
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `verifying extra signature`() {
|
fun `verifying extra signature`() {
|
||||||
val (_, aliceKey) = nodeInfoBuilder.addIdentity(ALICE_NAME)
|
val (_, aliceKey) = nodeInfoBuilder.addIdentity(ALICE_NAME)
|
||||||
@ -87,4 +110,26 @@ class SignedNodeInfoTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun generateKeyPair() = Crypto.generateKeyPair()
|
private fun generateKeyPair() = Crypto.generateKeyPair()
|
||||||
|
|
||||||
|
private fun createNodeInfoWithSingleIdentity(name: CordaX500Name, nodeKeyPair: KeyPair, identityCertPublicKey: PublicKey): NodeInfo {
|
||||||
|
val nodeCertificateAndKeyPair = createDevNodeCa(DEV_INTERMEDIATE_CA, name, nodeKeyPair)
|
||||||
|
val identityCert = X509Utilities.createCertificate(
|
||||||
|
CertificateType.LEGAL_IDENTITY,
|
||||||
|
nodeCertificateAndKeyPair.certificate,
|
||||||
|
nodeCertificateAndKeyPair.keyPair,
|
||||||
|
nodeCertificateAndKeyPair.certificate.subjectX500Principal,
|
||||||
|
identityCertPublicKey)
|
||||||
|
val certPath = X509Utilities.buildCertPath(
|
||||||
|
identityCert,
|
||||||
|
nodeCertificateAndKeyPair.certificate,
|
||||||
|
DEV_INTERMEDIATE_CA.certificate,
|
||||||
|
DEV_ROOT_CA.certificate)
|
||||||
|
val partyAndCertificate = PartyAndCertificate(certPath)
|
||||||
|
return NodeInfo(
|
||||||
|
listOf(NetworkHostAndPort("my.${partyAndCertificate.party.name.organisation}.com", 1234)),
|
||||||
|
listOf(partyAndCertificate),
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package net.corda.node.modes.draining
|
package net.corda.node.modes.draining
|
||||||
|
|
||||||
import co.paralleluniverse.fibers.Suspendable
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
import net.corda.MESSAGE_CONTRACT_PROGRAM_ID
|
import net.corda.testMessage.MESSAGE_CONTRACT_PROGRAM_ID
|
||||||
import net.corda.Message
|
import net.corda.testMessage.Message
|
||||||
import net.corda.MessageContract
|
import net.corda.testMessage.MessageContract
|
||||||
import net.corda.MessageState
|
import net.corda.testMessage.MessageState
|
||||||
import net.corda.RpcInfo
|
import net.corda.RpcInfo
|
||||||
import net.corda.client.rpc.CordaRPCClient
|
import net.corda.client.rpc.CordaRPCClient
|
||||||
import net.corda.core.contracts.Command
|
import net.corda.core.contracts.Command
|
||||||
|
@ -7,14 +7,13 @@
|
|||||||
*
|
*
|
||||||
* Distribution of this file or any portion thereof via any medium without the express permission of R3 is strictly prohibited.
|
* Distribution of this file or any portion thereof via any medium without the express permission of R3 is strictly prohibited.
|
||||||
*/
|
*/
|
||||||
|
package net.corda.node.persistence
|
||||||
package net.corda.node
|
|
||||||
|
|
||||||
import co.paralleluniverse.fibers.Suspendable
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
import net.corda.MESSAGE_CONTRACT_PROGRAM_ID
|
import net.corda.testMessage.MESSAGE_CONTRACT_PROGRAM_ID
|
||||||
import net.corda.Message
|
import net.corda.testMessage.Message
|
||||||
import net.corda.MessageContract
|
import net.corda.testMessage.MessageContract
|
||||||
import net.corda.MessageState
|
import net.corda.testMessage.MessageState
|
||||||
import net.corda.client.rpc.CordaRPCClient
|
import net.corda.client.rpc.CordaRPCClient
|
||||||
import net.corda.core.contracts.Command
|
import net.corda.core.contracts.Command
|
||||||
import net.corda.core.contracts.StateAndContract
|
import net.corda.core.contracts.StateAndContract
|
||||||
@ -56,13 +55,10 @@ class NodeStatePersistenceTests : IntegrationTest() {
|
|||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
fun `persistent state survives node restart`() {
|
fun `persistent state survives node restart`() {
|
||||||
// Temporary disable this test when executed on Windows. It is known to be sporadically failing.
|
|
||||||
// More investigation is needed to establish why.
|
|
||||||
assumeFalse(System.getProperty("os.name").toLowerCase().startsWith("win"))
|
|
||||||
|
|
||||||
val user = User("mark", "dadada", setOf(startFlow<SendMessageFlow>(), invokeRpc("vaultQuery")))
|
val user = User("mark", "dadada", setOf(startFlow<SendMessageFlow>(), invokeRpc("vaultQuery")))
|
||||||
val message = Message("Hello world!")
|
val message = Message("Hello world!")
|
||||||
val stateAndRef: StateAndRef<MessageState>? = driver(DriverParameters(isDebug = true, startNodesInProcess = isQuasarAgentSpecified(), portAllocation = RandomFree, extraCordappPackagesToScan = listOf(MessageState::class.packageName))) {
|
val stateAndRef: StateAndRef<MessageState>? = driver(DriverParameters(isDebug = true, startNodesInProcess = isQuasarAgentSpecified(),
|
||||||
|
portAllocation = RandomFree, extraCordappPackagesToScan = listOf(MessageState::class.packageName))) {
|
||||||
val nodeName = {
|
val nodeName = {
|
||||||
val nodeHandle = startNode(rpcUsers = listOf(user)).getOrThrow()
|
val nodeHandle = startNode(rpcUsers = listOf(user)).getOrThrow()
|
||||||
val nodeName = nodeHandle.nodeInfo.singleIdentity().name
|
val nodeName = nodeHandle.nodeInfo.singleIdentity().name
|
||||||
@ -125,7 +121,7 @@ class NodeStatePersistenceTests : IntegrationTest() {
|
|||||||
|
|
||||||
fun isQuasarAgentSpecified(): Boolean {
|
fun isQuasarAgentSpecified(): Boolean {
|
||||||
val jvmArgs = ManagementFactory.getRuntimeMXBean().inputArguments
|
val jvmArgs = ManagementFactory.getRuntimeMXBean().inputArguments
|
||||||
return jvmArgs.any { it.startsWith("-javaagent:") && it.endsWith("quasar.jar") }
|
return jvmArgs.any { it.startsWith("-javaagent:") && it.contains("quasar") }
|
||||||
}
|
}
|
||||||
|
|
||||||
@StartableByRPC
|
@StartableByRPC
|
@ -1,4 +1,4 @@
|
|||||||
package net.corda
|
package net.corda.testMessage
|
||||||
|
|
||||||
import net.corda.core.contracts.*
|
import net.corda.core.contracts.*
|
||||||
import net.corda.core.identity.AbstractParty
|
import net.corda.core.identity.AbstractParty
|
||||||
@ -50,7 +50,7 @@ object MessageSchemaV1 : MappedSchema(
|
|||||||
) : PersistentState()
|
) : PersistentState()
|
||||||
}
|
}
|
||||||
|
|
||||||
const val MESSAGE_CONTRACT_PROGRAM_ID = "net.corda.MessageContract"
|
const val MESSAGE_CONTRACT_PROGRAM_ID = "net.corda.testMessage.MessageContract"
|
||||||
|
|
||||||
open class MessageContract : Contract {
|
open class MessageContract : Contract {
|
||||||
override fun verify(tx: LedgerTransaction) {
|
override fun verify(tx: LedgerTransaction) {
|
@ -229,8 +229,11 @@ abstract class AbstractNode(val configuration: NodeConfiguration,
|
|||||||
identityService.loadIdentities(nodeInfo.legalIdentitiesAndCerts)
|
identityService.loadIdentities(nodeInfo.legalIdentitiesAndCerts)
|
||||||
val metrics = MetricRegistry()
|
val metrics = MetricRegistry()
|
||||||
val transactionStorage = makeTransactionStorage(database, configuration.transactionCacheSizeBytes)
|
val transactionStorage = makeTransactionStorage(database, configuration.transactionCacheSizeBytes)
|
||||||
|
log.debug("Transaction storage created")
|
||||||
attachments = NodeAttachmentService(metrics, configuration.attachmentContentCacheSizeBytes, configuration.attachmentCacheBound)
|
attachments = NodeAttachmentService(metrics, configuration.attachmentContentCacheSizeBytes, configuration.attachmentCacheBound)
|
||||||
|
log.debug("Attachment service created")
|
||||||
val cordappProvider = CordappProviderImpl(cordappLoader, CordappConfigFileProvider(), attachments, networkParameters.whitelistedContractImplementations)
|
val cordappProvider = CordappProviderImpl(cordappLoader, CordappConfigFileProvider(), attachments, networkParameters.whitelistedContractImplementations)
|
||||||
|
log.debug("Cordapp provider created")
|
||||||
val servicesForResolution = ServicesForResolutionImpl(identityService, attachments, cordappProvider, networkParameters, transactionStorage)
|
val servicesForResolution = ServicesForResolutionImpl(identityService, attachments, cordappProvider, networkParameters, transactionStorage)
|
||||||
val nodeProperties = NodePropertiesPersistentStore(StubbedNodeUniqueIdProvider::value, database)
|
val nodeProperties = NodePropertiesPersistentStore(StubbedNodeUniqueIdProvider::value, database)
|
||||||
val nodeServices = makeServices(
|
val nodeServices = makeServices(
|
||||||
|
@ -120,6 +120,7 @@ class PersistentIdentityService(override val trustRoot: X509Certificate,
|
|||||||
confidentialIdentities.forEach {
|
confidentialIdentities.forEach {
|
||||||
principalToParties.addWithDuplicatesAllowed(it.name, mapToKey(it), false)
|
principalToParties.addWithDuplicatesAllowed(it.name, mapToKey(it), false)
|
||||||
}
|
}
|
||||||
|
log.debug("Identities loaded")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class)
|
@Throws(CertificateExpiredException::class, CertificateNotYetValidException::class, InvalidAlgorithmParameterException::class)
|
||||||
|
@ -3,6 +3,7 @@ apply plugin: 'java'
|
|||||||
apply plugin: 'application'
|
apply plugin: 'application'
|
||||||
apply plugin: 'net.corda.plugins.quasar-utils'
|
apply plugin: 'net.corda.plugins.quasar-utils'
|
||||||
apply plugin: 'net.corda.plugins.publish-utils'
|
apply plugin: 'net.corda.plugins.publish-utils'
|
||||||
|
apply plugin: 'com.jfrog.artifactory'
|
||||||
|
|
||||||
description 'Corda Shell'
|
description 'Corda Shell'
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user