Skip to content

Commit

Permalink
fix unencrypted preferences sync, thanks to @xyz-nobody
Browse files Browse the repository at this point in the history
  • Loading branch information
lucky committed Jul 7, 2022
1 parent 3876640 commit 07332d3
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 48 deletions.
4 changes: 2 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

| Version | Supported |
| ------- | ------------------ |
| 1.4.x | :white_check_mark: |
| < 1.4 | :x: |
| 1.5.x | :white_check_mark: |
| < 1.5 | :x: |

## Reporting a Vulnerability

Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ android {
applicationId "me.lucky.wasted"
minSdk 23
targetSdk 32
versionCode 29
versionName "1.5.0"
versionCode 30
versionName "1.5.1"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
60 changes: 21 additions & 39 deletions app/src/main/java/me/lucky/wasted/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package me.lucky.wasted

import android.content.SharedPreferences
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
Expand All @@ -14,10 +13,6 @@ open class MainActivity : AppCompatActivity() {
private lateinit var prefs: Preferences
private lateinit var prefsdb: Preferences

private val prefsListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
prefs.copyTo(prefsdb, key)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
Expand All @@ -34,54 +29,41 @@ open class MainActivity : AppCompatActivity() {
replaceFragment(MainFragment())
}

private fun setup() {
binding.apply {
appBar.setNavigationOnClickListener {
drawer.open()
}
appBar.setOnMenuItemClickListener {
when (it.itemId) {
R.id.top_settings -> {
replaceFragment(when (supportFragmentManager.fragments.last()) {
is SettingsFragment ->
getFragment(navigation.checkedItem?.itemId ?: R.id.nav_main)
else -> SettingsFragment()
})
true
}
else -> false
private fun setup() = binding.apply {
appBar.setNavigationOnClickListener {
drawer.open()
}
appBar.setOnMenuItemClickListener {
when (it.itemId) {
R.id.top_settings -> {
replaceFragment(when (supportFragmentManager.fragments.last()) {
is SettingsFragment ->
getFragment(navigation.checkedItem?.itemId ?: R.id.nav_main)
else -> SettingsFragment()
})
true
}
else -> false
}
navigation.setNavigationItemSelectedListener {
replaceFragment(getFragment(it.itemId))
it.isChecked = true
drawer.close()
true
}
}
navigation.setNavigationItemSelectedListener {
replaceFragment(getFragment(it.itemId))
it.isChecked = true
drawer.close()
true
}
}

private fun replaceFragment(f: Fragment) {
private fun replaceFragment(f: Fragment) =
supportFragmentManager
.beginTransaction()
.replace(binding.fragment.id, f)
.commit()
}

private fun getFragment(id: Int) = when (id) {
R.id.nav_main -> MainFragment()
R.id.nav_trigger_lock -> LockFragment()
R.id.top_settings -> SettingsFragment()
else -> MainFragment()
}

override fun onStart() {
super.onStart()
prefs.registerListener(prefsListener)
}

override fun onStop() {
super.onStop()
prefs.unregisterListener(prefsListener)
}
}
17 changes: 17 additions & 0 deletions app/src/main/java/me/lucky/wasted/fragment/LockFragment.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.lucky.wasted.fragment

import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
Expand All @@ -23,9 +24,14 @@ class LockFragment : Fragment() {
private lateinit var binding: FragmentLockBinding
private lateinit var ctx: Context
private lateinit var prefs: Preferences
private lateinit var prefsdb: Preferences
private val lockCountPattern by lazy {
Pattern.compile("^[1-9]\\d*[$MODIFIER_DAYS$MODIFIER_HOURS$MODIFIER_MINUTES]$") }

private val prefsListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
prefs.copyTo(prefsdb, key)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -37,9 +43,20 @@ class LockFragment : Fragment() {
return binding.root
}

override fun onStart() {
super.onStart()
prefs.registerListener(prefsListener)
}

override fun onStop() {
super.onStop()
prefs.unregisterListener(prefsListener)
}

private fun init() {
ctx = requireContext()
prefs = Preferences(ctx)
prefsdb = Preferences(ctx, encrypted = false)
val count = prefs.triggerLockCount
val time = when {
count % (24 * 60) == 0 -> "${count / 24 / 60}$MODIFIER_DAYS"
Expand Down
21 changes: 16 additions & 5 deletions app/src/main/java/me/lucky/wasted/fragment/MainFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.app.Activity
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
Expand All @@ -23,9 +24,14 @@ class MainFragment : Fragment() {
private lateinit var binding: FragmentMainBinding
private lateinit var ctx: Context
private lateinit var prefs: Preferences
private lateinit var prefsdb: Preferences
private val clipboardManager by lazy { ctx.getSystemService(ClipboardManager::class.java) }
private val admin by lazy { DeviceAdminManager(ctx) }

private val prefsListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
prefs.copyTo(prefsdb, key)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -39,15 +45,24 @@ class MainFragment : Fragment() {

override fun onStart() {
super.onStart()
updateSecretColor()
prefs.registerListener(prefsListener)
}

override fun onStop() {
super.onStop()
prefs.unregisterListener(prefsListener)
}

private fun init() {
ctx = requireContext()
prefs = Preferences(ctx)
prefsdb = Preferences(ctx, encrypted = false)
if (prefs.secret.isEmpty()) prefs.secret = makeSecret()
binding.apply {
secret.text = prefs.secret
secret.setBackgroundColor(ctx.getColor(
if (prefs.triggers != 0) R.color.secret_1 else R.color.secret_0
))
wipeData.isChecked = prefs.isWipeData
wipeEmbeddedSim.isChecked = prefs.isWipeEmbeddedSim
wipeEmbeddedSim.isEnabled = wipeData.isChecked
Expand Down Expand Up @@ -77,10 +92,6 @@ class MainFragment : Fragment() {
Snackbar.make(binding.secret, R.string.copied_popup, Snackbar.LENGTH_SHORT).show()
}

private fun updateSecretColor() = binding.secret.setBackgroundColor(ctx.getColor(
if (prefs.triggers != 0) R.color.secret_1 else R.color.secret_0
))

private fun setOn() {
prefs.isEnabled = true
Utils(ctx).setEnabled(true)
Expand Down
17 changes: 17 additions & 0 deletions app/src/main/java/me/lucky/wasted/fragment/SettingsFragment.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.lucky.wasted.fragment

import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
Expand All @@ -17,8 +18,13 @@ class SettingsFragment : Fragment() {
private lateinit var binding: FragmentSettingsBinding
private lateinit var ctx: Context
private lateinit var prefs: Preferences
private lateinit var prefsdb: Preferences
private val utils by lazy { Utils(ctx) }

private val prefsListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
prefs.copyTo(prefsdb, key)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -30,9 +36,20 @@ class SettingsFragment : Fragment() {
return binding.root
}

override fun onStart() {
super.onStart()
prefs.registerListener(prefsListener)
}

override fun onStop() {
super.onStop()
prefs.unregisterListener(prefsListener)
}

private fun init() {
ctx = requireContext()
prefs = Preferences(ctx)
prefsdb = Preferences(ctx, encrypted = false)
binding.apply {
val triggers = prefs.triggers
panicKit.isChecked = triggers.and(Trigger.PANIC_KIT.value) != 0
Expand Down
1 change: 1 addition & 0 deletions fastlane/metadata/android/en-US/changelogs/30.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fix unencrypted preferences sync, thanks to @xyz-nobody

0 comments on commit 07332d3

Please sign in to comment.