2021-03-24 23:11:23 +08:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
2021-03-25 21:25:51 +08:00
|
|
|
"errors"
|
2021-03-26 18:18:40 +08:00
|
|
|
"fmt"
|
2021-03-25 21:11:01 +08:00
|
|
|
"github.com/darmiel/yaxc/internal/common"
|
2021-03-24 23:11:23 +08:00
|
|
|
"github.com/gofiber/fiber/v2"
|
2021-03-26 18:18:40 +08:00
|
|
|
"strings"
|
2021-03-24 23:11:23 +08:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2021-03-25 21:25:51 +08:00
|
|
|
var errEncryptionNotEnabled = errors.New("encryption not enabled")
|
|
|
|
|
2021-03-24 23:11:23 +08:00
|
|
|
func (s *yAxCServer) handlePostAnywhere(ctx *fiber.Ctx) (err error) {
|
2021-03-26 18:18:40 +08:00
|
|
|
path := strings.TrimSpace(ctx.Params("anywhere"))
|
2021-03-24 23:11:23 +08:00
|
|
|
|
2021-03-25 21:11:01 +08:00
|
|
|
// Read content
|
2021-03-24 23:11:23 +08:00
|
|
|
bytes := ctx.Body()
|
2021-03-24 23:33:28 +08:00
|
|
|
if s.MaxBodyLength > 0 && len(bytes) > s.MaxBodyLength {
|
2021-03-24 23:11:23 +08:00
|
|
|
return s.errBodyLen
|
|
|
|
}
|
|
|
|
content := string(bytes)
|
|
|
|
|
2021-03-25 21:11:01 +08:00
|
|
|
// TTL
|
2021-03-24 23:11:23 +08:00
|
|
|
ttl := s.DefaultTTL
|
|
|
|
if q := ctx.Query("ttl"); q != "" {
|
|
|
|
if ttl, err = time.ParseDuration(q); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-25 21:11:01 +08:00
|
|
|
// Encryption
|
|
|
|
if q := ctx.Query("secret"); q != "" {
|
2021-03-25 21:25:51 +08:00
|
|
|
if !s.EnableEncryption {
|
|
|
|
return errEncryptionNotEnabled
|
|
|
|
}
|
2021-03-25 21:11:01 +08:00
|
|
|
// fail on error
|
|
|
|
encrypt, err := common.Encrypt(content, q)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
content = string(encrypt)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if ttl is valid
|
2021-03-24 23:33:28 +08:00
|
|
|
if (s.MinTTL != 0 && s.MinTTL > ttl) || (s.MaxTTL != 0 && s.MaxTTL < ttl) {
|
2021-03-24 23:11:23 +08:00
|
|
|
return ctx.Status(400).SendString("ERROR: TTL out of range")
|
|
|
|
}
|
|
|
|
|
2021-03-26 18:18:40 +08:00
|
|
|
hash := common.Hash(content)
|
|
|
|
|
2021-03-25 21:11:01 +08:00
|
|
|
// Set contents
|
2021-03-26 18:18:40 +08:00
|
|
|
errVal := s.Backend.Set(path, content, ttl)
|
|
|
|
errHsh := s.Backend.SetHash(path, hash, ttl)
|
2021-03-24 23:11:23 +08:00
|
|
|
|
2021-03-26 18:18:40 +08:00
|
|
|
if errVal != nil || errHsh != nil {
|
|
|
|
log.Warning("ERROR saving Value / Hash:", errVal, errHsh)
|
|
|
|
return ctx.Status(400).SendString(
|
|
|
|
fmt.Sprintf("ERROR (Val): %v\nERROR (Hsh): %v", errVal, errHsh))
|
2021-03-25 21:11:01 +08:00
|
|
|
}
|
|
|
|
|
2021-03-26 17:59:53 +08:00
|
|
|
log.Debug(ctx.IP(), "updated", path, "with hash", hash)
|
2021-03-24 23:11:23 +08:00
|
|
|
|
2021-03-26 17:59:53 +08:00
|
|
|
return ctx.Status(200).SendString(content)
|
2021-03-24 23:11:23 +08:00
|
|
|
}
|