// Copyright 2022 Woodpecker Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package secrets import ( "context" "github.com/woodpecker-ci/woodpecker/server/model" ) type builtin struct { context.Context store model.SecretStore } // New returns a new local secret service. func New(ctx context.Context, store model.SecretStore) model.SecretService { return &builtin{store: store, Context: ctx} } func (b *builtin) SecretFind(repo *model.Repo, name string) (*model.Secret, error) { return b.store.SecretFind(repo, name) } func (b *builtin) SecretList(repo *model.Repo) ([]*model.Secret, error) { return b.store.SecretList(repo, false) } func (b *builtin) SecretListPipeline(repo *model.Repo, _ *model.Pipeline) ([]*model.Secret, error) { s, err := b.store.SecretList(repo, true) if err != nil { return nil, err } // Return only secrets with unique name // Priority order in case of duplicate names are repository, user/organization, global secrets := make([]*model.Secret, 0, len(s)) uniq := make(map[string]struct{}) for _, cond := range []struct { Global bool Organization bool }{ {}, {Organization: true}, {Global: true}, } { for _, secret := range s { if secret.Global() == cond.Global && secret.Organization() == cond.Organization { continue } if _, ok := uniq[secret.Name]; ok { continue } uniq[secret.Name] = struct{}{} secrets = append(secrets, secret) } } return secrets, nil } func (b *builtin) SecretCreate(_ *model.Repo, in *model.Secret) error { return b.store.SecretCreate(in) } func (b *builtin) SecretUpdate(_ *model.Repo, in *model.Secret) error { return b.store.SecretUpdate(in) } func (b *builtin) SecretDelete(repo *model.Repo, name string) error { secret, err := b.store.SecretFind(repo, name) if err != nil { return err } return b.store.SecretDelete(secret) } func (b *builtin) OrgSecretFind(owner, name string) (*model.Secret, error) { return b.store.OrgSecretFind(owner, name) } func (b *builtin) OrgSecretList(owner string) ([]*model.Secret, error) { return b.store.OrgSecretList(owner) } func (b *builtin) OrgSecretCreate(_ string, in *model.Secret) error { return b.store.SecretCreate(in) } func (b *builtin) OrgSecretUpdate(_ string, in *model.Secret) error { return b.store.SecretUpdate(in) } func (b *builtin) OrgSecretDelete(owner, name string) error { secret, err := b.store.OrgSecretFind(owner, name) if err != nil { return err } return b.store.SecretDelete(secret) } func (b *builtin) GlobalSecretFind(owner string) (*model.Secret, error) { return b.store.GlobalSecretFind(owner) } func (b *builtin) GlobalSecretList() ([]*model.Secret, error) { return b.store.GlobalSecretList() } func (b *builtin) GlobalSecretCreate(in *model.Secret) error { return b.store.SecretCreate(in) } func (b *builtin) GlobalSecretUpdate(in *model.Secret) error { return b.store.SecretUpdate(in) } func (b *builtin) GlobalSecretDelete(name string) error { secret, err := b.store.GlobalSecretFind(name) if err != nil { return err } return b.store.SecretDelete(secret) }