From a425f82c773176a04bf1cba11f4a721c6bde0087 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Mon, 9 Oct 2017 10:19:37 +0100 Subject: [PATCH] CORDA-540: Change how standard mutable whitelists structured (#1814) --- .../serialization/CordaClassResolver.kt | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt index 91573ed24e..b614284139 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt @@ -152,14 +152,15 @@ object AllWhitelist : ClassWhitelist { override fun hasListed(type: Class<*>): Boolean = true } -// TODO: Need some concept of from which class loader -class GlobalTransientClassWhiteList(val delegate: ClassWhitelist) : MutableClassWhitelist, ClassWhitelist by delegate { - companion object { - val whitelist: MutableSet = Collections.synchronizedSet(mutableSetOf()) - } +sealed class AbstractMutableClassWhitelist(private val whitelist: MutableSet, private val delegate: ClassWhitelist) : MutableClassWhitelist { override fun hasListed(type: Class<*>): Boolean { - return (type.name in whitelist) || delegate.hasListed(type) + /** + * There are certain delegates like [net.corda.nodeapi.internal.serialization.AllButBlacklisted] + * which may throw when asked whether the type is listed. + * In such situations - it may be a good idea to ask [delegate] first before making a check against own [whitelist]. + */ + return delegate.hasListed(type) || (type.name in whitelist) } override fun add(entry: Class<*>) { @@ -167,21 +168,17 @@ class GlobalTransientClassWhiteList(val delegate: ClassWhitelist) : MutableClass } } +// TODO: Need some concept of from which class loader +class GlobalTransientClassWhiteList(delegate: ClassWhitelist) : AbstractMutableClassWhitelist(GlobalTransientClassWhiteList.whitelist, delegate) { + companion object { + private val whitelist: MutableSet = Collections.synchronizedSet(mutableSetOf()) + } +} + /** - * A whitelist that can be customised via the [net.corda.core.node.SerializationWhitelist], since implements [MutableClassWhitelist]. + * A whitelist that can be customised via the [net.corda.core.node.SerializationWhitelist], since it implements [MutableClassWhitelist]. */ -class TransientClassWhiteList(val delegate: ClassWhitelist) : MutableClassWhitelist, ClassWhitelist by delegate { - val whitelist: MutableSet = Collections.synchronizedSet(mutableSetOf()) - - override fun hasListed(type: Class<*>): Boolean { - return (type.name in whitelist) || delegate.hasListed(type) - } - - override fun add(entry: Class<*>) { - whitelist += entry.name - } -} - +class TransientClassWhiteList(delegate: ClassWhitelist) : AbstractMutableClassWhitelist(Collections.synchronizedSet(mutableSetOf()), delegate) /** * This class is not currently used, but can be installed to log a large number of missing entries from the whitelist