repos / pico

pico services - prose.sh, pastes.sh, imgs.sh, feeds.sh, pgs.sh
git clone https://github.com/picosh/pico.git

pico / pastes
Eric Bower · 12 Nov 23

scp_hooks.go

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