Skip to content

🐛 device: 设备流补上自报显示名,回退不再切在 sha256: 前缀里 - #18

Merged
CodFrm merged 1 commit into
mainfrom
fix/2026-08-15-device-display-name
Aug 15, 2026
Merged

🐛 device: 设备流补上自报显示名,回退不再切在 sha256: 前缀里#18
CodFrm merged 1 commit into
mainfrom
fix/2026-08-15-device-display-name

Conversation

@CodFrm

@CodFrm CodFrm commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

用户报告设备在控制台显示的名字是 sha256:4 —— 而且每台机器都长这样。

根因

设备流没有任何途径接收设备名。授权端点 DeviceAuthorizeRequest 只收 device_kind / fingerprint / platform / version,所以 ExchangeToken 只能:

Name: flow.ClientFingerprint[:8],

而 daemon 与桌面端的规范指纹是 sha256:<64 位 hex>,前 8 个字符恒为 sha256: 加一个十六进制字符 —— 整个账号下的机器最多只有 16 种名字,等于没有名字。实测该账号下两台设备分别叫 sha256:4sha256:0

改动

  • 授权请求补上可选的 namebinding:"max=128"),不带它的老客户端照常授权
  • 落进新列 device_flow_codes.client_name(迁移 202608150002)—— 授权与换取 token 是两次独立请求,中间只有这一行 flow 记录能承载它
  • ExchangeToken 改由 device_entity.DisplayName(reported, fingerprint) 决定 devices.name:自报优先,缺省回退到剥掉 sha256: 前缀后的指纹缩写

回退规则放在实体层而不是 service —— 它是「这台设备叫什么」的业务判据。按符文而不是按字节截:端点按 min=8 收而 validator 数的是符文,八个多字节符文的指纹过得了校验,按字节切却会切在符文中间,落库是一段非法 UTF-8。

客户端侧(agentred 与桌面端登录时上报 os.Hostname())在 agentre-hub/agentre#55

迁移编号说明

202608150002 而不是 ...0001:同日的「浏览器改用短效中继凭据」已经占了 202608150001。gormigrate 按 ID 记账,同 ID 的两条只会跑一条、另一条被当成已执行 —— client_name 列会在已记录该 ID 的库上永远不被创建,且不报任何错

验证

  • go test ./internal/... ./migrations/... 全绿
  • golangci-lint run 0 问题
  • 服务层测试先复现再修复:RED 时的断言输出正是 actual: "sha256:4"

注意

devices.name 只在换取 token 时写入,所以既有设备要重新登录一次才会变成主机名。本 PR 不含数据回填。

设备流此前没有任何途径接收设备名:授权请求只收 device_kind / fingerprint /
platform / version,换取 token 时只能 flow.ClientFingerprint[:8] 当名字。而 daemon
与桌面端的规范指纹是 sha256:<64 位 hex>,切出来恒为 "sha256:" 加一个十六进制字符
——整个账号下的机器最多只有 16 种名字,等于没有名字。

授权请求补上可选的 name,落进 device_flow_codes.client_name,换取 token 时由
device_entity.DisplayName 决定 devices.name:自报优先,缺省回退到**剥掉 sha256:
前缀后**的指纹缩写。老客户端不带 name 照常授权。

回退规则放在实体层而不是 service:它是「这台设备叫什么」的业务判据。按符文而不是
按字节截 —— 端点按 binding `min=8` 收而 validator 数的是符文,八个多字节符文的指纹
过得了校验,按字节切却会切在符文中间,落库是一段非法 UTF-8。

迁移编号取 202608150002:202608150001 已被同日的「浏览器改用短效中继凭据」占用。
gormigrate 按 ID 记账,同 ID 的两条只会跑一条、另一条被当成已执行,client_name 列
会在已记录该 ID 的库上永远不被创建且不报错。

客户端侧(agentred 与桌面端上报主机名)在 agentre 仓库的 #55。
@CodFrm
CodFrm merged commit 92dd273 into main Aug 15, 2026
6 checks passed
@CodFrm
CodFrm deleted the fix/2026-08-15-device-display-name branch August 15, 2026 03:07
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