77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
package support
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"image"
|
||
|
|
"image/png"
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestSaveAndOpenKBImage(t *testing.T) {
|
||
|
|
dir := t.TempDir()
|
||
|
|
secret := "test-signing-secret-kb"
|
||
|
|
|
||
|
|
var buf bytes.Buffer
|
||
|
|
img := image.NewRGBA(image.Rect(0, 0, 8, 8))
|
||
|
|
if err := png.Encode(&buf, img); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
|
||
|
|
out, err := SaveKBImage(dir, "http://localhost:28471", secret, "shot.png", "image/png", bytes.NewReader(buf.Bytes()))
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if out.ContentType != "image/png" || out.Size <= 0 {
|
||
|
|
t.Fatalf("ct=%s size=%d", out.ContentType, out.Size)
|
||
|
|
}
|
||
|
|
if !strings.HasPrefix(out.AdminURL, KBImageAdminURLPrefix) {
|
||
|
|
t.Fatalf("admin url=%s", out.AdminURL)
|
||
|
|
}
|
||
|
|
if !strings.Contains(out.MarkdownURL, KBImagePublicPathPrefix) || !strings.Contains(out.MarkdownURL, "sig=") {
|
||
|
|
t.Fatalf("markdown url=%s", out.MarkdownURL)
|
||
|
|
}
|
||
|
|
if _, err := os.Stat(filepath.Join(dir, kbMediaSubdir, out.Filename)); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
|
||
|
|
f, ct, err := OpenKBImage(dir, out.Filename)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
defer f.Close()
|
||
|
|
if ct != "image/png" {
|
||
|
|
t.Fatalf("open ct=%s", ct)
|
||
|
|
}
|
||
|
|
|
||
|
|
idx := strings.Index(out.MarkdownURL, "sig=")
|
||
|
|
if idx < 0 {
|
||
|
|
t.Fatal("missing sig")
|
||
|
|
}
|
||
|
|
sig := out.MarkdownURL[idx+4:]
|
||
|
|
if err := VerifyKBImageSig(secret, out.Filename, sig); err != nil {
|
||
|
|
t.Fatalf("verify: %v", err)
|
||
|
|
}
|
||
|
|
if err := VerifyKBImageSig(secret, out.Filename, "deadbeef"); err != ErrKBImageBadSig {
|
||
|
|
t.Fatalf("expected bad sig, got %v", err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSaveKBImageRejectsBadType(t *testing.T) {
|
||
|
|
dir := t.TempDir()
|
||
|
|
_, err := SaveKBImage(dir, "http://localhost:28471", "secret", "x.txt", "text/plain", bytes.NewReader([]byte("not-an-image!!!!")))
|
||
|
|
if err != ErrKBImageInvalidType {
|
||
|
|
t.Fatalf("got %v", err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestResolveKBImagePathRejectsTraversal(t *testing.T) {
|
||
|
|
dir := t.TempDir()
|
||
|
|
_, err := ResolveKBImagePath(dir, "../etc/passwd")
|
||
|
|
if err != ErrKBImageInvalidName {
|
||
|
|
t.Fatalf("got %v", err)
|
||
|
|
}
|
||
|
|
}
|