fix: use the same decryption flow in autofill

Fixes #3131
This commit is contained in:
Harsh Shandilya 2024-07-24 00:28:42 +05:30
parent 8095ee4d6e
commit 1c6bbc51c3

View file

@ -17,6 +17,7 @@ import androidx.lifecycle.lifecycleScope
import app.passwordstore.Application.Companion.screenWasOff import app.passwordstore.Application.Companion.screenWasOff
import app.passwordstore.R import app.passwordstore.R
import app.passwordstore.crypto.PGPIdentifier import app.passwordstore.crypto.PGPIdentifier
import app.passwordstore.crypto.errors.CryptoHandlerException
import app.passwordstore.data.crypto.PGPPassphraseCache import app.passwordstore.data.crypto.PGPPassphraseCache
import app.passwordstore.data.passfile.PasswordEntry import app.passwordstore.data.passfile.PasswordEntry
import app.passwordstore.data.repo.PasswordRepository import app.passwordstore.data.repo.PasswordRepository
@ -33,11 +34,14 @@ import app.passwordstore.util.features.Features
import app.passwordstore.util.settings.PreferenceKeys import app.passwordstore.util.settings.PreferenceKeys
import com.github.androidpasswordstore.autofillparser.AutofillAction import com.github.androidpasswordstore.autofillparser.AutofillAction
import com.github.androidpasswordstore.autofillparser.Credentials import com.github.androidpasswordstore.autofillparser.Credentials
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.getOrElse import com.github.michaelbull.result.getOrElse
import com.github.michaelbull.result.map
import com.github.michaelbull.result.onFailure import com.github.michaelbull.result.onFailure
import com.github.michaelbull.result.onSuccess import com.github.michaelbull.result.onSuccess
import com.github.michaelbull.result.runCatching import com.github.michaelbull.result.runCatching
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
import javax.inject.Inject import javax.inject.Inject
@ -209,20 +213,16 @@ class AutofillDecryptActivity : BasePGPActivity() {
return null return null
} }
.onSuccess { encryptedInput -> .onSuccess { encryptedInput ->
runCatching { decryptPGPStream(encryptedInput, password, identifiers)
withContext(dispatcherProvider.io()) {
val outputStream = ByteArrayOutputStream()
repository.decrypt(password, identifiers, encryptedInput, outputStream)
outputStream
}
}
.onFailure { e -> .onFailure { e ->
logcat(ERROR) { e.asLog("Decryption failed") } logcat(ERROR) { e.asLog("Decryption failed") }
return null return null
} }
.onSuccess { result -> .onSuccess { result ->
return runCatching { return runCatching {
passphraseCache.cachePassphrase(this, identifiers.first(), password) if (features.isEnabled(EnablePGPPassphraseCache)) {
passphraseCache.cachePassphrase(this, identifiers.first(), password)
}
val entry = passwordEntryFactory.create(result.toByteArray()) val entry = passwordEntryFactory.create(result.toByteArray())
AutofillPreferences.credentialsFromStoreEntry(this, file, entry, directoryStructure) AutofillPreferences.credentialsFromStoreEntry(this, file, entry, directoryStructure)
} }
@ -235,6 +235,17 @@ class AutofillDecryptActivity : BasePGPActivity() {
return null return null
} }
private suspend fun decryptPGPStream(
message: ByteArrayInputStream,
passphrase: String,
gpgIdentifiers: List<PGPIdentifier>,
): Result<ByteArrayOutputStream, CryptoHandlerException> {
val outputStream = ByteArrayOutputStream()
return repository.decrypt(passphrase, gpgIdentifiers, message, outputStream).map {
outputStream
}
}
companion object { companion object {
private const val EXTRA_FILE_PATH = "app.passwordstore.autofill.oreo.EXTRA_FILE_PATH" private const val EXTRA_FILE_PATH = "app.passwordstore.autofill.oreo.EXTRA_FILE_PATH"