mirror of
https://github.com/phantomptr/ps5upload.git
synced 2026-10-21 19:33:08 -05:00
- Names that look like escapes or separators: the scanner built remote:// paths from raw server names, which parse() then percent-decoded, so "a%20b.pkg" read "a b.pkg" and "100% Orange.pkg" could not be read. Each name is now encoded (%, \) into the path and the relative path decoded back; parse() accepts an encoded backslash (never one hiding ".."). The organizer's server tree keeps raw server paths and never decodes them; only on Windows is a "\" turned into "/" (there a name holding one is left alone). Container strings go through one path_string everywhere. - FTP no-overwrite: a rename target counts as free only when its folder could be listed (550 is not "absent"), no entry has the name in any case, and SIZE/MDTM on the exact path do not find it (LIST hides dot-files). stat() probes the same way, so apply's destination check sees hidden files too. - Undo fingerprint: a run's log records protocol, host, port, share and folder. Undo is refused when the saved connection now points at another server; an older log is undone on the same connection id with a note. - redact(): a short secret right after a %XX escape, and the secret's percent-encoded form, are masked too. - Tests: odd names through the scanner and the organizer, case-variant collisions, FTP unlistable parent / hidden target / case twin, the undo fingerprint, URL-encoded redaction. Re-checked plan/apply/undo on Samba, vsftpd, OpenSSH and Apache WebDAV with such names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>