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}