This commit is contained in:
2026-07-06 10:04:23 +07:00
parent a48c0c0e7c
commit f49279fd10

View File

@@ -69,7 +69,7 @@ class AuthViewModel(
} }
runCatching { runCatching {
val signer = createSigner(secret) val (signer, _) = createSigner(secret)
nostr.setSigner(signer) nostr.setSigner(signer)
}.onSuccess { }.onSuccess {
_state.update { it.copy(signerRequired = false) } _state.update { it.copy(signerRequired = false) }
@@ -121,22 +121,27 @@ class AuthViewModel(
return keys return keys
} }
private suspend fun createSigner(secret: String, password: String? = null): AsyncNostrSigner { private suspend fun createSigner(
secret: String,
password: String? = null
): Pair<AsyncNostrSigner, String?> {
return when { return when {
secret.startsWith("nsec1") -> Keys.parse(secret) secret.startsWith("nsec1") -> Keys.parse(secret) to null
secret.startsWith("ncryptsec1") -> { secret.startsWith("ncryptsec1") -> {
if (password == null) throw IllegalArgumentException("Password is required") if (password == null) throw IllegalArgumentException("Password is required")
val enc = EncryptedSecretKey.fromBech32(secret) val enc = EncryptedSecretKey.fromBech32(secret)
val secret = enc.decrypt(password) val secret = enc.decrypt(password)
Keys(secret) val keys = Keys(secret)
keys to keys.secretKey().toBech32()
} }
secret.startsWith("bunker://") -> { secret.startsWith("bunker://") -> {
val appKeys = getOrInitAppKeys() val appKeys = getOrInitAppKeys()
val bunker = NostrConnectUri.parse(secret) val bunker = NostrConnectUri.parse(secret)
val timeout = 50.seconds val timeout = 50.seconds
NostrConnect(uri = bunker, appKeys, timeout, null) NostrConnect(uri = bunker, appKeys, timeout, null) to null
} }
secret.startsWith("nip55://") -> { secret.startsWith("nip55://") -> {
@@ -149,7 +154,7 @@ class AuthViewModel(
val pubkey = PublicKey.parse(parts[1]) val pubkey = PublicKey.parse(parts[1])
handler.setPackageName(packageName) handler.setPackageName(packageName)
ExternalSignerProxy(handler, pubkey) ExternalSignerProxy(handler, pubkey) to null
} }
else -> throw IllegalArgumentException("Invalid secret format") else -> throw IllegalArgumentException("Invalid secret format")
@@ -157,11 +162,13 @@ class AuthViewModel(
} }
suspend fun importIdentity(secret: String, password: String? = null) { suspend fun importIdentity(secret: String, password: String? = null) {
val signer = createSigner(secret, password) val (signer, decryptedSecret) = createSigner(secret, password)
// Update signer // Update signer
nostr.setSigner(signer) nostr.setSigner(signer)
// Persist the secret in the secret storage // Persist the secret in the secret storage
secretStore.set(KEY_USER_SIGNER, secret) secretStore.set(KEY_USER_SIGNER, decryptedSecret ?: secret)
// Update local states
_state.update { it.copy(signerRequired = false) }
} }
suspend fun connectExternalSigner() { suspend fun connectExternalSigner() {
@@ -206,7 +213,7 @@ class AuthViewModel(
val keys = Keys.generate() val keys = Keys.generate()
val secret = keys.secretKey().toBech32() val secret = keys.secretKey().toBech32()
val avatarUrl = picture?.let { val avatarUrl = picture?.let {
mediaRepository.blossomUpload(nostr.signer.get(), it, contentType ?: "image/jpeg") mediaRepository.blossomUpload(keys, it, contentType ?: "image/jpeg")
} }
// Create identity // Create identity
nostr.profiles.createIdentity(keys = keys, name = name, bio = bio, picture = avatarUrl) nostr.profiles.createIdentity(keys = keys, name = name, bio = bio, picture = avatarUrl)