[BUG] different plugin priveledges depending on install method
Please confirm
- [x] I have searched existing issues
- [x] This issue is not a duplicate of an existing one
- [x] I have checked the common issues section in the readme file
- [x] I have attached logs to this bug report (failure to include logs will mean your issue may not be responded to).
Bug Report Description
I noticed an odd behavior where a plugin installed from a ZIP file appears to have elevated privileges compared to the same plugin downloaded via the Decky Store. Specifically, the store-downloaded version was unable to copy a file from /defaults/assets to the mod path, while the ZIP-installed version could.
This could be related to differences in permissions set during installation, potentially between 777 and 755. My current workaround involves ensuring everything is downloaded to /bin first before copying over, but I’m unsure if this is intended behavior or if I’m handling something incorrectly.
Would appreciate any insights on whether this is expected or if there’s a permissions issue at play.
Steps to Reproduce: 1. Install the plugin from the Decky Store. 2. Attempt to copy a file from /defaults/assets to the mod path. 3. Install the same plugin via ZIP. 4. Perform the same file operation and note that it succeeds.
specific to my test case of decky frame gen v 0.9.0 https://github.com/xXJSONDeruloXx/Decky-Framegen/releases/tag/v0.9.0
Expected Behaviour
Both installation methods should result in the same permission behavior unless explicitly intended otherwise.
SteamOS version
3.6.20
Selected Update Channel
Stable
Decky Loader Version
v3.1.3 pre release
Plugin Info
(deck@steamdeck ~)$ bash -c 'directory_to_scan="$HOME/homebrew/plugins"; for dir in "$directory_to_scan"/*/; do if [ -f "${dir}package.json" ]; then name=$(jq -r ".name" "${dir}package.json"); version=$(jq -r ".version" "${dir}package.json"); echo "Directory: ${dir}"; echo "Package Name: $name"; echo "Version: $version"; echo "-----------------------------"; fi; done' Directory: /home/deck/homebrew/plugins/Crosshair/ Package Name: crosshair Version: 1.0.0
Directory: /home/deck/homebrew/plugins/deck-roulette/ Package Name: deck-roulette Version: 1.1.6-d0eea04
Directory: /home/deck/homebrew/plugins/decky-brightness-bar/ Package Name: decky-brightness-bar Version: 1.0.3-2b39e94
Directory: /home/deck/homebrew/plugins/Decky-Framegen/ Package Name: decky-framegen Version: 0.9.1-ce332ab
Directory: /home/deck/homebrew/plugins/decky-game-settings/ Package Name: decky-game-settings Version: 0.0.1-9fc66b1
Directory: /home/deck/homebrew/plugins/Decky-Lookup/ Package Name: Decky-Lookup Version: 0.0.1
Directory: /home/deck/homebrew/plugins/decky-steamgriddb/ Package Name: decky-steamgriddb Version: 1.5.1-loaderv2
Directory: /home/deck/homebrew/plugins/decky-terminal/ Package Name: decky-terminal Version: 0.4.1
Directory: /home/deck/homebrew/plugins/hltb-for-deck/ Package Name: hltb-for-deck Version: 2.0.4-7d39e65
Directory: /home/deck/homebrew/plugins/Junk-Store/ Package Name: Junk-Store Version: 1.1.8
Directory: /home/deck/homebrew/plugins/MagicPodsDecky/ Package Name: magicpods-decky Version: 1.0.7
Directory: /home/deck/homebrew/plugins/MangoPeel/ Package Name: MangoPeel Version: 0.0.5-1
Directory: /home/deck/homebrew/plugins/protondb-decky/ Package Name: protondb-decky Version: 1.1.0
Directory: /home/deck/homebrew/plugins/SDH-AnimationChanger/ Package Name: decky-animation-changer Version: 1.3.2-01f5968
Directory: /home/deck/homebrew/plugins/SDH-AudioLoader/ Package Name: SDH-AudioLoader Version: 1.6.0
Directory: /home/deck/homebrew/plugins/SDH-CssLoader/ Package Name: SDH-CssLoader Version: 2.1.2
Directory: /home/deck/homebrew/plugins/SDH-PauseGames/ Package Name: pause-games Version: 1.0.0-b2be59f
Directory: /home/deck/homebrew/plugins/SDH-PlayTime/ Package Name: PlayTime Version: 2.0.9-c9445a5
(deck@steamdeck ~)$
Have you modified the read-only filesystem at any point?
no
Backend Logs
Frontend Logs
[0208/222222.347230:WARNING:alloy_main_delegate.cc(578)] Alloy bootstrap is deprecated and will be removed in ~M127. See https://github.com/chromiumembedded/cef/issues/3685 [0208/222222.395715:INFO:crash_reporting.cc(238)] Crash reporting enabled for process: browser [0208/222222.406050:WARNING:task_impl.cc(31)] No task runner for threadId 0 [0208/222222.408373:WARNING:task_impl.cc(31)] No task runner for threadId 0 [0208/222222.644723:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser” [0208/222222.644759:WARNING:property.cc(144)] version: GetAndBlock: failed. [0208/222222.645142:ERROR:select_file_dialog_linux_portal.cc(287)] Failed to read portal version property [0208/222222.650319:INFO:crash_reporting.cc(255)] Crash reporting enabled for process: gpu-process [0208/222222.800406:WARNING:sandbox_linux.cc(430)] InitializeSandbox() called with multiple threads in process gpu-process. [0208/222223.569581:INFO:crash_reporting.cc(238)] Crash reporting enabled for process: utility [0208/222223.598257:INFO:crash_reporting.cc(255)] Crash reporting enabled for process: utility [0208/222225.013521:INFO:crash_reporting.cc(255)] Crash reporting enabled for process: renderer [0208/222227.590365:ERROR:atom_cache.cc(229)] Add STEAM_GAME to kAtomsToCache [0208/222228.098091:ERROR:ffmpeg_common.cc(959)] Unsupported pixel format: -1 [0208/222228.226827:INFO:crash_reporting.cc(238)] Crash reporting enabled for process: utility [0208/222258.388091:ERROR:gl_surface_presentation_helper.cc(260)] GetVSyncParametersIfAvailable() failed for 1 times! [0208/222258.389662:ERROR:gl_surface_presentation_helper.cc(260)] GetVSyncParametersIfAvailable() failed for 2 times! [0208/222301.962025:ERROR:gl_surface_presentation_helper.cc(260)] GetVSyncParametersIfAvailable() failed for 3 times! [0208/222458.491346:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/222459.419055:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/222522.427765:WARNING:sync_reader.cc(175)] ASR: No room in socket buffer.: Broken pipe (32) [0208/222523.647341:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/222524.956511:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/223027.391313:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/223028.177303:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/223029.284035:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/223030.091191:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/223030.691979:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/223031.102229:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2) [0208/223043.507250:INFO:CONSOLE(2)] "Unable to preventDefault inside passive event listener invocation.", source: https://steamloopback.host/libraries/libraries~00299a408.js (2)
Also potentially related, sometimes when I install the plugin from store the mod install button won’t show up in the plugin ui, but it shows just fine after a restart. This button state depends on detecting the presence of files from the backend py function for paths outside the plugin itself. So maybe on install and through that session it’s not given the permissions it typically would from unit on fresh boot after being installed?