Commit Graph

49 Commits

Author SHA1 Message Date
mediabot-pt
9b8fe439d7 fix: 编译器加 -parameters,Spring 反射获取参数名 2026-06-29 22:42:14 +08:00
mediabot-pt
e8a30d5e54 refactor: PSK 认证不再依赖账户查询,clientId 即身份
- PSK 签名通过后直接用 X-Client-Id 作为提交者标识
- 不再查 account 表,提交者=clientId
- 保留 Bearer Token 方式供 Web 管理后台使用
2026-06-29 22:34:50 +08:00
mediabot-pt
dd113ebf09 fix: PSK 复制兼容 HTTP 环境(execCommand 降级) 2026-06-29 22:17:27 +08:00
mediabot-pt
94c0d2a398 feat(par): 管理后台增加 PSK 管理页面
- 新增 /psks 页面:列表展示、生成新PSK、启用/禁用、复制密钥
- 版本号唯一,密钥支持手动输入或随机生成
- 侧边菜单增加「PSK 管理」入口
2026-06-29 22:09:23 +08:00
mediabot-pt
8565629a80 fix: 恢复 V1 原样,site_type 改动迁移到 V5
- V1: 恢复到原始 DEFAULT 'private' + 原始注释
- V5: ALTER TABLE sites MODIFY site_type DEFAULT 'unknown'
- 彻底解决 Flyway checksum 冲突,不改 flyway_schema_history
2026-06-29 21:33:34 +08:00
mediabot-pt
23fc6375fd fix: Flyway 关闭 validate-on-migrate 避免 V1 checksum 冲突 2026-06-29 21:22:44 +08:00
mediabot-pt
c7a3f653c1 fix: SiteType 改为引擎类型,与 mediabot 对齐
nexusphp/mtorrent/mteam/pttime/gazelle/unit3d/jsonapi/unknown
DB默认值 private → unknown
2026-06-29 18:20:43 +08:00
mediabot-pt
f247cc15fe docs: 更新 API.md — Manifest ETag + /time 接口 2026-06-29 17:22:04 +08:00
mediabot-pt
cbf5684abc feat: Manifest 接口支持 ETag 条件请求
- ETag = SHA256(所有 siteId + configHash 拼接)
- 客户端传 If-None-Match 命中返回 304 无数据
- 替代新增 /latest 接口,同一端点高效轮询
2026-06-29 17:21:22 +08:00
mediabot-pt
092cf22d7a docs: 添加 PAR Server 集成开发文档 (API.md)
- 认证鉴权: PSK 签名步骤 + Bearer Token 说明
- 全部公开 API 接口参考 (系统/认证/站点/配置/清单)
- 数据结构: 统一响应格式/Site/SiteConfig
- 工作流程: 首次接入/系统重建/配置更新
- Python + Node.js 完整代码示例
2026-06-29 17:09:17 +08:00
mediabot-pt
4ba9ade790 feat: 添加 GET /api/v1/time 基准时间接口
- 返回服务端 Unix 时间戳(秒)
- 客户端签名前调用此接口获取 timestamp
- 避免跨服务器时钟偏差导致 PSK 签名过期
2026-06-29 17:07:29 +08:00
mediabot-pt
bb96062b7c fix: 安全加固 — HMAC_SECRET 启动检查 + 登录锁定 + PSK 窗口配置
- SecurityCheck: 启动时 HMAC_SECRET 为空输出 ERROR 日志
- AccountServiceImpl: Caffeine 缓存实现登录失败计数/锁定
  (par.security.login-max-failures=5, login-lock-minutes=30)
