Merge remote-tracking branch 'open/master' into os-merge-c79dd80

# Conflicts:
#	docs/source/changelog.rst
#	docs/source/clientrpc.rst
#	node/src/integration-test/kotlin/net/corda/node/services/network/NetworkMapTest.kt
#	node/src/integration-test/kotlin/net/corda/node/services/rpc/RpcExceptionHandlingTest.kt
#	node/src/main/kotlin/net/corda/node/internal/rpc/proxies/ExceptionMaskingRpcOpsProxy.kt
#	testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt
This commit is contained in:
Shams Asari 2018-09-17 17:12:50 +01:00
commit d22bab98fa
7 changed files with 33 additions and 25 deletions

View File

@ -112,7 +112,8 @@ Unreleased
* ``WireTransaction.Companion.createComponentGroups`` has been marked as ``@CordaInternal``. It was never intended to be * ``WireTransaction.Companion.createComponentGroups`` has been marked as ``@CordaInternal``. It was never intended to be
public and was already internal for Kotlin code. public and was already internal for Kotlin code.
* RPC server will now mask internal errors to RPC clients if not in devMode. ``Throwable``s implementing ``ClientRelevantError`` will continue to be propagated to clients. * RPC server will now mask internal errors to RPC clients if not in devMode. ``Throwable``s implementing ``ClientRelevantError``
will continue to be propagated to clients.
* RPC Framework moved from Kryo to the Corda AMQP implementation [Corda-847]. This completes the removal * RPC Framework moved from Kryo to the Corda AMQP implementation [Corda-847]. This completes the removal
of ``Kryo`` from general use within Corda, remaining only for use in flow checkpointing. of ``Kryo`` from general use within Corda, remaining only for use in flow checkpointing.
@ -226,7 +227,7 @@ Version 3.1
* Update the fast-classpath-scanner dependent library version from 2.0.21 to 2.12.3 * Update the fast-classpath-scanner dependent library version from 2.0.21 to 2.12.3
.. note:: Whilst this is not the latest version of this library, that being 2.18.1 at time of writing, versions .. note:: Whilst this is not the latest version of this library, that being 2.18.1 at time of writing, versions
later than 2.12.3 (including 2.12.4) exhibit a different issue. later than 2.12.3 (including 2.12.4) exhibit a different issue.
* Added `database.hibernateDialect` node configuration option * Added `database.hibernateDialect` node configuration option

View File

@ -344,7 +344,8 @@ In ``devMode``, if the server implementation throws an exception, that exception
side as if it was thrown from inside the called RPC method. These exceptions can be caught as normal. side as if it was thrown from inside the called RPC method. These exceptions can be caught as normal.
When not in ``devMode``, the server will mask exceptions not meant for clients and return an ``InternalNodeException`` instead. When not in ``devMode``, the server will mask exceptions not meant for clients and return an ``InternalNodeException`` instead.
This does not expose internal information to clients, strengthening privacy and security. CorDapps can have exceptions implement ``ClientRelevantError`` to allow them to reach RPC clients. This does not expose internal information to clients, strengthening privacy and security. CorDapps can have exceptions implement
``ClientRelevantError`` to allow them to reach RPC clients.
Connection management Connection management
--------------------- ---------------------

View File

@ -12,15 +12,19 @@ import net.corda.core.messaging.startFlow
import net.corda.core.utilities.getOrThrow import net.corda.core.utilities.getOrThrow
import net.corda.node.internal.NodeStartup import net.corda.node.internal.NodeStartup
import net.corda.node.services.Permissions.Companion.startFlow import net.corda.node.services.Permissions.Companion.startFlow
import net.corda.nodeapi.exceptions.InternalNodeException
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.DUMMY_BANK_A_NAME import net.corda.testing.core.DUMMY_BANK_A_NAME
import net.corda.testing.driver.DriverParameters import net.corda.testing.driver.DriverParameters
import net.corda.testing.driver.NodeHandle
import net.corda.testing.driver.NodeParameters
import net.corda.testing.driver.driver import net.corda.testing.driver.driver
import net.corda.testing.internal.IntegrationTest import net.corda.testing.internal.IntegrationTest
import net.corda.testing.internal.IntegrationTestSchemas import net.corda.testing.internal.IntegrationTestSchemas
import net.corda.testing.internal.toDatabaseSchemaName import net.corda.testing.internal.toDatabaseSchemaName
import net.corda.testing.node.User import net.corda.testing.node.User
import net.corda.testing.node.internal.startNode
import org.assertj.core.api.Assertions.assertThatThrownBy import org.assertj.core.api.Assertions.assertThatThrownBy
import org.junit.ClassRule import org.junit.ClassRule
import org.junit.Test import org.junit.Test
@ -38,12 +42,21 @@ class BootTests : IntegrationTest() {
} }
@Test @Test
fun `java deserialization is disabled`() { fun `java deserialization is disabled`() {
driver(DriverParameters(notarySpecs = emptyList())) { val user = User("u", "p", setOf(startFlow<ObjectInputStreamFlow>()))
val user = User("u", "p", setOf(startFlow<ObjectInputStreamFlow>())) val params = NodeParameters(rpcUsers = listOf(user))
val future = CordaRPCClient(startNode(rpcUsers = listOf(user)).getOrThrow().rpcAddress).
start(user.username, user.password).proxy.startFlow(::ObjectInputStreamFlow).returnValue fun NodeHandle.attemptJavaDeserialization() {
assertThatThrownBy { future.getOrThrow() } CordaRPCClient(rpcAddress).use(user.username, user.password) { connection ->
.isInstanceOf(CordaRuntimeException::class.java) connection.proxy
rpc.startFlow(::ObjectInputStreamFlow).returnValue.getOrThrow()
}
}
driver {
val devModeNode = startNode(params).getOrThrow()
val node = startNode(ALICE_NAME, devMode = false, parameters = params).getOrThrow()
assertThatThrownBy { devModeNode.attemptJavaDeserialization() }.isInstanceOf(CordaRuntimeException::class.java)
assertThatThrownBy { node.attemptJavaDeserialization() }.isInstanceOf(InternalNodeException::class.java)
} }
} }

