security: FLAG_SECURE на экранах входа и PIN (аудит п.3)
Новый эффект F7SecureScreen(): пока экран на виду — окно с FLAG_SECURE (нет в скриншотах/recents/записи экрана), снимается при уходе. Повешен на LoginScreen (ввод пароля), AppLockUnlockScreen (разблокировка PIN) и AppLockSetupDialog (создание PIN). Закрывает хвост Этапа 0 п.3.
This commit is contained in:
@@ -53,6 +53,7 @@ import androidx.lifecycle.ProcessLifecycleOwner
|
|||||||
import ru.forbion.f7cloud.core.auth.AppLockStore
|
import ru.forbion.f7cloud.core.auth.AppLockStore
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7Colors
|
import ru.forbion.f7cloud.core.designsystem.F7Colors
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton
|
import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton
|
||||||
|
import ru.forbion.f7cloud.core.designsystem.F7SecureScreen
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7TextButton
|
import ru.forbion.f7cloud.core.designsystem.F7TextButton
|
||||||
import ru.forbion.f7cloud.mobile.R
|
import ru.forbion.f7cloud.mobile.R
|
||||||
|
|
||||||
@@ -145,6 +146,7 @@ fun AppLockSetupDialog(
|
|||||||
onLockConfigured: () -> Unit = {},
|
onLockConfigured: () -> Unit = {},
|
||||||
) {
|
) {
|
||||||
if (!visible) return
|
if (!visible) return
|
||||||
|
F7SecureScreen() // создание/подтверждение PIN — не в скриншотах/recents
|
||||||
|
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val activity = context.findFragmentActivity()
|
val activity = context.findFragmentActivity()
|
||||||
@@ -534,6 +536,7 @@ private fun AppLockUnlockScreen(
|
|||||||
lockSession: Int,
|
lockSession: Int,
|
||||||
onUnlocked: () -> Unit,
|
onUnlocked: () -> Unit,
|
||||||
) {
|
) {
|
||||||
|
F7SecureScreen() // экран разблокировки (PIN) — не в скриншотах/recents
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val activity = context.findFragmentActivity()
|
val activity = context.findFragmentActivity()
|
||||||
var pin by remember { mutableStateOf("") }
|
var pin by remember { mutableStateOf("") }
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ import ru.forbion.f7cloud.core.push.F7PushEventHub
|
|||||||
import ru.forbion.f7cloud.core.push.F7PushRegistrar
|
import ru.forbion.f7cloud.core.push.F7PushRegistrar
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7OverlayNavigationProvider
|
import ru.forbion.f7cloud.core.designsystem.F7OverlayNavigationProvider
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7AppMenuSheet
|
import ru.forbion.f7cloud.core.designsystem.F7AppMenuSheet
|
||||||
|
import ru.forbion.f7cloud.core.designsystem.F7SecureScreen
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7AppScaffold
|
import ru.forbion.f7cloud.core.designsystem.F7AppScaffold
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7AutoHideBottomBar
|
import ru.forbion.f7cloud.core.designsystem.F7AutoHideBottomBar
|
||||||
import ru.forbion.f7cloud.core.designsystem.F7BottomBarActions
|
import ru.forbion.f7cloud.core.designsystem.F7BottomBarActions
|
||||||
@@ -689,6 +690,7 @@ fun AppScaffold(
|
|||||||
private const val PERMISSIONS_PROMPTED_KEY = "runtime_permissions_prompted_v2"
|
private const val PERMISSIONS_PROMPTED_KEY = "runtime_permissions_prompted_v2"
|
||||||
@Composable
|
@Composable
|
||||||
private fun LoginScreen(onLogin: (AuthSession) -> Unit) {
|
private fun LoginScreen(onLogin: (AuthSession) -> Unit) {
|
||||||
|
F7SecureScreen() // ввод пароля — не в скриншотах/recents
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val keyboardController = LocalSoftwareKeyboardController.current
|
val keyboardController = LocalSoftwareKeyboardController.current
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package ru.forbion.f7cloud.core.designsystem
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.view.WindowManager
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.DisposableEffect
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Пока этот экран на виду — окно помечено FLAG_SECURE: содержимое не попадает
|
||||||
|
* в скриншоты, превью в «недавних» и запись экрана. Вешать на чувствительные
|
||||||
|
* экраны (ввод пароля/PIN). Флаг снимается при уходе с экрана.
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
fun F7SecureScreen() {
|
||||||
|
val context = LocalContext.current
|
||||||
|
DisposableEffect(Unit) {
|
||||||
|
val window = (context as? Activity)?.window
|
||||||
|
window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
|
||||||
|
onDispose {
|
||||||
|
window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user