From 62902ca80b2a0883d810518de8b1838f29a682eb Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sun, 24 Apr 2022 21:25:34 +0530 Subject: Reorganize crypto-common code and fix a couple minor bugs (#1868) --- .../msfjarvis/aps/ui/pgp/PGPKeyImportActivity.kt | 2 ++ ...ndroid-password-store.kotlin-library.gradle.kts | 6 +++-- .../dev/msfjarvis/aps/crypto/CryptoException.kt | 29 --------------------- .../kotlin/dev/msfjarvis/aps/crypto/KeyManager.kt | 2 +- .../msfjarvis/aps/crypto/errors/CryptoException.kt | 30 ++++++++++++++++++++++ .../dev/msfjarvis/aps/crypto/PGPKeyManager.kt | 28 ++++++++++++-------- .../dev/msfjarvis/aps/crypto/PGPKeyManagerTest.kt | 9 ++++--- 7 files changed, 60 insertions(+), 46 deletions(-) delete mode 100644 crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/CryptoException.kt create mode 100644 crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/errors/CryptoException.kt diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/pgp/PGPKeyImportActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/pgp/PGPKeyImportActivity.kt index 02ea4fc3..e140ac91 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/pgp/PGPKeyImportActivity.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/pgp/PGPKeyImportActivity.kt @@ -48,6 +48,8 @@ class PGPKeyImportActivity : AppCompatActivity() { .setPositiveButton(android.R.string.ok) { _, _ -> finish() } .setOnCancelListener { finish() } .show() + } else { + finish() } }, { throwable -> diff --git a/build-logic/kotlin-plugins/src/main/kotlin/com.github.android-password-store.kotlin-library.gradle.kts b/build-logic/kotlin-plugins/src/main/kotlin/com.github.android-password-store.kotlin-library.gradle.kts index 516f5e4f..ecd7f23e 100644 --- a/build-logic/kotlin-plugins/src/main/kotlin/com.github.android-password-store.kotlin-library.gradle.kts +++ b/build-logic/kotlin-plugins/src/main/kotlin/com.github.android-password-store.kotlin-library.gradle.kts @@ -10,8 +10,10 @@ plugins { id("com.github.android-password-store.kotlin-common") } tasks.withType().configureEach { kotlinOptions { - if (!name.contains("test", ignoreCase = true)) { - freeCompilerArgs += listOf("-Xexplicit-api=strict") + if (project.providers.gradleProperty("android.injected.invoked.from.ide").orNull != "true") { + if (!name.contains("test", ignoreCase = true)) { + freeCompilerArgs = freeCompilerArgs + listOf("-Xexplicit-api=strict") + } } } } diff --git a/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/CryptoException.kt b/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/CryptoException.kt deleted file mode 100644 index 42429a14..00000000 --- a/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/CryptoException.kt +++ /dev/null @@ -1,29 +0,0 @@ -package dev.msfjarvis.aps.crypto - -public sealed class CryptoException(message: String? = null) : Exception(message) - -/** Sealed exception types for [KeyManager]. */ -public sealed class KeyManagerException(message: String? = null) : CryptoException(message) { - - /** Store contains no keys. */ - public object NoKeysAvailableException : KeyManagerException("No keys were found") - - /** Key directory does not exist or cannot be accessed. */ - public object KeyDirectoryUnavailableException : - KeyManagerException("Key directory does not exist") - - /** Failed to delete given key. */ - public object KeyDeletionFailedException : KeyManagerException("Couldn't delete the key file") - - /** Failed to parse the key as a known type. */ - public object InvalidKeyException : - KeyManagerException("Given key cannot be parsed as a known key type") - - /** No key matching [keyId] could be found. */ - public class KeyNotFoundException(keyId: String) : - KeyManagerException("No key found with id: $keyId") - - /** Attempting to add another key for [keyId] without requesting a replace. */ - public class KeyAlreadyExistsException(keyId: String) : - KeyManagerException("Pre-existing key was found for $keyId") -} diff --git a/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/KeyManager.kt b/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/KeyManager.kt index aa71abf6..71efb2fb 100644 --- a/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/KeyManager.kt +++ b/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/KeyManager.kt @@ -16,7 +16,7 @@ public interface KeyManager { /** * Inserts a [key] into the store. If the key already exists, this method will return - * [KeyManagerException.KeyAlreadyExistsException] unless [replace] is `true`. + * [KeyAlreadyExistsException] unless [replace] is `true`. */ public suspend fun addKey(key: Key, replace: Boolean = false): Result diff --git a/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/errors/CryptoException.kt b/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/errors/CryptoException.kt new file mode 100644 index 00000000..5e911c35 --- /dev/null +++ b/crypto-common/src/main/kotlin/dev/msfjarvis/aps/crypto/errors/CryptoException.kt @@ -0,0 +1,30 @@ +package dev.msfjarvis.aps.crypto.errors + +import dev.msfjarvis.aps.crypto.KeyManager + +public sealed class CryptoException(message: String? = null) : Exception(message) + +/** Sealed exception types for [KeyManager]. */ +public sealed class KeyManagerException(message: String? = null) : CryptoException(message) + +/** Store contains no keys. */ +public object NoKeysAvailableException : KeyManagerException("No keys were found") + +/** Key directory does not exist or cannot be accessed. */ +public object KeyDirectoryUnavailableException : + KeyManagerException("Key directory does not exist") + +/** Failed to delete given key. */ +public object KeyDeletionFailedException : KeyManagerException("Couldn't delete the key file") + +/** Failed to parse the key as a known type. */ +public object InvalidKeyException : + KeyManagerException("Given key cannot be parsed as a known key type") + +/** No key matching [keyId] could be found. */ +public class KeyNotFoundException(keyId: String) : + KeyManagerException("No key found with id: $keyId") + +/** Attempting to add another key for [keyId] without requesting a replace. */ +public class KeyAlreadyExistsException(keyId: String) : + KeyManagerException("Pre-existing key was found for $keyId") diff --git a/crypto-pgpainless/src/main/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManager.kt b/crypto-pgpainless/src/main/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManager.kt index 8c54d516..3cc68ab3 100644 --- a/crypto-pgpainless/src/main/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManager.kt +++ b/crypto-pgpainless/src/main/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManager.kt @@ -10,6 +10,12 @@ import androidx.annotation.VisibleForTesting import com.github.michaelbull.result.Result import dev.msfjarvis.aps.crypto.KeyUtils.tryGetId import dev.msfjarvis.aps.crypto.KeyUtils.tryParseKeyring +import dev.msfjarvis.aps.crypto.errors.InvalidKeyException +import dev.msfjarvis.aps.crypto.errors.KeyAlreadyExistsException +import dev.msfjarvis.aps.crypto.errors.KeyDeletionFailedException +import dev.msfjarvis.aps.crypto.errors.KeyDirectoryUnavailableException +import dev.msfjarvis.aps.crypto.errors.KeyNotFoundException +import dev.msfjarvis.aps.crypto.errors.NoKeysAvailableException import dev.msfjarvis.aps.util.coroutines.runSuspendCatching import java.io.File import javax.inject.Inject @@ -29,16 +35,16 @@ constructor( override suspend fun addKey(key: PGPKey, replace: Boolean): Result = withContext(dispatcher) { runSuspendCatching { - if (!keyDirExists()) throw KeyManagerException.KeyDirectoryUnavailableException - if (tryParseKeyring(key) == null) throw KeyManagerException.InvalidKeyException + if (!keyDirExists()) throw KeyDirectoryUnavailableException + if (tryParseKeyring(key) == null) throw InvalidKeyException val keyFile = File(keyDir, "${tryGetId(key)}.$KEY_EXTENSION") if (keyFile.exists()) { // Check for replace flag first and if it is false, throw an error if (!replace) - throw KeyManagerException.KeyAlreadyExistsException( + throw KeyAlreadyExistsException( tryGetId(key)?.toString() ?: "Failed to retrieve key ID" ) - if (!keyFile.delete()) throw KeyManagerException.KeyDeletionFailedException + if (!keyFile.delete()) throw KeyDeletionFailedException } keyFile.writeBytes(key.contents) @@ -50,11 +56,11 @@ constructor( override suspend fun removeKey(key: PGPKey): Result = withContext(dispatcher) { runSuspendCatching { - if (!keyDirExists()) throw KeyManagerException.KeyDirectoryUnavailableException - if (tryParseKeyring(key) == null) throw KeyManagerException.InvalidKeyException + if (!keyDirExists()) throw KeyDirectoryUnavailableException + if (tryParseKeyring(key) == null) throw InvalidKeyException val keyFile = File(keyDir, "${tryGetId(key)}.$KEY_EXTENSION") if (keyFile.exists()) { - if (!keyFile.delete()) throw KeyManagerException.KeyDeletionFailedException + if (!keyFile.delete()) throw KeyDeletionFailedException } key @@ -64,9 +70,9 @@ constructor( override suspend fun getKeyById(id: GpgIdentifier): Result = withContext(dispatcher) { runSuspendCatching { - if (!keyDirExists()) throw KeyManagerException.KeyDirectoryUnavailableException + if (!keyDirExists()) throw KeyDirectoryUnavailableException val keyFiles = keyDir.listFiles() - if (keyFiles.isNullOrEmpty()) throw KeyManagerException.NoKeysAvailableException + if (keyFiles.isNullOrEmpty()) throw NoKeysAvailableException val keys = keyFiles.map { file -> PGPKey(file.readBytes()) } val matchResult = @@ -92,14 +98,14 @@ constructor( return@runSuspendCatching matchResult } - throw KeyManagerException.KeyNotFoundException("$id") + throw KeyNotFoundException("$id") } } override suspend fun getAllKeys(): Result, Throwable> = withContext(dispatcher) { runSuspendCatching { - if (!keyDirExists()) throw KeyManagerException.KeyDirectoryUnavailableException + if (!keyDirExists()) throw KeyDirectoryUnavailableException val keyFiles = keyDir.listFiles() if (keyFiles.isNullOrEmpty()) return@runSuspendCatching emptyList() keyFiles.map { keyFile -> PGPKey(keyFile.readBytes()) }.toList() diff --git a/crypto-pgpainless/src/test/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManagerTest.kt b/crypto-pgpainless/src/test/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManagerTest.kt index 650f3d89..1439d52d 100644 --- a/crypto-pgpainless/src/test/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManagerTest.kt +++ b/crypto-pgpainless/src/test/kotlin/dev/msfjarvis/aps/crypto/PGPKeyManagerTest.kt @@ -5,6 +5,9 @@ import com.github.michaelbull.result.unwrapError import dev.msfjarvis.aps.crypto.GpgIdentifier.KeyId import dev.msfjarvis.aps.crypto.GpgIdentifier.UserId import dev.msfjarvis.aps.crypto.TestUtils.getArmoredPrivateKeyWithMultipleIdentities +import dev.msfjarvis.aps.crypto.errors.KeyAlreadyExistsException +import dev.msfjarvis.aps.crypto.errors.KeyNotFoundException +import dev.msfjarvis.aps.crypto.errors.NoKeysAvailableException import java.io.File import kotlin.test.AfterTest import kotlin.test.BeforeTest @@ -69,7 +72,7 @@ class PGPKeyManagerTest { keyManager.addKey(key, false).unwrap() val error = keyManager.addKey(key, false).unwrapError() - assertIs(error) + assertIs(error) } @Test @@ -142,7 +145,7 @@ class PGPKeyManagerTest { // Check returned key val error = keyManager.getKeyById(keyId).unwrapError() - assertIs(error) + assertIs(error) assertEquals("No key found with id: $keyId", error.message) } @@ -151,7 +154,7 @@ class PGPKeyManagerTest { scope.runTest { // Check returned key val error = keyManager.getKeyById(KeyId(0x08edf7567183ce44)).unwrapError() - assertIs(error) + assertIs(error) assertEquals("No keys were found", error.message) } -- cgit v1.2.3