lfs_test.go
2159 bytes
1package git
2
3import (
4 "errors"
5 "strings"
6 "testing"
7
8 "github.com/charmbracelet/git-lfs-transfer/transfer"
9 "github.com/charmbracelet/soft-serve/pkg/lfs"
10)
11
12// Object IDs arrive raw off the pktline stream. They must be rejected before
13// they can be joined into a storage path. The backend is left zero-valued on
14// purpose: a guard that fires only after the store or filesystem is touched is
15// not a guard.
16func TestLFSTransferRejectsMalformedOid(t *testing.T) {
17 oids := []string{
18 "../../../../../../../../etc/passwd",
19 "../../ssh/soft_serve_host_ed25519",
20 "objects/../../../soft-serve.db",
21 "/etc/passwd",
22 "",
23 "abc",
24 strings.Repeat("a", 63),
25 strings.Repeat("a", 65),
26 strings.ToUpper(strings.Repeat("a", 64)),
27 }
28
29 var backend lfsTransfer
30 for _, oid := range oids {
31 t.Run(oid, func(t *testing.T) {
32 if _, _, err := backend.Download(oid, nil); !errors.Is(err, errInvalidOid) {
33 t.Errorf("Download: got %v, want errInvalidOid", err)
34 }
35 if err := backend.Upload(oid, 1, strings.NewReader("x"), nil); !errors.Is(err, errInvalidOid) {
36 t.Errorf("Upload: got %v, want errInvalidOid", err)
37 }
38 // Verify answers in-band with a conflict status rather than
39 // tearing down the session.
40 status, err := backend.Verify(oid, 1, nil)
41 if err != nil {
42 t.Errorf("Verify: unexpected error %v", err)
43 } else if status == nil || status.Code() != transfer.StatusConflict {
44 t.Errorf("Verify: got %v, want a conflict status", status)
45 }
46
47 items := []transfer.BatchItem{{Pointer: transfer.Pointer{Oid: oid, Size: 1}}}
48 if _, err := backend.Batch("download", items, nil); !errors.Is(err, errInvalidOid) {
49 t.Errorf("Batch: got %v, want errInvalidOid", err)
50 }
51 })
52 }
53}
54
55// A malformed object ID is a client error, so the processor reports it as a
56// 400 rather than falling through to a generic internal error.
57func TestInvalidOidIsAParseError(t *testing.T) {
58 if !errors.Is(errInvalidOid, transfer.ErrParseError) {
59 t.Errorf("errInvalidOid does not wrap transfer.ErrParseError")
60 }
61 if !errors.Is(errInvalidOid, lfs.ErrInvalidOIDFormat) {
62 t.Errorf("errInvalidOid does not wrap lfs.ErrInvalidOIDFormat")
63 }
64}