diff --git a/app/src/main/java/org/matrix/TEESimulator/config/PatchLevelManager.kt b/app/src/main/java/org/matrix/TEESimulator/config/PatchLevelManager.kt index d13c57f..03ca5ae 100644 --- a/app/src/main/java/org/matrix/TEESimulator/config/PatchLevelManager.kt +++ b/app/src/main/java/org/matrix/TEESimulator/config/PatchLevelManager.kt @@ -1,6 +1,7 @@ package org.matrix.TEESimulator.config import android.os.Build +import android.os.FileObserver import android.os.SystemProperties import java.io.File import java.nio.file.Files @@ -13,10 +14,14 @@ import org.matrix.TEESimulator.util.AndroidDeviceUtils object PatchLevelManager { private const val PATCH_FILE = "/data/adb/tricky_store/security_patch.txt" private const val STAGING_FILE = "/data/adb/tricky_store/security_patch.txt.next" + private const val PIF_DIR = "/data/adb/modules/playintegrityfix" private const val FLOOR_YYYYMMDD = 20200101 private const val MAX_PAST_OFFSET = 10000 private const val MAX_FUTURE_DAYS = 60L + private val PIF_FILENAMES = + setOf("pif.json", "pif.prop", "custom.pif.json", "custom.pif.prop") + private val DATE_PATTERN = Regex("^\\d{4}-\\d{2}-\\d{2}$") private val PROP_PATTERN = Regex("^SECURITY_PATCH=(.+)$", RegexOption.MULTILINE) private val SECTION_HEADER = Regex("^\\[[a-zA-Z0-9_.-]+]$") @@ -33,6 +38,11 @@ object PatchLevelManager { ) fun initialize() { + refreshFromSources() + startPifObserver() + } + + private fun refreshFromSources() { val date = resolvePifPatch() ?: SystemProperties.get( @@ -43,6 +53,14 @@ object PatchLevelManager { applyToProps(date) } + private fun startPifObserver() { + if (!File(PIF_DIR).exists()) { + SystemLogger.debug("PatchLevelManager: PIF dir absent, hot-reload disabled") + return + } + PifObserver.startWatching() + } + private fun applyToProps(date: String) { if (!DATE_PATTERN.matches(date)) { SystemLogger.warning( @@ -156,4 +174,13 @@ object PatchLevelManager { val key = trimmed.substringBefore("=").trim().lowercase() return key in GLOBAL_KEYS } + + private object PifObserver : + FileObserver(File(PIF_DIR), CLOSE_WRITE or MOVED_TO or DELETE) { + override fun onEvent(event: Int, path: String?) { + if (path == null || path !in PIF_FILENAMES) return + SystemLogger.info("PatchLevelManager: PIF change ($path), refreshing") + refreshFromSources() + } + } }