Repository navigation
fix: RPC 推送不再下发非法保存路径,文件名按规则清洗 - #57
Merged
Merged
Conversation
保存路径只填盘符或相对路径时不下发 dir,改用下载器默认目录;留空同样不下发, 不再落进 aria2 的工作目录。文件名统一处理 Windows 非法字符、结尾点空格与设备名, 超长按码点截断并保留扩展名。七家推送收口到 _rpcAddUri,面板改说「已提交」。
Closed
收口时这一行被写成了占位符,推送会带一条无效 Cookie。
字符集归网盘管:七家上传时就拒掉 :*?"<>| 这类字符, 这边再改一遍只是白改一遍名字。留下的是网盘管不到的: 路径分隔符、长度(NTFS 按码元算 255,aria2 还要写 <out>.aria2 控制文件,留 6 个)。
addUri 对非法名也返回 GID,面板只看到 GID 就判成功, ? * " < > | 的 errorCode 16 和 : 的 0 字节落盘都看不见。 裸 NUL 会被 Windows 当设备吞掉,补前缀。 控制文件名是 <out>.aria2__temp,多 12 个字符,截断相应收到 243。
NTFS 限 255 码元、ext4/APFS 限 255 字节,按码元截断时 243 个汉字是 721 字节,RPC 指向 Linux 上的 aria2 会 error 16。 设备名只认整名,NUL. / NUL 这类形态会绕过护栏被当设备吞掉。 占位文案删掉「目录需已存在」,实测 aria2 会自建目录。
\?\ / \.\ 前缀本身含 ?,剥掉后无条件 slice(2) 会把非法字符跳过:
rpcDir('\?\a?b') 剥完是 'a?b',再 slice(2) 只剩 'b',? 消失 → 放行。
实测这三个形态在 aria2 RPC 层全是 errorCode 16,且 addUri 照返 GID、面板打勾。
改为:剥前缀后必须仍是完整路径(盘符或 UNC),判非法字符时只在盘符形态下跳过盘符。
- 半截 UNC(\nas\、\127.0.0.1\)落不了盘,实测 errorCode 16,改要求共享名 - 目录名以引号结尾是合法的 POSIX 名(/data/'quoted'),原来被当成外层引号剥掉,静默改到别的目录;改成整串被引号包住才剥 - 扩展名类放开到非分隔符,避免超长中文名/双后缀被整段丢掉 - 保存路径被拒时提示用 warning 色,不再绿着说成功
写死 download 会让一批无名文件在 --allow-overwrite=false 下互相撞名: 实测三个不同 URL 连推,out='' 三件全部 complete,out='download' 后两件 error 13。
原文案说「不是完整路径;请填完整路径」,但 \?\UNC\nas\share 这类本身就是完整路径, 只是本脚本不支持该写法,提示误导用户去改路径。
「请填完整路径」会把用户从 C: 引到 C:\,而盘符根照样 errorCode 16—— 插件无法预判根目录写权限,所以不改判定,只改提示指向具体目录。 toast 用的 warning 类型在样式表里没有对应规则,退回无类型(基础中性样式)。
initDefaultConfig 只补缺失键,老用户存档里的 C: 不会被覆盖,每次推送都会 被 rpcDir 拒绝并提示一次。这里把脚本自己写下的那个默认值一次性清空。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
问题
推送到 Aria2 / Motrix 报「错误 16」(aria2
FILE_CREATE_ERROR,无法创建目标文件),面板却可能显示推送成功。#51原因是三处:
C:。C:不是目录,aria2 的applyDir把它拼成C:/文件名,等于往 C 盘根目录写;普通用户对根目录没有写权限,CreateFileW返回Access Denied,任务在addUri返回 GID 之后才失败,所以面板看不到。dir: ""。aria2 把空串拼成./文件名,落到 aria2 进程的工作目录,而不是下载器设置里的下载目录。safeRpcFilename只去掉控制字符与/ \,* ? " < > |全部放行 —— 实测直接 16;:更隐蔽,落成 0 字节文件加一条 NTFS 数据流,目录里看着像空文件。另外.slice(0, 255)会切掉扩展名、切断 emoji 代理对。补一句前提:这条支线的判据是
if (res.result) return 'success',而aria2.addUri对注定失败的名字照样返回 GID。所以「下载器报 16」与「面板打 ✓」可以同时成立 —— 这是为什么这些输入必须在插件侧挡掉。改动
只改主脚本,
+34 / −8。rpcDefaults.dir由'C:'改为''(只对新装生效;老用户存的C:靠下面的读取时归一兜住)。_rpcConfig()读取时调用rpcDir():归一(trim、整串被引号包住时剥引号、全角冒号转半角)并校验,被拒的形态不下发dir,改用下载器默认目录,推送结束提示一次原因;提示用 warning 色,不再绿着说成功。rpcDir()承接上一条的归一与判定。被拒形态:裸盘符(C:)、驱动相对(C:Downloads)、相对路径(Downloads)、~/、file://、含不可见字符、纯分隔符(/、//)、没有共享名的半截 UNC(\\nas\)、Windows 路径里的<>"|?*:(剥掉\\?\/\\.\前缀再判,前缀本身的那个?不算)。safeRpcFilename():\ / : * ? " < > |统一换成_;裸设备名(CON/PRN/AUX/NUL/COM1-9/LPT1-9,含尾随点空格的形态)前面补_;按 UTF-8 字节截到 243 并保留扩展名(扩展名按最后一个点切,非 ASCII 扩展名同样保留);空名与纯空白名返回空串,交回 aria2 按链接取名字。addUri只保证任务进了队列,不保证建文件成功。没有做:七家
sendLinkToRPC仍各自持有aria2.addUri报文,没有抽公共入口(那版已被c0a1c8c撤回);没有做推送后的tellStatus回查;没有剥离文件名结尾的点与空格。为什么是 243 字节
255 是文件系统上限。aria2 下载中会在同目录写控制文件
<out>.aria2,其临时名再带__temp后缀,合计要占掉 12 个字符,所以名字最多 243。实测(6MB 慢速源,等任务到终态,25ms 采样目录能看到瞬态文件):所以 244–255 这一段的表现最容易被误判:数据文件在、
tellStatus报complete、errorCode=0,丢的是断点续传 / session 记录,不是下载本身。取 243 就是拿 12 个字符的名字换回续传能力,不能按 255 取。按字节而不是码元:NTFS 限 255 码元,但 ext4 / APFS 的
NAME_MAX限 255 字节。这个插件的rpcDir接受/下载这类 POSIX 路径、validRpcDomain接受局域网地址,说明 NAS 上的 aria2 是被支持目标 —— 按码元截断时 243 个汉字 = 729 字节,在 NAS 上照样 16。代价是中文名最多 79 个汉字加扩展名(ASCII 仍是 243 字节)。验证
RPC 层真跑(aria2
1.37.0-motrix.23,本地 HTTP 源,aria2.addUri+aria2.tellStatus,看落盘字节)文件名组:
S01E01: Pilot.mp4S01E01+ NTFS 数据流(不报错)S01E01_ Pilot.mp4,4096Ba?b*c|d<e>f"g.ziperrorCode 16,无文件a_b_c_d_e_f_g.zip,4096B第1集:开端.mp4NULerrorCode 13,无文件_NUL,落盘NUL./NULerrorCode 13,无文件_NUL./_NUL,落盘CON/CON.txt/nul.mp4CON会被补成_CON)中×300 +.mp4.mp4(83 码点、241 字节)x×300 +.mp4a×254 +😀.mp4.mp4长×300 +.文件.文件保留保存路径组:
C:(基线脚本)errorCode 16,files[0].path = C:/…,磁盘无文件C:(本次改动)dir,complete,落下载器默认目录dir,completeC:Downloads/Downloadsdir,complete////dir,complete(基线会写盘根 /errorCode 18)C:\a?b/C:\a*b/C:\a:bdir,complete(基线errorCode 18)\\nas\/\\nas\\/\\127.0.0.1\dir,complete(基线errorCode 16)\\?\a?b/\\?\C:/\\?\?xdir,complete(基线errorCode 16)D:\Downloads"D:\...\quoted"(整串带引号)/data/'quoted'(名字里有引号)\\?\C:\x/\\?\D:\/\\.\C:\x(长路径前缀)\\?\UNC\nas\share(扩展长度 UNC)dir,提示「这种长路径写法不受支持」/下载、/data/movies、//nas/share浏览器端:ego lite + 篡改猴 5.5.1,夸克网盘实机走完整面板流程,保存路径设为
C:,推送后面板提示「已提交 1 个任务给 Aria2」,文件落D:\Downloads,C:\根目录无残留。node --check通过;本地 harnessrpc_cfg_check101/101。