View File

@ -247,4 +247,4 @@ class NetworkMapTest(var initFunc: (URL, NetworkMapServer) -> CompatibilityZoneP
} }
assertThat(rpc.networkMapSnapshot()).containsOnly(*nodes) assertThat(rpc.networkMapSnapshot()).containsOnly(*nodes)
} }
} }

View File

@ -3,24 +3,18 @@ package net.corda.node.services.rpc
import co.paralleluniverse.fibers.Suspendable import co.paralleluniverse.fibers.Suspendable
import net.corda.ClientRelevantException import net.corda.ClientRelevantException
import net.corda.core.CordaRuntimeException import net.corda.core.CordaRuntimeException
import net.corda.core.flows.FlowException import net.corda.core.flows.*
import net.corda.core.flows.FlowLogic
import net.corda.core.flows.FlowSession
import net.corda.core.flows.InitiatedBy
import net.corda.core.flows.InitiatingFlow
import net.corda.core.flows.StartableByRPC
import net.corda.core.identity.Party import net.corda.core.identity.Party
import net.corda.core.messaging.startFlow import net.corda.core.messaging.startFlow
import net.corda.core.utilities.getOrThrow import net.corda.core.utilities.getOrThrow
import net.corda.core.utilities.unwrap import net.corda.core.utilities.unwrap
import net.corda.node.services.Permissions import net.corda.node.services.Permissions
import net.corda.nodeapi.exceptions.InternalNodeException import net.corda.nodeapi.exceptions.InternalNodeException
import net.corda.testing.core.* import net.corda.testing.core.ALICE_NAME
import net.corda.testing.driver.DriverDSL import net.corda.testing.core.BOB_NAME
import net.corda.testing.driver.DriverParameters import net.corda.testing.core.DUMMY_NOTARY_NAME
import net.corda.testing.driver.NodeHandle import net.corda.testing.core.singleIdentity
import net.corda.testing.driver.NodeParameters import net.corda.testing.driver.*
import net.corda.testing.driver.driver
import net.corda.testing.internal.IntegrationTest import net.corda.testing.internal.IntegrationTest
import net.corda.testing.internal.IntegrationTestSchemas import net.corda.testing.internal.IntegrationTestSchemas
import net.corda.testing.internal.toDatabaseSchemaName import net.corda.testing.internal.toDatabaseSchemaName
@ -39,7 +33,6 @@ class RpcExceptionHandlingTest : IntegrationTest() {
@JvmField @JvmField
val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName()) val databaseSchemas = IntegrationTestSchemas(ALICE_NAME.toDatabaseSchemaName(), BOB_NAME.toDatabaseSchemaName(), DUMMY_NOTARY_NAME.toDatabaseSchemaName())
} }
private val user = User("mark", "dadada", setOf(Permissions.all())) private val user = User("mark", "dadada", setOf(Permissions.all()))
private val users = listOf(user) private val users = listOf(user)

View File

@ -122,4 +122,4 @@ internal class ExceptionMaskingRpcOpsProxy(private val delegate: CordaRPCOps, do
override fun toString(): String { override fun toString(): String {
return "ExceptionMaskingRpcOpsProxy" return "ExceptionMaskingRpcOpsProxy"
} }
} }

View File

@ -1190,4 +1190,4 @@ fun DriverDSL.startNode(providedName: CordaX500Name, devMode: Boolean, parameter
customOverrides = mapOf("devMode" to "false") customOverrides = mapOf("devMode" to "false")
} }
return startNode(parameters, providedName = providedName, customOverrides = customOverrides) return startNode(parameters, providedName = providedName, customOverrides = customOverrides)
} }