131 lines
2.7 KiB
Go
Raw Normal View History

2024-11-07 19:07:41 +00:00
package keychains
import (
2024-11-12 17:17:10 +00:00
"errors"
2024-11-07 19:07:41 +00:00
"net/http"
"github.com/gofiber/fiber/v2"
2024-11-16 02:34:07 +07:00
"rul.sh/vaulterm/server/models"
"rul.sh/vaulterm/server/utils"
2024-11-07 19:07:41 +00:00
)
func Router(app fiber.Router) {
2024-11-07 19:07:41 +00:00
router := app.Group("/keychains")
router.Get("/", getAll)
router.Post("/", create)
2024-11-09 18:57:36 +00:00
router.Put("/:id", update)
}
type GetAllResult struct {
*models.Keychain
Data map[string]interface{} `json:"data"`
2024-11-07 19:07:41 +00:00
}
func getAll(c *fiber.Ctx) error {
2024-11-12 17:17:10 +00:00
teamId := c.Query("teamId")
2024-11-09 18:57:36 +00:00
withData := c.Query("withData")
user := utils.GetUser(c)
repo := NewRepository(&Keychains{User: user})
2024-11-12 17:17:10 +00:00
if teamId != "" && !user.IsInTeam(&teamId) {
return utils.ResponseError(c, errors.New("no access"), 403)
}
rows, err := repo.GetAll(GetAllOpt{TeamID: teamId})
2024-11-07 19:07:41 +00:00
if err != nil {
return utils.ResponseError(c, err, 500)
}
2024-11-12 17:17:10 +00:00
if withData != "true" || (teamId != "" && !user.TeamCanWrite(&teamId)) {
2024-11-09 18:57:36 +00:00
return c.JSON(fiber.Map{"rows": rows})
}
res := make([]*GetAllResult, len(rows))
doneCh := make(chan struct{})
// Decrypt data
for i, item := range rows {
go func(i int, item *models.Keychain) {
var data map[string]interface{}
item.DecryptData(&data)
res[i] = &GetAllResult{item, data}
doneCh <- struct{}{}
}(i, item)
}
for range rows {
<-doneCh
}
return c.JSON(fiber.Map{"rows": res})
2024-11-07 19:07:41 +00:00
}
func create(c *fiber.Ctx) error {
var body CreateKeychainSchema
if err := c.BodyParser(&body); err != nil {
return utils.ResponseError(c, err, 500)
}
user := utils.GetUser(c)
repo := NewRepository(&Keychains{User: user})
2024-11-07 19:07:41 +00:00
2024-11-12 17:17:10 +00:00
if body.TeamID != nil && !user.TeamCanWrite(body.TeamID) {
return utils.ResponseError(c, errors.New("no access"), 403)
}
2024-11-07 19:07:41 +00:00
item := &models.Keychain{
2024-11-12 17:17:10 +00:00
OwnerID: &user.ID,
TeamID: body.TeamID,
Type: body.Type,
Label: body.Label,
2024-11-07 19:07:41 +00:00
}
if err := item.EncryptData(body.Data); err != nil {
return utils.ResponseError(c, err, 500)
}
if err := repo.Create(item); err != nil {
return utils.ResponseError(c, err, 500)
}
return c.Status(http.StatusCreated).JSON(item)
}
2024-11-09 18:57:36 +00:00
func update(c *fiber.Ctx) error {
var body CreateKeychainSchema
if err := c.BodyParser(&body); err != nil {
return utils.ResponseError(c, err, 500)
}
user := utils.GetUser(c)
repo := NewRepository(&Keychains{User: user})
2024-11-09 18:57:36 +00:00
id := c.Params("id")
2024-11-12 17:17:10 +00:00
data, _ := repo.Get(id)
if data == nil {
return utils.ResponseError(c, errors.New("key not found"), 404)
}
if !data.CanWrite(&user.User) || !user.TeamCanWrite(body.TeamID) {
return utils.ResponseError(c, errors.New("no access"), 403)
2024-11-09 18:57:36 +00:00
}
item := &models.Keychain{
2024-11-12 17:17:10 +00:00
TeamID: body.TeamID,
Type: body.Type,
Label: body.Label,
2024-11-09 18:57:36 +00:00
}
if err := item.EncryptData(body.Data); err != nil {
return utils.ResponseError(c, err, 500)
}
if err := repo.Update(id, item); err != nil {
return utils.ResponseError(c, err, 500)
}
return c.JSON(item)
}