diff options
Diffstat (limited to 'app/src/main/java/dev/msfjarvis/aps/ui/autofill')
4 files changed, 121 insertions, 35 deletions
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillDecryptActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillDecryptActivity.kt index 79fc44aa..07ae4c42 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillDecryptActivity.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillDecryptActivity.kt @@ -73,7 +73,12 @@ class AutofillDecryptActivity : AppCompatActivity() { putExtra(EXTRA_SEARCH_ACTION, false) putExtra(EXTRA_FILE_PATH, file.absolutePath) } - return PendingIntent.getActivity(context, decryptFileRequestCode++, intent, PendingIntent.FLAG_CANCEL_CURRENT) + return PendingIntent.getActivity( + context, + decryptFileRequestCode++, + intent, + PendingIntent.FLAG_CANCEL_CURRENT + ) .intentSender } } @@ -124,9 +129,17 @@ class AutofillDecryptActivity : AppCompatActivity() { setResult(RESULT_CANCELED) } else { val fillInDataset = - AutofillResponseBuilder.makeFillInDataset(this@AutofillDecryptActivity, credentials, clientState, action) + AutofillResponseBuilder.makeFillInDataset( + this@AutofillDecryptActivity, + credentials, + clientState, + action + ) withContext(Dispatchers.Main) { - setResult(RESULT_OK, Intent().apply { putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, fillInDataset) }) + setResult( + RESULT_OK, + Intent().apply { putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, fillInDataset) } + ) } } withContext(Dispatchers.Main) { finish() } @@ -137,7 +150,11 @@ class AutofillDecryptActivity : AppCompatActivity() { super.onDestroy() } - private suspend fun executeOpenPgpApi(data: Intent, input: InputStream, output: OutputStream): Intent? { + private suspend fun executeOpenPgpApi( + data: Intent, + input: InputStream, + output: OutputStream + ): Intent? { var openPgpServiceConnection: OpenPgpServiceConnection? = null val openPgpService = suspendCoroutine<IOpenPgpService2> { cont -> @@ -177,7 +194,9 @@ class AutofillDecryptActivity : AppCompatActivity() { return null } .onSuccess { result -> - return when (val resultCode = result?.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR)) { + return when (val resultCode = + result?.getIntExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR) + ) { OpenPgpApi.RESULT_CODE_SUCCESS -> { runCatching { val entry = @@ -185,7 +204,12 @@ class AutofillDecryptActivity : AppCompatActivity() { @Suppress("BlockingMethodInNonBlockingContext") passwordEntryFactory.create(lifecycleScope, decryptedOutput.toByteArray()) } - AutofillPreferences.credentialsFromStoreEntry(this, file, entry, directoryStructure) + AutofillPreferences.credentialsFromStoreEntry( + this, + file, + entry, + directoryStructure + ) } .getOrElse { e -> e(e) { "Failed to parse password entry" } @@ -193,7 +217,8 @@ class AutofillDecryptActivity : AppCompatActivity() { } } OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED -> { - val pendingIntent: PendingIntent = result.getParcelableExtra(OpenPgpApi.RESULT_INTENT)!! + val pendingIntent: PendingIntent = + result.getParcelableExtra(OpenPgpApi.RESULT_INTENT)!! runCatching { val intentToResume = withContext(Dispatchers.Main) { @@ -215,10 +240,16 @@ class AutofillDecryptActivity : AppCompatActivity() { val error = result.getParcelableExtra<OpenPgpError>(OpenPgpApi.RESULT_ERROR) if (error != null) { withContext(Dispatchers.Main) { - Toast.makeText(applicationContext, "Error from OpenKeyChain: ${error.message}", Toast.LENGTH_LONG) + Toast.makeText( + applicationContext, + "Error from OpenKeyChain: ${error.message}", + Toast.LENGTH_LONG + ) .show() } - e { "OpenPgpApi ACTION_DECRYPT_VERIFY failed (${error.errorId}): ${error.message}" } + e { + "OpenPgpApi ACTION_DECRYPT_VERIFY failed (${error.errorId}): ${error.message}" + } } null } diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillFilterActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillFilterActivity.kt index cf833a19..aac7008d 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillFilterActivity.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillFilterActivity.kt @@ -46,11 +46,16 @@ class AutofillFilterView : AppCompatActivity() { private const val HEIGHT_PERCENTAGE = 0.9 private const val WIDTH_PERCENTAGE = 0.75 - private const val EXTRA_FORM_ORIGIN_WEB = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_FORM_ORIGIN_WEB" - private const val EXTRA_FORM_ORIGIN_APP = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_FORM_ORIGIN_APP" + private const val EXTRA_FORM_ORIGIN_WEB = + "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_FORM_ORIGIN_WEB" + private const val EXTRA_FORM_ORIGIN_APP = + "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_FORM_ORIGIN_APP" private var matchAndDecryptFileRequestCode = 1 - fun makeMatchAndDecryptFileIntentSender(context: Context, formOrigin: FormOrigin): IntentSender { + fun makeMatchAndDecryptFileIntentSender( + context: Context, + formOrigin: FormOrigin + ): IntentSender { val intent = Intent(context, AutofillFilterView::class.java).apply { when (formOrigin) { @@ -108,7 +113,9 @@ class AutofillFilterView : AppCompatActivity() { FormOrigin.App(intent!!.getStringExtra(EXTRA_FORM_ORIGIN_APP)!!) } else -> { - e { "AutofillFilterActivity started without EXTRA_FORM_ORIGIN_WEB or EXTRA_FORM_ORIGIN_APP" } + e { + "AutofillFilterActivity started without EXTRA_FORM_ORIGIN_WEB or EXTRA_FORM_ORIGIN_APP" + } finish() return } @@ -125,7 +132,8 @@ class AutofillFilterView : AppCompatActivity() { with(binding) { rvPassword.apply { adapter = - SearchableRepositoryAdapter(R.layout.oreo_autofill_filter_row, ::PasswordViewHolder) { item -> + SearchableRepositoryAdapter(R.layout.oreo_autofill_filter_row, ::PasswordViewHolder) { + item -> val file = item.file.relativeTo(item.rootDir) val pathToIdentifier = directoryStructure.getPathToIdentifierFor(file) val identifier = directoryStructure.getIdentifierFor(file) @@ -171,10 +179,15 @@ class AutofillFilterView : AppCompatActivity() { setOnCheckedChangeListener { _, _ -> updateSearch() } } shouldMatch.text = - getString(R.string.oreo_autofill_match_with, formOrigin.getPrettyIdentifier(applicationContext)) + getString( + R.string.oreo_autofill_match_with, + formOrigin.getPrettyIdentifier(applicationContext) + ) model.searchResult.observe(this@AutofillFilterView) { result -> val list = result.passwordItems - (rvPassword.adapter as SearchableRepositoryAdapter).submitList(list) { rvPassword.scrollToPosition(0) } + (rvPassword.adapter as SearchableRepositoryAdapter).submitList(list) { + rvPassword.scrollToPosition(0) + } // Switch RecyclerView out for a "no results" message if the new list is empty and // the message is not yet shown (and vice versa). if ((list.isEmpty() && rvPasswordSwitcher.nextView.id == rvPasswordEmpty.id) || @@ -189,16 +202,21 @@ class AutofillFilterView : AppCompatActivity() { private fun updateSearch() { model.search( binding.search.text.toString().trim(), - filterMode = if (binding.strictDomainSearch.isChecked) FilterMode.StrictDomain else FilterMode.Fuzzy, + filterMode = + if (binding.strictDomainSearch.isChecked) FilterMode.StrictDomain else FilterMode.Fuzzy, searchMode = SearchMode.RecursivelyInSubdirectories, listMode = ListMode.FilesOnly ) } private fun decryptAndFill(item: PasswordItem) { - if (binding.shouldClear.isChecked) AutofillMatcher.clearMatchesFor(applicationContext, formOrigin) - if (binding.shouldMatch.isChecked) AutofillMatcher.addMatchFor(applicationContext, formOrigin, item.file) + if (binding.shouldClear.isChecked) + AutofillMatcher.clearMatchesFor(applicationContext, formOrigin) + if (binding.shouldMatch.isChecked) + AutofillMatcher.addMatchFor(applicationContext, formOrigin, item.file) // intent?.extras? is checked to be non-null in onCreate - decryptAction.launch(AutofillDecryptActivity.makeDecryptFileIntent(item.file, intent!!.extras!!, this)) + decryptAction.launch( + AutofillDecryptActivity.makeDecryptFileIntent(item.file, intent!!.extras!!, this) + ) } } diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillPublisherChangedActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillPublisherChangedActivity.kt index bea2bcd3..6ea47ea1 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillPublisherChangedActivity.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillPublisherChangedActivity.kt @@ -83,9 +83,15 @@ class AutofillPublisherChangedActivity : AppCompatActivity() { resetButton.visibility = View.VISIBLE } resetButton.setOnClickListener { - AutofillMatcher.clearMatchesFor(this@AutofillPublisherChangedActivity, FormOrigin.App(appPackage)) + AutofillMatcher.clearMatchesFor( + this@AutofillPublisherChangedActivity, + FormOrigin.App(appPackage) + ) val fillResponse = intent.getParcelableExtra<FillResponse>(EXTRA_FILL_RESPONSE_AFTER_RESET) - setResult(RESULT_OK, Intent().apply { putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, fillResponse) }) + setResult( + RESULT_OK, + Intent().apply { putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, fillResponse) } + ) finish() } } @@ -96,13 +102,18 @@ class AutofillPublisherChangedActivity : AppCompatActivity() { with(binding) { val packageInfo = packageManager.getPackageInfo(appPackage, PackageManager.GET_META_DATA) val installTime = DateUtils.getRelativeTimeSpanString(packageInfo.firstInstallTime) - warningAppInstallDate.text = getString(R.string.oreo_autofill_warning_publisher_install_time, installTime) + warningAppInstallDate.text = + getString(R.string.oreo_autofill_warning_publisher_install_time, installTime) val appInfo = packageManager.getApplicationInfo(appPackage, PackageManager.GET_META_DATA) warningAppName.text = "“${packageManager.getApplicationLabel(appInfo)}”" val currentHash = computeCertificatesHash(this@AutofillPublisherChangedActivity, appPackage) warningAppAdvancedInfo.text = - getString(R.string.oreo_autofill_warning_publisher_advanced_info_template, appPackage, currentHash) + getString( + R.string.oreo_autofill_warning_publisher_advanced_info_template, + appPackage, + currentHash + ) } } .onFailure { e -> diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillSaveActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillSaveActivity.kt index dfec29be..ee3cf752 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillSaveActivity.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/autofill/AutofillSaveActivity.kt @@ -34,13 +34,20 @@ class AutofillSaveActivity : AppCompatActivity() { private const val EXTRA_FOLDER_NAME = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_FOLDER_NAME" private const val EXTRA_PASSWORD = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_PASSWORD" private const val EXTRA_NAME = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_NAME" - private const val EXTRA_SHOULD_MATCH_APP = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_SHOULD_MATCH_APP" - private const val EXTRA_SHOULD_MATCH_WEB = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_SHOULD_MATCH_WEB" - private const val EXTRA_GENERATE_PASSWORD = "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_GENERATE_PASSWORD" + private const val EXTRA_SHOULD_MATCH_APP = + "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_SHOULD_MATCH_APP" + private const val EXTRA_SHOULD_MATCH_WEB = + "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_SHOULD_MATCH_WEB" + private const val EXTRA_GENERATE_PASSWORD = + "dev.msfjarvis.aps.autofill.oreo.ui.EXTRA_GENERATE_PASSWORD" private var saveRequestCode = 1 - fun makeSaveIntentSender(context: Context, credentials: Credentials?, formOrigin: FormOrigin): IntentSender { + fun makeSaveIntentSender( + context: Context, + credentials: Credentials?, + formOrigin: FormOrigin + ): IntentSender { val identifier = formOrigin.getPrettyIdentifier(context, untrusted = false) // Prevent directory traversals val sanitizedIdentifier = @@ -52,7 +59,11 @@ class AutofillSaveActivity : AppCompatActivity() { sanitizedIdentifier = sanitizedIdentifier, username = credentials?.username ) - val fileName = directoryStructure.getSaveFileName(username = credentials?.username, identifier = identifier) + val fileName = + directoryStructure.getSaveFileName( + username = credentials?.username, + identifier = identifier + ) val intent = Intent(context, AutofillSaveActivity::class.java).apply { putExtras( @@ -60,13 +71,20 @@ class AutofillSaveActivity : AppCompatActivity() { EXTRA_FOLDER_NAME to folderName, EXTRA_NAME to fileName, EXTRA_PASSWORD to credentials?.password, - EXTRA_SHOULD_MATCH_APP to formOrigin.identifier.takeIf { formOrigin is FormOrigin.App }, - EXTRA_SHOULD_MATCH_WEB to formOrigin.identifier.takeIf { formOrigin is FormOrigin.Web }, + EXTRA_SHOULD_MATCH_APP to + formOrigin.identifier.takeIf { formOrigin is FormOrigin.App }, + EXTRA_SHOULD_MATCH_WEB to + formOrigin.identifier.takeIf { formOrigin is FormOrigin.Web }, EXTRA_GENERATE_PASSWORD to (credentials == null) ) ) } - return PendingIntent.getActivity(context, saveRequestCode++, intent, PendingIntent.FLAG_CANCEL_CURRENT) + return PendingIntent.getActivity( + context, + saveRequestCode++, + intent, + PendingIntent.FLAG_CANCEL_CURRENT + ) .intentSender } } @@ -94,7 +112,8 @@ class AutofillSaveActivity : AppCompatActivity() { "FILE_PATH" to repo.resolve(intent.getStringExtra(EXTRA_FOLDER_NAME)!!).absolutePath, PasswordCreationActivity.EXTRA_FILE_NAME to intent.getStringExtra(EXTRA_NAME), PasswordCreationActivity.EXTRA_PASSWORD to intent.getStringExtra(EXTRA_PASSWORD), - PasswordCreationActivity.EXTRA_GENERATE_PASSWORD to intent.getBooleanExtra(EXTRA_GENERATE_PASSWORD, false) + PasswordCreationActivity.EXTRA_GENERATE_PASSWORD to + intent.getBooleanExtra(EXTRA_GENERATE_PASSWORD, false) ) ) } @@ -117,8 +136,15 @@ class AutofillSaveActivity : AppCompatActivity() { } val credentials = Credentials(username, password, null) val fillInDataset = - AutofillResponseBuilder.makeFillInDataset(this, credentials, clientState, AutofillAction.Generate) - Intent().apply { putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, fillInDataset) } + AutofillResponseBuilder.makeFillInDataset( + this, + credentials, + clientState, + AutofillAction.Generate + ) + Intent().apply { + putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, fillInDataset) + } } else { // Password was extracted from a form, there is nothing to fill. Intent() |
