dsh-mcloud 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,7 +6,8 @@
6
6
 
7
7
  | 插件版本 | 支持的 DeepSeek Harness | 支持的 Node |
8
8
  | --- | --- | --- |
9
- | **0.2.x** | **>= 0.2.1-rc.5,< 0.3.0** | >= 22 |
9
+ | **0.3.x** | **>= 0.2.1-rc.5,< 0.3.0** | >= 22 |
10
+ | 0.2.x | >= 0.2.1-rc.5,< 0.3.0 | >= 22 |
10
11
  | 0.1.x | >= 0.2.1-rc.5,< 0.3.0 | >= 22 |
11
12
 
12
13
  > 插件用到了 `tools/pre-execute`(写入审批闸)和 `webServer.register`(HTTP 路由)
@@ -16,6 +17,80 @@
16
17
 
17
18
  ---
18
19
 
20
+ ## 0.3.1
21
+
22
+ **安全修复:`/api/dsh-mcloud/*` 现在有 Host / Origin 准入。**
23
+
24
+ DSH 的 `webServer.register` 只按路径分发,**不做**准入。插件原来只查了「连接是不是来自
25
+ 环回地址」,而你自己浏览器里开着的任意网页发出的请求,`remoteAddress` 一样是 `127.0.0.1`。
26
+ 于是任意网页都能读 `/list`、`/search`、`/status`,也能打 `/mkdir`、`/remove`、`/move`、
27
+ `/upload` 等写接口。原有的 `x-dsh-mcloud: 1` **不是安全边界**,静态请求头任何网页都能自己加。
28
+
29
+ 现在所有路由统一过一道闸(`lib/request-guard.js`):
30
+
31
+ - **Host** 必须是本部署自己的 authority(环回 / 监听器绑定 IP / `allowedAuthorities`),
32
+ 端口要对得上监听器;解析不出、带 userinfo、带路径的一律拒
33
+ - **Origin** 必须与 Host 同源;`null`(沙箱 iframe、`file:` 页面)直接拒
34
+ - **`Sec-Fetch-Site: cross-site`** 一票否决
35
+
36
+ 新增 24 项回归测试(`npm test`)。其中 4 条攻击路径用例在 0.3.0 上全部失败,本版全部通过。
37
+
38
+ **新增配置**:`allowedAuthorities`,只有挂了反代或用自定义域名访问时才需要。
39
+
40
+ 0.3.0 的功能与界面不变。
41
+
42
+ ---
43
+
44
+ ## 0.3.0
45
+
46
+ **界面重做为资源管理器风格**(登录页保持不变)。
47
+
48
+ **布局**
49
+
50
+ - 左边是文件夹树,可以逐级展开;点哪个文件夹,右边就显示它的内容
51
+ - 左上角显示账号、授权有效期和下载目录;右上角是操作按钮,顺序为:传输记录 / 授权 / 退出 / 刷新
52
+ - 顶部栏底部有一条贯通全宽的容量条,容量数值居中压在条里(白字加深色描边,已用段和未用段上都看得清,亮暗主题均适配)
53
+ - 文件夹树与右侧列表之间有可拖动的分隔线(热区 14px,悬停才显形,双击恢复默认宽度)
54
+ - 文件列表的「大小」列左右各有一条竖线,从表头贯穿到列表里的每一行;两条竖线都能拖动调整列宽,双击恢复默认
55
+ - 列宽拖动有上下限(大小列 ≥64px、时间列 ≥88px,且永远给名称列留出 ≥120px),怎么拖都不会把某一列压成一条线
56
+ - 左右两条表头横线(左树「文件夹」与右侧「名称」)高度一致,能对齐
57
+ - 窄面板(右侧主栏宽度 <620px)时自动收起「修改时间」列;判断依据是主栏自身宽度而不是视口宽度,所以对话区只占窗口一小块时也能正确收起
58
+ - 面板会实测父容器的像素高度来撑满,不再依赖 `height:100%`(后者在 flex 子项里会静默失效,导致整个面板被内容撑长、列表滚不动、底部进度条被顶到最下面)
59
+ - 高度测量做了四级跨浏览器兜底:父级 clientHeight → getBoundingClientRect → 再上一层父级 → visualViewport 估算;并监听 resize、orientationchange、visualViewport 变化和 ResizeObserver,窗口缩放、横竖屏切换、移动端地址栏伸缩都能跟上
60
+ - 页面自适应:不同尺寸都能撑满,窄屏自动收起侧栏
61
+
62
+ **文件浏览**
63
+
64
+ - 列表滚动到底自动加载下一批,不再需要点按钮
65
+ - 列表行无边框,靠整行底色区分悬停与选中
66
+ - 新增文件搜索(在当前目录及子目录内按文件名查找)
67
+ - 点击目录时复核「有没有下一级」,空目录不会显示展开箭头
68
+
69
+ **传输**
70
+
71
+ - 底部一条传输进度条:空闲时是一条窄线,传输时变粗变蓝并显示文件名与百分比
72
+ - 完成后停留 5 秒,再用 1.5 秒缓缓褪色融入背景
73
+ - 进度条至少显示 1.2 秒,小文件下载也不会一闪而过
74
+ - **目录分页从每页 10 项改为 50 项**:实测每次请求的固定开销才是瓶颈,一次多拿几十条几乎不要钱。几百张图片的大目录现在翻页次数少了约 5 倍
75
+ - 右上角「传输记录」可查看本次会话的记录(进行中 / 已完成 / 失败 / 已取消分组,多时列表内滚动)
76
+ - 记录里上传显示向上箭头、下载显示向下箭头
77
+ - 支持一键清空记录:只删列表,网盘和本地文件都不受影响,正在传输的任务保留
78
+
79
+ **其他**
80
+
81
+ - 修复「只有文件、没有子文件夹」的目录仍然显示展开箭头的问题(之前判的是「目录里有没有东西」,现在只认「有没有子文件夹」,并会翻最多 3 页确认)
82
+ - 修复目录被清空后箭头仍然显示:判定缓存 45 秒过期,增删改和手动刷新会立即作废重建
83
+ - 修复小文件下载时传输进度条完全不出现的问题(起任务时就点亮进度条,即使任务瞬间完成也能看到完整过程)
84
+ - 修复大目录下「滚到底就不动了」:客户端请求加了 30 秒超时、加载标志加了 40 秒兜底,避免一次卡住的请求让后续加载永久停摆
85
+ - 传输进度条改为**浮在面板底部**的固定条:无论当前在哪个目录、列表滚到哪里都一定看得见(之前它会跟着布局被挤出可视区)
86
+ - 传输时浮层会显示文件名和百分比,带不透明背景和阴影,压在内容之上也读得清
87
+ - 修复在云盘面板里滚动时会把外层对话页一起带着滚的问题(滚动区加 overscroll 隔离;不使用 JS 拦截滚轮,避免影响列表滚动)
88
+ - 拖动左右分隔线时不会再触发页面拖动或选中文本
89
+ - 下载目录缩为小按钮,点开可手填路径或用系统对话框选目录
90
+ - 移除「返回上级」按钮(面包屑和左树都能回退)
91
+ - 文件夹右键菜单为「复制路径」和「重命名」;左树里的文件夹也支持右键
92
+ - 亮色 / 暗色主题自动跟随 DSH
93
+
19
94
  ## 0.2.1
