修复失效项目令牌的权限控制状态

This commit is contained in:
Scout开发者 2026-09-17 00:15:47 +08:00
parent 8b7e0e6fa0
commit 3370bf70ae
2 changed files with 34 additions and 1 deletions

View File

@ -103,8 +103,9 @@ func (s *Store) HasAccessControl(projectID string) bool {
if len(s.members[projectID]) > 0 {
return true
}
now := time.Now().UTC()
for _, token := range s.tokens {
if token.ProjectID == projectID {
if token.ProjectID == projectID && token.RevokedAt == nil && (token.ExpiresAt == nil || now.Before(*token.ExpiresAt)) {
return true
}
}

View File

@ -102,3 +102,35 @@ func TestStoreKeepsLastProjectAdmin(t *testing.T) {
t.Fatal("demoting the last project admin should fail")
}
}
func TestStoreIgnoresExpiredAndRevokedTokensForAccessControl(t *testing.T) {
store, err := New(filepath.Join(t.TempDir(), "access.json"))
if err != nil {
t.Fatal(err)
}
expired := time.Now().UTC().Add(-time.Minute)
_, _, err = store.CreateToken("ssl", "过期令牌", RoleViewer, &expired)
if err != nil {
t.Fatal(err)
}
if store.HasAccessControl("ssl") {
t.Fatal("过期项目令牌不应启用项目权限控制")
}
_, secret, err := store.CreateToken("ssl", "待吊销令牌", RoleViewer, nil)
if err != nil {
t.Fatal(err)
}
tokens := store.ListTokens("ssl")
if len(tokens) != 2 {
t.Fatalf("项目令牌数量错误:%d", len(tokens))
}
if _, err := store.RevokeToken("ssl", tokens[1].ID); err != nil {
t.Fatal(err)
}
if store.HasAccessControl("ssl") {
t.Fatal("仅剩过期或吊销令牌时不应启用项目权限控制")
}
if _, ok := store.AuthenticateToken("ssl", secret); ok {
t.Fatal("已吊销项目令牌仍可认证")
}
}