Commit Graph
83 Commits
Author SHA1 Message Date
TermiNexus 6e16c0d3b7 feat(msync-app): App 表 Source/ServiceName/ServiceDomain 字段 + 远端清单同步(SyncRemoteAppManifests,幂等 upsert + 本地冲突检测) 2026-08-13 23:57:58 +08:00
TermiNexus 345abe88bb feat(ram): RAMGrant 建表迁移 + 菜单过滤 RAM 角色粒度集成(无策略保持全员可见) 2026-08-13 23:55:55 +08:00
TermiNexus b1dd91dde0 fix(crb): 清理 Menu.CompanyUUID select_related 残留(FK→UUIDField 收敛后 FieldError),修复 /API/wallet 500 2026-08-13 19:36:17 +08:00
TermiNexus 31f341d1f4 fix(migrations): 0028 回填改用迁移状态字段名(小写)并补 Menu.TenantUUID,migrate 全部应用
- 0028 回填 Company/关联表历史字段名(tenant_uuid/company_uuid)匹配既有迁移状态
- gerp Menu 补 TenantUUID 字段(与已执行 DB 列对齐)
- migrate 完成:0028 回填 54 行(fake 标记,AddField 已由 MySQL DDL 提交)、0029 FK→UUIDField、token_blacklist 建表
2026-08-13 18:19:27 +08:00
TermiNexus a208dbb02a chore(tools): 根目录散落工具脚本归位 tools/ 目录
- find/listdir/r/sound/SendWX 及 WARN.mp3 移入 tools/(sound.py 相对路径同目录保持可用)
- Version 死代码(import 自增 VER)归档 tools/Version
- Main.py(生产入口候选)与 TODO 保留根目录待确认
2026-08-13 18:15:30 +08:00
TermiNexus 727fbba272 fix(tasks): stats 任务套重试 + PurgeOld 全周期清理;攻击日志写库限频去重
- 四个 stats 任务加 RetryOnFailure(2 次重试)
- PurgeOldStats 清理 daily/monthly/hourly 全周期
- AttackDetectMiddleware 同 IP+类型 60s 窗口去重,防 401 刷屏反向写库放大
2026-08-13 17:55:56 +08:00
TermiNexus 221c5d9e9d fix(security): 移除 core.User 默认密码哈希后门,异常堆栈改 logging 落盘
- UserPassword 默认值改为空串(防默认口令,须经注册/重置流程设置)
- exception_handler print→logging(日志可审计)
- ip_filter 默认 disabled 语义注释(生产需显式配置并挂载)
2026-08-13 17:55:55 +08:00
TermiNexus e76a5b359e security(jwt): 收敛 token 生命周期(168h→24h)并启用 refresh 轮换黑名单
- ACCESS_TOKEN_LIFETIME 默认 24h(缩小泄露窗口)
- BLACKLIST_AFTER_ROTATION 默认开启,注册 token_blacklist app
- LOGGING 增加 RotatingFileHandler 落盘(django.log)
- USE_TZ=False 决策文档化(存量 naive UTC 时间戳无法安全切换)
2026-08-13 17:55:54 +08:00
TermiNexus 67c4d03597 docs(settings): 文档化 AUTH_USER_MODEL 不可行决策(core.User 非 AbstractBaseUser,改设需重建 auth 框架) 2026-08-13 17:52:34 +08:00
TermiNexus e2944e13d2 fix(form_service): 适配 UUIDField 收敛——消除 ForeignKey attname(_id) 硬编码依赖
- 工单创建人/指派人读取与注入改用字段名(兼容 _id 遗留键)
- CompanyInfo 租户查重、部门成员计数过滤改字段名
- AttackDetectMiddleware 异常日志写入改字段名,测试断言同步
2026-08-13 17:52:17 +08:00
TermiNexus 5127ca4166 refactor(models): 模型双轨收敛——gerp 侧 31 处 ForeignKey 改 UUIDField,与 SDK 映射对齐
- models.py: Tenant/Company/Dept/WorkOrder/Message/Menu 等 31 处 FK→UUIDField(db_column 不变)
- 8 张有 CompanyUUID 的表补齐 TenantUUID(Dept/Workgroup/FileAsset/Menu/WorkgroupRole/UserRoleWorkgroup/UserRoleDepartment/CompanyApp)
- 迁移 0028 扩展回填全 8 表;迁移 0029 AlterField 对齐字段类型(DB 列无实际变化)
- 消除 select_related/_id 行为差异,SDK 与主库模型字段类型统一
2026-08-13 17:52:08 +08:00
TermiNexus 77e676e55f feat(tenant): Dept/Workgroup 补 TenantUUID 列 + 回填迁移,消除跨表隔离反射补偿
- gerp 模型 Department/Workgroup 新增 TenantUUID(nullable)
- 迁移 0028:AddField + RunPython 从 Company.TenantUUID 回填(待 migrate 执行)
- 配合 SDK 映射同步加字段,组织表结构对齐
2026-08-13 17:42:58 +08:00
TermiNexus 88c657660d refactor(role_scope): 数据权限表级特判改策略注册表
- 新增 TableScopeFilter 策略基类 + User/UserRole/Order 三个注册实例
- ApplyScopeToQueryset 改为注册表分发,新增 RegisterScopeFilter 扩展入口(开闭原则)
- 行为与原有 User/UserRole/Order 特判完全一致
2026-08-13 17:40:24 +08:00
TermiNexus e0af444c31 refactor(auth): JWT 认证链路复用 SDK ResolveRoleContext,消除角色解析双实现 2026-08-13 17:40:23 +08:00
TermiNexus 0a21d0bb30 feat(community): 头像 API——ugm 按 UserUUID 头像接口改公开(AllowAny),社区接口返回 AuthorAvatar 字段;GVSite 指针更新 2026-08-13 10:30:58 +08:00
TermiNexus 71c8ea8ae5 fix(community): SUBDOMAIN_CONFIG 注册 discuss/community/comm 子域(dir='' root_is_index)——discuss.gvsds.com 等根路径直达 GVSite SPA 社区 2026-08-13 10:22:14 +08:00
TermiNexus 3fd22c24eb feat(community): 官网社区后端——CommunityBoard/Category/Post/Reply/Like 五表 + /API/Community/* 接口(板块/帖子/详情/发帖/回复/点赞),注册 app 与路由;GVSite 指针更新(社区前端) 2026-08-13 10:18:01 +08:00
TermiNexus b41d90c998 feat(app): 应用配置公司化——AppConfig 增加 CompanyUUID(空=租户默认),读取回退链(公司→租户默认→模板默认),新增批量复制接口 Config/Copy,权限按管理范围校验 2026-08-13 08:48:05 +08:00
TermiNexus c122f80261 feat(app): ListMarket 支持可管理公司安装分布(InstalledCompanies),市场接口对管理员附带管理范围内已装公司名 2026-08-13 08:34:58 +08:00
TermiNexus d6c72b5ef9 fix(app): Install/Uninstall 公司权限校验 c.hex 改 c.hex()——UUIDObj 无 hex 属性导致权限误判(403/500) 2026-08-13 08:22:21 +08:00
TermiNexus 06d43b5a6e feat(gerp): 真应用注册协议 Manifest + 严格可用收紧 + 应用配置
- 新增 app_manifests.py:应用清单协议(元数据/菜单/前端入口/配置模板),内置6应用
- 菜单由 Manifest 全权管理:安装注入(挂已知父菜单)/卸载删除,删除手工 menu 项
- App 表新增 FrontendRoute/FrontendType/LegacySrc(0025);新增 AppConfig 键值表(0026)
- app_manager 配置服务(模板/读取/保存)+ AppConfigView(/API/App/Config)
- 严格收紧:AppAccessPermission 移除管理员豁免、menu 过滤全员执行按 Manifest 全菜单
- mail/gitea 管理视图补挂应用权限;Uninstall 支持 TenantOnly
- ManageCompanies 支持按应用查公司安装状态;修复 UUIDObj 无 .hex(转 bytes)
- 新增 sync_apps 管理命令(按安装状态收敛菜单)
2026-08-13 07:47:07 +08:00
TermiNexus 4de301aa78 feat(app): 公司级+租户级双粒度应用安装——CompanyApp 表、Install/Uninstall 支持指定公司、可管理公司范围校验(super/tenant/company)、CheckAccess 公司维度 2026-08-13 06:28:28 +08:00
TermiNexus 904e225b90 feat(app): 应用级访问控制——AppAccessPermission 权限工厂挂载邮箱/Gitea/商店/储值/钱包/企业 API(未安装租户拒绝,管理员豁免) 2026-08-13 05:34:42 +08:00
TermiNexus 63eda7437f fix(menu): MenuListCompatView 字典迭代中修改报错——子孙收集与移除逻辑移出 for 循环(GERP系统/应用中心父级菜单过滤) 2026-08-13 04:33:04 +08:00
TermiNexus b55dd2b966 feat(gerp/system): GERP系统一级菜单(admin:super 专属)——状态/时序/secrets.ini/运行时 API + 菜单过滤支持 admin:super 专属 2026-08-13 04:20:30 +08:00
TermiNexus a6fb0ca7cf feat(gerp/app): 功能/应用体系——App/TenantApp/UserApp 三表 + 应用中心服务层/API + 菜单按安装状态过滤 2026-08-13 04:06:15 +08:00
TermiNexus 0d019c1c8e feat(gerp/form): CompanyInfo 同一租户仅一条,防重复提交(epcreate 打通) 2026-08-13 02:39:42 +08:00
TermiNexus 139c2514c3 feat(oidc): 泛化 OIDC Provider 为多客户端并支持 user 身份策略
- secrets 新增 sections() 枚举配置段,客户端按 [oidc_client_<id>] 自动注册
- 身份策略 IDENTITY 支持 gitea(绑定 Gitea,sub=用户名)/ user(sub=UserUUID,全用户开放)
- authorize/token/userinfo 按 client_id 校验凭据与回调,code 绑定客户端防串用
- [gitea_oidc] 默认客户端行为零差异,兼容现有 Gitea 免密登录
2026-08-13 01:18:00 +08:00
TermiNexus bae47dae8c fix(gerp/mail): 邮箱名统一小写化,与 Stalwart 规范化存储保持一致 2026-08-13 01:06:36 +08:00
TermiNexus 164fbb9b76 feat(gerp/mail): 支持用户注册多个企业邮箱,上限 5 个
- MailApply 上限由 1 改 5,超出提示"邮箱数量已达上限"

- MyMailbox 返回 MailboxList 数组(按创建时间倒序),替代单 Mailbox

- ChangePassword/Login 支持可选 MailboxName 指定目标邮箱,缺省取第一个
2026-08-13 01:00:37 +08:00
TermiNexus 39e231bfbf fix(oidc): OIDC 端点禁用 DRF 默认 JWT 认证,修复 userinfo 401
DRF CustomJWTAuthentication 会把 Gitea 回传的 RS256 id_token 当 simplejwt token 解析失败返回 401;全部 OIDC 视图 authentication_classes=[],token/userinfo 各自自行校验凭据
2026-08-11 16:49:59 +08:00
TermiNexus 0b3620223c fix(oidc): id_token 补充 nickname claim(Gitea 默认按 nickname 取用户名) 2026-08-11 16:44:45 +08:00
TermiNexus 7b83db89d8 feat(gitea): GERP 作为 OIDC Provider 实现 Gitea 免密登录(SSO)
新增 /oidc/authorize|token|jwks|userinfo 与 /.well-known/openid-configuration:authorize 校验 GERP 会话自动授权,token 经 client 凭据换 RS256 id_token(sub/preferred_username/email 携带 Gitea 用户名);SessionConfig 输出 SsoUrl 供前端跳转 Gitea OAuth2 入口
2026-08-11 16:38:42 +08:00
TermiNexus 6c7664ae6e feat(sve): 注册 sve.gvsds.org 子域托管 TempLate/SVE,重构 SveID 编解码并兼容存量 CVSS 数据
- core/views.py 注册 sve 子域 -> SVE 目录
- sve/views.py:SveID 按 0x0YYYYNNNNN(5 字节 hex)编解码,兼容补零/文本存量形态;SveCvss 兼容小写键 score/severity/vector
- 删除 TempLate/Org 原生 SVE 页面
- .gitignore 排除 /SVE/ 与 /TempLate/SVE/
2026-08-11 16:28:52 +08:00
TermiNexus 6babdb95fd fix(gitea): 申请记录补传 UserGiteaAccountUUID 主键,修复 Duplicate entry '\x00'
创建 UserGiteaAccount 时漏传主键 UserGiteaAccountUUID,UUIDField 无默认值导致主键存全零字节,第二次申请触发 MySQL 主键冲突;与 mail.py 模式对齐补 uuid4().bytes
2026-08-11 16:17:51 +08:00
TermiNexus bef6594c76 fix(gitea): 创建组织团队补全 units 字段,修复加入组织失败
新版 Gitea 创建团队必填 units(单元权限),否则 POST /orgs/{org}/teams 返回 500 units permission should not be empty;GetOrCreateMemberTeam 创建 Members 团队时补 repo.code/issues/pulls/releases/wiki
2026-08-11 16:13:47 +08:00
TermiNexus 840be961f6 fix(mail): ChangePassword 增加旧密码校验,Stalwart 业务错误显式抛出
mail.py: 新增 _VerifyMailboxPassword(Basic 认证 JMAP discover),ChangePassword 必填 OldPassword 并先验证(缺→400/错→401/异常→502),Login 复用同一校验

stalwart.py: _Request 识别 HTTP 200 + {error} 业务错误并抛 StalwartMailError(notFound 仅 GetMailbox 放行),写操作遇 notFound 不再静默假成功
2026-08-11 01:22:09 +08:00
TermiNexus 1a73483db5 fix(atest): 中风险项修复——重连锁协议/OGM 键名/RemoteCallDemo
- _DoReconnect 互斥锁移入内部,修复 force_deregister 路径锁协议破坏
- 订单 OGM 键名 GlobalID→ObjectGlobalID(映射不再丢失)
- RemoteCallDemo 对 requests.Response 先解析 JSON,避免 500
- 补充 Compensate 状态守卫回归用例(20/20 通过)
2026-08-10 23:32:10 +08:00
TermiNexus feee433e50 fix(atest): 去除 manage.py 硬编码密钥口令 + SIO 初次连接失败兜底重连
- manage.py 强制环境变量注入,删除默认 SECRET_KEY/MSYNC_SERVICE_SECRET/DB_PASSWORD
- sio_client 初次连接失败启动兜底重连线程,消除永久退化态
- 补充 RetryStep 手动重试与状态守卫回归用例(17/17 通过)
2026-08-10 23:29:34 +08:00
TermiNexus f3cb513584 fix(msync): 版本升至 1.1.0,Saga 缺陷修复 + ATestCServer 本地事务端点 + 文档修正
- gvsds/settings.py 版本要求升至 1.1.0
- 新增 Saga 状态机回归测试(sqlite 内存库,12 项断言,独立运行)
- ATestCServer:新增 local/execute、local/compensate、local/handlers 端点
  (主服务器 Saga 驱动子服务器步骤),主服务器令牌经 introspect 远程校验
- SAAS_ARCHITECTURE.md:msync 双包描述更新、Role/Permission 双份收敛标注、
  ABAC 定位更正为属性标识符补充层
2026-08-10 22:39:08 +08:00
TermiNexus 7360235143 refactor(msync): msync 下沉 gvsdsdk,gvsds 侧引用全面切换
- 删除 gvsds/apps/msync(整体搬迁至 gvsdsdk/msync,git 识别为 rename)
- settings/urls/Main.py/gerp 视图引用切换至 gvsdsdk.msync
- gvsds.common.Serializer 改为从 gvsdsdk.serializer_base re-export
2026-08-10 22:26:39 +08:00
TermiNexus 34a13b3dce fix(msync): 分布式事务可靠性加固 + 子服务器强制密钥认证
- Saga #1:_call_service 异常兜底,非 2xx / 非法 JSON / requests
  异常统一转 StepExecutionError,失败必进补偿,事务不再悬挂 Running
- Saga #2:补偿失败步骤置 FAILED,新增 RetryCompensate(select_for_update
  + atomic)可重试补偿,全部补偿后事务置 COMPENSATED;新增 HTTP 端点
  tx/<code>/retry-compensate/ 与 SIO 事件 msync:tx:retry_compensate
- 密钥认证:Register 强制新节点携带 ServiceSecret 并校验 hash 自洽;
  HTTP 心跳/注销/OGMQuery/事务视图补 ServiceToken 鉴权(仅限本服务)
- 密钥认证:SIO 17 个业务事件要求 msync:auth 密钥认证,注销防伪造服务名
2026-08-10 08:09:18 +08:00
TermiNexus 7dab803ef3 feat(gitea): 银河锋锐 Gitea 对接(申请/认领/改密/头像迁移 API + UserGiteaAccount) 2026-08-09 18:28:56 +08:00
TermiNexus d4558fbacb feat(doc): Document 系列表重设计(可空系列 UUID + DocFormat 双格式)与 doc 子域动态 API,删除旧静态阅读页 2026-08-09 01:50:24 +08:00
TermiNexus 6c2eb5cdb7 feat(mail): 联系人 DELETE 接口(按 UUID 或邮箱删除)
- MailContactsView 增加 delete 方法 - 同步部署产物 index.html
2026-08-08 20:50:03 +08:00
TermiNexus 9bc6819296 feat(mail): 云端联系人表与发信自动存储 + 联系人查询接口
- 新增 MailContact 模型(用户+邮箱唯一),迁移 0020 - MailJmapView 发信成功后自动保存收件人为常用联系人 - 新增 /API/Mail/Contacts 列表/搜索/新增接口;同步部署产物 index.html
2026-08-08 19:53:12 +08:00
TermiNexus 4ad6403358 feat(mail): 邮箱登录换取会话 token,密码仅存后端内存不再明文传输
- 新增 /API/Mail/Login 校验密码并签发 24h token(内存存储邮箱凭据)

- /API/Mail/Jmap 改为携带 token 访问,移除明文 Password 字段

- 新增 /API/Mail/Logout 吊销 token
2026-08-08 15:12:16 +08:00
TermiNexus 108bed6387 fix(mail): 修复申请邮箱唯一性误判(Stalwart 不存在账户返回 HTTP 200+notFound)
GetMailbox 增加 error/data 显式判断,不存在邮箱返回 None 而非误判已存在
2026-08-08 13:29:17 +08:00
TermiNexus 0b1d71499e feat(mail): 新增 Stalwart 员工邮箱管理与 JMAP 收发代理
- 新增 UserMailbox 模型与 0019 迁移(密码不落库,仅存 Stalwart)

- 新增 StalwartMailManager 服务层(v0.11 /api/principal 管理 API)

- 新增 /API/Mail 六个接口:Session/Apply/ChangePassword/MyMailbox/Jmap/AdminList/Disable

- JMAP 收发统一经后端代理转发,避免浏览器跨域

- 修复 form_service 误导入已删除的实例方法(_BuildFieldMap 等)
2026-08-08 12:59:50 +08:00
TermiNexus d7f017d396 refactor(gerp): 收敛 SAAS 残留裸 ORM(doc 视图/统计任务/审计清理/工单通知/viewsets 换源) 2026-08-07 23:52:30 +08:00