aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/dev/msfjarvis/aps/ui
diff options
context:
space:
mode:
authorHarsh Shandilya <me@msfjarvis.dev>2021-12-10 14:51:05 +0530
committerHarsh Shandilya <me@msfjarvis.dev>2021-12-21 13:01:41 +0530
commita700e2a76622745890f21d499b380abce2031aab (patch)
tree2e69baba0cd6f278a8c40849896b857da514535f /app/src/main/java/dev/msfjarvis/aps/ui
parent0f837b003317970d50774df99bd474d3144120f8 (diff)
downloadHardenedPass-a700e2a76622745890f21d499b380abce2031aab.tar.gz
HardenedPass-a700e2a76622745890f21d499b380abce2031aab.zip
app: remove XkPasswd generator
Diffstat (limited to 'app/src/main/java/dev/msfjarvis/aps/ui')
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivity.kt4
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt4
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/ui/dialogs/XkPasswordGeneratorDialogFragment.kt156
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/ui/settings/PasswordSettings.kt71
4 files changed, 1 insertions, 234 deletions
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivity.kt
index b22ee706..b1c66a0a 100644
--- a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivity.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivity.kt
@@ -44,7 +44,6 @@ import dev.msfjarvis.aps.data.repo.PasswordRepository
import dev.msfjarvis.aps.databinding.PasswordCreationActivityBinding
import dev.msfjarvis.aps.ui.dialogs.OtpImportDialogFragment
import dev.msfjarvis.aps.ui.dialogs.PasswordGeneratorDialogFragment
-import dev.msfjarvis.aps.ui.dialogs.XkPasswordGeneratorDialogFragment
import dev.msfjarvis.aps.util.autofill.AutofillPreferences
import dev.msfjarvis.aps.util.autofill.DirectoryStructure
import dev.msfjarvis.aps.util.crypto.GpgIdentifier
@@ -361,8 +360,6 @@ class PasswordCreationActivity : BasePgpActivity(), OpenPgpServiceConnection.OnB
when (settings.getString(PreferenceKeys.PREF_KEY_PWGEN_TYPE) ?: KEY_PWGEN_TYPE_CLASSIC) {
KEY_PWGEN_TYPE_CLASSIC ->
PasswordGeneratorDialogFragment().show(supportFragmentManager, "generator")
- KEY_PWGEN_TYPE_XKPASSWD ->
- XkPasswordGeneratorDialogFragment().show(supportFragmentManager, "xkpwgenerator")
}
}
@@ -594,7 +591,6 @@ class PasswordCreationActivity : BasePgpActivity(), OpenPgpServiceConnection.OnB
companion object {
private const val KEY_PWGEN_TYPE_CLASSIC = "classic"
- private const val KEY_PWGEN_TYPE_XKPASSWD = "xkpasswd"
const val PASSWORD_RESULT_REQUEST_KEY = "PASSWORD_GENERATOR"
const val OTP_RESULT_REQUEST_KEY = "OTP_IMPORT"
const val RESULT = "RESULT"
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt
index b99d5f6d..3aa24a9f 100644
--- a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt
@@ -41,7 +41,6 @@ import dev.msfjarvis.aps.databinding.PasswordCreationActivityBinding
import dev.msfjarvis.aps.injection.crypto.CryptoSet
import dev.msfjarvis.aps.ui.dialogs.OtpImportDialogFragment
import dev.msfjarvis.aps.ui.dialogs.PasswordGeneratorDialogFragment
-import dev.msfjarvis.aps.ui.dialogs.XkPasswordGeneratorDialogFragment
import dev.msfjarvis.aps.util.autofill.AutofillPreferences
import dev.msfjarvis.aps.util.autofill.DirectoryStructure
import dev.msfjarvis.aps.util.extensions.asLog
@@ -291,8 +290,6 @@ class PasswordCreationActivityV2 : BasePgpActivity() {
when (settings.getString(PreferenceKeys.PREF_KEY_PWGEN_TYPE) ?: KEY_PWGEN_TYPE_CLASSIC) {
KEY_PWGEN_TYPE_CLASSIC ->
PasswordGeneratorDialogFragment().show(supportFragmentManager, "generator")
- KEY_PWGEN_TYPE_XKPASSWD ->
- XkPasswordGeneratorDialogFragment().show(supportFragmentManager, "xkpwgenerator")
}
}
@@ -469,7 +466,6 @@ class PasswordCreationActivityV2 : BasePgpActivity() {
companion object {
private const val KEY_PWGEN_TYPE_CLASSIC = "classic"
- private const val KEY_PWGEN_TYPE_XKPASSWD = "xkpasswd"
const val PASSWORD_RESULT_REQUEST_KEY = "PASSWORD_GENERATOR"
const val OTP_RESULT_REQUEST_KEY = "OTP_IMPORT"
const val RESULT = "RESULT"
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/dialogs/XkPasswordGeneratorDialogFragment.kt b/app/src/main/java/dev/msfjarvis/aps/ui/dialogs/XkPasswordGeneratorDialogFragment.kt
deleted file mode 100644
index 7b2297ff..00000000
--- a/app/src/main/java/dev/msfjarvis/aps/ui/dialogs/XkPasswordGeneratorDialogFragment.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
- * SPDX-License-Identifier: GPL-3.0-only
- */
-package dev.msfjarvis.aps.ui.dialogs
-
-import android.app.Dialog
-import android.content.Context
-import android.content.SharedPreferences
-import android.graphics.Typeface
-import android.os.Bundle
-import android.widget.Toast
-import androidx.appcompat.app.AlertDialog
-import androidx.core.content.edit
-import androidx.core.os.bundleOf
-import androidx.fragment.app.DialogFragment
-import androidx.fragment.app.setFragmentResult
-import androidx.lifecycle.lifecycleScope
-import com.github.michaelbull.result.fold
-import com.github.michaelbull.result.getOr
-import com.github.michaelbull.result.runCatching
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
-import dev.msfjarvis.aps.R
-import dev.msfjarvis.aps.databinding.FragmentXkpwgenBinding
-import dev.msfjarvis.aps.ui.crypto.PasswordCreationActivity
-import dev.msfjarvis.aps.util.extensions.asLog
-import dev.msfjarvis.aps.util.extensions.getString
-import dev.msfjarvis.aps.util.pwgenxkpwd.CapsType
-import dev.msfjarvis.aps.util.pwgenxkpwd.PasswordBuilder
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.merge
-import kotlinx.coroutines.flow.onEach
-import logcat.LogPriority.ERROR
-import logcat.logcat
-import reactivecircus.flowbinding.android.widget.afterTextChanges
-import reactivecircus.flowbinding.android.widget.selectionEvents
-
-@OptIn(ExperimentalCoroutinesApi::class)
-class XkPasswordGeneratorDialogFragment : DialogFragment() {
-
- override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
- val builder = MaterialAlertDialogBuilder(requireContext())
- val callingActivity = requireActivity()
- val inflater = callingActivity.layoutInflater
- val binding = FragmentXkpwgenBinding.inflate(inflater)
- val monoTypeface = Typeface.createFromAsset(callingActivity.assets, "fonts/sourcecodepro.ttf")
- val prefs = callingActivity.getSharedPreferences("PasswordGenerator", Context.MODE_PRIVATE)
-
- builder.setView(binding.root)
-
- val previousStoredCapStyle: String =
- runCatching { prefs.getString(PREF_KEY_CAPITALS_STYLE)!! }.getOr(DEFAULT_CAPS_STYLE)
-
- val lastCapitalsStyleIndex: Int =
- runCatching { CapsType.valueOf(previousStoredCapStyle).ordinal }.getOr(DEFAULT_CAPS_INDEX)
- binding.xkCapType.setSelection(lastCapitalsStyleIndex)
- binding.xkNumWords.setText(prefs.getString(PREF_KEY_NUM_WORDS, DEFAULT_NUMBER_OF_WORDS))
-
- binding.xkSeparator.setText(prefs.getString(PREF_KEY_SEPARATOR, DEFAULT_WORD_SEPARATOR))
- binding.xkNumberSymbolMask.setText(
- prefs.getString(PREF_KEY_EXTRA_SYMBOLS_MASK, DEFAULT_EXTRA_SYMBOLS_MASK)
- )
-
- binding.xkPasswordText.typeface = monoTypeface
-
- builder.setPositiveButton(resources.getString(R.string.dialog_ok)) { _, _ ->
- setPreferences(binding, prefs)
- setFragmentResult(
- PasswordCreationActivity.PASSWORD_RESULT_REQUEST_KEY,
- bundleOf(PasswordCreationActivity.RESULT to "${binding.xkPasswordText.text}")
- )
- }
-
- // flip neutral and negative buttons
- builder.setNeutralButton(resources.getString(R.string.dialog_cancel)) { _, _ -> }
- builder.setNegativeButton(resources.getString(R.string.pwgen_generate), null)
-
- val dialog = builder.setTitle(this.resources.getString(R.string.xkpwgen_title)).create()
-
- // make parameter changes reactive and automatically update passwords
- merge(
- binding.xkSeparator.afterTextChanges().skipInitialValue(),
- binding.xkCapType.selectionEvents().skipInitialValue(),
- binding.xkNumWords.afterTextChanges().skipInitialValue(),
- binding.xkNumberSymbolMask.afterTextChanges().skipInitialValue(),
- )
- .onEach { updatePassword(binding, prefs) }
- .launchIn(lifecycleScope)
-
- dialog.setOnShowListener {
- updatePassword(binding, prefs)
-
- dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener {
- updatePassword(binding, prefs)
- }
- }
- return dialog
- }
-
- private fun updatePassword(binding: FragmentXkpwgenBinding, prefs: SharedPreferences) {
- setPreferences(binding, prefs)
- makeAndSetPassword(binding)
- }
-
- private fun makeAndSetPassword(binding: FragmentXkpwgenBinding) {
- PasswordBuilder(requireContext())
- .setNumberOfWords(binding.xkNumWords.text.toString().ifBlank { "0" }.toInt())
- .setMinimumWordLength(DEFAULT_MIN_WORD_LENGTH)
- .setMaximumWordLength(DEFAULT_MAX_WORD_LENGTH)
- .setSeparator(binding.xkSeparator.text.toString())
- .appendNumbers(
- binding.xkNumberSymbolMask.text!!.count { c -> c == EXTRA_CHAR_PLACEHOLDER_DIGIT }
- )
- .appendSymbols(
- binding.xkNumberSymbolMask.text!!.count { c -> c == EXTRA_CHAR_PLACEHOLDER_SYMBOL }
- )
- .setCapitalization(CapsType.valueOf(binding.xkCapType.selectedItem.toString()))
- .create()
- .fold(
- success = { binding.xkPasswordText.text = it },
- failure = { e ->
- Toast.makeText(requireActivity(), e.message, Toast.LENGTH_SHORT).show()
- logcat("xkpw", ERROR) { e.asLog("failure generating xkpasswd") }
- binding.xkPasswordText.text = FALLBACK_ERROR_PASS
- },
- )
- }
-
- private fun setPreferences(binding: FragmentXkpwgenBinding, prefs: SharedPreferences) {
- prefs.edit {
- putString(PREF_KEY_CAPITALS_STYLE, binding.xkCapType.selectedItem.toString())
- putString(PREF_KEY_NUM_WORDS, binding.xkNumWords.text.toString())
- putString(PREF_KEY_SEPARATOR, binding.xkSeparator.text.toString())
- putString(PREF_KEY_EXTRA_SYMBOLS_MASK, binding.xkNumberSymbolMask.text.toString())
- }
- }
-
- companion object {
-
- const val PREF_KEY_CAPITALS_STYLE = "pref_key_capitals_style"
- const val PREF_KEY_NUM_WORDS = "pref_key_num_words"
- const val PREF_KEY_SEPARATOR = "pref_key_separator"
- const val PREF_KEY_EXTRA_SYMBOLS_MASK = "pref_key_xkpwgen_extra_symbols_mask"
- val DEFAULT_CAPS_STYLE = CapsType.Sentence.name
- val DEFAULT_CAPS_INDEX = CapsType.Sentence.ordinal
- const val DEFAULT_NUMBER_OF_WORDS = "3"
- const val DEFAULT_WORD_SEPARATOR = "."
- const val DEFAULT_EXTRA_SYMBOLS_MASK = "ds"
- const val DEFAULT_MIN_WORD_LENGTH = 3
- const val DEFAULT_MAX_WORD_LENGTH = 9
- const val FALLBACK_ERROR_PASS = "42"
- const val EXTRA_CHAR_PLACEHOLDER_DIGIT = 'd'
- const val EXTRA_CHAR_PLACEHOLDER_SYMBOL = 's'
- }
-}
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/settings/PasswordSettings.kt b/app/src/main/java/dev/msfjarvis/aps/ui/settings/PasswordSettings.kt
index dced4fc8..c6da00b6 100644
--- a/app/src/main/java/dev/msfjarvis/aps/ui/settings/PasswordSettings.kt
+++ b/app/src/main/java/dev/msfjarvis/aps/ui/settings/PasswordSettings.kt
@@ -6,78 +6,20 @@
package dev.msfjarvis.aps.ui.settings
import android.text.InputType
-import android.widget.Toast
-import androidx.activity.result.contract.ActivityResultContracts
-import androidx.core.content.edit
import androidx.fragment.app.FragmentActivity
-import de.Maxr1998.modernpreferences.Preference
import de.Maxr1998.modernpreferences.PreferenceScreen
import de.Maxr1998.modernpreferences.helpers.checkBox
import de.Maxr1998.modernpreferences.helpers.editText
-import de.Maxr1998.modernpreferences.helpers.onCheckedChange
-import de.Maxr1998.modernpreferences.helpers.onClick
import de.Maxr1998.modernpreferences.helpers.onSelectionChange
import de.Maxr1998.modernpreferences.helpers.singleChoice
-import de.Maxr1998.modernpreferences.preferences.CheckBoxPreference
import de.Maxr1998.modernpreferences.preferences.choice.SelectionItem
import dev.msfjarvis.aps.R
-import dev.msfjarvis.aps.util.extensions.getString
-import dev.msfjarvis.aps.util.extensions.sharedPrefs
-import dev.msfjarvis.aps.util.extensions.unsafeLazy
-import dev.msfjarvis.aps.util.pwgenxkpwd.XkpwdDictionary
import dev.msfjarvis.aps.util.settings.PreferenceKeys
-import java.io.File
class PasswordSettings(private val activity: FragmentActivity) : SettingsProvider {
- private val sharedPrefs by unsafeLazy { activity.sharedPrefs }
- private val storeCustomXkpwdDictionaryAction =
- activity.registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
- if (uri == null) return@registerForActivityResult
-
- Toast.makeText(
- activity,
- activity.resources.getString(R.string.xkpwgen_custom_dict_imported, uri.path),
- Toast.LENGTH_SHORT
- )
- .show()
-
- sharedPrefs.edit { putString(PreferenceKeys.PREF_KEY_CUSTOM_DICT, uri.toString()) }
-
- val inputStream = activity.contentResolver.openInputStream(uri)
- val customDictFile =
- File(activity.filesDir.toString(), XkpwdDictionary.XKPWD_CUSTOM_DICT_FILE).outputStream()
- inputStream?.copyTo(customDictFile, 1024)
- inputStream?.close()
- customDictFile.close()
- }
-
override fun provideSettings(builder: PreferenceScreen.Builder) {
builder.apply {
- val customDictPref =
- CheckBoxPreference(PreferenceKeys.PREF_KEY_IS_CUSTOM_DICT).apply {
- titleRes = R.string.pref_xkpwgen_custom_wordlist_enabled_title
- summaryRes = R.string.pref_xkpwgen_custom_dict_summary_off
- summaryOnRes = R.string.pref_xkpwgen_custom_dict_summary_on
- visible = sharedPrefs.getString(PreferenceKeys.PREF_KEY_PWGEN_TYPE) == "xkpasswd"
- onCheckedChange {
- requestRebind()
- true
- }
- }
- val customDictPathPref =
- Preference(PreferenceKeys.PREF_KEY_CUSTOM_DICT).apply {
- dependency = PreferenceKeys.PREF_KEY_IS_CUSTOM_DICT
- titleRes = R.string.pref_xkpwgen_custom_dict_picker_title
- summary =
- sharedPrefs.getString(PreferenceKeys.PREF_KEY_CUSTOM_DICT)
- ?: activity.resources.getString(R.string.pref_xkpwgen_custom_dict_picker_summary)
- visible = sharedPrefs.getString(PreferenceKeys.PREF_KEY_PWGEN_TYPE) == "xkpasswd"
- onClick {
- storeCustomXkpwdDictionaryAction.launch(arrayOf("*/*"))
- true
- }
- }
val values = activity.resources.getStringArray(R.array.pwgen_provider_values)
val labels = activity.resources.getStringArray(R.array.pwgen_provider_labels)
val items = values.zip(labels).map { SelectionItem(it.first, it.second, null) }
@@ -87,19 +29,8 @@ class PasswordSettings(private val activity: FragmentActivity) : SettingsProvide
) {
initialSelection = "classic"
titleRes = R.string.pref_password_generator_type_title
- onSelectionChange { selection ->
- val xkpasswdEnabled = selection == "xkpasswd"
- customDictPathPref.visible = xkpasswdEnabled
- customDictPref.visible = xkpasswdEnabled
- customDictPref.requestRebind()
- customDictPathPref.requestRebind()
- true
- }
+ onSelectionChange { true }
}
- // We initialize them early and add them manually to be able to manually force a rebind
- // when the password generator type is changed.
- addPreferenceItem(customDictPref)
- addPreferenceItem(customDictPathPref)
editText(PreferenceKeys.GENERAL_SHOW_TIME) {
titleRes = R.string.pref_clipboard_timeout_title
summaryProvider =