SSH Push/Pull Mirroring & Migrations

This commit is contained in:
techknowlogick committed 2025-07-15 15:46:17 -04:00
1 parent 9854df3e87
commit 4c8e222242
30 files changed
+1495 -28

No files matched your search

+51
View File
@@ -0,0 +1,51 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package org
import (
"net/http"
"code.gitea.io/gitea/modules/templates"
shared_user "code.gitea.io/gitea/routers/web/shared/user"
"code.gitea.io/gitea/services/context"
mirror_service "code.gitea.io/gitea/services/mirror"
)
const (
tplSettingsSSHKeys templates.TplName = "org/settings/ssh_keys"
)
// SSHKeys render organization SSH mirror keys page
func SSHKeys(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("org.settings.ssh_keys")
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsOrgSettingsSSHKeys"] = true
if _, err := shared_user.RenderUserOrgHeader(ctx); err != nil {
ctx.ServerError("RenderUserOrgHeader", err)
return
}
keypair, err := mirror_service.GetOrCreateSSHKeypairForOrg(ctx, ctx.Org.Organization.ID)
if err != nil {
ctx.ServerError("GetOrCreateSSHKeypairForOrg", err)
return
}
ctx.Data["SSHKeypair"] = keypair
ctx.HTML(http.StatusOK, tplSettingsSSHKeys)
}
// RegenerateSSHKey regenerates the SSH keypair for organization mirror operations
func RegenerateSSHKey(ctx *context.Context) {
_, err := mirror_service.RegenerateSSHKeypairForOrg(ctx, ctx.Org.Organization.ID)
if err != nil {
ctx.ServerError("RegenerateSSHKeypairForOrg", err)
return
}
ctx.Flash.Success(ctx.Tr("settings.mirror_ssh_regenerated"))
ctx.Redirect(ctx.Org.OrgLink + "/settings/ssh_keys")
}
+34
View File
@@ -10,6 +10,7 @@ import (
asymkey_model "code.gitea.io/gitea/models/asymkey"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/templates"
@@ -17,6 +18,7 @@ import (
asymkey_service "code.gitea.io/gitea/services/asymkey"
"code.gitea.io/gitea/services/context"
"code.gitea.io/gitea/services/forms"
mirror_service "code.gitea.io/gitea/services/mirror"
)
const (
@@ -342,4 +344,36 @@ func loadKeysData(ctx *context.Context) {
ctx.Data["VerifyingID"] = ctx.FormString("verify_gpg")
ctx.Data["VerifyingFingerprint"] = ctx.FormString("verify_ssh")
ctx.Data["UserDisabledFeatures"] = user_model.DisabledFeaturesWithLoginType(ctx.Doer)
// Load SSH mirror keypair if it exists
mirrorKeypair, err := mirror_service.GetOrCreateSSHKeypairForUser(ctx, ctx.Doer.ID)
if err == nil {
ctx.Data["HasMirrorSSHKey"] = true
// Create a struct with the public key including comment
publicKeyWithComment, _ := mirrorKeypair.GetPublicKeyWithComment(ctx)
mirrorKeyData := struct {
*repo_model.MirrorSSHKeypair
PublicKeyWithComment string
}{
MirrorSSHKeypair: mirrorKeypair,
PublicKeyWithComment: publicKeyWithComment,
}
ctx.Data["MirrorSSHKey"] = mirrorKeyData
} else {
ctx.Data["HasMirrorSSHKey"] = false
}
}
// RegenerateMirrorSSHKeyPair regenerates the SSH keypair for repository mirroring
func RegenerateMirrorSSHKeyPair(ctx *context.Context) {
_, err := mirror_service.RegenerateSSHKeypairForUser(ctx, ctx.Doer.ID)
if err != nil {
ctx.ServerError("RegenerateSSHKeypairForUser", err)
return
}
ctx.Flash.Success(ctx.Tr("settings.mirror_ssh_key_regenerated"))
ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
}
+6
View File
@@ -636,6 +636,7 @@ func registerWebRoutes(m *web.Router) {
m.Combo("/keys").Get(user_setting.Keys).
Post(web.Bind(forms.AddKeyForm{}), user_setting.KeysPost)
m.Post("/keys/delete", user_setting.DeleteKey)
m.Post("/keys/mirror-ssh/regenerate", user_setting.RegenerateMirrorSSHKeyPair)
m.Group("/packages", func() {
m.Get("", user_setting.Packages)
m.Group("/rules", func() {
@@ -957,6 +958,11 @@ func registerWebRoutes(m *web.Router) {
m.Post("/initialize", web.Bind(forms.InitializeLabelsForm{}), org.InitializeLabels)
})
m.Group("/ssh_keys", func() {
m.Get("", org.SSHKeys)
m.Post("/regenerate", org.RegenerateSSHKey)
})
m.Group("/actions", func() {
m.Get("", org_setting.RedirectToDefaultSetting)
addSettingsRunnersRoutes()