diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/filters/Filter.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/filters/Filter.kt index 9b7cf1a52..5472bb9c0 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/filters/Filter.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/filters/Filter.kt @@ -21,6 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.filters import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address class Filter( val ids: List? = null, @@ -46,4 +47,23 @@ class Filter( limit: Int? = this.limit, search: String? = this.search, ) = Filter(ids, authors, kinds, tags, since, until, limit, search) + + init { + // TODO: Remove this in production + ids?.forEach { + if (it.length != 64) throw IllegalArgumentException("Invalid id length $it on ${toJson()}") + } + authors?.forEach { + if (it.length != 64) throw IllegalArgumentException("Invalid author length $it on ${toJson()}") + } + tags?.get("#p")?.forEach { + if (it.length != 64) throw IllegalArgumentException("Invalid p-tag length $it on ${toJson()}") + } + tags?.get("#e")?.forEach { + if (it.length != 64) throw IllegalArgumentException("Invalid e-tag length $it on ${toJson()}") + } + tags?.get("#a")?.forEach { + if (Address.parse(it) != null) throw IllegalArgumentException("Invalid a-tag length $it on ${toJson()}") + } + } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/NormalizedRelayUrl.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/NormalizedRelayUrl.kt index 094e6fb0e..d9e80aefa 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/NormalizedRelayUrl.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/NormalizedRelayUrl.kt @@ -41,6 +41,6 @@ fun NormalizedRelayUrl.toHttp() = "https://$url" } -fun NormalizedRelayUrl.isOnion() = url.endsWith(".onion/") +fun NormalizedRelayUrl.isOnion() = url.contains(".onion/") -fun NormalizedRelayUrl.isLocalHost() = url.contains("127.0.0.1") || url.contains("localhost") || url.contains(".local:") +fun NormalizedRelayUrl.isLocalHost() = RelayUrlNormalizer.isLocalHost(this.url) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt index c6aa1491d..453710a29 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/relay/normalizer/RelayUrlNormalizer.kt @@ -27,9 +27,14 @@ val normalizedUrls = LruCache(5000) class RelayUrlNormalizer { companion object { - fun isLocalHost(url: String) = url.contains("127.0.0.1") || url.contains("localhost") || url.contains(".local:") + fun isLocalHost(url: String) = + url.contains("127.0.0.1") || + url.contains("localhost") || + url.contains("//umbrel:") || + url.contains("192.168.") || + url.contains(".local:") - fun isOnion(url: String) = url.endsWith(".onion") || url.endsWith(".onion/") + fun isOnion(url: String) = url.endsWith(".onion") || url.contains(".onion/") private fun norm(url: String) = NormalizedRelayUrl( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/settings/tags/RelayTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/settings/tags/RelayTag.kt index 19a2762cd..d1c50cf20 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/settings/tags/RelayTag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/settings/tags/RelayTag.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.nip17Dm.settings.tags import com.vitorpamplona.quartz.nip01Core.core.has import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer +import com.vitorpamplona.quartz.nip01Core.relay.normalizer.isLocalHost import com.vitorpamplona.quartz.utils.ensure class RelayTag { @@ -41,7 +42,9 @@ class RelayTag { ensure(tag[0] == TAG_NAME) { return null } ensure(tag[1].isNotEmpty()) { return null } - val relay = RelayUrlNormalizer.normalizeOrNull(tag[1]) ?: return null + val relay = RelayUrlNormalizer.normalizeOrNull(tag[1]) + + ensure(relay != null && !relay.isLocalHost()) { return null } return relay } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/tags/AdvertisedRelayInfoTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/tags/AdvertisedRelayInfoTag.kt index 4bb8d237b..9a7de3008 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/tags/AdvertisedRelayInfoTag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/tags/AdvertisedRelayInfoTag.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.core.has import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer +import com.vitorpamplona.quartz.nip01Core.relay.normalizer.isLocalHost import com.vitorpamplona.quartz.utils.ensure import kotlin.text.isBlank @@ -79,6 +80,10 @@ class AdvertisedRelayInfo( ensure(match(tag)) { return null } ensure(AdvertisedRelayType.isRead(tag.getOrNull(2))) { return null } + val relay = RelayUrlNormalizer.normalizeOrNull(tag[1]) + + ensure(relay != null && !relay.isLocalHost()) { return null } + return RelayUrlNormalizer.normalizeOrNull(tag[1]) } @@ -87,7 +92,11 @@ class AdvertisedRelayInfo( ensure(match(tag)) { return null } ensure(AdvertisedRelayType.isWrite(tag.getOrNull(2))) { return null } - return RelayUrlNormalizer.normalizeOrNull(tag[1]) + val relay = RelayUrlNormalizer.normalizeOrNull(tag[1]) + + ensure(relay != null && !relay.isLocalHost()) { return null } + + return relay } @JvmStatic