Antonio Mika
·
2025-03-12
pipe.go
1package pipe
2
3import (
4 "fmt"
5 "io/fs"
6 "strconv"
7 "strings"
8 "time"
9
10 "github.com/picosh/pico/pkg/pssh"
11 "github.com/picosh/pico/pkg/send/utils"
12)
13
14func Middleware(writeHandler utils.CopyFromClientHandler, ext string) pssh.SSHServerMiddleware {
15 return func(sshHandler pssh.SSHServerHandler) pssh.SSHServerHandler {
16 return func(session *pssh.SSHServerConnSession) error {
17 _, _, activePty := session.Pty()
18 if activePty {
19 _ = session.Exit(0)
20 err := session.Close()
21 return err
22 }
23
24 cmd := session.Command()
25
26 name := ""
27 if len(cmd) > 0 {
28 name = strings.TrimSpace(cmd[0])
29 if strings.Contains(name, "=") {
30 name = ""
31 }
32 }
33
34 postTime := time.Now()
35
36 if name == "" {
37 name = fmt.Sprintf("%s%s", strconv.Itoa(int(postTime.UnixNano())), ext)
38 }
39
40 result, err := writeHandler.Write(session, &utils.FileEntry{
41 Filepath: name,
42 Mode: fs.FileMode(0777),
43 Size: 0,
44 Mtime: postTime.Unix(),
45 Atime: postTime.Unix(),
46 Reader: session,
47 })
48 if err != nil {
49 utils.ErrorHandler(session, err)
50 return err
51 }
52
53 if result != "" {
54 _, err = session.Write([]byte(fmt.Sprintf("%s\r\n", result)))
55 if err != nil {
56 utils.ErrorHandler(session, err)
57 }
58 return err
59 }
60
61 return sshHandler(session)
62 }
63 }
64}