20
95
 
21
96
  修正 DSH 兼容性上界:原先写的 `< 0.4.0` 没有依据,改为 `< 0.3.0`。
package/CONTRIBUTING.md CHANGED
@@ -8,7 +8,7 @@
8
8
  - Node.js **>= 22**(插件用了内置 `fetch`、`AbortSignal.timeout`、`node:stream/promises`)
9
9
  - Windows(宿主端用 Puppeteer 无依赖的 PowerShell + WinForms 处理系统对话框与 DPAPI;
10
10
  macOS / Linux 上凭据改用文件权限,但部分功能未验证)
11
- - DeepSeek Harness `0.2.x`
11
+ - DeepSeek Harness `>= 0.2.1-rc.5, < 0.3.0`(插件 0.3.x 的兼容范围)
12
12
 
13
13
  ## 本地开发
14
14
 
package/FAQ.md CHANGED
@@ -105,19 +105,21 @@
105
105
 
106
106
  先确认是不是这几种情况:
107
107
 
108
- - **目录条目特别多**(几千项)→ 需要多次「加载更多」
109
108
  - **网络不稳** → 面板会给出错误提示,等几秒重试即可
110
109
  - **刚登录后第一次访问** → 首次要解析服务地址,会稍慢
110
+ - **目录里图片特别多** → 首屏只拉第一页,往下滚才会继续加载
111
111
 
112
112
  如果某个目录每次都很慢,把目录名和大概条目数告诉我。
113
113
 
114
- ### 为什么一次只显示 10 项
114
+ ### 列表是怎么加载的
115
115
 
