feat: add deploy tokens (#37306)

Deploy keys only work over SSH. A deploy token is their counterpart for HTTPS: a repository scoped credential, used as the password of a Git request, with read or read and write access. It covers Git operations and LFS, and can be regenerated in place.

Signed-off-by: silverwind <me@silverwind.io>
Co-authored-by: Claude Mythos <noreply@anthropic.com>
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: bircni <bircni@icloud.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
ToastyTheBot
2026-08-27 03:32:44 +08:00
committed by GitHub
parent 3c4d5a6a5c
commit 646ea0f253
76 changed files with 1594 additions and 831 deletions
+13 -10
View File
@@ -20,6 +20,7 @@ import (
asymkey_model "gitea.dev/models/asymkey"
"gitea.dev/models/auth"
"gitea.dev/models/db"
deploykey_model "gitea.dev/models/deploykey"
git_model "gitea.dev/models/git"
issues_model "gitea.dev/models/issues"
"gitea.dev/models/organization"
@@ -846,19 +847,21 @@ func ToGitHook(h *git.Hook) *api.GitHook {
}
}
// ToDeployKey convert asymkey_model.DeployKey to api.DeployKey
func ToDeployKey(ctx context.Context, repo *repo_model.Repository, deployKey *asymkey_model.DeployKey) *api.DeployKey {
// ToDeployKey convert deploykey_model.DeployKey to api.DeployKey
func ToDeployKey(ctx context.Context, repo *repo_model.Repository, deployKey *deploykey_model.DeployKey) *api.DeployKey {
k := &api.DeployKey{
ID: deployKey.ID,
KeyID: deployKey.KeyID,
URL: repo.APIURL(ctx) + fmt.Sprintf("/keys/%d", deployKey.ID),
Title: deployKey.Name,
Created: deployKey.CreatedUnix.AsTime(),
ReadOnly: deployKey.Mode == perm.AccessModeRead, // All deploy keys are read-only.
ID: deployKey.ID,
KeyType: util.Iif(deployKey.KeyType == deploykey_model.KeyTypeSSH, "ssh", "token"),
KeyID: deployKey.KeyID,
Token: deployKey.Token,
URL: repo.APIURL(ctx) + fmt.Sprintf("/keys/%d", deployKey.ID),
Title: deployKey.Name,
Fingerprint: deployKey.Fingerprint,
Created: deployKey.CreatedUnix.AsTime(),
ReadOnly: deployKey.IsReadOnly(),
}
if err := deployKey.LoadPublicKey(ctx); err == nil {
if deployKey.KeyType == deploykey_model.KeyTypeSSH && deployKey.LoadPublicKey(ctx) == nil {
k.Key = deployKey.PublicKey.Content
k.Fingerprint = deployKey.PublicKey.Fingerprint
}
return k
}