refactor: drop dead weight (unused param, duplicate checks, dead code)
- tmux_party_setup_server took an unused name parameter; drop it.
- validate_party_name ran two separate case blocks with a length
check between them; merge into one case now that the length check
(which an empty name always passes) runs first.
- roster_read now applies the RR_GROUP fallback to TMUX_PARTY_GROUP
once, so cmd_join, cmd_invite, and cmd_list no longer each repeat
${RR_GROUP:-$TMUX_PARTY_GROUP}.
- socket_path had no caller in party; remove it and its test.
This commit is contained in:
parent
bdcad47147
commit
d51656c9e4
2 changed files with 22 additions and 28 deletions
45
party
45
party
|
|
@ -103,16 +103,18 @@ EOF
|
||||||
# name as a flag, so such a party could never be addressed.
|
# name as a flag, so such a party could never be addressed.
|
||||||
validate_party_name() {
|
validate_party_name() {
|
||||||
name="$1"
|
name="$1"
|
||||||
case "$name" in
|
|
||||||
'' ) echo "party: name must not be empty" >&2; return 2 ;;
|
|
||||||
esac
|
|
||||||
# Length cap: 63 keeps the full socket path comfortably below the
|
# Length cap: 63 keeps the full socket path comfortably below the
|
||||||
# 108-char sun_path limit for typical USERs.
|
# 108-char sun_path limit for typical USERs. Runs before the empty/
|
||||||
|
# shape checks below; an empty name has length 0, so it always
|
||||||
|
# passes this check and falls through to the '' case there.
|
||||||
if [ "${#name}" -gt 63 ]; then
|
if [ "${#name}" -gt 63 ]; then
|
||||||
echo "party: name '$name' too long (max 63 chars)" >&2
|
echo "party: name '$name' too long (max 63 chars)" >&2
|
||||||
return 2
|
return 2
|
||||||
fi
|
fi
|
||||||
case "$name" in
|
case "$name" in
|
||||||
|
'' )
|
||||||
|
echo "party: name must not be empty" >&2
|
||||||
|
return 2 ;;
|
||||||
-* )
|
-* )
|
||||||
echo "party: name must not start with '-'" >&2
|
echo "party: name must not start with '-'" >&2
|
||||||
return 2 ;;
|
return 2 ;;
|
||||||
|
|
@ -200,10 +202,6 @@ roster_record_path() {
|
||||||
printf '%s/roster\n' "$(party_dir_path "$1" "$2")"
|
printf '%s/roster\n' "$(party_dir_path "$1" "$2")"
|
||||||
}
|
}
|
||||||
|
|
||||||
socket_path() {
|
|
||||||
printf '%s/sock\n' "$(party_dir_path "$1" "$2")"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Roster I/O
|
# Roster I/O
|
||||||
# ----------
|
# ----------
|
||||||
#
|
#
|
||||||
|
|
@ -326,6 +324,10 @@ roster_read() {
|
||||||
'' | \#*) ;;
|
'' | \#*) ;;
|
||||||
esac
|
esac
|
||||||
done < "$rec"
|
done < "$rec"
|
||||||
|
# A roster written before --group existed (or otherwise missing
|
||||||
|
# GROUP=) gates on the default group; callers can rely on RR_GROUP
|
||||||
|
# always naming the party's actual perimeter.
|
||||||
|
[ -n "$RR_GROUP" ] || RR_GROUP=$TMUX_PARTY_GROUP
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -565,7 +567,7 @@ party_self_path() {
|
||||||
# All commands run against -S "$sock". Every literal name embedded
|
# All commands run against -S "$sock". Every literal name embedded
|
||||||
# is shell-quoted to survive tmux's parser.
|
# is shell-quoted to survive tmux's parser.
|
||||||
tmux_party_setup_server() {
|
tmux_party_setup_server() {
|
||||||
sock="$1" name="$2"
|
sock="$1"
|
||||||
|
|
||||||
# Write a tiny notification helper next to the socket. The leading dot
|
# Write a tiny notification helper next to the socket. The leading dot
|
||||||
# keeps it out of typical `ls` listings. The per-party private dir
|
# keeps it out of typical `ls` listings. The per-party private dir
|
||||||
|
|
@ -872,7 +874,7 @@ EOF
|
||||||
# apply_party_perms_file widens it AFTER server-access -aw runs.
|
# apply_party_perms_file widens it AFTER server-access -aw runs.
|
||||||
"$PARTY_TMUX" -S "$sock" new-session -d -s "$name"
|
"$PARTY_TMUX" -S "$sock" new-session -d -s "$name"
|
||||||
|
|
||||||
tmux_party_setup_server "$sock" "$name"
|
tmux_party_setup_server "$sock"
|
||||||
|
|
||||||
# Auth gate FIRST, server-access runs BEFORE we widen FS perms.
|
# Auth gate FIRST, server-access runs BEFORE we widen FS perms.
|
||||||
# This closes the connect-before-allowlist race: without this order,
|
# This closes the connect-before-allowlist race: without this order,
|
||||||
|
|
@ -1192,7 +1194,7 @@ EOF
|
||||||
# segments.
|
# segments.
|
||||||
: >> "$logfile"
|
: >> "$logfile"
|
||||||
chmod 0640 "$logfile"
|
chmod 0640 "$logfile"
|
||||||
chgrp "${RR_GROUP:-$TMUX_PARTY_GROUP}" "$logfile"
|
chgrp "$RR_GROUP" "$logfile"
|
||||||
|
|
||||||
# Filter to unpiped panes ourselves rather than trusting `-o` to
|
# Filter to unpiped panes ourselves rather than trusting `-o` to
|
||||||
# skip them: on tmux 3.5a, `-o` toggles an existing pipe closed
|
# skip them: on tmux 3.5a, `-o` toggles an existing pipe closed
|
||||||
|
|
@ -1253,10 +1255,9 @@ EOF
|
||||||
# FS perimeter on the per-party dir already blocks non-group readers
|
# FS perimeter on the per-party dir already blocks non-group readers
|
||||||
# at roster_list; this preflight just turns that into a friendlier
|
# at roster_list; this preflight just turns that into a friendlier
|
||||||
# error than "party not found" when membership is the actual cause.
|
# error than "party not found" when membership is the actual cause.
|
||||||
party_group="${RR_GROUP:-$TMUX_PARTY_GROUP}"
|
if ! user_in_group "$USER" "$RR_GROUP"; then
|
||||||
if ! user_in_group "$USER" "$party_group"; then
|
|
||||||
cat >&2 <<EOF
|
cat >&2 <<EOF
|
||||||
party: '$RR_PARTY_NAME' uses group '$party_group'; you ($USER) are not a member.
|
party: '$RR_PARTY_NAME' uses group '$RR_GROUP'; you ($USER) are not a member.
|
||||||
|
|
||||||
Ask the host or your sysadmin to add you, then log out and back in.
|
Ask the host or your sysadmin to add you, then log out and back in.
|
||||||
EOF
|
EOF
|
||||||
|
|
@ -1469,12 +1470,11 @@ cmd_invite() {
|
||||||
# the guest sees a write(1) ping, but `party join` reports not-found.
|
# the guest sees a write(1) ping, but `party join` reports not-found.
|
||||||
# Warn-and-proceed (rather than hard-fail) so a later usermod -aG
|
# Warn-and-proceed (rather than hard-fail) so a later usermod -aG
|
||||||
# doesn't require a re-invite.
|
# doesn't require a re-invite.
|
||||||
invite_group="${RR_GROUP:-$TMUX_PARTY_GROUP}"
|
if ! user_in_group "$user" "$RR_GROUP"; then
|
||||||
if ! user_in_group "$user" "$invite_group"; then
|
|
||||||
cat >&2 <<EOF
|
cat >&2 <<EOF
|
||||||
party invite: warning, '$user' is not in group '$invite_group'.
|
party invite: warning, '$user' is not in group '$RR_GROUP'.
|
||||||
They will not be able to discover or join until added.
|
They will not be able to discover or join until added.
|
||||||
Run: sudo usermod -aG $invite_group $user (and have them relog).
|
Run: sudo usermod -aG $RR_GROUP $user (and have them relog).
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -1576,15 +1576,14 @@ cmd_list() {
|
||||||
# metadata leak; it only stops `party list` from DISPLAYING parties
|
# metadata leak; it only stops `party list` from DISPLAYING parties
|
||||||
# whose group the caller isn't in. Confidentiality still rides on
|
# whose group the caller isn't in. Confidentiality still rides on
|
||||||
# the FS perimeter alone.
|
# the FS perimeter alone.
|
||||||
list_group="${RR_GROUP:-$TMUX_PARTY_GROUP}"
|
printf '%s\n' "$_ls_groups" | grep -qx "$RR_GROUP" || continue
|
||||||
printf '%s\n' "$_ls_groups" | grep -qx "$list_group" || continue
|
|
||||||
# The group tag only earns its column when the visible parties
|
# The group tag only earns its column when the visible parties
|
||||||
# disagree on it. Which group gates a party is decided per host
|
# disagree on it. Which group gates a party is decided per host
|
||||||
# (auto-selection), so there is no default to compare against:
|
# (auto-selection), so there is no default to compare against:
|
||||||
# tag every line, then strip the tags below unless they differ.
|
# tag every line, then strip the tags below unless they differ.
|
||||||
[ -n "$first_group" ] || first_group="$list_group"
|
[ -n "$first_group" ] || first_group="$RR_GROUP"
|
||||||
[ "$list_group" = "$first_group" ] || mixed=1
|
[ "$RR_GROUP" = "$first_group" ] || mixed=1
|
||||||
group_tag=" [group=$list_group]"
|
group_tag=" [group=$RR_GROUP]"
|
||||||
if [ "$state" = ok ]; then
|
if [ "$state" = ok ]; then
|
||||||
attendees=$("$PARTY_TMUX" -S "$RR_SOCKET" list-clients 2>/dev/null | wc -l | tr -d ' ')
|
attendees=$("$PARTY_TMUX" -S "$RR_SOCKET" list-clients 2>/dev/null | wc -l | tr -d ' ')
|
||||||
line=$(printf '%-12s %-30s %s attendee(s)%s' \
|
line=$(printf '%-12s %-30s %s attendee(s)%s' \
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,6 @@ setup() {
|
||||||
[ "$out" = "$PARTY_SOCKET_DIR/party-veg:debug-the-deploy.d" ]
|
[ "$out" = "$PARTY_SOCKET_DIR/party-veg:debug-the-deploy.d" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "socket_path lives inside the per-party private dir" {
|
|
||||||
out=$(socket_path "veg" "debug-the-deploy")
|
|
||||||
[ "$out" = "$PARTY_SOCKET_DIR/party-veg:debug-the-deploy.d/sock" ]
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "roster_write then roster_read round-trips all fields" {
|
@test "roster_write then roster_read round-trips all fields" {
|
||||||
ensure_party_dir "$USER" "rt-test"
|
ensure_party_dir "$USER" "rt-test"
|
||||||
rec=$(roster_record_path "$USER" "rt-test")
|
rec=$(roster_record_path "$USER" "rt-test")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue