Only gift wrap welcomeEvent to the intended participant

This commit is contained in:
Kgothatso Ngako committed 2026-07-07 00:03:37 +02:00
1 parent add6c7fd31
commit 925c83582b
1 file changed
+52 -49
@@ -11,6 +11,7 @@ import at.torch.compose.database.model.Profile
import at.torch.compose.database.model.intermdiate.LocalChatMessage import at.torch.compose.database.model.intermdiate.LocalChatMessage
import at.torch.compose.database.model.intermdiate.LocalChatRoom import at.torch.compose.database.model.intermdiate.LocalChatRoom
import co.touchlab.kermit.Logger import co.touchlab.kermit.Logger
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeEvent
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState
import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.Event
@@ -244,61 +245,63 @@ class DatabaseChatRepository(
nostrSignerSync: NostrSignerSync nostrSignerSync: NostrSignerSync
) { ) {
database.participantDao().findParticipantsByChatRoomId(giftWrapPayload.chatRoomId).forEachIndexed { index, participant -> database.participantDao().findParticipantsByChatRoomId(giftWrapPayload.chatRoomId).forEachIndexed { index, participant ->
val wrapperKeyPair = KeyPair() if (giftWrapPayload.kind == WelcomeEvent.KIND && giftWrapPayload.publicKey != participant.participantPublicKey) {
val wrapperSigner = NostrSignerSync( logger.w("We shouldn't be gift wrapping welcome event to anyone but the intended public key (${giftWrapPayload.id}).")
keyPair = wrapperKeyPair } else {
) val wrapperKeyPair = KeyPair()
val wrapperSigner = NostrSignerSync(
val giftWrapPayloadEvent = nostrSignerSync.signNormal<Event>( keyPair = wrapperKeyPair
createdAt = giftWrapPayload.createdAt.epochSeconds,
kind = giftWrapPayload.kind,
tags = giftWrapPayload.tags,
content = giftWrapPayload.content
)
logger.d("GiftWrap Payload Event: ${giftWrapPayloadEvent.toJson()}")
logger.d("Seal to $participant")
val payload = giftWrapPayloadEvent.toJson()
val sealedRumorEvent = nostrSignerSync.signNormal<SealedRumorEvent>(
createdAt = TimeUtils.randomWithTwoDays(),
kind = SealedRumorEvent.KIND,
tags = emptyArray(),
content = nostrSignerSync.nip44Encrypt(
plaintext = payload,
toPublicKey = participant.participantPublicKey
) )
)
logger.d("SealedRumorEvent: ${sealedRumorEvent.toJson()}")
val giftWrapEvent = wrapperSigner.signNormal<GiftWrapEvent>( val giftWrapPayloadEvent = nostrSignerSync.signNormal<Event>(
createdAt = TimeUtils.randomWithTwoDays(), createdAt = giftWrapPayload.createdAt.epochSeconds,
kind = GiftWrapEvent.KIND, kind = giftWrapPayload.kind,
tags = arrayOf( tags = giftWrapPayload.tags,
PTag.assemble(participant.participantPublicKey, participant.relayHint?.let { NormalizedRelayUrl(it) }) content = giftWrapPayload.content
),
content = wrapperSigner.nip44Encrypt(
plaintext = sealedRumorEvent.toJson(),
toPublicKey = participant.participantPublicKey
) )
) logger.d("GiftWrap Payload Event: ${giftWrapPayloadEvent.toJson()}")
logger.d("giftWrapEvent: ${giftWrapEvent.toJson()}")
database.nostrNip17Dao().persistAndBroadcastGiftWrap( logger.d("Seal to $participant")
giftWrapPayload = Pair( val payload = giftWrapPayloadEvent.toJson()
index,
giftWrapPayload val sealedRumorEvent = nostrSignerSync.signNormal<SealedRumorEvent>(
), createdAt = TimeUtils.randomWithTwoDays(),
sealedRumorEvent = sealedRumorEvent, kind = SealedRumorEvent.KIND,
giftWrapEvent = giftWrapEvent, tags = emptyArray(),
receiverPublicKey = PTag( content = nostrSignerSync.nip44Encrypt(
pubKey = participant.participantPublicKey, plaintext = payload,
relayHint = participant.relayHint?.let { NormalizedRelayUrl(it) } toPublicKey = participant.participantPublicKey
)
) )
) logger.d("SealedRumorEvent: ${sealedRumorEvent.toJson()}")
val giftWrapEvent = wrapperSigner.signNormal<GiftWrapEvent>(
createdAt = TimeUtils.randomWithTwoDays(),
kind = GiftWrapEvent.KIND,
tags = arrayOf(
PTag.assemble(participant.participantPublicKey, participant.relayHint?.let { NormalizedRelayUrl(it) })
),
content = wrapperSigner.nip44Encrypt(
plaintext = sealedRumorEvent.toJson(),
toPublicKey = participant.participantPublicKey
)
)
logger.d("giftWrapEvent: ${giftWrapEvent.toJson()}")
database.nostrNip17Dao().persistAndBroadcastGiftWrap(
giftWrapPayload = Pair(
index,
giftWrapPayload
),
sealedRumorEvent = sealedRumorEvent,
giftWrapEvent = giftWrapEvent,
receiverPublicKey = PTag(
pubKey = participant.participantPublicKey,
relayHint = participant.relayHint?.let { NormalizedRelayUrl(it) }
)
)
}
} }
} }
companion object { companion object {