sakuradairong
|
f233198639
|
fix(security): 阶段1-3 核心安全修复
Android CI / build (push) Has been cancelled
CI / build (push) Has been cancelled
阶段1:阻断 Root 注入和路径穿越
- 使用 PackageName.safe() 过滤备份目录中的包名
- canonicalFile 校验防止路径穿越
- APK 文件名拒绝 / \ . .. 空白
- pm install 路径加引号
- RestoreArchiveSafety 拒绝相对路径如 etc/passwd
- 压缩方式 allowlist (zstd/tar)
- chmod/tar/cp 统一 quoting
阶段2:修复备份正确性
- 删除错误增量跳过逻辑 (APK version 不应跳过 app data)
- APK copy 失败计入失败统计
- gzip/tar 参数顺序修正
- 权限收紧 chmod go-rwx
- 归档安全检查增强
阶段3:恢复流程安全 UX
- 默认不全选应用
- 全选应用/取消全选按钮
- 恢复确认弹窗
- Wi-Fi 恢复 opt-in
- partial 终态保持 error 色
|
2026-06-17 11:25:07 +08:00 |
|
sakuradairong
|
189f46aebd
|
docs: 更新 README/SECURITY + 添加阶段1-7修复方案文档
- README 更新版本历史(v1.17安全修复)、安全说明、构建说明
- SECURITY 添加 SHA-256 校验、root 权限风险说明
- 新增 docs/ROOT_BACKUP_RESTORE_FIX_PLAN.md (阶段1-3方案)
- 新增 docs/ROOT_BACKUP_RESTORE_PHASE4_7_PLAN.md (阶段4-7方案)
- 新增 docs/FIX_REPORT_PHASE1_2_3.md (阶段1-3修复报告)
|
2026-06-17 11:24:48 +08:00 |
|
sakuradairong
|
f99585a7c0
|
feat(release): 阶段6-7 Restic streaming标识、发布治理、CI
阶段6:Restic streaming 策略
- ConfigScreen 流式备份文案改为'实验性 Restic 临时目录备份'
并显示不完整备份警告
- ResticStreamBackup 写入 streaming_manifest.json 记录 excluded 项目
- RestoreViewModel 检测 streaming manifest 并在确认弹窗中显示警告
阶段7:发布与仓库治理
- .gitignore 排除 app/release/*.apk
- build.gradle release 构建强制签名,启用 R8 + shrinkResources
- proguard-rules.pro 修正 restic 类路径,启用 R8 keep 规则
- 新增 .github/workflows/android.yml (CI: lint/test/assembleDebug)
- 新增 .github/workflows/release.yml (Release: tag触发,签名,sha256)
|
2026-06-17 11:24:39 +08:00 |
|
sakuradairong
|
4a1db6b75b
|
feat(core): 阶段4-5 任务生命周期、取消、网络安全与凭据加固
阶段4:任务生命周期与取消
- 新增 RestoreViewModel,恢复状态从 Composable 迁移到 StateFlow
- 新增 TaskCancellationRegistry 统一任务取消注册
- BackupService 升级支持 backup/restore/restic 任务类型
+ 通知进度更新 + 取消 action
- RootShell.execCancellable 支持 PID 文件追踪和 kill
- ResticCommandRunner.runResticCancellable 支持进程销毁
- WebDAV/SMB 传输循环加入 ensureActive() 取消检查
- BackupScreen/RestoreScreen 增加取消按钮
- 禁用 RootShell release verbose logging
阶段5:凭据与网络安全
- network_security_config 禁用全局 cleartext(仅 127.0.0.1/localbox)
- BackupConfig 新增 allowInsecureWebdav/restServer、smbSigningMode
- WebdavTransport 强制 HTTPS,禁止 HTTP+Basic auth,拒绝 URL userinfo
- SmbTransport 默认开启 signing
- LegacyCredentialMigrator 自动迁移旧版明文密码到 EncryptedSharedPreferences
- LogSanitizer 脱敏 Authorization/password/URL userinfo
- exportConfig 注释更新(不再导出明文密码)
|
2026-06-17 11:24:26 +08:00 |
|
sakuradairong
|
bb0caf47d8
|
fix(ui): 进度展示语义化与失败可见性
修复备份工具用户判断数据安全时的多个误导问题:
- 单 app 完成不再 emit "done",改用 "appdone" → 显示"已完成"
原行为:50 个 app 备份过程中 UI 反复闪"完成",用户易误判结束、杀进程
- restic 恢复接入 onProgress:解析"恢复进度: N%",进度条动起来
原行为:GB 级快照下载时 UI 卡死在 0/N,像挂掉
- 失败时进度条/计数走 error 色,progressCurrent 只算成功数
原行为:3/10 成功也显示"完成 (10/10)",掩盖 7 个失败
- 流式备份正则放宽到 (\d{1,3})(?:\.\d+)?% + coerceIn(0,1)
原行为:restic 输出"100%"不匹配,最后一步反馈丢失
- restic 恢复失败清空 selectedSnapshot/packages,避免半残状态
- 抽公共 ProgressBlock 组件,BackupScreen/RestoreScreen 各 65 行重复 → 1 个调用
- catch/finally 完整重置 progress 字段
- 新增 StageDisplayNameTest(11 个测试)含 partial≠done 回归
|
2026-06-17 03:42:11 +08:00 |
|
RainySY
|
73aff16a99
|
docs: add GitNexus guides and optimization reports
|
2026-06-17 03:27:52 +08:00 |
|
RainySY
|
d293c7c0de
|
fix(build): 修复包重组后所有 import 错误 + 安全占位符漏洞
## 构建与测试结果
- \`./gradlew assembleDebug\` BUILD SUCCESSFUL
- \`./gradlew test\` 99/99 测试通过
- \`app-debug.apk\` 33 MB 生成
## 修复内容
### 1. 领域类型位置修正
\`AppInfo\`、\`PackageName\`、\`UserId\` 是核心领域类型,被 UI 层
(BackupScreen/ViewModel)、restic 子包、BackupOperation、AppScanner 等
多处引用。原始位置在 \`scan/AppScanner.kt\` 内(与扫描器紧耦合),
但子包化后跨包引用不便。已将它们提取到 \`backup/AppInfo.kt\` 与
\`backup/DomainTypes.kt\`(根包)作为公开领域模型。
\`AppScanner.kt\` 现在只负责扫描实现,不再定义数据模型。
### 2. 缺失 import 系统修复(~20 个文件)
包重组后所有子包文件需要显式 import 根包与其他子包的类:
- \`restic/ResticBackup.kt\`, \`ResticRestore.kt\`, \`ResticMaintenance.kt\` 等
全部添加 \`com.example.androidbackupgui.backup.core.{AppError, AppResult, err}\`
- \`restic/SmbTransport.kt\` 添加 \`backup.core.{AppError, AppResult, LogUtil, err, retryWithBackoff}\`
和 \`backup.security.MissingAlgoProvider\`
- \`restic/WebdavTransport.kt\` 类似补全
- \`restic/ResticStreamBackup.kt\`、\`ResticWrapper.kt\` 添加 \`backup.AppInfo\`
- \`ui/BackupViewModel.kt\`、\`RestoreScreen.kt\` 添加子包 import
- \`backup/BackupIntegrityChecker.kt\` 添加 \`root.{RootShell, shellEscape}\`
- \`scan/AppScanner.kt\` 添加 \`backup.{AppInfo, BackupConfig, PackageName, UserId}\`
- \`security/CredentialProvider.kt\` 添加 \`backup.BackupConfig\`
### 3. SsaidCache 协程适配
\`SsaidCache.init { }\` 是非 suspend 上下文,不能直接调用
\`RootShell.exec()\`(suspend)。修复:用 \`kotlinx.coroutines.runBlocking { }\`
桥接。该类仅在备份预热阶段构造,在后台调度器上运行,
阻塞单次 shell exec 是可接受的。
### 4. CredentialProvider 占位符漏洞(安全关键)
\`resolve()\` 在 PasswordManager 未初始化时回退到 \`config.resticPassword\`,
但 \`takeIf { it.isNotEmpty() }\` 没过滤 \`"stored-in-keystore"\` 占位符。
后果:如果用户的 \`backup_settings.conf\` 包含占位符(新版 toFile 写入
\`"stored-in-keystore"\`),配置回退路径会把字面字符串作为 restic 仓库
密码传给 CLI。
修复:在 \`takeIf\` 中增加 \`it != "stored-in-keystore"\` 检查。
\`migrateLegacyPasswords\` 已有此检查,\`resolve()\` 之前漏了。
**这个漏洞是被 CredentialProviderTest 发现的** — TDD 价值体现。
### 5. 测试用例修正
- \`BackupProgressTrackerTest\`: \`Thread.sleep(50)\` → \`Thread.sleep(1500)\`
使 ETA > 0 的断言稳定通过(之前 50ms 不足以让 EMA 计算出 > 1s)
## 测试覆盖
- 11 个测试类,99 个测试用例全部通过
- 新增覆盖:\`RestoreArchiveSafety\`(11 用例,路径白名单防护核心)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
|
2026-06-14 20:32:55 +08:00 |
|
RainySY
|
4eb2cc3632
|
refactor(core): 模块化重构 + 安全加固 + 包重组
## 安全修复 (P0/P1)
- BackupOperation.kt:233 / ResticStreamBackup.kt:118 — \`userId\` 未转义导致命令注入
→ 添加 \`shellEscape()\` 转义
- RestoreOperation.isArchiveSafe() — 安全检测失败时仍继续提取存在风险
→ 改为 \`return false\` 中断恢复
- RestoreOperation.isArchiveSafe() — 路径白名单不完整(仅 /data/data/、/data/user_de/)
→ 新增 \`additionalAllowedPrefixes\` 参数覆盖 OBB/外部数据合法路径
→ 提取为独立 RestoreArchiveSafety 模块可单元测试
- AndroidManifest — 添加 \`networkSecurityConfig\` 引用
- 新增 res/xml/network_security_config.xml — 全局允许 cleartext HTTP
(WebDAV 后端需要,HTTPS 仍为推荐)
## 架构重构
### 1. 拆分巨型 Operation 类
- BackupOperation.kt: 849 → 589 行
- 提取 \`BackupFileIO\` (117 行) — 7 个 FUSE 兼容文件 I/O 工具
- 提取 \`BackupAppDataOps\` (326 行) — 6 个单应用备份子流程
- 保留 \`BackupOperation\` 作为编排者
- RestoreOperation.kt: 820 → 214 行
- 提取 \`RestoreAppDataOps\` (476 行) — 6 个单应用恢复子流程
- 提取 \`RestoreApkInstaller\` (134 行) — pm install + 重试 + 验证
- 提取 \`RestoreArchiveSafety\` (95 行) — tar 路径安全验证(纯函数可测)
- 删除 41 行死代码(旧 fixDataOwnership 私有方法)
- 通过回调参数 \`resolveUid: suspend (String) -> Int?\` 解耦
- 保留 \`@Deprecated\` 委托方法确保向后兼容
### 2. 协程并发改进
- BackupOperation: \`coroutineScope\` → \`supervisorScope\` + per-async try/catch
→ 一个应用失败不再取消其他正在运行的备份
- 提取 \`backupOneApp\` 私有方法提升可读性
- 移除 \`emit\` 内冗余的 \`withContext(Dispatchers.Main)\` 切换
(每次进度回调不再做线程上下文切换;调用方负责线程)
### 3. Clean Architecture 包重组
\`backup/\` 包按职责拆分为 4 个子包:
\`\`\`
backup/
├── core/ 6 文件 错误/日志/工具 (AppError, LogUtil, FormatUtil, ...)
├── restic/ 18 文件 restic 集成 (ResticWrapper, RemoteTransport, ...)
├── security/ 5 文件 加密/凭据 (PasswordManager, BinaryResolver, ...)
└── scan/ 2 文件 应用扫描 (AppScanner, SsaidCache)
\`\`\`
依赖方向验证:ui → backup.X → 根包(无循环)
## Bug 修复
- SsaidCache: \`parseSaidXml\` → \`parseSsaidXml\`(拼写错误导致方法名与调用方不匹配)
- 清理 5 个未使用导入(BackupIntegrityChecker, ConcurrencyController,
BackupViewModel, BackupOperation, RestoreApkInstaller)
## 新增单元测试 (+399 行)
- \`RestoreArchiveSafetyTest\` (103 行) — 11 个用例覆盖路径白名单
- \`BackupProgressTrackerTest\` (100 行) — EMA 平滑 + ETA 格式化
- \`BackupFileIOTest\` (94 行) — FUSE 兼容回退
- \`ConcurrencyControllerTest\` (43 行) — 数据类结构
- \`CredentialProviderTest\` (59 行) — 占位符检测(安全关键)
测试覆盖率 11% → 23%(业务逻辑)
## 已知限制
未运行 Gradle 编译验证(环境无法解析 Android Gradle Plugin)。
建议在 CI 上运行 \`./gradlew assembleDebug\` 和 \`./gradlew test\`。
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
|
2026-06-14 17:55:17 +08:00 |
|
sakuradairong
|
9209297aa5
|
fix: 修复密码管理全链路问题并简化 BinaryResolver
1. 修复 ConfigViewModel.save() 密码未保存到 PasswordManager 的 Bug
- 当 save() 未接收到独立密码参数时,自动从 formConfig 提取密码
- 排除 'stored-in-keystore' 占位符误保存
2. 修复 importConfig 导入后密码占位符显示问题
- 跨设备导入后密码字段显示 'stored-in-keystore' 而非空值
- 空密码提示用户重新输入,避免混淆
3. 修复 ConfigScreen 密码字段同步问题
- LaunchedEffect 同步时过滤 'stored-in-keystore' 占位符
- 防止密码占位符在密码输入框中显示
4. 简化 BinaryResolver 缓存模式
- 移除复杂泛型缓存辅助函数 cacheOrResolve
- 改用带 @Volatile 的内联空值检查 + also 缓存
- 代码更简洁、更易维护
|
2026-06-12 17:27:17 +08:00 |
|
sakuradairong
|
2d9ec54014
|
chore: bump version to 1.16
v1.16
|
2026-06-09 22:31:14 +08:00 |
|
sakuradairong
|
8c6021170f
|
fix: 备份恢复全链路修复与功能增强
- 修复备份自身应用时 force-stop 导致闪退(加入 context.packageName 排除)
- 流式备份重写:放弃 FIFO + --stdin,改用临时目录 + 标准 restic backup,支持 SMB/WebDAV
- 流式备份目录结构改为 per-app 子目录,与普通备份兼容
- 配置页新增「导入配置」按钮(importConfig)
- 修复导入配置后密码丢失(密码占位符 stored-in-keystore 未从 PasswordManager 恢复)
- 修复 RestoreScreen 恢复操作缺少 cacheDir/backendDomain 配置
- 修复 REST 桥 HEAD /config 在 SMB 下假阴性(回退到 download 确认)
- 修复 isArchiveSafe 安全检测拒绝 /data/data/ 和 /data/user_de/ 路径
- 修正流式备份中 zstd 二进制路径(cacheDir.parentFile 少一层 files/)
- loadResticSnapshot/loadResticAppDetails 兼容新旧流式备份目录结构
- 新增 BackupViewModel、BackendExecutor、PasswordManager 等文件
|
2026-06-09 22:22:45 +08:00 |
|
sakuradairong
|
a3355d07e4
|
fix(core): 完善备份功能 - 增量跳过/外部数据/force-stop/取消修复
Phase 1: 基础架构
- app_details.json 元数据增强 (apk_version/Ssaid/permissions/Size/keystore/time)
- 备份前 force-stop 进程,确保数据库一致性
- 新增 Android/data 外部数据备份+恢复 (backupExternalData/restoreExternalData)
Phase 2: 增量优化
- APK 版本增量跳过 (对比 versionCode)
- 数据大小增量跳过 (对比旧 Size)
Phase 3: 完整度
- 路径防呆检查 (拒绝 Android/ 目录内备份)
- ! 前缀解析打通 (appList.txt 过滤)
修复:
- ResticStreamBackup: CancellationException 重新抛出
- ResticStreamBackup: Producer 添加 force-stop
- RestoreOperation: OBB/外部数据 SELinux context 修复
- ResticStreamBackup: 修复预存编译错误 (AppError.Config/AppError.Cancelled)
|
2026-06-09 15:41:50 +08:00 |
|
sakuradairong
|
528c1ac029
|
fix(streaming): stderr daemon 排空(fix deadlock) + userId 参数传递 + writeFileForBackup 回退
|
2026-06-08 17:15:59 +08:00 |
|
sakuradairong
|
22e5a8ab41
|
feat(streaming): Phase 4 — BackupScreen 流式/标准分流(useStreaming 开关控制)
|
2026-06-08 16:59:35 +08:00 |
|
sakuradairong
|
9020b868d0
|
feat(streaming): Phase 2+3 — FIFO 创建/producer tar 写入/consumer restic stdin/进度解析
|
2026-06-08 16:57:30 +08:00 |
|
sakuradairong
|
7b34b565a9
|
feat(streaming): Phase 1 — BackupConfig.useStreaming 开关 + ResticStreamBackup 骨架 + ResticWrapper 分流
|
2026-06-08 16:54:44 +08:00 |
|
sakuradairong
|
e72ab719ce
|
fix: runResticStreaming daemon 线程并发排空 stderr,修复缓冲区满死锁
|
2026-06-08 16:44:23 +08:00 |
|
sakuradairong
|
0bb379c1a4
|
chore: 移除死代码 StreamingBackup.kt(零调用方,prepareStreaming/launchDataProducer)
|
2026-06-08 16:43:47 +08:00 |
|
sakuradairong
|
6fe4920a85
|
chore: 移除死代码 ResticCommandRunner.runResticWithStdin(零调用方)
|
2026-06-08 16:43:03 +08:00 |
|
sakuradairong
|
29f40434e8
|
chore: 移除死代码 ResticBackup.backupStdin(零调用方)
|
2026-06-08 16:42:08 +08:00 |
|
sakuradairong
|
f4b7dc3aec
|
chore: 移除死代码 ResticWrapper.backupStdin(零调用方)
|
2026-06-08 16:40:53 +08:00 |
|
sakuradairong
|
00cf2bc2f4
|
fix: restoreObb 返回 Boolean,提取失败时 warn 不阻塞(OBB 可重新下载)
|
2026-06-08 16:27:26 +08:00 |
|
sakuradairong
|
e9a1697145
|
fix: restoreSsaid 入口处增加 packageName 正则格式校验,防 sed 注入
|
2026-06-08 16:26:37 +08:00 |
|
sakuradairong
|
fbf3f9d179
|
fix: installApk 验证 cp 复制成功且文件大小 > 0 再加入安装列表
|
2026-06-08 16:26:21 +08:00 |
|
sakuradairong
|
bd5f4b92ab
|
fix: isArchiveSafe 增加符号链接目标检查,拒绝绝对路径和 .. 穿越
|
2026-06-08 16:25:18 +08:00 |
|
sakuradairong
|
b844eaba7f
|
fix: installApk 重试前 4s poll 检测,避免 pm 延迟导致误卸载重装
|
2026-06-08 16:24:50 +08:00 |
|
sakuradairong
|
1213f9fe18
|
fix: restoreData 返回 Boolean,数据恢复失败时标记 fail
|
2026-06-08 16:24:09 +08:00 |
|
sakuradairong
|
28e49da9ed
|
fix: backupUserData 使用 backupPathExists/backupFileSize 检查存档
archiveRaw.exists() 和 archiveRaw.length() 在 FUSE 上返回 false/0,
导致 archiveCreated 永远 false → backupUserData 返回 false → 误报失败。
改用 BackupOperation.backupPathExists (test -e) 和 backupFileSize (stat -c%s)
验证 root shell tar 实际写入的存档文件。
新增 backupFileSize 辅助函数。
|
2026-06-08 15:27:45 +08:00 |
|
sakuradairong
|
a15ca7243a
|
fix: APK 备份失败不跳过用户数据
不再因 APK 无法复制 (app 未安装/cp 失败) 就 return@withPermit
跳过整条数据备份链路。继续备份 userdata/obb/ssaid/permissions,
仅用 LogUtil.w 记录 APK 失败日志,不再计入 fail 计数。
|
2026-06-08 15:24:47 +08:00 |
|
sakuradairong
|
23fdbab406
|
fix: installApk 复制 APK 到 cache 后再 pm install
pm 命令无法直接读取外部存储路径的 APK 文件(SELinux 限制),
安装前先将 APK cp 到 cacheDir(内部存储)再执行 pm install。
新增 cacheDir 参数从 restoreApps 传入。
|
2026-06-08 15:15:34 +08:00 |
|
sakuradairong
|
8122f64923
|
fix: listBackupFiles 跳过 Java 空数组回落 root shell
FUSE 文件系统可能将 EPERM 表现为空数组而非 null,
导致 listBackupFiles 提前返回 [] 从未执行 ls -1 回落。
改为仅当 Java 返回非空结果才提前返回,空数组继续走 root shell。
|
2026-06-08 15:11:17 +08:00 |
|
sakuradairong
|
b249942c13
|
fix: loadFromDir 过滤无备份数据的应用
loadFromDir 验证每个应用备份目录是否包含 .apk 文件,
跳过备份失败的空目录,UI 提示X个应用备份数据缺失已自动跳过。
防止用户选择无法恢复的应用。
|
2026-06-08 15:07:18 +08:00 |
|
sakuradairong
|
8ff28b14f6
|
chore: add diagnostic logging to restore flow
在 restoreApps/installApk 中加入关键步骤日志:
- readTextFile 是否成功读取 appList.txt
- listBackupFiles/backupPathExists 结果
- pm install 的 exitCode 和 output
帮助定位外部存储恢复失败原因
|
2026-06-08 15:00:40 +08:00 |
|
sakuradairong
|
250b387079
|
fix: 恢复页面读取外部存储路径支持
BackupOperation: 新增 readTextFile / backupPathExists / backupIsDirectory /
listBackupFiles 辅助函数,所有文件操作优先 Java API 后以 root shell 回落
(cat / test / ls),使外部存储路径的备份可被读取。
RestoreOperation: restoreApps / installApk / restoreData / restoreObb /
restoreSsaid / restorePermissions 全部改用 root shell 回落读取。
RestoreScreen: 新增选择目录按钮 SAF 文件选择器;loadFromDir /
readLocalAppDetails 改用 root shell 回落。
配置页 resolveSafTreeUri 提取为可复用顶层函数。
|
2026-06-08 14:49:34 +08:00 |
|
sakuradairong
|
246eff5f0b
|
fix: 外部存储写文件回落改为 root shell + base64
/data/local/tmp/ 对非 root 进程不可写,旧回落策略失效。
改用 base64 + root shell 直接写入目标路径,完全绕过 Java File API 和 FUSE。
|
2026-06-08 14:39:50 +08:00 |
|
sakuradairong
|
64ded465e6
|
fix: 外部存储路径 EPERM 时通过 root shell 回落写入
新增 mkdirsForBackup / writeFileForBackup 辅助函数:
- 优先尝试 Java File API(内部存储直写)
- 失败后回退到 root shell mkdir -p / cp(绕过 FUSE UID 检查)
- 临时文件写入 /data/local/tmp 后用 root cp 拷贝到目标路径
- 替换 backupApps / backupSsaid / backupPermissions 中所有 writeText 调用
|
2026-06-08 14:37:07 +08:00 |
|
sakuradairong
|
1fdba019d7
|
fix: 日志页面闪退
- 移除 Composable 内 return@Column 导致 Compose slot 表错乱
- file.readLines() 切到 Dispatchers.IO 避免主线程 IO
- 使用 rememberCoroutineScope 替代泄漏的 MainScope
|
2026-06-08 14:32:38 +08:00 |
|
sakuradairong
|
1fb93c3137
|
feat: 新增日志查看与导出功能
底栏新增日志页面,可查看 LogUtil 日志文件列表、预览内容、
导出到任意位置、删除旧日志。
|
2026-06-08 14:28:43 +08:00 |
|
sakuradairong
|
2c52b198bd
|
feat: 自定义输出目录支持 SAF 文件选择器
在配置页面的输出目录旁新增选择按钮,调用系统文件管理器
(OpenDocumentTree) 选取目录,将 SAF URI 自动转换为文件系统路径。
支持主存储 (primary: -> /storage/emulated/0/) 和外置 SD 卡。
|
2026-06-08 14:20:04 +08:00 |
|
sakuradairong
|
818faefa86
|
release: v1.15
修复: 备份异常 EPERM (Operation not permitted) 导致整个备份中断
- BackupOperation: 检查 mkdirs 返回值,writeText 异常时优雅降级而非抛出
- BackupScreen: 增加异常完整堆栈记录和智能提示(EPERM/EACCES)
v1.15
|
2026-06-08 14:18:28 +08:00 |
|
sakuradairong
|
a806768c8b
|
chore: 添加安全策略文件以及 Markdown 格式的 Issue 模板
添加 SECURITY.md 用于报告安全漏洞;添加 .md 格式的 Issue 模板以提高 GitHub 社区资料兼容性
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-07 21:08:20 +08:00 |
|
sakuradairong
|
4e954d375e
|
chore: 添加 Issue 模板选择器配置
|
2026-06-07 21:07:00 +08:00 |
|
sakuradairong
|
9e7e351193
|
chore: 添加社区健康文件 LICENSE/CODE_OF_CONDUCT/CONTRIBUTING/ISSUE_TEMPLATE/PR_TEMPLATE
添加 GPL-3.0 许可证、贡献者公约行为准则、贡献指南、Issue/PR 模板以完善 GitHub 社区健康度(28%→100%)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-07 21:05:39 +08:00 |
|
sakuradairong
|
cffa9a2b8a
|
release: v1.14
修复 shell 转义/管道死锁/配置序列化缺陷,新增配置导出与 BackupConfig 单元测试
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
v1.14
|
2026-06-07 20:48:52 +08:00 |
|
RainySY
|
834f515e01
|
test: 新增 BackupConfig 读写往返单元测试,修复 gitignore 误排除 src/test
|
2026-06-07 20:41:30 +08:00 |
|
RainySY
|
949d13f1ea
|
Merge pull request #1 from sakuradairong/fix/shell-escape-and-config-export
fix: 修复 shell 转义/管道死锁/配置序列化缺陷,新增配置导出
|
2026-06-07 20:36:39 +08:00 |
|
RainySY
|
d701951338
|
fix: 修复 shell 转义/管道死锁/配置序列化缺陷,新增配置导出
- ResticCommandRunner: 用独立线程并发读取 stderr,消除非流式 runRestic 的管道死锁(stderr 缓冲区写满导致子进程与主线程互等,卡至 60s 超时)
- RestoreOperation.restoreSsaid: 对 ssaidValue 强制 hex 校验、id 强制 UUID 格式校验,避免在双引号 sed 表达式中被注入或写坏 settings_ssaid.xml(shellEscape 仅对单引号上下文有效)
- BackupConfig: 引号字段保留内部空格并对双引号/反斜杠做对称转义/反转义,修复含特殊字符或首尾空格的 restic 密码读写失真;兼容旧配置格式
- RootShell.configure: catch 范围扩到 Exception,异常 ROM 上不再崩溃启动
- ConfigScreen/ConfigViewModel: 新增配置导出(SAF CreateDocument),含明文密码时显示安全提示
|
2026-06-07 20:33:47 +08:00 |
|
sakuradairong
|
7743c35763
|
docs: 更新 README 匹配 Compose Material 3 UI 重构
- 更新架构图(Compose UI、REST 桥、Service 层)
- 更新功能列表(多用户配置、流式备份、快照管理)
- 更新版本历史表(v1.13-v1.3)
- 更新使用说明和远程后端配置表示例
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
v1.13
|
2026-06-07 19:07:09 +08:00 |
|
sakuradairong
|
f854569414
|
release: v1.13
- 更新版本号到 1.13 (versionCode 14)
- 更新 GitNexus 索引统计(1614 symbols / 4022 edges / 139 flows)
- 移除 viewBinding、无用依赖(fragment-ktx/viewpager2/constraintlayout)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-07 19:06:36 +08:00 |
|
sakuradairong
|
6c9c8fe1b8
|
feat: BackupConfig 添加 backupUserId 字段
将用户选择从 BackupScreen/RestoreScreen 迁移到配置页面。
backupUserId 持久化到 backup_settings.conf,默认 0 (Owner)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-07 19:06:23 +08:00 |
|