- PskService: pskWindowSeconds 从 application.yml 读取
- AdminController: 清理重复 import
2026-06-29 17:05:43 +08:00
mediabot-pt
c9dc78b6ef feat: PSK 认证支持多个 X-Email 头,依次匹配账户 2026-06-29 17:00:56 +08:00
mediabot-pt
f69c75368c fix: PSK 请求恢复 X-Email 头用于身份识别
- X-Email 参与身份查找但不参与签名
- 已注册邮箱:对应该账户 accountId/trustLevel
- 未注册邮箱:accountId=0, trustLevel=TRUSTED
- audit 日志通过 authEmail attribute 追踪
2026-06-29 16:59:49 +08:00
mediabot-pt
ae8d0ed7d2 refactor: PSK 签名改为 METHOD:path:timestamp 格式
- 签名内容不再包含 email,email 仅作审计
- 改用 METHOD:path:timestamp 防重放到不同端点
- X-Email 头改为可选
- medibot 签名: HMAC(PSK, 'POST:/api/v1/sites/x/submit:1234567890')
2026-06-29 16:58:56 +08:00
mediabot-pt
311ead0e89 refactor: 彻底移除 apiSecret 认证方式,仅保留 Bearer + PSK
删除:
- HmacUtil: deriveApiKey/deriveApiSecret/verifyMediabotPsk
- HmacAuthInterceptor: apiSecret 验签/自动创建账户/readBody
- AccountService: generateApiCredentials/registerByInterceptor
- AccountDTO: apiKey 字段
- AuthController: register 返回 apiSecret
- AdminController: generateApiKey 端点
- Users.vue: API Key 列/生成密钥弹窗
- api/index.js: genApiKey

认证方式简化为两种:
  Bearer Token → Web 管理后台
  PSK 签名    → 外部集成客户端
2026-06-29 16:56:00 +08:00
mediabot-pt
5304449de6 feat: PSK 版本化管理 + DB 表 + 管理后台增删启禁
- V4 迁移: psks 表 (version, secret, description, is_active)
- PskService: 启动导入 PAR_MEDIABOT_PSK → v1, verify 遍历所有活跃 PSK
- HmacAuthInterceptor: PSK 签名优先验签,精简为 Bearer/PSK 双路径
- AdminController: GET/POST /psks + toggle 启禁
- AuthController: register/recover 改用 PskService 验证
- docker-compose.yml 新增 PAR_MEDIABOT_PSK 环境变量

mediabot 端只需: X-Signature = HMAC(PSK, 'email:ts')
2026-06-29 16:52:20 +08:00
mediabot-pt
11d0840e42 feat: Mediabot PSK 签名恢复 + 注册自动提权
- par.mediabot.psk 配置项(环境变量 PAR_MEDIABOT_PSK)
- HmacUtil.verifyMediabotPsk() PSK 签名验证
- POST /auth/recover: PSK 签名 → 返回/重建 apiKey/apiSecret → 自动 TRUSTED
- POST /auth/register: 携带 PSK 头 → 自动提升为 TRUSTED
- AccountService 新增 updateAccount

mediabot 端只需:
  const PSK = '内置密钥'
  sig = HMAC('email:timestamp', PSK)
  POST /auth/recover {email} + X-Medibot-* 头 → 拿回凭据
2026-06-29 16:44:59 +08:00
mediabot-pt
aed8035995 feat: 确定性密钥推导 + HMAC 自动恢复账户
- HmacUtil.deriveApiSecret/deriveApiKey: email+HMAC_SECRET 确定性推导
- 注册时用推导值替代随机生成(同 email 永远同 key)
- HMAC 拦截器:未知邮箱但签名匹配 → 自动创建账户
- 重装后 mediabot 直接发 HMAC 请求即可恢复,无需重新注册

核心: apiSecret = HMAC(email + ':par-api-secret', HMAC_SECRET)
      同一 email + 同一 HMAC_SECRET → 永久不变的凭据
2026-06-29 16:38:37 +08:00
mediabot-pt
92f4ed7a2a fix: 注册密码改为可选,机器注册无需密码
- RegisterRequest.password 移除 @NotBlank
- 密码为空时自动生成随机密码
- mediabot 只需 email 即可注册获得 apiKey/apiSecret
- 重装后同邮箱重新注册即可,无需记住密码
2026-06-29 16:36:24 +08:00
mediabot-pt
26c686fa69 feat: 注册时自动生成 API Key,mediabot 自注册即可获得凭据
- AccountService.register() 自动生成 api_key + api_secret
- POST /auth/register 返回 apiKey + apiSecret(一次性)
- POST /auth/login 返回 apiKey(不含 secret)
- V3 迁移自动为已有管理员生成 key

mediabot 集成流程:
  1. POST /auth/register → 得到 apiKey + apiSecret → 保存
  2. 管理员在后台提升 trustLevel 为 TRUSTED
  3. 用 apiKey/apiSecret 做 HMAC 签名调用写入接口
