agola/internal/services/configstore/api/secret.go

223 lines
5.4 KiB
Go
Raw Normal View History

2019-03-14 13:36:18 +00:00
// Copyright 2019 Sorint.lab
//
// 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 api
import (
"encoding/json"
"net/http"
2019-07-01 09:40:20 +00:00
"agola.io/agola/internal/db"
"agola.io/agola/internal/services/configstore/action"
"agola.io/agola/internal/services/configstore/readdb"
"agola.io/agola/internal/util"
csapitypes "agola.io/agola/services/configstore/api/types"
"agola.io/agola/services/configstore/types"
2019-03-14 13:36:18 +00:00
"github.com/gorilla/mux"
"github.com/rs/zerolog"
2019-03-14 13:36:18 +00:00
)
type SecretHandler struct {
log zerolog.Logger
ah *action.ActionHandler
2019-03-14 13:36:18 +00:00
readDB *readdb.ReadDB
}
func NewSecretHandler(log zerolog.Logger, ah *action.ActionHandler, readDB *readdb.ReadDB) *SecretHandler {
return &SecretHandler{log: log, ah: ah, readDB: readDB}
2019-03-14 13:36:18 +00:00
}
func (h *SecretHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
2019-03-14 13:36:18 +00:00
vars := mux.Vars(r)
secretID := vars["secretid"]
secret, err := h.ah.GetSecret(ctx, secretID)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
return
}
if err := util.HTTPResponse(w, http.StatusOK, secret); err != nil {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
}
}
type SecretsHandler struct {
log zerolog.Logger
ah *action.ActionHandler
2019-03-14 13:36:18 +00:00
readDB *readdb.ReadDB
}
func NewSecretsHandler(log zerolog.Logger, ah *action.ActionHandler, readDB *readdb.ReadDB) *SecretsHandler {
return &SecretsHandler{log: log, ah: ah, readDB: readDB}
2019-03-14 13:36:18 +00:00
}
func (h *SecretsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
2019-03-14 13:36:18 +00:00
query := r.URL.Query()
_, tree := query["tree"]
parentType, parentRef, err := GetConfigTypeRef(r)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
return
}
secrets, err := h.ah.GetSecrets(ctx, parentType, parentRef, tree)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
return
}
resSecrets := make([]*csapitypes.Secret, len(secrets))
for i, s := range secrets {
resSecrets[i] = &csapitypes.Secret{Secret: s}
}
err = h.readDB.Do(ctx, func(tx *db.Tx) error {
2019-03-14 13:36:18 +00:00
// populate parent path
for _, s := range resSecrets {
pp, err := h.readDB.GetPath(tx, s.Parent.Type, s.Parent.ID)
2019-03-14 13:36:18 +00:00
if err != nil {
return err
}
s.ParentPath = pp
2019-03-14 13:36:18 +00:00
}
return err
})
if err != nil {
h.log.Err(err).Send()
util.HTTPError(w, err)
2019-03-14 13:36:18 +00:00
return
}
if err := util.HTTPResponse(w, http.StatusOK, resSecrets); err != nil {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
}
}
type CreateSecretHandler struct {
log zerolog.Logger
ah *action.ActionHandler
2019-03-14 13:36:18 +00:00
}
func NewCreateSecretHandler(log zerolog.Logger, ah *action.ActionHandler) *CreateSecretHandler {
return &CreateSecretHandler{log: log, ah: ah}
2019-03-14 13:36:18 +00:00
}
func (h *CreateSecretHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
parentType, parentRef, err := GetConfigTypeRef(r)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
return
}
var secret *types.Secret
d := json.NewDecoder(r.Body)
if err := d.Decode(&secret); err != nil {
util.HTTPError(w, util.NewAPIError(util.ErrBadRequest, err))
2019-03-14 13:36:18 +00:00
return
}
secret.Parent.Type = parentType
secret.Parent.ID = parentRef
secret, err = h.ah.CreateSecret(ctx, secret)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
return
}
if err := util.HTTPResponse(w, http.StatusCreated, secret); err != nil {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
}
}
2019-07-08 08:32:32 +00:00
type UpdateSecretHandler struct {
log zerolog.Logger
2019-07-08 08:32:32 +00:00
ah *action.ActionHandler
}
func NewUpdateSecretHandler(log zerolog.Logger, ah *action.ActionHandler) *UpdateSecretHandler {
return &UpdateSecretHandler{log: log, ah: ah}
2019-07-08 08:32:32 +00:00
}
func (h *UpdateSecretHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
vars := mux.Vars(r)
secretName := vars["secretname"]
parentType, parentRef, err := GetConfigTypeRef(r)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-07-08 08:32:32 +00:00
return
}
var secret *types.Secret
d := json.NewDecoder(r.Body)
if err := d.Decode(&secret); err != nil {
util.HTTPError(w, util.NewAPIError(util.ErrBadRequest, err))
2019-07-08 08:32:32 +00:00
return
}
secret.Parent.Type = parentType
secret.Parent.ID = parentRef
areq := &action.UpdateSecretRequest{
SecretName: secretName,
Secret: secret,
}
secret, err = h.ah.UpdateSecret(ctx, areq)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-07-08 08:32:32 +00:00
return
}
if err := util.HTTPResponse(w, http.StatusOK, secret); err != nil {
h.log.Err(err).Send()
2019-07-08 08:32:32 +00:00
}
}
2019-03-14 13:36:18 +00:00
type DeleteSecretHandler struct {
log zerolog.Logger
ah *action.ActionHandler
2019-03-14 13:36:18 +00:00
}
func NewDeleteSecretHandler(log zerolog.Logger, ah *action.ActionHandler) *DeleteSecretHandler {
return &DeleteSecretHandler{log: log, ah: ah}
2019-03-14 13:36:18 +00:00
}
func (h *DeleteSecretHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
vars := mux.Vars(r)
secretName := vars["secretname"]
parentType, parentRef, err := GetConfigTypeRef(r)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
return
}
err = h.ah.DeleteSecret(ctx, parentType, parentRef, secretName)
if util.HTTPError(w, err) {
h.log.Err(err).Send()
2019-03-14 13:36:18 +00:00
}
if err := util.HTTPResponse(w, http.StatusNoContent, nil); err != nil {
h.log.Err(err).Send()
}
2019-03-14 13:36:18 +00:00
}