diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/RootSceneTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/RootSceneTag.kt index 652d88f62..28cdc8234 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/RootSceneTag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/RootSceneTag.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.bytesUsedInMemory +import com.vitorpamplona.quartz.utils.ensure import com.vitorpamplona.quartz.utils.pointerSizeInBytes import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers @@ -66,15 +67,13 @@ data class RootSceneTag( dTag: String, ) = Address.assemble(kind, pubKeyHex, dTag) - fun parse( - aTagId: String, - relay: String?, - ) = Address.parse(aTagId)?.let { RootSceneTag(it.kind, it.pubKeyHex, it.dTag, relay) } - @JvmStatic fun parse(tag: Array): RootSceneTag? { - if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null - return parse(tag[1], tag.getOrNull(2)) + ensure(tag.size > 2) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } + val address = Address.parse(tag[1]) ?: return null + return RootSceneTag(address.kind, address.pubKeyHex, address.dTag, tag.getOrNull(2)) } @JvmStatic diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/StoryOptionTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/StoryOptionTag.kt index 6327c0527..b664b30f1 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/StoryOptionTag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/tags/StoryOptionTag.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.experimental.interactiveStories.tags import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.nip46RemoteSigner.getOrNull import com.vitorpamplona.quartz.utils.arrayOfNotNull +import com.vitorpamplona.quartz.utils.ensure class StoryOptionTag( val option: String, @@ -37,10 +38,10 @@ class StoryOptionTag( @JvmStatic fun parse(tag: Array): StoryOptionTag? { - if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null - + ensure(tag.size > 3) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[2].isNotEmpty()) { return null } val address = Address.parse(tag[2]) ?: return null - return StoryOptionTag(tag[1], address, tag.getOrNull(3)) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/tags/addressables/ATag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/tags/addressables/ATag.kt index e11d0bd26..91d0a214f 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/tags/addressables/ATag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/tags/addressables/ATag.kt @@ -28,6 +28,7 @@ import com.vitorpamplona.quartz.nip01Core.core.value import com.vitorpamplona.quartz.nip01Core.hints.types.AddressHint import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.bytesUsedInMemory +import com.vitorpamplona.quartz.utils.ensure import com.vitorpamplona.quartz.utils.pointerSizeInBytes import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers @@ -110,31 +111,43 @@ data class ATag( @JvmStatic fun parse(tag: Array): ATag? { - if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null + ensure(tag.size > 2) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } return parse(tag[1], tag.getOrNull(2)) } @JvmStatic fun parseValidAddress(tag: Array): String? { - if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null + ensure(tag.size > 2) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } return Address.parse(tag[1])?.toValue() } @JvmStatic fun parseAddress(tag: Array): Address? { - if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null + ensure(tag.size > 2) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } return Address.parse(tag[1]) } @JvmStatic fun parseAddressId(tag: Array): String? { - if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null + ensure(tag.size > 2) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } return tag[1] } @JvmStatic fun parseAsHint(tag: Array): AddressHint? { - if (tag.size < 3 || tag[0] != TAG_NAME || !tag[1].contains(':') || tag[2].isEmpty()) return null + ensure(tag.size > 2) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } + ensure(tag[1].contains(':')) { return null } + ensure(tag[2].isNotEmpty()) { return null } return AddressHint(tag[1], tag[2]) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/quotes/QAddressableTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/quotes/QAddressableTag.kt index fa374d475..355760c17 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/quotes/QAddressableTag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/quotes/QAddressableTag.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.utils.arrayOfNotNull import com.vitorpamplona.quartz.utils.bytesUsedInMemory +import com.vitorpamplona.quartz.utils.ensure import com.vitorpamplona.quartz.utils.pointerSizeInBytes @Immutable @@ -61,7 +62,9 @@ data class QAddressableTag( @JvmStatic fun parse(tag: Array): QAddressableTag? { - if (tag.size < TAG_SIZE || tag[0] != QTag.TAG_NAME) return null + ensure(tag.size > TAG_SIZE) { return null } + ensure(tag[0] == QTag.TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } val address = Address.parse(tag[1]) ?: return null return QAddressableTag(address, tag.getOrNull(2)) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/recommendation/tags/RecommendationTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/recommendation/tags/RecommendationTag.kt index 0b094b2b4..80fdc1f8d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/recommendation/tags/RecommendationTag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/recommendation/tags/RecommendationTag.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.match import com.vitorpamplona.quartz.nip01Core.core.valueIfMatches import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.utils.arrayOfNotNull +import com.vitorpamplona.quartz.utils.ensure @Immutable class RecommendationTag( @@ -44,7 +45,9 @@ class RecommendationTag( @JvmStatic fun parse(tag: Array): RecommendationTag? { - if (tag.size < TAG_SIZE || tag[0] != TAG_NAME) return null + ensure(tag.size > 2) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } val address = Address.parse(tag[1]) ?: return null return RecommendationTag(address, tag.getOrNull(2), tag.getOrNull(3)) }