toolbox: Preview-Felder base64-kodieren um fzf Word-Splitting zu verhindern

Beschreibungstexte mit Leerzeichen und Zeilenumbrüche wurden durch fzf
word-gesplittet: Eintraege landeten in der Auswahlliste, printf-Cycling
zerlegte den Preview-Text Wort fuer Wort. Fix: name, raw_preview und
details als Base64 in den fzf-Feldern speichern (kein Leerzeichen →
kein Splitting), im Preview-Befehl per base64 -d dekodieren.
Shell-Quoted-Context per echten "-Zeichen (kein Raw-String) sichert
auch die Ausgabe von $(…) gegen nachtraegliches Splitting.
This commit is contained in:
rene 2026-03-28 18:07:47 +01:00
parent 2f731f68e2
commit 4c2d7db69b

View file

@ -11,6 +11,7 @@ import os
import platform
import shlex
import json
import base64
from dataclasses import dataclass
IS_MAC = platform.system() == "Darwin"
@ -858,15 +859,21 @@ def main() -> None:
desc_col = f"{DIM}{t.description}{RST}{BADGE}"
raw_preview = f"⚠ {get_install_cmd(t)}"
# Felder: display_name | display_desc | raw_name | raw_preview | idx:status | details
line = (f"{name_col}\t{desc_col}\t{t.name}\t{raw_preview}"
f"\t{i}:{'avail' if avail else 'missing'}\t{t.details}")
# Felder: display_name | display_desc | name_b64 | preview_b64 | idx:status | details_b64
# Alle Preview-Felder als Base64: kein Leerzeichen → kein Word-Splitting durch fzf
name_b64 = base64.b64encode(t.name.encode()).decode()
preview_b64 = base64.b64encode(raw_preview.encode()).decode()
details_b64 = base64.b64encode(t.details.encode()).decode()
line = (f"{name_col}\t{desc_col}\t{name_b64}\t{preview_b64}"
f"\t{i}:{'avail' if avail else 'missing'}\t{details_b64}")
tool_lines.append(line)
# Preview: Name (bold) + Details + Befehl/Install (gelb)
# Preview: alle Felder base64-kodiert → sicheres Dekodieren ohne Word-Splitting
# Normaler Python-String (kein r""), damit \" → " wird (echter Shell-Quoted-Context)
preview = (
r"printf '\n \033[1m%s\033[0m\n\n%s\n\n \033[33m%s\033[0m\n' "
r"'{3}' '{6}' '{4}'"
"printf '\\n \\033[1m%s\\033[0m\\n\\n' \"$(printf '%s' {3} | base64 -d)\"; "
"printf '%s' {6} | base64 -d; "
"printf '\\n\\n \\033[33m%s\\033[0m\\n' \"$(printf '%s' {4} | base64 -d)\""
)
key, chosen = fzf_run_keyed(