116
- 为了打开目录更快。点底部的「加载更多」看剩下的内容。
116
+ 每页取 50 项,**滚动到底会自动加载下一批**,不需要点任何按钮。
117
+ 每次请求的耗时主要花在网络往返上,一次多取一些反而更划算,所以页大小调成了 50。
117
118
 
118
119
  ### 回到看过的目录会很快
119
120
 
120
- 已访问过的目录会被缓存,再次进入基本是瞬间打开。
121
+ 已访问过的目录会被缓存(约 5 分钟),再次进入基本是瞬间打开;
122
+ 缓存期间仍会在后台悄悄刷新,内容变了也能看到。
121
123
 
122
124
  ## 权限与安全
123
125
 
package/README.md CHANGED
@@ -1,239 +1,271 @@
1
- # dsh-mcloud
2
-
3
- 把 **中国移动云盘(139)** 接进 DeepSeek Harness:在会话页顶部加一个「移动云盘」页签,
4
- 可以直接浏览、上传、下载、转移网盘文件;同时给模型提供一整套 `mcloud_*` 工具。
5
-
6
- 📖 [常见问题 FAQ](FAQ.md) · 📝 [更新日志](CHANGELOG.md) · 🤝 [贡献指南](CONTRIBUTING.md)
7
-
8
- [![npm](https://img.shields.io/npm/v/dsh-mcloud?color=cb3837&logo=npm&logoColor=white)](https://www.npmjs.com/package/dsh-mcloud)
9
- [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
-
11
- ## 快速开始
12
-
13
- **环境要求**
14
-
15
- | 项目 | 要求 |
16
- | --- | --- |
17
- | DeepSeek Harness | **>= 0.2.1-rc.5,< 0.3.0** |
18
- | Node.js | >= 22 |
19
- | 系统 | Windows |
20
-
21
- **五步用起来**
22
-
23
- 1. 装插件(见下方「安装」)
24
- 2. 重启 DSH —— 插件在 profile 启动时加载
25
- 3. 会话页顶部标签栏点「**移动云盘**」
26
- 4. 用**扫码**或**账号密码**登录(全新安装一定是未登录状态)
27
- 5. 看到容量和文件列表 → 可以用了
28
-
29
- 之后可以直接让 AI 操作网盘,也可以右键菜单自己动手。
30
-
31
- ## 安装
32
-
33
- 最省事:在 DSH 的「添加插件」里输入包名:
34
-
35
- ```
36
- dsh-mcloud
37
- ```
38
-
39
- 或者用命令行:
40
-
41
- ```powershell
42
- dsh plugin --profile desktop add dsh-mcloud
43
- ```
44
-
45
- 也可以从 GitHub 装:
46
-
47
- ```powershell
48
- dsh plugin --profile desktop add github:GIYN-S/dsh-mcloud
49
- ```
50
-
51
- 或下载 Release 里的 tgz:
52
-
53
- ```powershell
54
- dsh plugin --profile desktop add https://github.com/GIYN-S/dsh-mcloud/releases/download/v0.2.0/dsh-mcloud-0.2.0.tgz
55
- ```
56
-
57
- 本地开发用 link:
58
-
59
- ```powershell
60
- dsh plugin --profile desktop add "link:/path/to/dsh-mcloud"
61
- ```
62
-
63
- 装完**重启 DSH** 才生效。
64
-
65
- ## 登录
66
-
67
- 打开面板会看到登录页,两种方式任选。
68
-
69
- ### 扫码登录(推荐)
70
-
71
- 点「**开始扫码登录**」→ 弹出一个浏览器窗口 → 手机扫码 → 完成。
72
-
73
- - 不需要输密码
74
- - 凭据会自动续期,日常**不需要反复扫码**
75
- - 弹出的是独立 profile 的浏览器,不影响你日常用的 Edge
76
-
77
- ### 账号密码登录
78
-
79
- 在「账号密码」页签填手机号/邮箱和密码。
80
-
81
- - **密码默认只用一次**,登录成功后立刻丢弃
82
- - 勾选「**记住密码**」才会保存,用 Windows DPAPI 加密存在本机
83
-
84
- ### 退出登录
85
-
86
- 面板里点「退出登录」,会清掉本机凭据,回到未登录状态。
87
-
88
- ### 凭据存在哪
89
-
90
- `%USERPROFILE%\.dsh-mcloud\authorization.dpapi` —— 当前用户的 DPAPI 加密,
91
- 换用户或换机器都解不开。想换位置在配置里写 `credentialDir`。
92
-
93
- **不要把凭据贴到 Issue、聊天记录或截图里。**
94
-
95
- ## 功能
96
-
97
- ### 面板内操作
98
-
99
- | 操作 | 说明 |
100
- | --- | --- |
101
- | 浏览目录 | 点击文件夹进入,顶部面包屑可回退 |
102
- | 容量 | 显示总量 / 已用 / 剩余 |
103
- | 上传 | 右键 → 上传文件 / 上传文件夹 / 拖动上传 |
104
- | 下载 | 右键 → 下载到本地 / 打开下载直链 / 下载整个文件夹 |
105
- | 转移 | 右键 → 转移到…(选择目标文件夹) |
106
- | 复制路径 | 右键 → 复制路径 |
107
- | 重命名 / 删除 | 右键菜单 |
108
-
109
- ### 模型工具
110
-
111
- | 工具 | 用途 |
112
- | --- | --- |
113
- | `mcloud_quota` | 查询容量 |
114
- | `mcloud_list` | 列目录 |
115
- | `mcloud_search` | 按文件名搜索 |
116
- | `mcloud_upload` | 上传本地文件(按路径,直接从磁盘读) |
117
- | `mcloud_upload_folder` | 上传整个本地文件夹 |
118
- | `mcloud_download` | 下载到本地 |
119
- | `mcloud_download_folder` | 递归下载整个文件夹 |
120
- | `mcloud_download_link` | 获取下载直链 |
121
- | `mcloud_mkdir` | 新建文件夹 |
122
- | `mcloud_rename` | 重命名 |
123
- | `mcloud_move` | 转移 |
124
- | `mcloud_remove` | 删除(进回收站) |
125
-
126
- ## 使用提醒
127
-
128
- - **大文件或整个目录**:让模型调用 `mcloud_upload`,走本机路径直传,效率最高。
129
- 面板里的上传需要经过浏览器中转一次。
130
- - **下载整个文件夹**不是压缩包:移动云盘没有打包下载接口,插件会递归遍历后逐个下载。
131
- - **删除进回收站**,可以在网盘里恢复。
132
- - **写入类操作会弹审批**,这是 DSH 的安全机制,不是出错。
133
- - **一次只显示 10 项**,点「加载更多」翻页;看过的目录会被缓存,再次进入很快。
134
- - 如果长时间不用,登录凭据可能过期,届时重新登录即可。
135
-
136
- ## 配置
137
-
138
- 可选,在 profile 的 `cordis.patch.yml` 里:
139
-
140
- ```yaml
141
- - id: dsh-mcloud
142
- name: 'dsh-mcloud'
143
- config:
144
- credentialDir: '/custom/credential/dir' # 凭据目录
145
- enableWrites: false # 设为 false 则关闭写入审批闸(不建议)
146
- ```
147
-
148
- ## 文件结构
149
-
150
- ```
151
- lib/index.js 宿主端:网盘客户端、工具、HTTP 路由、凭据存储
152
- lib/login.js 账号密码登录
153
- lib/scan-login.js 扫码登录
154
- lib/transfer.js 上传下载的传输层
155
- lib/client.js 会话页面板(登录页、文件浏览、右键菜单、传输进度)
156
- cordis.patch.yml bundle patch
157
- locale/*.json 面板标题与描述
158
- ```
159
-
160
- ## 免责声明
161
-
162
- **使用本项目即表示你已阅读、理解并同意以下全部内容。如果你不同意,请不要安装或使用。**
163
-
164
- ### 1. 与官方无关
165
-
166
- 本项目是一个**第三方社区项目**,由个人开发者在业余时间编写,**不是中国移动、中国移动云盘(139)
167
- 或其任何关联公司的官方产品**。我们与中国移动:
168
-
169
- - 没有任何隶属、合作、赞助、背书或授权关系;
170
- - 没有获得中国移动的任何许可、技术支持或数据访问权限;
171
- - 不代表中国移动的立场,也不承担其任何义务。
172
-
173
- 「中国移动」「移动云盘」「139」等名称与标识是其各自权利人的商标,本项目仅作**描述性使用**
174
- (说明本工具连接的是哪个服务),不主张任何商标权利。
175
-
176
- ### 2. 技术实现方式
177
-
178
- 本项目通过**非官方接口**与移动云盘通信。这些接口并非公开 API,而是社区通过观察网页端
179
- 行为整理得出(参考了 [OpenList](https://github.com/OpenListTeam/OpenList) 与
180
- [cloud_driver_sdk](https://github.com/kong-hen/cloud_driver_sdk) 的开源实现)。
181
-
182
- 这意味着:
183
-
184
- - 接口**没有任何稳定性承诺**,中国移动可以随时修改、限制或关闭,且无需通知;
185
- - 接口变更可能导致本插件**完全失效**,且不保证能及时修复;
186
- - 部分行为(如分页上限、请求频率限制)是观察到的现象,**不保证在所有账号上一致**。
187
-
188
- ### 3. 账号与合规风险
189
-
190
- **你需要自行确认使用本插件不违反你与中国移动之间的服务协议。**
191
-
192
- 需要注意的现实风险包括但不限于:
193
-
194
- - 服务协议通常禁止使用非官方客户端或自动化工具访问服务;
195
- - 高频或异常调用可能触发风控,导致**账号被限制、临时封禁或功能受限**;
196
- - 中国移动可能随时调整政策,使此类第三方工具不再可用。
197
-
198
- **因使用本插件导致的任何账号处置、服务中断、数据丢失或协议违约后果,由使用者自行承担。**
199
-
200
- ### 4. 数据与隐私
201
-
202
- - **你的凭据只存在你自己的机器上**,使用 Windows DPAPI(当前用户级)加密,
203
- 不会上传到任何第三方服务器,本项目的开发者也无法获取。
204
- - 插件只与 `*.yun.139.com`、`*.10086.cn`(登录)及文件 CDN 通信,
205
- **不含任何统计、埋点或遥测代码**。
206
- - 账号在界面上以脱敏形式显示(只露前 3 位与末 2 位)。
207
- - ⚠️ **但请注意**:本项目对凭据的保管仅做到「本机 DPAPI 加密」这一层。
208
- 如果你的电脑本身被入侵、被他人物理接触、或登录了不受信任的账号环境,
209
- 凭据仍可能被读取。**请自行评估你所在环境的安全水平。**
210
-
211
- ### 5. 数据完整性
212
-
213
- 本插件会**真实地修改你的网盘内容**(上传、移动、重命名、删除)。
214
-
215
- - 删除操作走的是回收站,通常可以恢复,但**不保证**(例如回收站被清空、或服务端策略变化);
216
- - 上传、移动等操作可能因网络中断、接口异常而产生**不完整或重复**的文件;
217
- - **请勿把本插件用于你无法承受丢失的数据。重要数据请自行另行备份。**
218
-
219
- ### 6. 无担保
220
-
221
- 本项目按「**现状**」(AS IS)提供,**不附带任何明示或暗示的担保**,包括但不限于
222
- 适销性、特定用途适用性、以及不侵权的担保。
223
-
224
- 作者**不对任何直接、间接、偶然、特殊、惩罚性或后果性损害承担责任**,
225
- 包括但不限于数据丢失、利润损失、业务中断、账号损失——
226
- 无论这些损害是如何产生的、基于何种责任理论,也无论作者是否已被告知此类损害的可能性。
227
-
228
- ### 7. 关于 Issue 与支持
229
-
230
- - 本项目**不提供任何形式的商业支持或 SLA**;
231
- - 因接口变更导致的问题,作者**没有义务**修复;
232
- - 提交 Issue 时**绝不要附带凭据(Authorization / cookie / token)或截图中的敏感信息**。
233
-
234
- ## 许可
235
-
236
- 本项目以 [MIT 许可](LICENSE) 发布。你可以在许可条款范围内自由使用、修改与分发,
237
- 但**必须保留原版权声明与许可声明**。MIT 许可同样包含上述免责条款。
238
-
239
- 详见 [LICENSE](LICENSE)。
1
+ # dsh-mcloud
2
+
3
+ 把 **中国移动云盘(139)** 接进 DeepSeek Harness:在会话页顶部加一个「移动云盘」页签,
4
+ 可以直接浏览、上传、下载、转移网盘文件;同时给模型提供一整套 `mcloud_*` 工具。
5
+
6
+ 📖 [常见问题 FAQ](FAQ.md) · 📝 [更新日志](CHANGELOG.md) · 🤝 [贡献指南](CONTRIBUTING.md)
7
+
8
+ [![npm](https://img.shields.io/npm/v/dsh-mcloud?color=cb3837&logo=npm&logoColor=white)](https://www.npmjs.com/package/dsh-mcloud)
9
+ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
+
11
+ ## 快速开始
12
+
13
+ **环境要求**
14
+
15
+ | 项目 | 要求 |
16
+ | --- | --- |
17
+ | DeepSeek Harness | **>= 0.2.1-rc.5,< 0.3.0** |
18
+ | Node.js | >= 22 |
19
+ | 系统 | Windows |
20
+
21
+ **五步用起来**
22
+
23
+ 1. 装插件(见下方「安装」)
24
+ 2. 重启 DSH —— 插件在 profile 启动时加载
25
+ 3. 会话页顶部标签栏点「**移动云盘**」
26
+ 4. 用**扫码**或**账号密码**登录(全新安装一定是未登录状态)
27
+ 5. 看到容量和文件列表 → 可以用了
28
+
29
+ 之后可以直接让 AI 操作网盘,也可以右键菜单自己动手。
30
+
31
+ ## 安装
32
+
33
+ 最省事:在 DSH 的「添加插件」里输入包名:
34
+
35
+ ```
36
+ dsh-mcloud
37
+ ```
38
+
39
+ 或者用命令行:
40
+
41
+ ```powershell
42
+ dsh plugin --profile desktop add dsh-mcloud
43
+ ```
44
+
45
+ 也可以从 GitHub 装:
46
+
47
+ ```powershell
48
+ dsh plugin --profile desktop add github:GIYN-S/dsh-mcloud
49
+ ```
50
+
51
+ 或下载 Release 里的 tgz:
52
+
53
+ ```powershell
54
+ dsh plugin --profile desktop add https://github.com/GIYN-S/dsh-mcloud/releases/download/v0.2.0/dsh-mcloud-0.2.0.tgz
55
+ ```
56
+
57
+ 本地开发用 link:
58
+
59
+ ```powershell
60
+ dsh plugin --profile desktop add "link:/path/to/dsh-mcloud"
61
+ ```
62
+
63
+ 装完**重启 DSH** 才生效。
64
+
65
+ ## 登录
66
+
67
+ 打开面板会看到登录页,两种方式任选。
68
+
69
+ ### 扫码登录(推荐)
70
+
71
+ 点「**开始扫码登录**」→ 弹出一个浏览器窗口 → 手机扫码 → 完成。
72
+
73
+ - 不需要输密码
74
+ - 凭据会自动续期,日常**不需要反复扫码**
75
+ - 弹出的是独立 profile 的浏览器,不影响你日常用的 Edge
76
+
77
+ ### 账号密码登录
78
+
79
+ 在「账号密码」页签填手机号/邮箱和密码。
80
+
81
+ - **密码默认只用一次**,登录成功后立刻丢弃
82
+ - 勾选「**记住密码**」才会保存,用 Windows DPAPI 加密存在本机
83
+
84
+ ### 退出登录
85
+
86
+ 面板里点「退出登录」,会清掉本机凭据,回到未登录状态。
87
+
88
+ ### 凭据存在哪
89
+
90
+ `%USERPROFILE%\.dsh-mcloud\authorization.dpapi` —— 当前用户的 DPAPI 加密,
91
+ 换用户或换机器都解不开。想换位置在配置里写 `credentialDir`。
92
+
93
+ **不要把凭据贴到 Issue、聊天记录或截图里。**
94
+
95
+ ## 功能
96
+
97
+ ### 面板内操作
98
+
99
+ 界面是资源管理器风格:左边文件夹树,右边文件列表。
100
+
101
+ | 操作 | 说明 |
102
+ | --- | --- |
103
+ | 浏览目录 | 左侧点文件夹,右侧显示它的内容;也可双击右侧文件夹进入 |
104
+ | 返回上级 | 点面包屑跳回任意一层,或点左侧文件夹树 |
105
+ | 调整侧栏宽度 | 拖动文件夹树与列表之间的分隔线,双击恢复默认 |
106
+ | 容量 | 顶部栏底部的一条通栏进度线,数值居中显示 |
107
+ | 调整列宽 | 拖动「大小」两侧的竖线,双击恢复默认 |
108
+ | 搜索 | 顶部搜索框,在当前目录及子目录中按文件名查找 |
109
+ | 上传 | 右键 → 上传文件 / 上传文件夹 / 拖动上传 |
110
+ | 下载 | 右键 → 下载到本地 / 打开下载直链 / 下载整个文件夹 |
111
+ | 转移 | 右键 → 转移到…(选择目标文件夹) |
112
+ | 复制路径 | 右键 → 复制路径 |
113
+ | 重命名 / 删除 | 右键菜单(文件夹的右键菜单只有「复制路径」和「重命名」) |
114
+
115
+ **下载目录**:左上角「下载到」按钮,点开可以手填路径,或点「选择目录」用系统对话框逐级选。
116
+
117
+ **传输进度**:面板底部有一条固定的进度条,空闲时是一条淡色细线。传输时变粗变蓝,
118
+ 显示文件名与百分比;完成后保持 5 秒再缓缓淡出。
119
+
120
+ ### 模型工具
121
+
122
+ | 工具 | 用途 |
123
+ | --- | --- |
124
+ | `mcloud_quota` | 查询容量 |
125
+ | `mcloud_list` | 列目录 |
126
+ | `mcloud_search` | 按文件名搜索 |
127
+ | `mcloud_upload` | 上传本地文件(按路径,直接从磁盘读) |
128
+ | `mcloud_upload_folder` | 上传整个本地文件夹 |
129
+ | `mcloud_download` | 下载到本地 |
130
+ | `mcloud_download_folder` | 递归下载整个文件夹 |
131
+ | `mcloud_download_link` | 获取下载直链 |
132
+ | `mcloud_mkdir` | 新建文件夹 |
133
+ | `mcloud_rename` | 重命名 |
134
+ | `mcloud_move` | 转移 |
135
+ | `mcloud_remove` | 删除(进回收站) |
136
+
137
+ ## 使用提醒
138
+
139
+ - **大文件或整个目录**:让模型调用 `mcloud_upload`,走本机路径直传,效率最高。
140
+ 面板里的上传需要经过浏览器中转一次。
141
+ - **下载整个文件夹**不是压缩包:移动云盘没有打包下载接口,插件会递归遍历后逐个下载。
142
+ - **删除进回收站**,可以在网盘里恢复。
143
+ - **写入类操作会弹审批**,这是 DSH 的安全机制,不是出错。
144
+ - **列表滚动到底会自动加载下一批**,不需要点按钮;看过的目录会被缓存,再次进入很快。
145
+ - 如果长时间不用,登录凭据可能过期,届时重新登录即可。
146
+
147
+ ## 配置
148
+
149
+ 可选,在 profile 的 `cordis.patch.yml` 里:
150
+
151
+ ```yaml
152
+ - id: dsh-mcloud
153
+ name: 'dsh-mcloud'
154
+ config:
155
+ credentialDir: '/custom/credential/dir' # 凭据目录
156
+ enableWrites: false # 设为 false 则关闭写入审批闸(不建议)
157
+ # 仅当你在 DSH 前面挂了反代 / 用自定义域名访问时才需要:
158
+ allowedAuthorities: ['dsh.example.com']
159
+ ```
160
+
161
+ ## 安全说明
162
+
163
+ `/api/dsh-mcloud/*` 是一组挂在本机 webServer 上的接口,能读写你已登录的云盘。
164
+ DSH 的 `webServer.register` 只按路径分发、**不做** Host / Origin 准入,所以插件自己
165
+ 带了一道闸(`lib/request-guard.js`),每条路由都会过:
166
+
167
+ - **Host** 必须是本部署自己的 authority(环回 / 监听器绑定 IP / `allowedAuthorities`),
168
+ 且端口要对得上监听器;
169
+ - **Origin** 必须与 Host 同源,`null` 直接拒;
170
+ - **`Sec-Fetch-Site: cross-site`** 一票否决。
171
+
172
+ 这挡住的是 DNS rebinding 和「你用浏览器打开恶意网页、它替你打本机接口」这两类攻击。
173
+ 注意 `x-dsh-mcloud: 1` 这个请求头**只是标记,不是安全边界** —— 任何网页都能自己加,
174
+ 真正起作用的是上面三条。
175
+
176
+ `npm test` 跑安全回归(24 项,含 4 条攻击路径)。
177
+
178
+ ## 文件结构
179
+
180
+ ```
181
+ lib/index.js 宿主端:网盘客户端、工具、HTTP 路由、凭据存储
182
+ lib/request-guard.js 请求闸:Host / Origin / DNS rebinding 防护
183
+ lib/login.js 账号密码登录
184
+ lib/scan-login.js 扫码登录
185
+ lib/transfer.js 上传下载的传输层
186
+ lib/client.js 会话页面板(登录页、文件浏览、右键菜单、传输进度)
187
+ cordis.patch.yml bundle patch
188
+ locale/*.json 面板标题与描述
189
+ test/ 安全回归测试(node --test)
190
+ ```
191
+
192
+ ## 免责声明
193
+
194
+ **使用本项目即表示你已阅读、理解并同意以下全部内容。如果你不同意,请不要安装或使用。**
195
+
196
+ ### 1. 与官方无关
197
+
198
+ 本项目是一个**第三方社区项目**,由个人开发者在业余时间编写,**不是中国移动、中国移动云盘(139)
199
+ 或其任何关联公司的官方产品**。我们与中国移动:
200
+
201
+ - 没有任何隶属、合作、赞助、背书或授权关系;
202
+ - 没有获得中国移动的任何许可、技术支持或数据访问权限;
203
+ - 不代表中国移动的立场,也不承担其任何义务。
204
+
205
+ 「中国移动」「移动云盘」「139」等名称与标识是其各自权利人的商标,本项目仅作**描述性使用**
206
+ (说明本工具连接的是哪个服务),不主张任何商标权利。
207
+
208
+ ### 2. 技术实现方式
209
+
210
+ 本项目通过**非官方接口**与移动云盘通信。这些接口并非公开 API,而是社区通过观察网页端
211
+ 行为整理得出(参考了 [OpenList](https://github.com/OpenListTeam/OpenList) 与
212
+ [cloud_driver_sdk](https://github.com/kong-hen/cloud_driver_sdk) 的开源实现)。
213
+
214
+ 这意味着:
215
+
216
+ - 接口**没有任何稳定性承诺**,中国移动可以随时修改、限制或关闭,且无需通知;
217
+ - 接口变更可能导致本插件**完全失效**,且不保证能及时修复;
218
+ - 部分行为(如分页上限、请求频率限制)是观察到的现象,**不保证在所有账号上一致**。
219
+
220
+ ### 3. 账号与合规风险
221
+
222
+ **你需要自行确认使用本插件不违反你与中国移动之间的服务协议。**
223
+
224
+ 需要注意的现实风险包括但不限于:
225
+
226
+ - 服务协议通常禁止使用非官方客户端或自动化工具访问服务;
227
+ - 高频或异常调用可能触发风控,导致**账号被限制、临时封禁或功能受限**;
228
+ - 中国移动可能随时调整政策,使此类第三方工具不再可用。
229
+
230
+ **因使用本插件导致的任何账号处置、服务中断、数据丢失或协议违约后果,由使用者自行承担。**
231
+
232
+ ### 4. 数据与隐私
233
+
234
+ - **你的凭据只存在你自己的机器上**,使用 Windows DPAPI(当前用户级)加密,
235
+ 不会上传到任何第三方服务器,本项目的开发者也无法获取。
236
+ - 插件只与 `*.yun.139.com`、`*.10086.cn`(登录)及文件 CDN 通信,
237
+ **不含任何统计、埋点或遥测代码**。
238
+ - 账号在界面上以脱敏形式显示(只露前 3 位与末 2 位)。
239
+ - ⚠️ **但请注意**:本项目对凭据的保管仅做到「本机 DPAPI 加密」这一层。
240
+ 如果你的电脑本身被入侵、被他人物理接触、或登录了不受信任的账号环境,
241
+ 凭据仍可能被读取。**请自行评估你所在环境的安全水平。**
242
+
243
+ ### 5. 数据完整性
244
+
245
+ 本插件会**真实地修改你的网盘内容**(上传、移动、重命名、删除)。
246
+
247
+ - 删除操作走的是回收站,通常可以恢复,但**不保证**(例如回收站被清空、或服务端策略变化);
248
+ - 上传、移动等操作可能因网络中断、接口异常而产生**不完整或重复**的文件;
249
+ - **请勿把本插件用于你无法承受丢失的数据。重要数据请自行另行备份。**
250
+
251
+ ### 6. 无担保
252
+
253
+ 本项目按「**现状**」(AS IS)提供,**不附带任何明示或暗示的担保**,包括但不限于
254
+ 适销性、特定用途适用性、以及不侵权的担保。
255
+
256
+ 作者**不对任何直接、间接、偶然、特殊、惩罚性或后果性损害承担责任**,
257
+ 包括但不限于数据丢失、利润损失、业务中断、账号损失——
258
+ 无论这些损害是如何产生的、基于何种责任理论,也无论作者是否已被告知此类损害的可能性。
259
+
260
+ ### 7. 关于 Issue 与支持
261
+
262
+ - 本项目**不提供任何形式的商业支持或 SLA**;
263
+ - 因接口变更导致的问题,作者**没有义务**修复;
264
+ - 提交 Issue 时**绝不要附带凭据(Authorization / cookie / token)或截图中的敏感信息**。
265
+
266
+ ## 许可
267
+
268
+ 本项目以 [MIT 许可](LICENSE) 发布。你可以在许可条款范围内自由使用、修改与分发,
269
+ 但**必须保留原版权声明与许可声明**。MIT 许可同样包含上述免责条款。
270
+
271
+ 详见 [LICENSE](LICENSE)。