Skip to content

远端文件改属主 / 属组(chown):属性弹窗里属主、属组可编辑 - #539

Merged
joesdu merged 3 commits into
mainfrom
dev
Sep 30, 2026
Merged

joesdu merged 3 commits into
mainfrom
dev

Conversation

@joesdu

@joesdu joesdu commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

主要改动

feature-plan.md 🟢 P3 项「远端文件 chown / 属主编辑」。原先属性弹窗里属主、属组只读,ISftpService 只有 chmod。

  • 契约:ISftpService 加 SetOwnerAsync(sessionId, path, owner, group)(名称或十进制数字 id,null = 这一项不改)与 GetOwnerChoicesAsync(候选用户名 / 组名;null = 后端改不了属主);ISftpClientWrapper 加 ChangeOwnerAsync(path, uid?, gid?)。
  • SFTP:名称翻数字 id 复用列目录显示名称的那张查表(RemoteIdentityResolver,每会话一次 getent passwd / group),多记一份名称 → id,同 id 的别名(BSD 的 toor)也认。顺序与 chown 命令一致:先当名称、再当数字。翻不出来抛本地化的错误,不发请求;纯 SFTP 账号查不到表时只能填数字。
  • VelaSftpClientWrapper:SFTP v3 的 uid 与 gid 共用一个标志位,只改一项时先 stat 取回另一项再一并 setstat;服务端 stat 没报 uid/gid 就不写(拿不到的一项会被当成 0,等于把文件交给 root)。只用库的公开 SetAttributesAsync,src/VelaShell.Ssh 没动。
  • FTP 与插件协议:FTP 没有标准命令、插件 SDK 没有这一面 —— 候选返回 null,弹窗里两行只读;SetOwnerAsync 抛 NotSupportedException。路由与串行化装饰器透传。
  • 界面:属性弹窗的属主 / 属组换成可编辑下拉(MessageDialog 的 BodyHost 补 ComboBox 样式,全用令牌),清空即不改。确定后先 chown 再 chmod:属主最容易被拒,被拒时什么都还没改;chown 成了、chmod 被拒时照样刷新列表,错误条不被刷新清掉。
  • 五份 resx 补 4 个键(Sftp_OwnerPlaceholder、Sftp_GroupPlaceholder、SftpSvc_UnknownUser、SftpSvc_UnknownGroup)。
  • 不递归、不批量(与 chmod 一致);符号链接改的是它指向的对象。

测试

  • SftpServiceTests 新增 9 条:名称翻译、只改属组、无查表时的数字 id、名字像数字时名字优先、别名、未知名称不发请求(且消息不带 (Parameter …) 尾巴)、空操作、候选排序、无查表时给空名单而非 null。
  • FileBrowserViewModelTests 新增 5 条(候选透传、候选取不到退回只读、先 chown 再 chmod、chown 被拒不动权限、chmod 被拒仍刷新且保留错误),原有 3 条改用新委托;SerializedSftpServiceTests 透传清单补两项。
  • 新增 SftpOwnerIntegrationTests(DockerIntegration)对真实 OpenSSH:只改属组时属主原样写回;把属主交给 root 冒出 VelaSftpPermissionDeniedException 且文件不动。把「沿用当前值」临时改成写 0 后该用例报 Permission denied 失败 —— 确认它真跑过,不是早退记为通过。
  • headless 截图核对了弹窗:深 / 浅主题,可编辑 / 只读 / 下拉展开。

编译 0 警告。dotnet test VelaShell.slnx:VelaShell.Core.Tests 616 通过 / 10 跳过 / 1 失败,VelaShell.Tests 1626 通过 / 8 跳过,VelaShell.Infrastructure.Tests 569 通过 / 4 跳过,其余全过。唯一的失败 X11_RefusedByServer_KeepsAgentForwardingAndWarnsOnce 与本 PR 无关:本机 velashell-test-shells 镜像建于 09-22,早于 Dockerfile 里给 vela-dash 关 X11 的 Match 段(09-23),重建镜像即可。

文档

涉及文档修改。

joesdu added 2 commits October 1, 2026 03:30
- ISftpService 加 SetOwnerAsync / GetOwnerChoicesAsync,ISftpClientWrapper 加 ChangeOwnerAsync。
- SFTP:名称经会话缓存的 passwd / group 查表翻成数字 id(先当名称、再当数字,与 chown 命令一致),
  翻不出来当场报错、不发请求;只改一项时先 stat 取回另一项再一并 setstat,服务端没报 uid/gid 就不写。
- FTP 与插件协议:候选返回 null(弹窗里两行只读),SetOwnerAsync 抛 NotSupportedException。
- 属性弹窗:属主 / 属组换成可编辑下拉,确定后先 chown 再 chmod;MessageDialog 补 ComboBox 样式。
- 五份 resx 补 4 个键。
- 测试:SftpServiceTests、FileBrowserViewModelTests、SerializedSftpServiceTests,
  新增对真实 OpenSSH 的 SftpOwnerIntegrationTests。
joesdu added a commit to VelaShellLabs/velashell-docs that referenced this pull request Sep 30, 2026
docs(host): 远端文件改属主 / 属组(chown)(joesdu/VelaShell#539)
@joesdu
joesdu merged commit e3e6381 into main Sep 30, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant