Fix Security Bypass (#935)

* Hide timeout when it isn't being used.

* Fix #925

* ktlint
This commit is contained in:
Justin Bassett 2020-09-14 16:20:09 -04:00 committed by GitHub
parent 71d764cf40
commit 3a6291c38a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 13 deletions

View file

@ -65,11 +65,12 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsView {
isValid isValid
} }
val onChangeBiometricValidator = Preference.OnPreferenceChangeListener { _, newValue -> findPreference<SwitchPreference>("app_lock")?.setOnPreferenceChangeListener { _, newValue ->
var isValid: Boolean var isValid: Boolean
if (newValue == false) if (newValue == false) {
isValid = true isValid = true
else { findPreference<EditTextPreference>("session_timeout")?.isVisible = false
} else {
isValid = true isValid = true
if (BiometricManager.from(requireActivity()).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) { if (BiometricManager.from(requireActivity()).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) {
setLock = true setLock = true
@ -87,6 +88,13 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsView {
isValid isValid
} }
findPreference<EditTextPreference>("session_timeout")?.let { pref ->
pref.setOnBindEditTextListener {
it.inputType = InputType.TYPE_CLASS_NUMBER
}
pref.isVisible = findPreference<SwitchPreference>("app_lock")?.isChecked == true
}
findPreference<Preference>("nfc_tags")?.let { findPreference<Preference>("nfc_tags")?.let {
it.isVisible = presenter.nfcEnabled() it.isVisible = presenter.nfcEnabled()
it.onPreferenceClickListener = Preference.OnPreferenceClickListener { it.onPreferenceClickListener = Preference.OnPreferenceClickListener {
@ -95,10 +103,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsView {
} }
} }
findPreference<EditTextPreference>("session_timeout")?.setOnBindEditTextListener {
it.inputType = InputType.TYPE_CLASS_NUMBER
}
removeSystemFromThemesIfNeeded() removeSystemFromThemesIfNeeded()
findPreference<EditTextPreference>("connection_internal")?.onPreferenceChangeListener = findPreference<EditTextPreference>("connection_internal")?.onPreferenceChangeListener =
@ -107,9 +111,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsView {
findPreference<EditTextPreference>("connection_external")?.onPreferenceChangeListener = findPreference<EditTextPreference>("connection_external")?.onPreferenceChangeListener =
onChangeUrlValidator onChangeUrlValidator
findPreference<SwitchPreference>("app_lock")?.onPreferenceChangeListener =
onChangeBiometricValidator
findPreference<Preference>("sensors")?.setOnPreferenceClickListener { findPreference<Preference>("sensors")?.setOnPreferenceClickListener {
parentFragmentManager parentFragmentManager
.beginTransaction() .beginTransaction()
@ -171,8 +172,10 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsView {
} }
private fun authenticationResult(result: Int) { private fun authenticationResult(result: Int) {
val success = result == Authenticator.SUCCESS
val switchLock = findPreference<SwitchPreference>("app_lock") val switchLock = findPreference<SwitchPreference>("app_lock")
switchLock?.isChecked = result == Authenticator.SUCCESS switchLock?.isChecked = success
findPreference<EditTextPreference>("session_timeout")?.isVisible = success
} }
private fun removeSystemFromThemesIfNeeded() { private fun removeSystemFromThemesIfNeeded() {

View file

@ -155,8 +155,10 @@ class WebViewActivity : AppCompatActivity(), io.homeassistant.companion.android.
exoToggleMute() exoToggleMute()
} }
}) })
if (!presenter.isLockEnabled()) if (!presenter.isLockEnabled()) {
blurView.setBlurEnabled(false) blurView.setBlurEnabled(false)
unlocked = true
}
authenticator = Authenticator(this, this, ::authenticationResult) authenticator = Authenticator(this, this, ::authenticationResult)
@ -164,6 +166,10 @@ class WebViewActivity : AppCompatActivity(), io.homeassistant.companion.android.
webView = findViewById(R.id.webview) webView = findViewById(R.id.webview)
webView.apply { webView.apply {
setOnTouchListener { _, _ ->
return@setOnTouchListener !unlocked
}
settings.javaScriptEnabled = true settings.javaScriptEnabled = true
settings.domStorageEnabled = true settings.domStorageEnabled = true
webViewClient = object : WebViewClient() { webViewClient = object : WebViewClient() {
@ -400,6 +406,12 @@ class WebViewActivity : AppCompatActivity(), io.homeassistant.companion.android.
} }
} }
override fun onResume() {
super.onResume()
if (!unlocked && !presenter.isLockEnabled())
unlocked = true
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == NFC_COMPLETE && resultCode != -1) { if (requestCode == NFC_COMPLETE && resultCode != -1) {
@ -547,7 +559,9 @@ class WebViewActivity : AppCompatActivity(), io.homeassistant.companion.android.
if ((System.currentTimeMillis() > presenter.getSessionExpireMillis())) { if ((System.currentTimeMillis() > presenter.getSessionExpireMillis())) {
blurView.setBlurEnabled(true) blurView.setBlurEnabled(true)
authenticator.authenticate() authenticator.authenticate()
} else blurView.setBlurEnabled(false) } else {
blurView.setBlurEnabled(false)
}
presenter.onViewReady(intent.getStringExtra(EXTRA_PATH)) presenter.onViewReady(intent.getStringExtra(EXTRA_PATH))
intent.removeExtra(EXTRA_PATH) intent.removeExtra(EXTRA_PATH)

View file

@ -49,6 +49,7 @@
android:key="session_timeout" android:key="session_timeout"
android:icon="@drawable/ic_timeout" android:icon="@drawable/ic_timeout"
android:title="@string/session_timeout_title" android:title="@string/session_timeout_title"
app:isPreferenceVisible="false"
app:useSimpleSummaryProvider="true"/> app:useSimpleSummaryProvider="true"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory