repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

pico / pkg / apps / pastes
Eric Bower  ·  2026-01-25

scp_hooks.go

  1package pastes
  2
  3import (
  4	"fmt"
  5	"strconv"
  6	"strings"
  7	"time"
  8
  9	"github.com/araddon/dateparse"
 10	"github.com/picosh/pico/pkg/db"
 11	"github.com/picosh/pico/pkg/filehandlers"
 12	"github.com/picosh/pico/pkg/pssh"
 13	"github.com/picosh/pico/pkg/shared"
 14)
 15
 16var DEFAULT_EXPIRES_AT = 90
 17
 18type FileHooks struct {
 19	Cfg *shared.ConfigSite
 20	Db  db.DB
 21}
 22
 23func (p *FileHooks) FileValidate(s *pssh.SSHServerConnSession, data *filehandlers.PostMetaData) (bool, error) {
 24	if !shared.IsTextFile(string(data.Text)) {
 25		err := fmt.Errorf(
 26			"ERROR: (%s) invalid file must be plain text (utf-8), skipping",
 27			data.Filename,
 28		)
 29		return false, err
 30	}
 31
 32	maxFileSize := int(p.Cfg.MaxAssetSize)
 33	if data.FileSize > maxFileSize {
 34		return false, fmt.Errorf(
 35			"ERROR: file (%s) has exceeded maximum file size (%d bytes)",
 36			data.Filename,
 37			maxFileSize,
 38		)
 39	}
 40
 41	return true, nil
 42}
 43
 44func (p *FileHooks) FileMeta(s *pssh.SSHServerConnSession, data *filehandlers.PostMetaData) error {
 45	data.Title = shared.ToUpper(data.Slug)
 46	// we want the slug to be the filename for pastes
 47	data.Slug = data.Filename
 48
 49	if data.ExpiresAt == nil || data.ExpiresAt.IsZero() {
 50		// mark posts for deletion a X days after creation
 51		expiresAt := time.Now().AddDate(0, 0, DEFAULT_EXPIRES_AT)
 52		data.ExpiresAt = &expiresAt
 53	}
 54
 55	var hidden bool
 56	var expiresFound bool
 57	var expires *time.Time
 58
 59	cmd := s.Command()
 60
 61	for _, arg := range cmd {
 62		if strings.Contains(arg, "=") {
 63			splitArg := strings.Split(arg, "=")
 64			if len(splitArg) != 2 {
 65				continue
 66			}
 67
 68			switch splitArg[0] {
 69			case "hidden":
 70				val, err := strconv.ParseBool(splitArg[1])
 71				if err != nil {
 72					continue
 73				}
 74
 75				hidden = val
 76			case "expires":
 77				val, err := strconv.ParseBool(splitArg[1])
 78				if err == nil {
 79					expiresFound = !val
 80					continue
 81				}
 82
 83				duration, err := time.ParseDuration(splitArg[1])
 84				if err == nil {
 85					expiresFound = true
 86					expireTime := time.Now().Add(duration)
 87					expires = &expireTime
 88					continue
 89				}
 90
 91				expireTime, err := dateparse.ParseStrict(splitArg[1])
 92				if err == nil {
 93					expiresFound = true
 94					expires = &expireTime
 95				}
 96			}
 97		}
 98	}
 99
100	data.Hidden = hidden
101
102	if expiresFound {
103		data.ExpiresAt = expires
104	}
105
106	return nil
107}