Merge remote-tracking branch 'origin/nrobi144/desktop-phase1'

* origin/nrobi144/desktop-phase1:
  Fixes FilledFilter test
  moves keystore to commons to avoid unnecessary dependencies on Quartz
  Fixes missing tagsAll
This commit is contained in:
Vitor Pamplona
2026-01-07 11:41:30 -05:00
9 changed files with 32 additions and 23 deletions
+7
View File
@@ -104,6 +104,9 @@ kotlin {
// Desktop-specific Compose
implementation(compose.desktop.currentOs)
implementation(compose.uiTooling)
// Secure key storage via OS keychain (macOS/Windows/Linux)
implementation(libs.java.keyring)
}
}
@@ -112,6 +115,10 @@ kotlin {
dependencies {
// Android-specific Compose tooling
implementation(libs.androidx.ui.tooling.preview)
// Secure key storage via Android Keystore
implementation(libs.androidx.security.crypto.ktx)
implementation(libs.androidx.datastore.preferences)
}
}
@@ -18,7 +18,7 @@
* 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.nip01Core.crypto
package com.vitorpamplona.amethyst.commons.keystorage
import android.os.Build
import android.security.keystore.KeyGenParameterSpec
@@ -18,7 +18,7 @@
* 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.nip01Core.crypto
package com.vitorpamplona.amethyst.commons.keystorage
import android.content.Context
import androidx.security.crypto.EncryptedSharedPreferences
@@ -276,6 +276,7 @@ class FilterBuilder {
private var authors: List<String>? = null
private var kinds: List<Int>? = null
private var tags: MutableMap<String, List<String>>? = null
private var tagsAll: MutableMap<String, List<String>>? = null
private var since: Long? = null
private var until: Long? = null
private var limit: Int? = null
@@ -313,6 +314,14 @@ class FilterBuilder {
tags!![name] = values
}
fun tagAll(
name: String,
values: List<String>,
) {
if (tagsAll == null) tagsAll = mutableMapOf()
tagsAll!![name] = values
}
fun pTag(vararg pubKeys: String) {
tag("p", pubKeys.toList())
}
@@ -337,7 +346,7 @@ class FilterBuilder {
this.search = search
}
fun build(): Filter = Filter(ids, authors, kinds, tags, since, until, limit, search)
fun build(): Filter = Filter(ids, authors, kinds, tags, tagsAll, since, until, limit, search)
}
/**
@@ -18,7 +18,7 @@
* 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.nip01Core.crypto
package com.vitorpamplona.amethyst.commons.keystorage
/**
* Secure storage for private keys using platform-specific secure storage mechanisms.
@@ -418,7 +418,7 @@ class FilterBuildersTest {
fun testGlobalFeedScenario() {
val filter = FilterBuilders.textNotesGlobal(limit = 50)
assertTrue(filter.isFilledFilter())
assertTrue(!filter.isEmpty())
assertEquals(listOf(1), filter.kinds)
assertEquals(50, filter.limit)
}
@@ -428,7 +428,7 @@ class FilterBuildersTest {
val followedUsers = listOf(testPubKey, testPubKey2)
val filter = FilterBuilders.textNotesFromAuthors(followedUsers, limit = 50)
assertTrue(filter.isFilledFilter())
assertTrue(!filter.isEmpty())
assertEquals(listOf(1), filter.kinds)
assertEquals(followedUsers, filter.authors)
assertEquals(50, filter.limit)
@@ -440,9 +440,9 @@ class FilterBuildersTest {
val postsFilter = FilterBuilders.textNotesFromAuthors(listOf(testPubKey), limit = 50)
val contactListFilter = FilterBuilders.contactList(testPubKey)
assertTrue(metadataFilter.isFilledFilter())
assertTrue(postsFilter.isFilledFilter())
assertTrue(contactListFilter.isFilledFilter())
assertTrue(!metadataFilter.isEmpty())
assertTrue(!postsFilter.isEmpty())
assertTrue(!contactListFilter.isEmpty())
assertEquals(listOf(0), metadataFilter.kinds)
assertEquals(listOf(1), postsFilter.kinds)
@@ -453,7 +453,7 @@ class FilterBuildersTest {
fun testNotificationsScenario() {
val filter = FilterBuilders.notificationsForUser(testPubKey, limit = 100)
assertTrue(filter.isFilledFilter())
assertTrue(!filter.isEmpty())
assertEquals(listOf(1, 7, 6, 16, 9735), filter.kinds)
assertNotNull(filter.tags)
assertEquals(listOf(testPubKey), filter.tags!!["p"])
@@ -470,7 +470,7 @@ class FilterBuildersTest {
limit(100)
}
assertTrue(filter.isFilledFilter())
assertTrue(!filter.isEmpty())
assertEquals(listOf(1), filter.kinds)
assertNotNull(filter.tags)
assertEquals(listOf(testEventId), filter.tags!!["e"])
@@ -485,7 +485,7 @@ class FilterBuildersTest {
limit(50)
}
assertTrue(filter.isFilledFilter())
assertTrue(!filter.isEmpty())
assertEquals(listOf(7), filter.kinds)
assertNotNull(filter.tags)
assertEquals(listOf(testEventId), filter.tags!!["e"])
@@ -500,7 +500,7 @@ class FilterBuildersTest {
limit(50)
}
assertTrue(filter.isFilledFilter())
assertTrue(!filter.isEmpty())
assertEquals(listOf(1), filter.kinds)
assertNotNull(filter.tags)
assertEquals(listOf("bitcoin"), filter.tags!!["t"])
@@ -21,11 +21,11 @@
package com.vitorpamplona.amethyst.commons.account
import androidx.compose.runtime.Stable
import com.vitorpamplona.amethyst.commons.keystorage.SecureKeyStorage
import com.vitorpamplona.amethyst.commons.keystorage.SecureStorageException
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
import com.vitorpamplona.quartz.nip01Core.crypto.SecureKeyStorage
import com.vitorpamplona.quartz.nip01Core.crypto.SecureStorageException
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
import com.vitorpamplona.quartz.nip19Bech32.decodePrivateKeyAsHexOrNull
@@ -18,7 +18,7 @@
* 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.nip01Core.crypto
package com.vitorpamplona.amethyst.commons.keystorage
import com.github.javakeyring.BackendNotSupportedException
import com.github.javakeyring.Keyring
-7
View File
@@ -166,9 +166,6 @@ kotlin {
// LibSodium for ChaCha encryption (NIP-44)
implementation (libs.lazysodium.java)
implementation (libs.jna)
// Secure key storage via OS keychain (macOS/Windows/Linux)
implementation(libs.java.keyring)
}
}
@@ -191,10 +188,6 @@ kotlin {
// LibSodium for ChaCha encryption (NIP-44)
implementation ("com.goterl:lazysodium-android:5.2.0@aar")
implementation ("net.java.dev.jna:jna:5.18.1@aar")
// Secure key storage via Android Keystore
implementation(libs.androidx.security.crypto.ktx)
implementation(libs.androidx.datastore.preferences)
}
}