From f56d927f725e4fc12f926875bcfbab423215f036 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 19 Aug 2025 12:40:53 -0400 Subject: [PATCH] Adds 90 day expiration to all drafts. --- .../vitorpamplona/amethyst/model/Account.kt | 3 +- .../quartz/nip37Drafts/DraftBuilder.kt | 54 ------------------- .../{DraftEventCache.kt => DraftWrapCache.kt} | 0 .../quartz/nip37Drafts/DraftWrapEvent.kt | 7 +++ .../vitorpamplona/quartz/utils/TimeUtils.kt | 3 ++ 5 files changed, 11 insertions(+), 56 deletions(-) delete mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftBuilder.kt rename quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/{DraftEventCache.kt => DraftWrapCache.kt} (100%) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 5772cc335..c01751674 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -159,7 +159,6 @@ import com.vitorpamplona.quartz.nip19Bech32.entities.NPub import com.vitorpamplona.quartz.nip19Bech32.entities.NRelay import com.vitorpamplona.quartz.nip19Bech32.entities.NSec import com.vitorpamplona.quartz.nip36SensitiveContent.contentWarning -import com.vitorpamplona.quartz.nip37Drafts.DraftBuilder import com.vitorpamplona.quartz.nip37Drafts.DraftEventCache import com.vitorpamplona.quartz.nip37Drafts.DraftWrapEvent import com.vitorpamplona.quartz.nip42RelayAuth.RelayAuthEvent @@ -1151,7 +1150,7 @@ class Account( val extraRelays = cache.getAddressableNoteIfExists(DraftWrapEvent.createAddressTag(signer.pubKey, draftTag))?.relays ?: emptyList() val rumor = RumorAssembler.assembleRumor(signer.pubKey, template) - val draftEvent = DraftBuilder.encryptAndSign(draftTag, rumor, signer) + val draftEvent = DraftWrapEvent.create(draftTag, rumor, signer) draftsDecryptionCache.preload(draftEvent, rumor) cache.justConsumeMyOwnEvent(draftEvent) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftBuilder.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftBuilder.kt deleted file mode 100644 index 3435d2227..000000000 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftBuilder.kt +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2025 Vitor Pamplona - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the - * Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package com.vitorpamplona.quartz.nip37Drafts - -import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner -import com.vitorpamplona.quartz.nip01Core.signers.eventTemplate -import com.vitorpamplona.quartz.nip01Core.tags.dTags.dTag -import com.vitorpamplona.quartz.nip01Core.tags.kinds.kind -import com.vitorpamplona.quartz.nip31Alts.alt -import com.vitorpamplona.quartz.utils.TimeUtils - -class DraftBuilder { - companion object { - suspend fun encryptAndSign( - dTag: String, - draft: T, - signer: NostrSigner, - createdAt: Long = TimeUtils.now(), - ): DraftWrapEvent { - val encryptedContent = signer.nip44Encrypt(draft.toJson(), signer.pubKey) - val template = - eventTemplate(DraftWrapEvent.KIND, encryptedContent, createdAt) { - alt(DraftWrapEvent.ALT_DESCRIPTION) - dTag(dTag) - kind(draft.kind) - - if (draft is ExposeInDraft) { - addAll(draft.exposeInDraft()) - } - } - - return signer.sign(template) - } - } -} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftEventCache.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftWrapCache.kt similarity index 100% rename from quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftEventCache.kt rename to quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftWrapCache.kt diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftWrapEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftWrapEvent.kt index bae8d9b69..7d3966bb9 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftWrapEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip37Drafts/DraftWrapEvent.kt @@ -34,6 +34,7 @@ import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address import com.vitorpamplona.quartz.nip01Core.tags.dTags.dTag import com.vitorpamplona.quartz.nip01Core.tags.kinds.kind import com.vitorpamplona.quartz.nip31Alts.alt +import com.vitorpamplona.quartz.nip40Expiration.expiration import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -91,6 +92,11 @@ class DraftWrapEvent( alt(ALT_DESCRIPTION) dTag(dTag) kind(draft.kind) + expiration(TimeUtils.ninetyDaysFromNow()) + + if (draft is ExposeInDraft) { + addAll(draft.exposeInDraft()) + } initializer() } @@ -105,6 +111,7 @@ class DraftWrapEvent( createdAt = createdAt, ) { alt(ALT_DESCRIPTION) + expiration(TimeUtils.oneMinuteFromNow()) dTag(dTag) initializer() } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt b/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt index 6f46cb0d9..d271d7b8a 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/utils/TimeUtils.kt @@ -28,6 +28,7 @@ object TimeUtils { const val ONE_HOUR = 60 * ONE_MINUTE const val EIGHT_HOURS = 8 * ONE_HOUR const val ONE_DAY = 24 * ONE_HOUR + const val NINETY_DAYS = 90 * ONE_DAY const val ONE_WEEK = 7 * ONE_DAY const val ONE_MONTH = 30 * ONE_DAY const val ONE_YEAR = 365 * ONE_DAY @@ -61,4 +62,6 @@ object TimeUtils { fun oneMonthAgo() = now() - ONE_MONTH fun randomWithTwoDays() = now() - RandomInstance.int(twoDays()) + + fun ninetyDaysFromNow() = now() + NINETY_DAYS }