2026-06-29 16:34:39 +08:00
mediabot-pt
2d91552ea4 feat: API Key 静默认证 + 多邮箱支持
核心改动:
- V3 迁移: accounts 加 api_key/api_secret + account_emails 多邮箱关联表
- HMAC 验签改用 api_secret 替代密码哈希(改密码不影响集成)
- findByAnyEmail 支持主邮箱 + 关联邮箱查找
- AdminController: API Key 生成/重置 + 邮箱绑定/解绑/列表
- 前端 Users.vue: API Key 列 + 生成按钮 + Secret 复制弹窗
- 现有邮箱自动迁移到 account_emails 表

认证流程:
  旧: X-Email → account.email → passwordHash 作 HMAC key
  新: X-Email → account_emails ∪ account.email → api_secret 作 HMAC key
2026-06-29 16:30:53 +08:00
mediabot-pt
c4877f983a feat: 添加站点收录提交接口 POST /api/v1/sites/{siteId}/submit
- 支持创建新站点或更新已有站点
- HMAC 签名鉴权保护
- Swagger 文档同步可见
2026-06-29 15:09:40 +08:00
mediabot-pt
20a8983afb chore: Swagger 文档隐藏管理后台接口,仅暴露集成端点 2026-06-29 14:54:06 +08:00
mediabot-pt
bf754d058c feat: 集成 SpringDoc OpenAPI + Swagger UI 文档页面
- 添加 springdoc-openapi-starter-webmvc-ui 2.5.0
- OpenApiConfig 配置 API 标题、描述、版本、认证方案
- 文档包含 Bearer Token 和 HMAC 签名两种认证说明
- Swagger UI: /swagger-ui.html
- OpenAPI JSON: /v3/api-docs
2026-06-29 14:52:43 +08:00
mediabot-pt
40f1da1e2b feat: 用户等级改为下拉选择 + 禁止修改管理员/提升为管理员
- Users.vue: ElMessageBox.prompt → el-dialog + el-select 下拉
- Users.vue: 管理员行隐藏设置按钮,显示标签文本
- AdminController: 拒绝修改 MANAGER 账户等级,拒绝提升为 ADMIN
- 信任等级显示改为中文标签
2026-06-29 14:51:36 +08:00
mediabot-pt
7575d65428 fix: 补全管理后台缺失的 API 端点 + 修复 @RequestParam 参数名
- AdminController: 新增 GET /admin/accounts 用户列表
- ConfigController: 新增 GET /configs/pending 待审核列表
- AdminController: 修复 @RequestParam 缺少参数名导致参数绑定失败
- SiteConfigMapper/ConfigService: 新增 selectPending/listPendingConfigs
2026-06-29 14:41:36 +08:00
mediabot-pt
cd118586d2 fix: 导航栏用户显示改为 par_user 而非 token 串 + 注销同步清除 2026-06-29 14:39:23 +08:00
mediabot-pt
bb26695c34 fix: 补回 @RequiredArgsConstructor 修复编译失败 + 移除过时 Maven 参数 2026-06-29 14:29:11 +08:00
mediabot-pt
c15016d57c feat: Bearer Token 认证,修复 Web 管理后台 401 问题
- HmacAuthInterceptor 增加 Bearer Token 优先认证(Web 管理后台)
- AuthController.login 使用 hmac.secret 签发 24h 有效 token
- AccountDTO 新增 token 字段(@JsonInclude NON_NULL)
- 前端 Login.vue 存储登录返回的 token
- 原有 HMAC 签名认证不受影响(外部 API 客户端继续可用)
2026-06-29 14:20:29 +08:00
mediabot-pt
d2c226c25f feat: 添加 Flyway V2 迁移,自动初始化默认管理员账号
- 首次部署自动创建 admin@par.local (trust_level=2)
- 已有账号自动提权(member→admin)
- 幂等安全,重复执行无副作用
- 使用项目 PasswordUtil 生成 bcrypt 哈希,无外部依赖
2026-06-29 14:14:16 +08:00
mediabot-pt
a5279e0a69 fix: 静态资源配置添加 classpath:/static/ 回退路径,修复首页 500 错误 2026-06-29 13:49:34 +08:00
mediabot-pt
145f745e71 perf: 前端 Element Plus 按需导入 + 代码分割,bundle 从 1.18MB 降至 ~500KB
- 引入 unplugin-vue-components 自动按需导入 Element Plus 组件和图标
- 引入 unplugin-auto-import 自动导入 Vue/EP API(ref/reactive/ElMessage 等)
- vite.config 添加 manualChunks 拆包(vendor 独立 chunk)
- 移除 main.js 全量 Element Plus 导入和图标注册
- 所有 .vue 文件移除冗余的 import 语句
2026-06-29 13:18:59 +08:00
mediabot-pt
67b6e356e8 fix: 添加 flyway-core 版本锁定 10.15.0,修复与 Spring Boot BOM 9.22.3 冲突 2026-06-29 13:14:17 +08:00
mediabot-pt
03bcf974b1 fix: ENTRYPOINT 兼容 DB_* 和 MYSQL_* 两种变量命名,修复 MySQL 连接失败 2026-06-29 13:08:11 +08:00
mediabot-pt
0e74734636 perf: 部署步骤使用 alpine-openssh 镜像,省去每次 apk add 安装 SSH 2026-06-29 12:59:09 +08:00
mediabot-pt
180022e42d perf: 参考 mediabot 优化 Dockerfile 入口脚本和镜像元数据
- 两个 Dockerfile 同步 OCI 标准镜像标签(org.opencontainers.image.*)
- ENTRYPOINT 改为动态构造数据源 URL(MYSQL_* → SPRING_DATASOURCE_*),兼容不同环境
- 注入 APP_VERSION / APP_BUILD_TIME 环境变量,便于运行时查看版本
- 支持 JAVA_OPTS 环境变量
- 创建 /app/data /app/logs 运行时目录
2026-06-29 12:57:24 +08:00
mediabot-pt
b24ec27905 perf: 优化 CI Docker 镜像构建速度
- 新增 CI 精简 Dockerfile,直接打包 drone 预编译 jar,避免在 Docker 内重复编译(省去 npm ci + mvn 全量编译 ~15min)
- build-docker-image 步骤改用精简 Dockerfile,去掉无效的 docker pull 缓存尝试
- maven-build 步骤优化:动态检测 CPU 核数设置并行度 -T 1C/2C、增加 JVM 内存、添加 --fail-at-end
- .dockerignore 优化:CI Dockerfile 仅需 par-api/target/*.jar,排除所有源码/pom/前端文件
- par-api/Dockerfile 标注为独立多阶段构建版本(本地使用)

参考 mediabot 项目的多阶段构建思路,但将编译前置到 drone host 缓存中,Docker 构建秒级完成
2026-06-29 12:53:33 +08:00
mediabot-pt
d5fc73cad7 ci: speed up docker build with BuildKit cache mount and layer caching 2026-06-29 12:37:48 +08:00
mediabot-pt
76f975915c ci: align Dockerfile base images with mediabot (use Harbor maven-java21 + eclipse-temurin) 2026-06-29 12:24:37 +08:00
mediabot-pt
478a1e197a ci: use aliyun mirror for eclipse-temurin base images 2026-06-29 12:20:55 +08:00
mediabot-pt
7a83b1cc31 ci: fix SSH deploy by switching to alpine + openssh-client and PEM key conversion 2026-06-29 12:08:22 +08:00
mediabot-pt
c6f371af0f ci: speed up build by using Harbor images and Aliyun mirrors for Maven/npm 2026-06-29 12:05:28 +08:00
mediabot-pt
7e301ed69f ci: complete Drone pipeline referencing mediabot (frontend build, docker build, harbor push, deploy) 2026-06-29 11:22:44 +08:00
mediabot-pt
6f56cde229 feat: add Vue 3 admin frontend and integrate with backend like mediabot 2026-06-29 11:14:37 +08:00
mediabot-pt
25cd9873ae refactor: read database connection and config from environment variables like mediabot 2026-06-29 10:59:02 +08:00
mediabot-pt
13ce7d95dd ci: update Drone config for dev/test/main branch workflow 2026-06-29 10:51:06 +08:00
mediabot-pt
5b86621f81 chore: add Drone CI/CD, docker-compose, deploy script and update Dockerfile to Java 21 2026-06-29 10:49:09 +08:00
mediabot-pt
baa04b5138 Initial commit: PAR Server with Spring Boot 3.2, MyBatis-Plus, Flyway 2026-06-29 10:43:24 +08:00