Update Qlyra application
Build Android (FCM) / build-android-fcm (push) Canceled after 0s
Build Android / build-android (push) Canceled after 0s
Build iOS / build-ios (push) Canceled after 0s
Build Linux / build-linux (push) Canceled after 0s
Build macOS / build-macos (push) Canceled after 0s
Build Windows / build-windows (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s

This commit is contained in:
sevenhill
2026-08-30 22:53:15 +03:00
parent 116d3fb1d3
commit 50816588e4
4812 changed files with 14559 additions and 403 deletions
@@ -49,6 +49,7 @@ import java.net.NetworkInterface
import java.util.Collections
import java.util.Random
import java.util.concurrent.atomic.AtomicBoolean
import java.security.MessageDigest
class MainActivity : FlutterActivity() {
@@ -124,6 +125,23 @@ class MainActivity : FlutterActivity() {
nfcAdapter = NfcAdapter.getDefaultAdapter(this)
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"ru.qlyra.app/update_integrity",
).setMethodCallHandler { call, result ->
when (call.method) {
"verifyApkSigner" -> {
val path = call.argument<String>("path")
if (path == null) {
result.error("INVALID_PATH", "APK path is required", null)
} else {
result.success(apkSignerMatchesInstalled(path))
}
}
else -> result.notImplemented()
}
}
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"ru.qlyra.app/nfc",
@@ -515,6 +533,38 @@ class MainActivity : FlutterActivity() {
FkmChannel.attach(flutterEngine, this)
}
@Suppress("DEPRECATION")
private fun apkSignerMatchesInstalled(path: String): Boolean {
return try {
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
PackageManager.GET_SIGNING_CERTIFICATES
} else {
PackageManager.GET_SIGNATURES
}
val archive = packageManager.getPackageArchiveInfo(path, flags) ?: return false
if (archive.packageName != packageName) return false
val installed = packageManager.getPackageInfo(packageName, flags)
val archiveSigners = signerDigests(archive)
archiveSigners.isNotEmpty() && archiveSigners == signerDigests(installed)
} catch (_: Exception) {
false
}
}
@Suppress("DEPRECATION")
private fun signerDigests(info: android.content.pm.PackageInfo): Set<String> {
val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
info.signingInfo?.apkContentsSigners.orEmpty()
} else {
info.signatures.orEmpty()
}
return signatures.map { signature ->
MessageDigest.getInstance("SHA-256")
.digest(signature.toByteArray())
.joinToString("") { byte -> "%02x".format(byte) }
}.toSet()
}
override fun onCreate(savedInstanceState: Bundle?) {
if (intent?.hasExtra(CallConst.EXTRA_CALL) == true) applyCallWindowFlags()
super.onCreate(savedInstanceState)