feat(spoof): hot-reload PIF via FileObserver
PatchLevelManager.initialize ran once at boot; PIF edits required a reboot to take effect. Add a FileObserver on /data/adb/modules/playintegrityfix for CLOSE_WRITE, MOVED_TO, and DELETE on the four known PIF filenames, re-resolving and applying the new date when any of them changes. Skip the watch when the PIF dir is absent so the daemon does not start a stale inotify node before the module is even installed.
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user