feat!: drop the backend-side elevation windows; password and passkey sessions share capabilities, passkeys guard what nodes verify; the trust page lists added and removed passkeys [CI]
This commit is contained in:
1 parent
f704c66dd9
commit
4106f831dc
34 files changed
+191
-1364
No files matched your search
@@ -5,6 +5,46 @@ import { signStatement } from '@shared/api/webauthn'
|
||||
import { useQuery } from '@shared/hooks'
|
||||
import { CopyButton, ErrorNotice, Spinner, useAction, useToast } from '@shared/ui'
|
||||
|
||||
type Proposal = NonNullable<TrustStateDto['proposal']>
|
||||
|
||||
/**
|
||||
* 要签名的这一版相对当前生效的集合有什么变化。<b>签名之前必须看一眼</b>:往账号里加一把 passkey 再等人签名,是这个流程唯一的风险——
|
||||
* 签了就等于授权它成为操作员(节点会认它)。
|
||||
*/
|
||||
function Changes({ proposal }: { proposal: Proposal }) {
|
||||
const { added, removed, server_key_changed: serverChanged } = proposal
|
||||
if (added.length === 0 && removed.length === 0 && !serverChanged) return null
|
||||
return (
|
||||
<div className="stack" style={{ gap: 6 }}>
|
||||
{added.length > 0 ? (
|
||||
<div>
|
||||
<b>新增的操作员 Passkey(签名后节点会认它):</b>
|
||||
<ul style={{ margin: '4px 0 0', paddingLeft: 20 }}>
|
||||
{added.map((a) => (
|
||||
<li key={a.id}>
|
||||
<b>{a.name}</b> <span className="faint">创建于 {new Date(a.created_at).toLocaleString()} · {a.id.slice(0, 12)}…</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
) : null}
|
||||
{removed.length > 0 ? (
|
||||
<div>
|
||||
<b>移除的操作员 Passkey:</b>
|
||||
<ul style={{ margin: '4px 0 0', paddingLeft: 20 }}>
|
||||
{removed.map((id) => (
|
||||
<li key={id} className="faint">
|
||||
{id.slice(0, 12)}…
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
) : null}
|
||||
{serverChanged ? <div>服务器身份密钥有变化。</div> : null}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 信任根:你的 Passkey 是整个系统的根。节点安装时把下面这个指纹和属主(passkey)固定在本地,之后只认从它出发、由你的 Passkey 签过名的
|
||||
* 操作员集合,面板自己改不了,也签不出新的版本。
|
||||
@@ -41,10 +81,11 @@ export function Trust() {
|
||||
</div>
|
||||
<p className="muted">
|
||||
建立之后,新装的节点会把你的信任根指纹和属主固定在本地:以后 web ssh 等敏感操作只认你的 Passkey,Backend 被攻破也改不了。添加节点本身不需要触碰 Passkey。
|
||||
这一步会把账号下已有的 Passkey 登记为操作员,并需要你触碰两次 Passkey(确认身份、给集合签名)。
|
||||
这一步会把下面列出的 Passkey 登记为操作员,需要你触碰一次 Passkey 给集合签名。
|
||||
</p>
|
||||
{state.proposal ? (
|
||||
<div>
|
||||
<div className="stack">
|
||||
<Changes proposal={state.proposal} />
|
||||
<button type="button" className="btn primary" disabled={busy} onClick={() => void sign()}>
|
||||
用 Passkey 建立信任根
|
||||
</button>
|
||||
@@ -89,8 +130,9 @@ export function Trust() {
|
||||
) : (
|
||||
<div className="notice warn stack">
|
||||
<div>
|
||||
账号下的 Passkey(或站点域名)和生效的操作员集合不一致,比如新添加或删除了 Passkey。需要用一把<b>现有操作员的 Passkey</b>签一个新版本,节点才会采用。
|
||||
账号下的 Passkey(或站点域名)和生效的操作员集合不一致。需要用一把<b>现有操作员的 Passkey</b>签一个新版本,节点才会采用。
|
||||
</div>
|
||||
{state.proposal ? <Changes proposal={state.proposal} /> : null}
|
||||
<div>
|
||||
<b>注意</b>:从集合里去掉一把 Passkey 之后,由它批准过的节点会被固定了信任根的对端拒绝。
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user