repos / pico

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

pico / pkg / send / pipe
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}