diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt index 770058460..c7eae62c6 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt @@ -75,6 +75,7 @@ class Relay( private var afterEOSEPerSubscription = mutableMapOf() private val authResponse = mutableMapOf() + private val authChallengesSent = mutableSetOf() private val outboxCache = mutableMapOf() fun register(listener: Listener) { @@ -372,6 +373,9 @@ class Relay( fun resetEOSEStatuses() { afterEOSEPerSubscription = LinkedHashMap(afterEOSEPerSubscription.size) + + authResponse.clear() + authChallengesSent.clear() } fun sendFilter( @@ -492,8 +496,19 @@ class Relay( } private fun sendAuth(signedEvent: RelayAuthEvent) { - authResponse.put(signedEvent.id, false) - writeToSocket("""["AUTH",${signedEvent.toJson()}]""") + val challenge = signedEvent.challenge() ?: "" + + // only send replies to new challenges to avoid infinite loop: + // 1. Auth is sent + // 2. auth is rejected + // 3. auth is requested + // 4. auth is sent + // ... + if (!authChallengesSent.contains(challenge)) { + authResponse.put(signedEvent.id, false) + authChallengesSent.add(challenge) + writeToSocket("""["AUTH",${signedEvent.toJson()}]""") + } } private fun sendEvent(signedEvent: EventInterface) {