fix(deps): update kotlinresult to v1.1.21 (#2958)

* fix(deps): update kotlinresult to v1.1.21

* refactor: fix deprecation warnings

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
renovate[bot] 2024-03-17 06:33:48 +00:00 committed by GitHub
parent b01fddaa56
commit 48067b4a01
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 72 additions and 102 deletions

View file

@ -16,7 +16,7 @@ import app.passwordstore.injection.prefs.SettingsPreferences
import app.passwordstore.util.coroutines.DispatcherProvider
import app.passwordstore.util.settings.PreferenceKeys
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.getAll
import com.github.michaelbull.result.filterValues
import com.github.michaelbull.result.mapBoth
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
@ -57,7 +57,7 @@ constructor(
message: ByteArrayInputStream,
out: ByteArrayOutputStream,
): Result<Unit, CryptoHandlerException> {
val keys = identities.map { id -> pgpKeyManager.getKeyById(id) }.getAll()
val keys = identities.map { id -> pgpKeyManager.getKeyById(id) }.filterValues()
val decryptionOptions = PGPDecryptOptions.Builder().build()
return pgpCryptoHandler.decrypt(keys, password, message, out, decryptionOptions)
}
@ -71,7 +71,7 @@ constructor(
PGPEncryptOptions.Builder()
.withAsciiArmor(settings.getBoolean(PreferenceKeys.ASCII_ARMOR, false))
.build()
val keys = identities.map { id -> pgpKeyManager.getKeyById(id) }.getAll()
val keys = identities.map { id -> pgpKeyManager.getKeyById(id) }.filterValues()
return pgpCryptoHandler.encrypt(
keys,
content,

View file

@ -27,8 +27,6 @@ import app.passwordstore.util.features.Feature.EnablePGPPassphraseCache
import app.passwordstore.util.features.Features
import app.passwordstore.util.settings.Constants
import app.passwordstore.util.settings.PreferenceKeys
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.runCatching
import dagger.hilt.android.AndroidEntryPoint
import java.io.ByteArrayOutputStream
@ -214,18 +212,16 @@ class DecryptActivity : BasePGPActivity() {
authResult: BiometricResult,
onSuccess: suspend () -> Unit = {},
) {
when (val result = decryptPGPStream(passphrase, identifiers)) {
is Ok -> {
val entry = passwordEntryFactory.create(result.value.toByteArray())
passwordEntry = entry
createPasswordUI(entry)
startAutoDismissTimer()
onSuccess()
}
is Err -> {
logcat(ERROR) { result.error.stackTraceToString() }
decrypt(isError = true, authResult = authResult)
}
val result = decryptPGPStream(passphrase, identifiers)
if (result.isOk) {
val entry = passwordEntryFactory.create(result.value.toByteArray())
passwordEntry = entry
createPasswordUI(entry)
startAutoDismissTimer()
onSuccess()
} else {
logcat(ERROR) { result.error.stackTraceToString() }
decrypt(isError = true, authResult = authResult)
}
}
@ -242,10 +238,7 @@ class DecryptActivity : BasePGPActivity() {
message,
outputStream,
)
when (result) {
is Ok -> outputStream
is Err -> throw result.error
}
if (result.isOk) outputStream else throw result.error
}
private suspend fun createPasswordUI(entry: PasswordEntry) =

View file

@ -14,8 +14,6 @@ import app.passwordstore.crypto.KeyUtils.tryGetId
import app.passwordstore.crypto.PGPKey
import app.passwordstore.crypto.PGPKeyManager
import app.passwordstore.crypto.errors.KeyAlreadyExistsException
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.runCatching
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@ -69,45 +67,42 @@ class PGPKeyImportActivity : AppCompatActivity() {
}
private fun handleImportResult(result: Result<PGPKey?, Throwable>) {
when (result) {
is Ok<PGPKey?> -> {
val key = result.value
if (key == null) {
setResult(RESULT_CANCELED)
if (result.isOk) {
val key = result.value
if (key == null) {
setResult(RESULT_CANCELED)
finish()
// This return convinces Kotlin that the control flow for `key == null` definitely
// terminates here and allows for a smart cast below.
return
}
MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.pgp_key_import_succeeded))
.setMessage(getString(R.string.pgp_key_import_succeeded_message, tryGetId(key)))
.setPositiveButton(android.R.string.ok) { _, _ ->
setResult(RESULT_OK)
finish()
// This return convinces Kotlin that the control flow for `key == null` definitely
// terminates here and allows for a smart cast below.
return
}
.setCancelable(false)
.show()
} else {
if (result.error is KeyAlreadyExistsException && lastBytes != null) {
MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.pgp_key_import_succeeded))
.setMessage(getString(R.string.pgp_key_import_succeeded_message, tryGetId(key)))
.setPositiveButton(android.R.string.ok) { _, _ ->
setResult(RESULT_OK)
finish()
.setTitle(getString(R.string.pgp_key_import_failed))
.setMessage(getString(R.string.pgp_key_import_failed_replace_message))
.setPositiveButton(R.string.dialog_yes) { _, _ ->
handleImportResult(runCatching { importKey(lastBytes!!, replace = true) })
}
.setNegativeButton(R.string.dialog_no) { _, _ -> finish() }
.setCancelable(false)
.show()
} else {
MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.pgp_key_import_failed))
.setMessage(result.error.message)
.setPositiveButton(android.R.string.ok) { _, _ -> finish() }
.setCancelable(false)
.show()
}
is Err<Throwable> -> {
if (result.error is KeyAlreadyExistsException && lastBytes != null) {
MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.pgp_key_import_failed))
.setMessage(getString(R.string.pgp_key_import_failed_replace_message))
.setPositiveButton(R.string.dialog_yes) { _, _ ->
handleImportResult(runCatching { importKey(lastBytes!!, replace = true) })
}
.setNegativeButton(R.string.dialog_no) { _, _ -> finish() }
.setCancelable(false)
.show()
} else {
MaterialAlertDialogBuilder(this)
.setTitle(getString(R.string.pgp_key_import_failed))
.setMessage(result.error.message)
.setPositiveButton(android.R.string.ok) { _, _ -> finish() }
.setCancelable(false)
.show()
}
}
}
}

