Skip to content

Commit 4700d4c

Browse files
add UI for editing secrets
1 parent d6d3c96 commit 4700d4c

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-0
lines changed

routers/web/repo/setting/secrets.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,26 @@ func SecretsPost(ctx *context.Context) {
114114
)
115115
}
116116

117+
func SecretsEdit(ctx *context.Context) {
118+
sCtx, err := getSecretsCtx(ctx)
119+
if err != nil {
120+
ctx.ServerError("getSecretsCtx", err)
121+
return
122+
}
123+
124+
if ctx.HasError() {
125+
ctx.JSONError(ctx.GetErrMsg())
126+
return
127+
}
128+
129+
shared.PerformSecretsEdit(
130+
ctx,
131+
sCtx.OwnerID,
132+
sCtx.RepoID,
133+
sCtx.RedirectLink,
134+
)
135+
}
136+
117137
func SecretsDelete(ctx *context.Context) {
118138
sCtx, err := getSecretsCtx(ctx)
119139
if err != nil {

routers/web/shared/secrets/secrets.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package secrets
55

66
import (
7+
"fmt"
8+
79
"code.gitea.io/gitea/models/db"
810
secret_model "code.gitea.io/gitea/models/secret"
911
"code.gitea.io/gitea/modules/log"
@@ -38,6 +40,37 @@ func PerformSecretsPost(ctx *context.Context, ownerID, repoID int64, redirectURL
3840
ctx.JSONRedirect(redirectURL)
3941
}
4042

43+
func PerformSecretsEdit(ctx *context.Context, ownerID, repoID int64, redirectURL string) {
44+
form := web.GetForm(ctx).(*forms.EditSecretForm)
45+
id := ctx.PathParamInt64("secret_id")
46+
47+
if id == 0 {
48+
ctx.ServerError("PerformSecretsEdit", fmt.Errorf("id not found"))
49+
return
50+
}
51+
52+
secrets, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{OwnerID: ownerID, RepoID: repoID, SecretID: id})
53+
if err != nil {
54+
ctx.ServerError("FindSecrets", err)
55+
return
56+
}
57+
58+
if len(secrets) != 1 {
59+
ctx.ServerError("FindSecrets", fmt.Errorf("secret not found"))
60+
return
61+
}
62+
63+
s, _, err := secret_service.CreateOrUpdateSecret(ctx, ownerID, repoID, secrets[0].Name, util.ReserveLineBreakForTextarea(form.Data))
64+
if err != nil {
65+
log.Error("CreateOrUpdateSecret failed: %v", err)
66+
ctx.JSONError(ctx.Tr("secrets.edit.failed"))
67+
return
68+
}
69+
70+
ctx.Flash.Success(ctx.Tr("secrets.edit.success", s.Name))
71+
ctx.JSONRedirect(redirectURL)
72+
}
73+
4174
func PerformSecretsDelete(ctx *context.Context, ownerID, repoID int64, redirectURL string) {
4275
id := ctx.FormInt64("id")
4376

routers/web/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@ func registerRoutes(m *web.Router) {
446446
m.Group("/secrets", func() {
447447
m.Get("", repo_setting.Secrets)
448448
m.Post("", web.Bind(forms.AddSecretForm{}), repo_setting.SecretsPost)
449+
m.Post("/{secret_id}/edit", web.Bind(forms.EditSecretForm{}), repo_setting.SecretsEdit)
449450
m.Post("/delete", repo_setting.SecretsDelete)
450451
})
451452
}

services/forms/user_form.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,17 @@ func (f *AddSecretForm) Validate(req *http.Request, errs binding.Errors) binding
335335
return middleware.Validate(errs, ctx.Data, f, ctx.Locale)
336336
}
337337

338+
// AddSecretForm for adding secrets
339+
type EditSecretForm struct {
340+
Data string `binding:"Required;MaxSize(65535)"`
341+
}
342+
343+
// Validate validates the fields
344+
func (f *EditSecretForm) Validate(req *http.Request, errs binding.Errors) binding.Errors {
345+
ctx := context.GetValidateContext(req)
346+
return middleware.Validate(errs, ctx.Data, f, ctx.Locale)
347+
}
348+
338349
type EditVariableForm struct {
339350
Name string `binding:"Required;MaxSize(255)"`
340351
Data string `binding:"Required;MaxSize(65535)"`

templates/shared/secrets/add_list.tmpl

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@
3030
<span class="color-text-light-2">
3131
{{ctx.Locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix)}}
3232
</span>
33+
<button class="ui btn interact-bg tw-p-2 show-modal"
34+
data-modal="#edit-secret-modal"
35+
data-modal-form.action="{{$.Link}}/{{.ID}}/edit"
36+
data-modal-header="{{ctx.Locale.Tr "secrets.edit"}}"
37+
data-modal-secret-name="{{.Name}}"
38+
data-tooltip-content="{{ctx.Locale.Tr "secrets.edit"}}"
39+
>
40+
{{svg "octicon-pencil"}}
41+
</button>
3342
<button class="ui btn interact-bg link-action tw-p-2"
3443
data-url="{{$.Link}}/delete?id={{.ID}}"
3544
data-modal-confirm="{{ctx.Locale.Tr "secrets.deletion.description"}}"
@@ -60,8 +69,42 @@
6069
<div class="field">
6170
<label for="secret-name">{{ctx.Locale.Tr "name"}}</label>
6271
<input autofocus required
72+
name="name"
6373
id="secret-name"
74+
value="{{.name}}"
75+
pattern="^(?!GITEA_|GITHUB_)[a-zA-Z_][a-zA-Z0-9_]*$"
76+
placeholder="{{ctx.Locale.Tr "secrets.creation.name_placeholder"}}"
77+
>
78+
</div>
79+
<div class="field">
80+
<label for="secret-data">{{ctx.Locale.Tr "value"}}</label>
81+
<textarea required
82+
id="secret-data"
83+
name="data"
84+
placeholder="{{ctx.Locale.Tr "secrets.creation.value_placeholder"}}"
85+
></textarea>
86+
</div>
87+
</div>
88+
{{template "base/modal_actions_confirm" (dict "ModalButtonTypes" "confirm")}}
89+
</form>
90+
</div>
91+
92+
{{/* Edit secret dialog */}}
93+
<div class="ui small modal" id="edit-secret-modal">
94+
<div class="header">
95+
<span id="actions-modal-header"></span>
96+
</div>
97+
<form class="ui form form-fetch-action" method="post">
98+
<div class="content">
99+
{{.CsrfTokenHtml}}
100+
<div class="field">
101+
{{ctx.Locale.Tr "secrets.description"}}
102+
</div>
103+
<div class="field">
104+
<label for="secret-name">{{ctx.Locale.Tr "name"}}</label>
105+
<input disabled
64106
name="name"
107+
id="secret-name"
65108
value="{{.name}}"
66109
pattern="^(?!GITEA_|GITHUB_)[a-zA-Z_][a-zA-Z0-9_]*$"
67110
placeholder="{{ctx.Locale.Tr "secrets.creation.name_placeholder"}}"

0 commit comments

Comments
 (0)