mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-09-30 13:19:44 +02:00
refactor(discord): remove rich presence and bundled SDK
Remove the presence setting, platform bridge, SDK archive, and SDK preparation from local and CI builds. Reject leftover Discord native libraries in release APK audits.
This commit is contained in:
1 parent
863d1536dd
commit
728d179d69
43 files changed
+37
-1171
No files matched your search
@@ -1,4 +1,4 @@
|
||||
"""Reject APKs that silently lose the optional native Discord integration."""
|
||||
"""Verify native backend payloads and reject removed SDKs in release APKs."""
|
||||
|
||||
import struct
|
||||
import tempfile
|
||||
@@ -9,43 +9,40 @@ from pathlib import Path
|
||||
import check_backend_apk as checker
|
||||
|
||||
|
||||
class DiscordApkAuditTest(unittest.TestCase):
|
||||
class BackendApkAuditTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
directory = tempfile.TemporaryDirectory()
|
||||
self.addCleanup(directory.cleanup)
|
||||
self.apk = Path(directory.name) / "release.apk"
|
||||
self.entries = {
|
||||
"assets/discord-sdk-notices.txt": b"SDK license notices",
|
||||
"classes.dex": b"\0".join(checker.DISCORD_CLASSES),
|
||||
}
|
||||
self.entries = {"classes.dex": b"backend classes"}
|
||||
for abi, (elf_class, machine) in checker.ABI_LAYOUT.items():
|
||||
header = bytearray(20)
|
||||
header[:6] = b"\x7fELF" + bytes([elf_class, 1])
|
||||
struct.pack_into("<H", header, 18, machine)
|
||||
for library in checker.CORE_LIBRARIES + checker.DISCORD_LIBRARIES + (
|
||||
for library in checker.CORE_LIBRARIES + (
|
||||
"libspotiflac_mobile.so", "libjnidispatch.so",
|
||||
):
|
||||
self.entries[f"lib/{abi}/{library}"] = bytes(header)
|
||||
|
||||
def audit(self, abis=("arm64-v8a", "armeabi-v7a"), require_discord=True):
|
||||
def audit(self, abis=("arm64-v8a", "armeabi-v7a")):
|
||||
with zipfile.ZipFile(self.apk, "w") as zf:
|
||||
for name, data in self.entries.items():
|
||||
zf.writestr(name, data)
|
||||
return checker.audit(self.apk, "rust", abis, require_discord)
|
||||
return checker.audit(self.apk, "rust", abis)
|
||||
|
||||
def test_universal_with_discord_passes(self):
|
||||
def test_universal_passes(self):
|
||||
self.assertEqual(len(self.audit()), 64)
|
||||
|
||||
def test_split_apks_require_discord_for_their_abi(self):
|
||||
def test_split_apks_pass(self):
|
||||
original = self.entries.copy()
|
||||
for abi in checker.ABI_LAYOUT:
|
||||
self.entries = {name: data for name, data in original.items()
|
||||
if not name.startswith("lib/") or name.startswith(f"lib/{abi}/")}
|
||||
self.assertEqual(len(self.audit((abi,))), 64)
|
||||
|
||||
def test_either_discord_library_missing_in_either_abi_fails(self):
|
||||
def test_missing_backend_in_either_abi_fails(self):
|
||||
for abi in checker.ABI_LAYOUT:
|
||||
for library in checker.DISCORD_LIBRARIES:
|
||||
for library in ("libspotiflac_mobile.so", "libjnidispatch.so"):
|
||||
with self.subTest(abi=abi, library=library):
|
||||
path = f"lib/{abi}/{library}"
|
||||
data = self.entries.pop(path)
|
||||
@@ -54,36 +51,21 @@ class DiscordApkAuditTest(unittest.TestCase):
|
||||
self.entries[path] = data
|
||||
|
||||
def test_wrong_architecture_fails(self):
|
||||
self.entries["lib/armeabi-v7a/libdiscord_partner_sdk.so"] = self.entries[
|
||||
"lib/arm64-v8a/libdiscord_partner_sdk.so"
|
||||
self.entries["lib/armeabi-v7a/libspotiflac_mobile.so"] = self.entries[
|
||||
"lib/arm64-v8a/libspotiflac_mobile.so"
|
||||
]
|
||||
with self.assertRaisesRegex(checker.AuditError, "ELF class"):
|
||||
self.audit()
|
||||
|
||||
def test_missing_or_empty_notices_fail(self):
|
||||
self.entries.pop("assets/discord-sdk-notices.txt")
|
||||
with self.assertRaisesRegex(checker.AuditError, "missing APK entry"):
|
||||
self.audit()
|
||||
self.entries["assets/discord-sdk-notices.txt"] = b" "
|
||||
with self.assertRaisesRegex(checker.AuditError, "notices are empty"):
|
||||
self.audit()
|
||||
|
||||
def test_removed_or_renamed_jni_classes_fail(self):
|
||||
for marker in checker.DISCORD_CLASSES:
|
||||
self.entries["classes.dex"] = marker
|
||||
with self.assertRaisesRegex(checker.AuditError, "classes missing"):
|
||||
self.audit()
|
||||
|
||||
def test_multidex_classes_pass(self):
|
||||
self.entries["classes.dex"] = checker.DISCORD_CLASSES[0]
|
||||
self.entries["classes2.dex"] = checker.DISCORD_CLASSES[1]
|
||||
self.assertEqual(len(self.audit()), 64)
|
||||
|
||||
def test_explicit_backend_only_audit_still_works(self):
|
||||
self.entries = {name: data for name, data in self.entries.items()
|
||||
if "discord" not in name}
|
||||
self.entries["classes.dex"] = b"backend only"
|
||||
self.assertEqual(len(self.audit(require_discord=False)), 64)
|
||||
def test_removed_sdk_cannot_leak_from_build_cache(self):
|
||||
for abi in checker.ABI_LAYOUT:
|
||||
for library in checker.REMOVED_LIBRARIES:
|
||||
with self.subTest(abi=abi, library=library):
|
||||
path = f"lib/{abi}/{library}"
|
||||
self.entries[path] = self.entries[f"lib/{abi}/libapp.so"]
|
||||
with self.assertRaisesRegex(checker.AuditError, "removed SDK"):
|
||||
self.audit()
|
||||
del self.entries[path]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in new issue
Block a user