View file

@ -5,8 +5,6 @@
package app.passwordstore.util.extensions
import app.passwordstore.data.repo.PasswordRepository
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.getOrElse
import com.github.michaelbull.result.runCatching
import java.io.File
@ -68,8 +66,3 @@ fun <T> unsafeLazy(initializer: () -> T) = lazy(LazyThreadSafetyMode.NONE) { ini
/** A convenience extension to turn a [Throwable] with a message into a loggable string. */
fun Throwable.asLog(message: String): String = "$message\n${asLog()}"
/** Extension on [Result] that returns if the type is [Err] */
fun <V, E> Result<V, E>.isErr(): Boolean {
return this is Err<E>
}

View file

@ -8,9 +8,8 @@ import androidx.lifecycle.viewModelScope
import app.passwordstore.crypto.KeyUtils
import app.passwordstore.crypto.PGPIdentifier
import app.passwordstore.crypto.PGPKeyManager
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.map
import com.github.michaelbull.result.onSuccess
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.collections.immutable.ImmutableList
@ -28,15 +27,10 @@ class PGPKeyListViewModel @Inject constructor(private val keyManager: PGPKeyMana
fun updateKeySet() {
viewModelScope.launch {
when (
val result =
keyManager.getAllKeys().map { keys ->
keys.mapNotNull { key -> KeyUtils.tryGetEmail(key) }
}
) {
is Ok -> keys = result.value.toPersistentList()
is Err -> TODO()
}
keyManager
.getAllKeys()
.map { keys -> keys.mapNotNull { key -> KeyUtils.tryGetEmail(key) } }
.onSuccess { keys = it.toPersistentList() }
}
}

View file

@ -7,8 +7,6 @@ import app.passwordstore.crypto.errors.KeyAlreadyExistsException
import app.passwordstore.crypto.errors.KeyNotFoundException
import app.passwordstore.crypto.errors.NoKeysAvailableException
import app.passwordstore.crypto.errors.UnusableKeyException
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.unwrap
import com.github.michaelbull.result.unwrapError
import java.io.File
@ -18,8 +16,8 @@ import kotlin.test.assertEquals
import kotlin.test.assertIs
import kotlin.test.assertNotEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.rules.TemporaryFolder
@ -28,7 +26,6 @@ class PGPKeyManagerTest {
@get:Rule val temporaryFolder: TemporaryFolder = TemporaryFolder()
private val dispatcher = StandardTestDispatcher()
private val scope = TestScope(dispatcher)
private val filesDir by unsafeLazy { temporaryFolder.root }
private val keysDir by unsafeLazy { File(filesDir, PGPKeyManager.KEY_DIR_NAME) }
private val keyManager by unsafeLazy { PGPKeyManager(filesDir.absolutePath, dispatcher) }
@ -170,24 +167,24 @@ class PGPKeyManagerTest {
@Test
fun replaceSecretKeyWithPublicKey() =
runTest(dispatcher) {
assertIs<Ok<PGPKey>>(keyManager.addKey(secretKey))
assertIs<Err<KeyAlreadyExistsException>>(keyManager.addKey(publicKey))
assertTrue(keyManager.addKey(secretKey).isOk)
assertTrue(keyManager.addKey(publicKey).isErr)
}
@Test
fun replacePublicKeyWithSecretKey() =
runTest(dispatcher) {
assertIs<Ok<PGPKey>>(keyManager.addKey(publicKey))
assertIs<Ok<PGPKey>>(keyManager.addKey(secretKey))
assertTrue(keyManager.addKey(publicKey).isOk)
assertTrue(keyManager.addKey(secretKey).isOk)
}
@Test
fun replacePublicKeyWithPublicKey() =
runTest(dispatcher) {
assertIs<Ok<PGPKey>>(keyManager.addKey(publicKey))
assertIs<Ok<PGPKey>>(keyManager.addKey(publicKey))
assertTrue(keyManager.addKey(publicKey).isOk)
assertTrue(keyManager.addKey(publicKey).isOk)
val allKeys = keyManager.getAllKeys()
assertIs<Ok<List<PGPKey>>>(allKeys)
assertTrue(allKeys.isOk)
assertEquals(1, allKeys.value.size)
val key = allKeys.value[0]
assertContentEquals(publicKey.contents, key.contents)
@ -196,8 +193,8 @@ class PGPKeyManagerTest {
@Test
fun replaceSecretKeyWithSecretKey() =
runTest(dispatcher) {
assertIs<Ok<PGPKey>>(keyManager.addKey(secretKey))
assertIs<Err<KeyAlreadyExistsException>>(keyManager.addKey(secretKey))
assertTrue(keyManager.addKey(secretKey).isOk)
assertTrue(keyManager.addKey(secretKey).isErr)
}
@Test
@ -207,11 +204,11 @@ class PGPKeyManagerTest {
PGPKey(this::class.java.classLoader.getResource("alice_owner@example_com")!!.readBytes())
val bobby =
PGPKey(this::class.java.classLoader.getResource("bobby_owner@example_com")!!.readBytes())
assertIs<Ok<PGPKey>>(keyManager.addKey(alice))
assertIs<Ok<PGPKey>>(keyManager.addKey(bobby))
assertTrue(keyManager.addKey(alice).isOk)
assertTrue(keyManager.addKey(bobby).isOk)
keyManager.getAllKeys().apply {
assertIs<Ok<List<PGPKey>>>(this)
assertTrue(this.isOk)
assertEquals(2, this.value.size)
}
val longKeyIds =
@ -228,8 +225,8 @@ class PGPKeyManagerTest {
for (idCollection in arrayOf(longKeyIds, userIds)) {
val alice1 = keyManager.getKeyById(idCollection[0])
val bobby1 = keyManager.getKeyById(idCollection[1])
assertIs<Ok<PGPKey>>(alice1)
assertIs<Ok<PGPKey>>(bobby1)
assertTrue(alice1.isOk)
assertTrue(bobby1.isOk)
assertNotEquals(alice1.value.contents, bobby1.value.contents)
}
}

View file

@ -9,8 +9,6 @@ package app.passwordstore.crypto
import app.passwordstore.crypto.CryptoConstants.KEY_PASSPHRASE
import app.passwordstore.crypto.CryptoConstants.PLAIN_TEXT
import app.passwordstore.crypto.errors.IncorrectPassphraseException
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.getError
import com.google.testing.junit.testparameterinjector.TestParameter
import com.google.testing.junit.testparameterinjector.TestParameterInjector
@ -48,7 +46,7 @@ class PGPainlessCryptoHandlerTest {
ciphertextStream,
PGPEncryptOptions.Builder().build(),
)
assertIs<Ok<Unit>>(encryptRes)
assertTrue(encryptRes.isOk)
val plaintextStream = ByteArrayOutputStream()
val decryptRes =
cryptoHandler.decrypt(
@ -58,7 +56,7 @@ class PGPainlessCryptoHandlerTest {
plaintextStream,
PGPDecryptOptions.Builder().build(),
)
assertIs<Ok<Unit>>(decryptRes)
assertTrue(decryptRes.isOk)
assertEquals(PLAIN_TEXT, plaintextStream.toString(Charsets.UTF_8))
}
@ -72,7 +70,7 @@ class PGPainlessCryptoHandlerTest {
ciphertextStream,
PGPEncryptOptions.Builder().build(),
)
assertIs<Ok<Unit>>(encryptRes)
assertTrue(encryptRes.isOk)
val plaintextStream = ByteArrayOutputStream()
val result =
cryptoHandler.decrypt(
@ -82,7 +80,7 @@ class PGPainlessCryptoHandlerTest {
plaintextStream,
PGPDecryptOptions.Builder().build(),
)
assertIs<Err<Throwable>>(result)
assertTrue(result.isErr)
assertIs<IncorrectPassphraseException>(result.getError())
}
@ -96,7 +94,7 @@ class PGPainlessCryptoHandlerTest {
ciphertextStream,
PGPEncryptOptions.Builder().withAsciiArmor(true).build(),
)
assertIs<Ok<Unit>>(encryptRes)
assertTrue(encryptRes.isOk)
val ciphertext = ciphertextStream.toString(Charsets.UTF_8)
assertContains(ciphertext, "Version: PGPainless")
assertContains(ciphertext, "-----BEGIN PGP MESSAGE-----")
@ -118,7 +116,7 @@ class PGPainlessCryptoHandlerTest {
ciphertextStream,
PGPEncryptOptions.Builder().withAsciiArmor(true).build(),
)
assertIs<Ok<Unit>>(encryptRes)
assertTrue(encryptRes.isOk)
val message = ciphertextStream.toByteArray().decodeToString()
val info = MessageInspector.determineEncryptionInfoForMessage(message)
assertTrue(info.isEncrypted)
@ -135,7 +133,7 @@ class PGPainlessCryptoHandlerTest {
plaintextStream,
PGPDecryptOptions.Builder().build(),
)
assertIs<Ok<Unit>>(res)
assertTrue(res.isOk)
}
}

View file

@ -8,7 +8,7 @@ coroutines = "1.8.0"
flowbinding = "1.2.0"
hilt = "2.51"
kotlin = "1.9.23"
kotlinResult = "1.1.20"
kotlinResult = "1.1.21"
lifecycle = "2.7.0"
moshi = "1.15.1"