diff --git a/appview/pages/pages.go b/appview/pages/pages.go --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -16,6 +16,7 @@ "strings" "sync" + "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/appview/commitverify" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" @@ -690,6 +691,8 @@ Branches []types.Branch Spindles []string CurrentSpindle string + Secrets []*tangled.RepoListSecrets_Secret + // TODO: use repoinfo.roles IsCollaboratorInviteAllowed bool } diff --git a/appview/repo/repo.go b/appview/repo/repo.go --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -912,6 +912,78 @@ w.Write(fmt.Append(nil, "default branch set to: ", branch)) } +func (rp *Repo) Secrets(w http.ResponseWriter, r *http.Request) { + f, err := rp.repoResolver.Resolve(r) + if err != nil { + log.Println("failed to get repo and knot", err) + return + } + + if f.Spindle == "" { + log.Println("empty spindle cannot add/rm secret", err) + return + } + + lxm := tangled.RepoAddSecretNSID + if r.Method == http.MethodDelete { + lxm = tangled.RepoRemoveSecretNSID + } + + spindleClient, err := rp.oauth.ServiceClient( + r, + oauth.WithService(f.Spindle), + oauth.WithLxm(lxm), + oauth.WithDev(rp.config.Core.Dev), + ) + if err != nil { + log.Println("failed to create spindle client", err) + return + } + + key := r.FormValue("key") + if key == "" { + w.WriteHeader(http.StatusBadRequest) + return + } + + switch r.Method { + case http.MethodPut: + value := r.FormValue("value") + if key == "" { + w.WriteHeader(http.StatusBadRequest) + return + } + + err = tangled.RepoAddSecret( + r.Context(), + spindleClient, + &tangled.RepoAddSecret_Input{ + Repo: f.RepoAt.String(), + Key: key, + Value: value, + }, + ) + if err != nil { + log.Println("request didnt run", "err", err) + return + } + + case http.MethodDelete: + err = tangled.RepoRemoveSecret( + r.Context(), + spindleClient, + &tangled.RepoRemoveSecret_Input{ + Repo: f.RepoAt.String(), + Key: key, + }, + ) + if err != nil { + log.Println("request didnt run", "err", err) + return + } + } +} + func (rp *Repo) RepoSettings(w http.ResponseWriter, r *http.Request) { f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -955,6 +1027,22 @@ return } + var secrets []*tangled.RepoListSecrets_Secret + if f.Spindle != "" { + if spindleClient, err := rp.oauth.ServiceClient( + r, + oauth.WithService(f.Spindle), + oauth.WithLxm(tangled.RepoListSecretsNSID), + oauth.WithDev(rp.config.Core.Dev), + ); err != nil { + log.Println("failed to create spindle client", err) + } else if resp, err := tangled.RepoListSecrets(r.Context(), spindleClient, f.RepoAt.String()); err != nil { + log.Println("failed to fetch secrets", err) + } else { + secrets = resp.Secrets + } + } + rp.pages.RepoSettings(w, pages.RepoSettingsParams{ LoggedInUser: user, RepoInfo: f.RepoInfo(user), @@ -963,6 +1051,7 @@ Branches: result.Branches, Spindles: spindles, CurrentSpindle: f.Spindle, + Secrets: secrets, }) } } diff --git a/appview/repo/router.go b/appview/repo/router.go --- a/appview/repo/router.go +++ b/appview/repo/router.go @@ -74,6 +74,8 @@ r.With(mw.RepoPermissionMiddleware("repo:invite")).Put("/collaborator", rp.AddCollaborator) r.With(mw.RepoPermissionMiddleware("repo:delete")).Delete("/delete", rp.DeleteRepo) r.Put("/branches/default", rp.SetDefaultBranch) + r.Put("/secrets", rp.Secrets) + r.Delete("/secrets", rp.Secrets) }) }) diff --git a/appview/pages/templates/repo/settings.html b/appview/pages/templates/repo/settings.html --- a/appview/pages/templates/repo/settings.html +++ b/appview/pages/templates/repo/settings.html @@ -115,6 +115,50 @@ {{ end }} + {{ if $.CurrentSpindle }} +
+ Secrets +
+ +
+ {{ range $idx, $secret := .Secrets }} + {{ with $secret }} +
+ {{ .Key }} created on {{ .CreatedAt }} by {{ .CreatedBy }} +
+ {{ end }} + {{ end }} +
+
+ + + + + + +
+ {{ end }} + {{ if .RepoInfo.Roles.RepoDeleteAllowed }}