File no-hardcoded-deck.patch of Package jupiter-hw-support
diff --git a/usr/bin/steamos-polkit-helpers/steamos-priv-write b/usr/bin/steamos-polkit-helpers/steamos-priv-write
index 9278a2d..13d6f27 100755
--- a/usr/bin/steamos-polkit-helpers/steamos-priv-write
+++ b/usr/bin/steamos-polkit-helpers/steamos-priv-write
@@ -3,11 +3,36 @@
set -euo pipefail
shopt -s nullglob
+usage() {
+ echo "Usage: $0 [--owner <uid>:<gid>] <path> <value>"
+ exit 1
+}
+
if [[ $EUID -ne 0 ]];
then
- exec pkexec --disable-internal-agent "$0" "$@"
+ gid="$(id -g "$UID")"
+ exec pkexec --disable-internal-agent "$0" --owner "$UID:$gid" "$@"
fi
+OWNER_GID=""
+while [ $# -gt 0 ]; do
+ case "$1" in
+ --owner)
+ [ $# -ge 2 ] || usage
+ owner="$2"
+ OWNER_GID="${owner##*:}"
+ shift 2
+ ;;
+ --) shift; break ;;
+ *) break ;;
+ esac
+done
+
+[ $# -eq 2 ] || usage
+
+[ -n "$OWNER_GID" ] || { echo "Missing --owner (expected UID:GID)"; exit 1; }
+[[ "$OWNER_GID" =~ ^[0-9]+$ ]] || { echo "Invalid --owner (expected UID:GID)"; exit 1; }
+
WRITE_PATH=$(realpath -s -- "$1")
WRITE_VALUE="$2"
@@ -42,7 +67,7 @@ function CommitWrite()
printf "%s" "$WRITE_VALUE" > "$WRITE_PATH"
fi
- chgrp deck "$WRITE_PATH"
+ chgrp "$OWNER_GID" "$WRITE_PATH"
chmod g+w "$WRITE_PATH"
exit 0
}
diff --git a/usr/lib/hwsupport/block-device-event.sh b/usr/lib/hwsupport/block-device-event.sh
index 7023aa5..00888b5 100755
--- a/usr/lib/hwsupport/block-device-event.sh
+++ b/usr/lib/hwsupport/block-device-event.sh
@@ -13,6 +13,27 @@ usage()
exit 1
}
+get_configured_user()
+{
+ local SYSCONF="/etc/gamescope-session-steam/system.conf"
+ local DEFAULT_USER=""
+
+ if [[ -f "$SYSCONF" ]]; then
+ . "$SYSCONF"
+ fi
+
+ [[ -z "$DEFAULT_USER" ]] && return 1
+
+ # Verify that the user actually exists on the system
+ if getent passwd "$DEFAULT_USER" >/dev/null 2>&1; then
+ echo "$DEFAULT_USER"
+ return 0
+ fi
+
+ # Configured user does not exist
+ return 1
+}
+
is_os_partition ()
{
local -r dev="/dev/${DEVBASE}"
@@ -89,7 +110,13 @@ do_add()
fi
fi
- /usr/libexec/hwsupport/steamos-automount.sh add "${DEVBASE}"
+ local user
+ user="$(get_configured_user || true)"
+ if [[ -z "$user" ]]; then
+ exit 0
+ fi
+
+ /usr/libexec/hwsupport/steamos-automount.sh --user "$user" add "${DEVBASE}"
}
do_remove()
diff --git a/usr/lib/hwsupport/format-device.sh b/usr/lib/hwsupport/format-device.sh
index 21ca5a7..82fd4ad 100755
--- a/usr/lib/hwsupport/format-device.sh
+++ b/usr/lib/hwsupport/format-device.sh
@@ -13,8 +13,7 @@ fi
RUN_VALIDATION=1
EXTENDED_OPTIONS="nodiscard"
-# default owner for the new filesystem
-OWNER="1000:1000"
+OWNER=""
EXTRA_MKFS_ARGS=()
# Increase the version number every time a new option is added
VERSION_NUMBER=1
@@ -41,8 +40,21 @@ if [[ "$#" -gt 0 ]]; then
echo "Unknown option $1"; exit 22
fi
+if [[ ! "$OWNER" =~ ^[0-9]+:[0-9]+$ ]]; then
+ echo "Invalid --owner '$OWNER' (expected <uid>:<gid>)"
+ exit 22
+fi
+
EXTENDED_OPTIONS="$EXTENDED_OPTIONS,root_owner=$OWNER"
+OWNER_UID="${OWNER%%:*}"
+
+OWNER_USER="$(getent passwd "$OWNER_UID" | cut -d: -f1 || true)"
+if [[ -z "$OWNER_USER" ]]; then
+ echo "Could not resolve username for UID $OWNER_UID"
+ exit 22
+fi
+
# We only support SD/MMC and USB mass-storage devices
case "$STORAGE_DEVICE" in
"")
@@ -76,12 +88,12 @@ fi
# If any partitions on the device are mounted, unmount them before continuing
# to prevent problems later
-lsblk -n "$STORAGE_DEVICE" -o MOUNTPOINTS | awk NF | sort -u | while read m; do
+while read -r m; do
if ! umount "$m"; then
echo "Failed to unmount filesystem: $m"
exit 32 # EPIPE
fi
-done
+done < <(lsblk -n "$STORAGE_DEVICE" -o MOUNTPOINTS | awk NF | sort -u)
# Test the sdcard
# Some fake cards advertise a larger size than their actual capacity,
@@ -137,7 +149,7 @@ mkfs.ext4 -m 0 -O casefold -E "$EXTENDED_OPTIONS" "${EXTRA_MKFS_ARGS[@]}" -F "$S
udevadm settle
# Mount the device
-if ! /usr/libexec/hwsupport/steamos-automount.sh add "$STORAGE_PARTBASE"; then
+if ! /usr/libexec/hwsupport/steamos-automount.sh --user "$OWNER_USER" add "$STORAGE_PARTBASE"; then
echo "Failed to mount ${STORAGE_PARTBASE}"
exit 5
fi
diff --git a/usr/lib/hwsupport/steamos-automount.sh b/usr/lib/hwsupport/steamos-automount.sh
index af0dca4..52ccecc 100755
--- a/usr/lib/hwsupport/steamos-automount.sh
+++ b/usr/lib/hwsupport/steamos-automount.sh
@@ -11,35 +11,67 @@ set -euo pipefail
usage()
{
- echo "Usage: $0 {add|remove} device_name (e.g. sdb1)"
+ echo "Usage: $0 [--user USER] {add|remove} device_name (e.g. sdb1)"
exit 1
}
-if [[ $# -ne 2 ]]; then
- usage
-fi
+USER_NAME=""
+
+# simple option parsing
+while [ $# -gt 0 ]; do
+ case "$1" in
+ --user)
+ [ $# -ge 2 ] || usage
+ USER_NAME="$2"
+ shift 2
+ ;;
+ --) shift; break;;
+ -*) usage;;
+ *) break;;
+ esac
+done
+
+[ $# -eq 2 ] || usage
ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"
-DECK_UID=$(id -u deck)
-DECK_GID=$(id -g deck)
+TARGET_UID=""
+TARGET_GID=""
+
send_steam_url()
{
local command="$1"
local arg="$2"
- local encoded=$(urlencode "$arg")
- if pgrep -x "steam" > /dev/null; then
- # TODO use -ifrunning and check return value - if there was a steam process and it returns -1, the message wasn't sent
- # need to retry until either steam process is gone or -ifrunning returns 0, or timeout i guess
- systemd-run -M ${DECK_UID}@ --user --collect --wait sh -c "./.steam/root/ubuntu12_32/steam steam://${command}/${encoded@Q}"
- echo "Sent URL to steam: steam://${command}/${arg} (steam://${command}/${encoded})"
- else
+ local encoded home steam_bin
+
+ encoded="$(urlencode "$arg")"
+
+ # If Steam isn't running for that user, don't bother
+ if ! pgrep -u "$TARGET_UID" -x "steam" > /dev/null; then
echo "Could not send steam URL steam://${command}/${arg} (steam://${command}/${encoded}) -- steam not running"
+ return 0
+ fi
+
+ home="$(getent passwd "$USER_NAME" | cut -d: -f6 || true)"
+ if [[ -z "$home" ]]; then
+ echo "Could not determine home for user '$USER_NAME'; skipping steam URL"
+ return 0
fi
+
+ steam_bin="$home/.steam/root/ubuntu12_32/steam"
+ if [[ ! -x "$steam_bin" ]]; then
+ echo "Steam binary not found at $steam_bin; skipping steam URL"
+ return 0
+ fi
+
+ systemd-run -M "${TARGET_UID}@" --user --collect --wait "$steam_bin" "steam://${command}/${encoded}"
+
+ echo "Sent URL to steam: steam://${command}/${arg} (steam://${command}/${encoded})"
}
+
# From https://gist.github.com/HazCod/da9ec610c3d50ebff7dd5e7cac76de05
urlencode()
{
@@ -53,6 +85,9 @@ do_mount()
readonly FSCK_ERROR=1
readonly MOUNT_ERROR=2
+ TARGET_UID="$(id -u "$USER_NAME")" || exit 1
+ TARGET_GID="$(id -g "$USER_NAME")" || exit 1
+
# Get info for this drive: $ID_FS_LABEL, and $ID_FS_TYPE
dev_json=$(lsblk -o PATH,LABEL,FSTYPE --json -- "$DEVICE" | jq '.blockdevices[0]')
ID_FS_LABEL=$(jq -r '.label | select(type == "string")' <<< "$dev_json")
@@ -71,7 +106,6 @@ do_mount()
echo "Error mounting ${DEVICE}: wrong fstype: ${ID_FS_TYPE} - ${dev_json}"
exit 2
fi
-
# Try to repair the filesystem if it's known to have errors.
# ret=0 means no errors, 1 means that errors were corrected.
# In all other cases we try to mount the fs read-only and report an error.
@@ -90,12 +124,12 @@ do_mount()
"block_devices/${DEVBASE}" \
Filesystem Mount \
'a{sv}' 3 \
- as-user s deck \
+ as-user s "$USER_NAME" \
auth.no_user_interaction b true \
options s "$OPTS")
- # Ensure that the deck user can write to the root directory
- if ! setpriv --clear-groups --reuid "${DECK_UID}" --regid "${DECK_GID}" test -w "${mount_point}"; then
+ # Ensure that the user can write to the root directory
+ if ! setpriv --clear-groups --reuid "${TARGET_UID}" --regid "${TARGET_GID}" test -w "${mount_point}"; then
chmod 777 "${mount_point}" || true
fi
@@ -132,6 +166,7 @@ do_unmount()
case "${ACTION}" in
add)
+ [ -n "$USER_NAME" ] || usage
do_mount
;;
remove)