feat: add password timeout
This commit is contained in:
parent
a8694bb468
commit
f50881c1fc
4 changed files with 49 additions and 13 deletions
|
@ -168,6 +168,7 @@ class MainActivity : NoSplashAppCompatActivity() {
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
|
protectionCheck.resetAuthorization()
|
||||||
if (!isProtectionCheckActive) {
|
if (!isProtectionCheckActive) {
|
||||||
isProtectionCheckActive = true
|
isProtectionCheckActive = true
|
||||||
protectionCheck.queryProtection(this, ProtectionCheck.Protection.APPLICATION, UIRunnable { isProtectionCheckActive = false },
|
protectionCheck.queryProtection(this, ProtectionCheck.Protection.APPLICATION, UIRunnable { isProtectionCheckActive = false },
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:validate="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:key="@string/key_configbuilder_general_settings"
|
android:key="@string/key_configbuilder_general_settings"
|
||||||
|
@ -24,9 +25,8 @@
|
||||||
<EditTextPreference
|
<EditTextPreference
|
||||||
android:inputType="textPersonName"
|
android:inputType="textPersonName"
|
||||||
android:key="@string/key_patient_name"
|
android:key="@string/key_patient_name"
|
||||||
android:title="@string/patient_name"
|
|
||||||
android:summary="@string/patient_name_summary"
|
android:summary="@string/patient_name_summary"
|
||||||
/>
|
android:title="@string/patient_name" />
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:key="@string/key_protection_settings"
|
android:key="@string/key_protection_settings"
|
||||||
|
@ -35,8 +35,7 @@
|
||||||
<Preference
|
<Preference
|
||||||
android:inputType="textPassword"
|
android:inputType="textPassword"
|
||||||
android:key="@string/key_master_password"
|
android:key="@string/key_master_password"
|
||||||
android:title="@string/master_password"
|
android:title="@string/master_password" />
|
||||||
/>
|
|
||||||
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:defaultValue="0"
|
android:defaultValue="0"
|
||||||
|
@ -83,6 +82,15 @@
|
||||||
android:key="@string/key_bolus_pin"
|
android:key="@string/key_bolus_pin"
|
||||||
android:title="@string/bolus_pin" />
|
android:title="@string/bolus_pin" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:inputType="number"
|
||||||
|
android:key="@string/key_protection_timeout"
|
||||||
|
android:title="@string/protection_timeout_title"
|
||||||
|
app:defaultValue="0"
|
||||||
|
validate:maxNumber="180"
|
||||||
|
validate:minNumber="0"
|
||||||
|
validate:testType="numeric" />
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<info.nightscout.androidaps.skins.SkinListPreference
|
<info.nightscout.androidaps.skins.SkinListPreference
|
||||||
|
|
|
@ -2,16 +2,22 @@ package info.nightscout.androidaps.utils.protection
|
||||||
|
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import info.nightscout.androidaps.core.R
|
import info.nightscout.androidaps.core.R
|
||||||
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.shared.sharedPreferences.SP
|
import info.nightscout.shared.sharedPreferences.SP
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class ProtectionCheck @Inject constructor(
|
class ProtectionCheck @Inject constructor(
|
||||||
val sp: SP,
|
val sp: SP,
|
||||||
val passwordCheck: PasswordCheck
|
val passwordCheck: PasswordCheck,
|
||||||
|
val dateUtil: DateUtil
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
private var lastAuthorization = mutableListOf(0L, 0L, 0L)
|
||||||
|
private val timeout = TimeUnit.SECONDS.toMillis(sp.getInt(R.string.key_protection_timeout, 0).toLong())
|
||||||
|
|
||||||
enum class Protection {
|
enum class Protection {
|
||||||
PREFERENCES,
|
PREFERENCES,
|
||||||
APPLICATION,
|
APPLICATION,
|
||||||
|
@ -61,19 +67,38 @@ class ProtectionCheck @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun queryProtection(activity: FragmentActivity, protection: Protection,
|
fun resetAuthorization() {
|
||||||
ok: Runnable?, cancel: Runnable? = null, fail: Runnable? = null) {
|
lastAuthorization = mutableListOf(0L, 0L, 0L)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun activeSession(protection: Protection): Boolean {
|
||||||
|
val last = lastAuthorization[protection.ordinal]
|
||||||
|
val diff = dateUtil.now() - last
|
||||||
|
return diff < timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onOk(protection: Protection) {
|
||||||
|
lastAuthorization[protection.ordinal] = dateUtil.now()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun queryProtection(activity: FragmentActivity, protection: Protection, ok: Runnable?, cancel: Runnable? = null, fail: Runnable? = null) {
|
||||||
|
if (activeSession(protection)) {
|
||||||
|
onOk(protection)
|
||||||
|
ok?.run()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
when (ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionType.NONE.ordinal)]) {
|
when (ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionType.NONE.ordinal)]) {
|
||||||
ProtectionType.NONE ->
|
ProtectionType.NONE ->
|
||||||
ok?.run()
|
ok?.run()
|
||||||
ProtectionType.BIOMETRIC ->
|
ProtectionType.BIOMETRIC ->
|
||||||
BiometricCheck.biometricPrompt(activity, titlePassResourceIDs[protection.ordinal], ok, cancel, fail, passwordCheck)
|
BiometricCheck.biometricPrompt(activity, titlePassResourceIDs[protection.ordinal], { onOk(protection); ok?.run() }, cancel, fail, passwordCheck)
|
||||||
ProtectionType.MASTER_PASSWORD ->
|
ProtectionType.MASTER_PASSWORD ->
|
||||||
passwordCheck.queryPassword(activity, R.string.master_password, R.string.key_master_password, { ok?.run() }, { cancel?.run() }, { fail?.run() })
|
passwordCheck.queryPassword(activity, R.string.master_password, R.string.key_master_password, { onOk(protection); ok?.run() }, { cancel?.run() }, { fail?.run() })
|
||||||
ProtectionType.CUSTOM_PASSWORD ->
|
ProtectionType.CUSTOM_PASSWORD ->
|
||||||
passwordCheck.queryPassword(activity, titlePassResourceIDs[protection.ordinal], passwordsResourceIDs[protection.ordinal], { ok?.run() }, { cancel?.run() }, { fail?.run() })
|
passwordCheck.queryPassword(activity, titlePassResourceIDs[protection.ordinal], passwordsResourceIDs[protection.ordinal], { onOk(protection); ok?.run() }, { cancel?.run() }, { fail?.run() })
|
||||||
ProtectionType.CUSTOM_PIN ->
|
ProtectionType.CUSTOM_PIN ->
|
||||||
passwordCheck.queryPassword(activity, titlePinResourceIDs[protection.ordinal], pinsResourceIDs[protection.ordinal], { ok?.run() }, { cancel?.run() }, { fail?.run() }, true)
|
passwordCheck.queryPassword(activity, titlePinResourceIDs[protection.ordinal], pinsResourceIDs[protection.ordinal], { onOk(protection); ok?.run() }, { cancel?.run() }, { fail?.run() }, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<string name="application_pin">Application PIN</string>
|
<string name="application_pin">Application PIN</string>
|
||||||
<string name="bolus_password">Bolus password</string>
|
<string name="bolus_password">Bolus password</string>
|
||||||
<string name="bolus_pin">Bolus PIN</string>
|
<string name="bolus_pin">Bolus PIN</string>
|
||||||
|
<string name="protection_timeout_title">Time before Bolus and Settings password / PIN expires (seconds)</string>
|
||||||
<string name="unlock_settings">Unlock settings</string>
|
<string name="unlock_settings">Unlock settings</string>
|
||||||
<string name="biometric">Biometric</string>
|
<string name="biometric">Biometric</string>
|
||||||
<string name="custom_password">Custom password</string>
|
<string name="custom_password">Custom password</string>
|
||||||
|
@ -43,4 +44,5 @@
|
||||||
<string name="key_settings_protection" translatable="false">settings_protection</string>
|
<string name="key_settings_protection" translatable="false">settings_protection</string>
|
||||||
<string name="key_application_protection" translatable="false">application_protection</string>
|
<string name="key_application_protection" translatable="false">application_protection</string>
|
||||||
<string name="key_bolus_protection" translatable="false">bolus_protection</string>
|
<string name="key_bolus_protection" translatable="false">bolus_protection</string>
|
||||||
|
<string name="key_protection_timeout" translatable="false">protection_timeout</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue