From ff8ad5bb83c334aae8791f9c23e05707ee855ec4 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 25 Nov 2021 19:04:36 +0100 Subject: [PATCH] Fix registry delete (#532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Make make it possible to delete `"ยง4fda` - Reject non urls for registry-address - Fix #520 --- cmd/server/server.go | 1 - cmd/server/setup.go | 1 + server/model/registry.go | 14 +++++++++----- server/plugins/registry/db.go | 6 +----- server/router/router.go | 1 + server/store/datastore/registry.go | 8 ++++++-- server/store/store.go | 2 +- web/src/components/repo/settings/RegistriesTab.vue | 4 +++- 8 files changed, 22 insertions(+), 15 deletions(-) diff --git a/cmd/server/server.go b/cmd/server/server.go index 02735c991..5f7ae79df 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -120,7 +120,6 @@ func run(c *cli.Context) error { var webUIServe func(w http.ResponseWriter, r *http.Request) if proxyWebUI == "" { - // we are switching from gin to httpservermux|treemux, webUIServe = setupTree(c).ServeHTTP } else { origin, _ := url.Parse(proxyWebUI) diff --git a/cmd/server/setup.go b/cmd/server/setup.go index 5973ccdca..d78957cb0 100644 --- a/cmd/server/setup.go +++ b/cmd/server/setup.go @@ -305,6 +305,7 @@ func setupCoding(c *cli.Context) (remote.Remote, error) { func setupTree(c *cli.Context) *gin.Engine { tree := gin.New() + tree.UseRawPath = true web.New( web.WithSync(time.Hour*72), web.WithDocs(c.String("docs")), diff --git a/server/model/registry.go b/server/model/registry.go index 7644b9376..3739a8105 100644 --- a/server/model/registry.go +++ b/server/model/registry.go @@ -15,7 +15,10 @@ package model -import "errors" +import ( + "errors" + "net/url" +) var ( errRegistryAddressInvalid = errors.New("Invalid Registry Address") @@ -32,7 +35,7 @@ type RegistryService interface { RegistryDelete(*Repo, string) error } -// RegistryService defines a service for managing registries. +// ReadOnlyRegistryService defines a service for managing registries. type ReadOnlyRegistryService interface { RegistryFind(*Repo, string) (*Registry, error) RegistryList(*Repo) ([]*Registry, error) @@ -44,7 +47,7 @@ type RegistryStore interface { RegistryList(*Repo) ([]*Registry, error) RegistryCreate(*Registry) error RegistryUpdate(*Registry) error - RegistryDelete(*Registry) error + RegistryDelete(repo *Repo, addr string) error } // Registry represents a docker registry with credentials. @@ -68,9 +71,10 @@ func (r *Registry) Validate() error { return errRegistryUsernameInvalid case len(r.Password) == 0: return errRegistryPasswordInvalid - default: - return nil } + + _, err := url.Parse(r.Address) + return err } // Copy makes a copy of the registry without the password. diff --git a/server/plugins/registry/db.go b/server/plugins/registry/db.go index 433eecbab..d09ba7fae 100644 --- a/server/plugins/registry/db.go +++ b/server/plugins/registry/db.go @@ -30,9 +30,5 @@ func (b *db) RegistryUpdate(repo *model.Repo, in *model.Registry) error { } func (b *db) RegistryDelete(repo *model.Repo, addr string) error { - registry, err := b.RegistryFind(repo, addr) - if err != nil { - return err - } - return b.store.RegistryDelete(registry) + return b.store.RegistryDelete(repo, addr) } diff --git a/server/router/router.go b/server/router/router.go index 98c76614e..2e18f532d 100644 --- a/server/router/router.go +++ b/server/router/router.go @@ -31,6 +31,7 @@ import ( // Load loads the router func Load(serveHTTP func(w http.ResponseWriter, r *http.Request), middleware ...gin.HandlerFunc) http.Handler { e := gin.New() + e.UseRawPath = true e.Use(gin.Recovery()) e.Use(func(c *gin.Context) { diff --git a/server/store/datastore/registry.go b/server/store/datastore/registry.go index 39c5cce31..915455c57 100644 --- a/server/store/datastore/registry.go +++ b/server/store/datastore/registry.go @@ -42,7 +42,11 @@ func (s storage) RegistryUpdate(registry *model.Registry) error { return err } -func (s storage) RegistryDelete(registry *model.Registry) error { - _, err := s.engine.ID(registry.ID).Delete(new(model.Registry)) +func (s storage) RegistryDelete(repo *model.Repo, addr string) error { + registry, err := s.RegistryFind(repo, addr) + if err != nil { + return err + } + _, err = s.engine.ID(registry.ID).Delete(new(model.Registry)) return err } diff --git a/server/store/store.go b/server/store/store.go index b2c843ec4..46e4863a6 100644 --- a/server/store/store.go +++ b/server/store/store.go @@ -137,7 +137,7 @@ type Store interface { RegistryList(*model.Repo) ([]*model.Registry, error) RegistryCreate(*model.Registry) error RegistryUpdate(*model.Registry) error - RegistryDelete(*model.Registry) error + RegistryDelete(repo *model.Repo, addr string) error ProcLoad(int64) (*model.Proc, error) ProcFind(*model.Build, int) (*model.Proc, error) diff --git a/web/src/components/repo/settings/RegistriesTab.vue b/web/src/components/repo/settings/RegistriesTab.vue index 29fe6f14c..e34b46164 100644 --- a/web/src/components/repo/settings/RegistriesTab.vue +++ b/web/src/components/repo/settings/RegistriesTab.vue @@ -35,6 +35,7 @@
+ @@ -115,7 +116,8 @@ export default defineComponent({ throw new Error("Unexpected: Can't load repo"); } - await apiClient.deleteRegistry(repo.value.owner, repo.value.name, _registry.address); + const registryAddress = encodeURIComponent(_registry.address); + await apiClient.deleteRegistry(repo.value.owner, repo.value.name, registryAddress); notifications.notify({ title: 'Registry credentials deleted', type: 'success' }); await loadRegistries(); });