repos / pico

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

commit
5f240f0
parent
c26a047
author
Eric Bower
date
2026-04-20 21:26:04 -0400 EDT
chore: rm dead code
1 files changed,  +0, -274
D pkg/storage/handler.go
+0, -274
  1@@ -1,274 +0,0 @@
  2-package storage
  3-
  4-import (
  5-	"bytes"
  6-	"encoding/binary"
  7-	"fmt"
  8-	"io"
  9-	"log/slog"
 10-	"os"
 11-	"path/filepath"
 12-	"time"
 13-
 14-	"github.com/picosh/pico/pkg/pssh"
 15-	"github.com/picosh/pico/pkg/send/utils"
 16-)
 17-
 18-type ctxBucketKey struct{}
 19-
 20-func getBucket(ctx *pssh.SSHServerConnSession) (Bucket, error) {
 21-	bucket, ok := ctx.Value(ctxBucketKey{}).(Bucket)
 22-	if !ok {
 23-		return bucket, fmt.Errorf("bucket not set on `ssh.Context()` for connection")
 24-	}
 25-	if bucket.Name == "" {
 26-		return bucket, fmt.Errorf("bucket not set on `ssh.Context()` for connection")
 27-	}
 28-	return bucket, nil
 29-}
 30-func setBucket(ctx *pssh.SSHServerConnSession, bucket Bucket) {
 31-	ctx.SetValue(ctxBucketKey{}, bucket)
 32-}
 33-
 34-type FileData struct {
 35-	*utils.FileEntry
 36-	Text   []byte
 37-	User   string
 38-	Bucket Bucket
 39-}
 40-
 41-type Config struct {
 42-	Logger     *slog.Logger
 43-	Storage    StorageServe
 44-	AssetNames AssetNames
 45-}
 46-
 47-type UploadAssetHandler struct {
 48-	Cfg *Config
 49-}
 50-
 51-var _ utils.CopyFromClientHandler = &UploadAssetHandler{}
 52-var _ utils.CopyFromClientHandler = (*UploadAssetHandler)(nil)
 53-
 54-func NewUploadAssetHandler(cfg *Config) *UploadAssetHandler {
 55-	if cfg.AssetNames == nil {
 56-		cfg.AssetNames = &AssetNamesBasic{}
 57-	}
 58-
 59-	return &UploadAssetHandler{
 60-		Cfg: cfg,
 61-	}
 62-}
 63-
 64-func (h *UploadAssetHandler) GetLogger(s *pssh.SSHServerConnSession) *slog.Logger {
 65-	return h.Cfg.Logger
 66-}
 67-
 68-func (h *UploadAssetHandler) Delete(s *pssh.SSHServerConnSession, entry *utils.FileEntry) error {
 69-	h.Cfg.Logger.Info("deleting file", "file", entry.Filepath)
 70-	bucket, err := getBucket(s)
 71-	if err != nil {
 72-		h.Cfg.Logger.Error(err.Error())
 73-		return err
 74-	}
 75-
 76-	objectFileName, err := h.Cfg.AssetNames.ObjectName(s, entry)
 77-	if err != nil {
 78-		return err
 79-	}
 80-	return h.Cfg.Storage.DeleteObject(bucket, objectFileName)
 81-}
 82-
 83-func (h *UploadAssetHandler) Read(s *pssh.SSHServerConnSession, entry *utils.FileEntry) (os.FileInfo, utils.ReadAndReaderAtCloser, error) {
 84-	fileInfo := &utils.VirtualFile{
 85-		FName:    filepath.Base(entry.Filepath),
 86-		FIsDir:   false,
 87-		FSize:    entry.Size,
 88-		FModTime: time.Unix(entry.Mtime, 0),
 89-	}
 90-	h.Cfg.Logger.Info("reading file", "file", fileInfo)
 91-
 92-	bucketName, err := h.Cfg.AssetNames.BucketName(s)
 93-	if err != nil {
 94-		return nil, nil, err
 95-	}
 96-	bucket, err := h.Cfg.Storage.GetBucket(bucketName)
 97-	if err != nil {
 98-		return nil, nil, err
 99-	}
100-
101-	fname, err := h.Cfg.AssetNames.ObjectName(s, entry)
102-	if err != nil {
103-		return nil, nil, err
104-	}
105-	contents, info, err := h.Cfg.Storage.GetObject(bucket, fname)
106-	if err != nil {
107-		return nil, nil, err
108-	}
109-
110-	fileInfo.FSize = info.Size
111-	fileInfo.FModTime = info.LastModified
112-
113-	return fileInfo, contents, nil
114-}
115-
116-func (h *UploadAssetHandler) List(s *pssh.SSHServerConnSession, fpath string, isDir bool, recursive bool) ([]os.FileInfo, error) {
117-	h.Cfg.Logger.Info(
118-		"listing path",
119-		"dir", fpath,
120-		"isDir", isDir,
121-		"recursive", recursive,
122-	)
123-	var fileList []os.FileInfo
124-
125-	cleanFilename := fpath
126-
127-	bucketName, err := h.Cfg.AssetNames.BucketName(s)
128-	if err != nil {
129-		return fileList, err
130-	}
131-	bucket, err := h.Cfg.Storage.GetBucket(bucketName)
132-	if err != nil {
133-		return fileList, err
134-	}
135-
136-	fname, err := h.Cfg.AssetNames.ObjectName(s, &utils.FileEntry{Filepath: cleanFilename})
137-	if err != nil {
138-		return fileList, err
139-	}
140-
141-	if fname == "" || fname == "." {
142-		name := fname
143-		if name == "" {
144-			name = "/"
145-		}
146-
147-		info := &utils.VirtualFile{
148-			FName:  name,
149-			FIsDir: true,
150-		}
151-
152-		fileList = append(fileList, info)
153-	} else {
154-		name := fname
155-		if name != "/" && isDir {
156-			name += "/"
157-		}
158-
159-		foundList, err := h.Cfg.Storage.ListObjects(bucket, name, recursive)
160-		if err != nil {
161-			return fileList, err
162-		}
163-
164-		fileList = append(fileList, foundList...)
165-	}
166-
167-	return fileList, nil
168-}
169-
170-func (h *UploadAssetHandler) Validate(s *pssh.SSHServerConnSession) error {
171-	var err error
172-	userName := s.User()
173-
174-	assetBucket, err := h.Cfg.AssetNames.BucketName(s)
175-	if err != nil {
176-		return err
177-	}
178-	bucket, err := h.Cfg.Storage.UpsertBucket(assetBucket)
179-	if err != nil {
180-		return err
181-	}
182-	setBucket(s, bucket)
183-
184-	pk, _ := utils.KeyText(s)
185-	h.Cfg.Logger.Info(
186-		"attempting to upload files",
187-		"user", userName,
188-		"bucket", bucket.Name,
189-		"publicKey", pk,
190-	)
191-	return nil
192-}
193-
194-func (h *UploadAssetHandler) Write(s *pssh.SSHServerConnSession, entry *utils.FileEntry) (string, error) {
195-	var origText []byte
196-	if b, err := io.ReadAll(entry.Reader); err == nil {
197-		origText = b
198-	}
199-	fileSize := binary.Size(origText)
200-	// TODO: hack for now until I figure out how to get correct
201-	// filesize from sftp,scp,rsync
202-	entry.Size = int64(fileSize)
203-	userName := s.User()
204-
205-	bucket, err := getBucket(s)
206-	if err != nil {
207-		h.Cfg.Logger.Error(err.Error())
208-		return "", err
209-	}
210-
211-	data := &FileData{
212-		FileEntry: entry,
213-		User:      userName,
214-		Text:      origText,
215-		Bucket:    bucket,
216-	}
217-	err = h.writeAsset(s, data)
218-	if err != nil {
219-		h.Cfg.Logger.Error(err.Error())
220-		return "", err
221-	}
222-
223-	url, err := h.Cfg.AssetNames.PrintObjectName(s, entry, bucket.Name)
224-	if err != nil {
225-		return "", err
226-	}
227-	return url, nil
228-}
229-
230-func (h *UploadAssetHandler) validateAsset(_ *FileData) (bool, error) {
231-	return true, nil
232-}
233-
234-func (h *UploadAssetHandler) writeAsset(s *pssh.SSHServerConnSession, data *FileData) error {
235-	valid, err := h.validateAsset(data)
236-	if !valid {
237-		return err
238-	}
239-
240-	objectFileName, err := h.Cfg.AssetNames.ObjectName(s, data.FileEntry)
241-	if err != nil {
242-		return err
243-	}
244-	reader := bytes.NewReader(data.Text)
245-
246-	h.Cfg.Logger.Info(
247-		"uploading file to bucket",
248-		"user",
249-		data.User,
250-		"bucket",
251-		data.Bucket.Name,
252-		"object",
253-		objectFileName,
254-	)
255-
256-	var mtime time.Time
257-	if data.Mtime > 0 {
258-		mtime = time.Unix(data.Mtime, 0)
259-	}
260-	info := &ObjectInfo{
261-		LastModified: mtime,
262-	}
263-
264-	_, _, err = h.Cfg.Storage.PutObject(
265-		data.Bucket,
266-		objectFileName,
267-		utils.NopReadAndReaderAtCloser(reader),
268-		info,
269-	)
270-	if err != nil {
271-		return err
272-	}
273-
274-	return nil
275-}