mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-09-25 21:20:12 +00:00
Fix registry delete (#532)
- Make make it possible to delete `"§4fda` - Reject non urls for registry-address - Fix #520
This commit is contained in:
parent
fac0e16996
commit
ff8ad5bb83
8 changed files with 22 additions and 15 deletions
|
@ -120,7 +120,6 @@ func run(c *cli.Context) error {
|
||||||
var webUIServe func(w http.ResponseWriter, r *http.Request)
|
var webUIServe func(w http.ResponseWriter, r *http.Request)
|
||||||
|
|
||||||
if proxyWebUI == "" {
|
if proxyWebUI == "" {
|
||||||
// we are switching from gin to httpservermux|treemux,
|
|
||||||
webUIServe = setupTree(c).ServeHTTP
|
webUIServe = setupTree(c).ServeHTTP
|
||||||
} else {
|
} else {
|
||||||
origin, _ := url.Parse(proxyWebUI)
|
origin, _ := url.Parse(proxyWebUI)
|
||||||
|
|
|
@ -305,6 +305,7 @@ func setupCoding(c *cli.Context) (remote.Remote, error) {
|
||||||
|
|
||||||
func setupTree(c *cli.Context) *gin.Engine {
|
func setupTree(c *cli.Context) *gin.Engine {
|
||||||
tree := gin.New()
|
tree := gin.New()
|
||||||
|
tree.UseRawPath = true
|
||||||
web.New(
|
web.New(
|
||||||
web.WithSync(time.Hour*72),
|
web.WithSync(time.Hour*72),
|
||||||
web.WithDocs(c.String("docs")),
|
web.WithDocs(c.String("docs")),
|
||||||
|
|
|
@ -15,7 +15,10 @@
|
||||||
|
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import "errors"
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errRegistryAddressInvalid = errors.New("Invalid Registry Address")
|
errRegistryAddressInvalid = errors.New("Invalid Registry Address")
|
||||||
|
@ -32,7 +35,7 @@ type RegistryService interface {
|
||||||
RegistryDelete(*Repo, string) error
|
RegistryDelete(*Repo, string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegistryService defines a service for managing registries.
|
// ReadOnlyRegistryService defines a service for managing registries.
|
||||||
type ReadOnlyRegistryService interface {
|
type ReadOnlyRegistryService interface {
|
||||||
RegistryFind(*Repo, string) (*Registry, error)
|
RegistryFind(*Repo, string) (*Registry, error)
|
||||||
RegistryList(*Repo) ([]*Registry, error)
|
RegistryList(*Repo) ([]*Registry, error)
|
||||||
|
@ -44,7 +47,7 @@ type RegistryStore interface {
|
||||||
RegistryList(*Repo) ([]*Registry, error)
|
RegistryList(*Repo) ([]*Registry, error)
|
||||||
RegistryCreate(*Registry) error
|
RegistryCreate(*Registry) error
|
||||||
RegistryUpdate(*Registry) error
|
RegistryUpdate(*Registry) error
|
||||||
RegistryDelete(*Registry) error
|
RegistryDelete(repo *Repo, addr string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Registry represents a docker registry with credentials.
|
// Registry represents a docker registry with credentials.
|
||||||
|
@ -68,9 +71,10 @@ func (r *Registry) Validate() error {
|
||||||
return errRegistryUsernameInvalid
|
return errRegistryUsernameInvalid
|
||||||
case len(r.Password) == 0:
|
case len(r.Password) == 0:
|
||||||
return errRegistryPasswordInvalid
|
return errRegistryPasswordInvalid
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err := url.Parse(r.Address)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy makes a copy of the registry without the password.
|
// Copy makes a copy of the registry without the password.
|
||||||
|
|
|
@ -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 {
|
func (b *db) RegistryDelete(repo *model.Repo, addr string) error {
|
||||||
registry, err := b.RegistryFind(repo, addr)
|
return b.store.RegistryDelete(repo, addr)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return b.store.RegistryDelete(registry)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import (
|
||||||
// Load loads the router
|
// Load loads the router
|
||||||
func Load(serveHTTP func(w http.ResponseWriter, r *http.Request), middleware ...gin.HandlerFunc) http.Handler {
|
func Load(serveHTTP func(w http.ResponseWriter, r *http.Request), middleware ...gin.HandlerFunc) http.Handler {
|
||||||
e := gin.New()
|
e := gin.New()
|
||||||
|
e.UseRawPath = true
|
||||||
e.Use(gin.Recovery())
|
e.Use(gin.Recovery())
|
||||||
|
|
||||||
e.Use(func(c *gin.Context) {
|
e.Use(func(c *gin.Context) {
|
||||||
|
|
|
@ -42,7 +42,11 @@ func (s storage) RegistryUpdate(registry *model.Registry) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s storage) RegistryDelete(registry *model.Registry) error {
|
func (s storage) RegistryDelete(repo *model.Repo, addr string) error {
|
||||||
_, err := s.engine.ID(registry.ID).Delete(new(model.Registry))
|
registry, err := s.RegistryFind(repo, addr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = s.engine.ID(registry.ID).Delete(new(model.Registry))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,7 @@ type Store interface {
|
||||||
RegistryList(*model.Repo) ([]*model.Registry, error)
|
RegistryList(*model.Repo) ([]*model.Registry, error)
|
||||||
RegistryCreate(*model.Registry) error
|
RegistryCreate(*model.Registry) error
|
||||||
RegistryUpdate(*model.Registry) error
|
RegistryUpdate(*model.Registry) error
|
||||||
RegistryDelete(*model.Registry) error
|
RegistryDelete(repo *model.Repo, addr string) error
|
||||||
|
|
||||||
ProcLoad(int64) (*model.Proc, error)
|
ProcLoad(int64) (*model.Proc, error)
|
||||||
ProcFind(*model.Build, int) (*model.Proc, error)
|
ProcFind(*model.Build, int) (*model.Proc, error)
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
<div v-else class="space-y-4">
|
<div v-else class="space-y-4">
|
||||||
<form @submit.prevent="createRegistry">
|
<form @submit.prevent="createRegistry">
|
||||||
<InputField label="Address">
|
<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 />
|
<TextField v-model="selectedRegistry.address" placeholder="Registry Address (e.g. docker.io)" required />
|
||||||
</InputField>
|
</InputField>
|
||||||
|
|
||||||
|
@ -115,7 +116,8 @@ export default defineComponent({
|
||||||
throw new Error("Unexpected: Can't load repo");
|
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' });
|
notifications.notify({ title: 'Registry credentials deleted', type: 'success' });
|
||||||
await loadRegistries();
|
await loadRegistries();
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue