Fix registry delete (#532)

- Make make it possible to delete `"§4fda`
- Reject non urls for registry-address
- Fix #520
This commit is contained in:
6543 2021-11-25 19:04:36 +01:00 committed by GitHub
parent fac0e16996
commit ff8ad5bb83
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 22 additions and 15 deletions

View file

@ -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)

View file

@ -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")),

View file

@ -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.

View file

@ -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)
}

View file

@ -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) {

View file

@ -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
}

View file

@ -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)

View file

@ -35,6 +35,7 @@
<div v-else class="space-y-4">
<form @submit.prevent="createRegistry">
<InputField label="Address">
<!-- TODO: check input field Address is a valid address -->
<TextField v-model="selectedRegistry.address" placeholder="Registry Address (e.g. docker.io)" required />
</InputField>
@ -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();
});