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}