mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-27 00:02:12 +01:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1309a0883d | ||
|
|
1e6d742b98 | ||
|
|
1ddb6278b8 | ||
|
|
4252d22975 |
No files matched your search
@@ -0,0 +1,44 @@
|
||||
# Native plugin packaging blockers, 26 October 2026
|
||||
|
||||
This is a static, digest-scoped follow-up. Neither plugin was installed or
|
||||
run on the Frame. Their compatibility statuses remain **broken**.
|
||||
|
||||
## Decky Cloud Save 1.4.2, store ID 49
|
||||
|
||||
The official ZIP SHA-256 is
|
||||
`b311d967ddf1b0f0046d36929645855891a40173e3a93f6f0cd8b1576b04b411`.
|
||||
It was downloaded and hash-checked without executing any member. Of its 27
|
||||
members, `decky-cloud-save/bin/rclone` is a regular executable of **60,776,600
|
||||
bytes** with ELF machine **62 (x86_64)**. The installer permits at most 30 MiB
|
||||
per member, so this exact ZIP fails before native architecture validation.
|
||||
Raising that limit alone would still leave an x86_64 executable on the ARM64
|
||||
Frame. No cloud credentials, saves, reads or writes were exercised.
|
||||
|
||||
## Emuchievements 2.0.5, store ID 28
|
||||
|
||||
The official ZIP SHA-256 is
|
||||
`98dcb443e81b9f9011cfe77c69eb659869c8e2df2df8b0a443df66cbfc2f5a89`.
|
||||
The [earlier helper check](framey-emuchievements-arm-2026-10-26.md) proved
|
||||
one synthetic ROM hash on ARM64, without installing the plugin. The upstream
|
||||
source commit `8567e94befffc943434b2adb842487274815f8bb` and its pinned
|
||||
libarchive, libchdr and rcheevos submodules were checked out separately for
|
||||
this audit. The source is GPL-3.0. An isolated Debian ARM64 cross-build made a
|
||||
2.6 MB helper (`c8794558a0d75294930f969a426e7d2ac13a27e3c1ff9bd8aae093e31596b9bd`),
|
||||
but it was **not shipped or run on ROM archives**. A complete source bundle
|
||||
without Git metadata compressed to about 8 MB; source and license distribution
|
||||
would be part of any release-ready port.
|
||||
|
||||
The proposed source has an additional blocker. `backend/src/util.cpp` builds
|
||||
an extraction destination by appending each raw archive member pathname to
|
||||
an owned `/tmp/tmpdir.*` prefix, then passes it to libarchive's disk writer.
|
||||
It neither rejects `..`/absolute paths nor enables libarchive's secure path
|
||||
flags. `backend/src/main.cpp` later removes the extracted file's parent path.
|
||||
With an untrusted archive, those paths may leave the intended temporary
|
||||
directory. The plugin's Python backend also invokes `bin/hash` through a
|
||||
shell with a path argument. A port needs bounded path validation, secure
|
||||
extraction/cleanup, safe subprocess arguments, format coverage and actual
|
||||
Decky/backend tests before its official ZIP can be transformed or installed.
|
||||
|
||||
The official archive still contains an x86_64 helper. RetroAchievements
|
||||
login, real ROM scanning, a packaged ARM64 backend, wearer-visible VR and
|
||||
physical controller use remain unverified.
|
||||
@@ -65,7 +65,7 @@ The API column shows manifest / actual bundled frontend API. Many manifests say
|
||||
| 44: DeckMTP 1.0.5 | legacy / legacy | broken | Plugin contains a non-ARM64 Linux binary: DeckMTP/bin/umtprd. | static archive, local browser, fake-Frame |
|
||||
| 46: Steamback 1.0.0-1 | legacy / legacy | partial | Panel opens using the real Frame current-user/library snapshot. Account setup and empty save-list reads pass through actual Decky 3.3.0 amd64 in isolation. ARM64 backend, supported-save discovery, automatic backups and restore remain unverified; no backup/restore ran. | static archive, local browser, fake-Frame, real Frame SSH |
|
||||
| 48: Quick Launch 1.2.1 | legacy / legacy | broken | This plugin needs root and is not supported by the Frame user service. | static archive, local browser, fake-Frame |
|
||||
| 49: Decky Cloud Save 1.4.2 | legacy / legacy | broken | Unsafe plugin archive member. | static archive, local browser, fake-Frame |
|
||||
| 49: Decky Cloud Save 1.4.2 | legacy / legacy | broken | The exact official ZIP contains a 60,776,600-byte x86_64 rclone member, above the 30 MiB member limit and unusable on ARM64. Installation remains blocked. | static archive, local browser, fake-Frame |
|
||||
| 50: Storage Cleaner 1.4.0 | 1 / 2 | partial | Empty-data panel rendered; cleanup was deliberately not run because it can remove local data. | static archive, local browser, fake-Frame |
|
||||
| 52: Game Theme Music 1.7.1-1 | 1 / 2 | partial | An inert local component lets the exact frontend initialize and render its Settings view in opaque Chromium. Backend get_setting and plugin network were denied in the audit; Steam game-page theme injection has no verified target in Framey. Music search, playback, downloads, settings persistence and worn VR remain unverified. | static archive, local browser, fake-Frame |
|
||||
| 53: Shotty 0.1.0 | legacy / legacy | partial | The frontend starts with the read-only Frame library snapshot. Frame Control adds a digest-scoped click.get_app_dir compatibility module to the managed install; the exact backend then imports and copies a synthetic Steam screenshot into a temporary Pictures folder in isolated Python. Actual Decky 3.3.0 ARM64 loading, live screenshots/rescue, in-VR panel and physical controller use remain unverified. | static archive, local browser, fake-Frame, real Frame SSH, isolated Python backend |
|
||||
@@ -288,11 +288,11 @@ All published Linux native payloads in this snapshot are x86_64; no published aa
|
||||
| Fantastic | bin/backend | Fan backend/driver is Deck-specific; an ARM64 rebuild would not provide compatible Frame hardware. |
|
||||
| PowerTools | bin/libryzenadj.so, bin/ryzenadj, bin/backend | RyzenAdj and AMD power backend cannot control an ARM64 Frame SoC. |
|
||||
| Memory Deck | bin/libscanmem.so.1.0.0 | libscanmem must be rebuilt for aarch64 and validated against target process architecture; memory writes were not tested. |
|
||||
| Emuchievements | bin/hash | A source-matched ARM64 bin/hash helper matched the official x86_64 helper on one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The official ZIP still bundles x86_64 bytes and remains blocked; format coverage, packaging, plugin backend/UI, login and worn VR are unverified. |
|
||||
| Emuchievements | bin/hash | A source-matched ARM64 helper matched one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The pinned upstream source proposed for packaging also has unsafe archive extraction and cleanup paths (docs/evidence/framey-native-port-blockers-2026-10-26.md); fix and test those before shipping an ARM64 binary. The official x86_64 ZIP remains blocked; format coverage, plugin backend/UI, login and worn VR are unverified. |
|
||||
| MoonDeck | python/externals/yarl/_quoting_c.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_http_parser.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_websocket/reader_c.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_websocket/mask.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_http_writer.cpython-313-x86_64-linux-gnu.so, … 26 total; full list in JSON | Rebuild vendored CPython 3.13 extension wheels for the headset Python ABI and ARM64; buddy/helper dependencies also need ports. |
|
||||
| Controller Tools | bin/backend | Native backend needs an ARM64 build and controller/HID dependencies; its direct websocket also bypasses the Framey bridge. |
|
||||
| DeckMTP | bin/umtprd | umtprd needs ARM64 libusb/MTP dependencies and USB gadget permissions; root user-service blocker remains. |
|
||||
| Decky Cloud Save | bin/rclone | rclone needs an ARM64 artifact; this ZIP also fails safe member validation. Cloud writes were not exercised. |
|
||||
| Decky Cloud Save | bin/rclone | An ARM64 rclone artifact and safe package policy are needed; the official 60,776,600-byte x86_64 member fails archive validation. No cloud writes were run (docs/evidence/framey-native-port-blockers-2026-10-26.md). |
|
||||
| DeckyFileServer | bin/backend | Native file-server backend needs ARM64 dependencies; root requirement also blocks the user service. |
|
||||
| TS3 QuickAccess | bin/ts3-qs4sd.so | TeamSpeak client plugin must match an ARM64 TeamSpeak client and SDK ABI, not merely rebuild the .so. |
|
||||
| Syncthing | bin/decky-syncthing-watchdog | The watchdog needs an ARM64 build, plus a supported Syncthing runtime/package and safe path validation. |
|
||||
|
||||
@@ -276,12 +276,29 @@ class ArtworkTests(unittest.TestCase):
|
||||
import threading
|
||||
from apk_sources import _images
|
||||
gate = threading.Event()
|
||||
with patch.object(_images.socket, 'getaddrinfo', side_effect=lambda *a, **k: gate.wait(5) and []):
|
||||
start = time.monotonic()
|
||||
with self.assertRaisesRegex(_images.SourceError, 'too long'):
|
||||
_images.get('https://example.org/a.png', deadline=start + 0.1)
|
||||
self.assertLess(time.monotonic() - start, 0.4)
|
||||
gate.set()
|
||||
real_join = threading.Thread.join
|
||||
waits = []
|
||||
|
||||
def bounded_join(worker, timeout=None):
|
||||
waits.append(timeout)
|
||||
return real_join(worker, timeout)
|
||||
|
||||
try:
|
||||
with patch.object(_images.socket, 'getaddrinfo', side_effect=lambda *a, **k: gate.wait(5) and []), \
|
||||
patch.object(_images.threading.Thread, 'join', bounded_join):
|
||||
start = time.monotonic()
|
||||
deadline = start + 0.1
|
||||
with self.assertRaisesRegex(_images.SourceError, 'too long'):
|
||||
_images.get('https://example.org/a.png', deadline=deadline)
|
||||
# Check the requested wait, not elapsed runner time: a loaded CI
|
||||
# host can deschedule this test after the bounded join returns.
|
||||
self.assertEqual(len(waits), 1)
|
||||
self.assertIsNotNone(waits[0])
|
||||
self.assertGreaterEqual(waits[0], 0)
|
||||
self.assertLessEqual(waits[0], deadline - start)
|
||||
finally:
|
||||
gate.set()
|
||||
wait_for_idle_resolvers()
|
||||
with self.assertRaisesRegex(_images.SourceError, 'too long'):
|
||||
_images.get('https://example.org/a.png', deadline=time.monotonic() - 1)
|
||||
|
||||
|
||||
@@ -1790,7 +1790,7 @@
|
||||
},
|
||||
"backend": "Python + native payload",
|
||||
"hardware": "No specific hardware requirement detected statically; runtime requirements unverified.",
|
||||
"nativePort": "A source-matched ARM64 bin/hash helper matched the official x86_64 helper on one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The official ZIP still bundles x86_64 bytes and remains blocked; format coverage, packaging, plugin backend/UI, login and worn VR are unverified.",
|
||||
"nativePort": "A source-matched ARM64 helper matched one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The pinned upstream source proposed for packaging also has unsafe archive extraction and cleanup paths (docs/evidence/framey-native-port-blockers-2026-10-26.md); fix and test those before shipping an ARM64 binary. The official x86_64 ZIP remains blocked; format coverage, plugin backend/UI, login and worn VR are unverified.",
|
||||
"uiSurfaces": [
|
||||
"local/Steam routes",
|
||||
"toasts",
|
||||
@@ -3593,7 +3593,7 @@
|
||||
"https://github.com/GedasFX/decky-cloud-save.git"
|
||||
],
|
||||
"status": "broken",
|
||||
"reason": "Unsafe plugin archive member.",
|
||||
"reason": "The exact official ZIP contains a 60,776,600-byte x86_64 rclone member, above the 30 MiB member limit and unusable on ARM64. Installation remains blocked.",
|
||||
"blockInstall": true,
|
||||
"verification": [
|
||||
"static archive",
|
||||
@@ -3628,7 +3628,7 @@
|
||||
},
|
||||
"backend": "Python + native payload",
|
||||
"hardware": "No specific hardware requirement detected statically; runtime requirements unverified.",
|
||||
"nativePort": "rclone needs an ARM64 artifact; this ZIP also fails safe member validation. Cloud writes were not exercised.",
|
||||
"nativePort": "An ARM64 rclone artifact and safe package policy are needed; the official 60,776,600-byte x86_64 member fails archive validation. No cloud writes were run (docs/evidence/framey-native-port-blockers-2026-10-26.md).",
|
||||
"uiSurfaces": [
|
||||
"local/Steam routes",
|
||||
"toasts",
|
||||
|
||||
Reference in new issue
Block a user