Add binaryservice

This commit is contained in:
2021-12-08 05:42:25 +01:00
parent aacbeed1e3
commit ee7c48dad7
15 changed files with 965 additions and 111 deletions

View File

@@ -2,7 +2,10 @@ package store
import (
"crypto/ecdsa"
"crypto/sha256"
"crypto/x509"
"fmt"
"strings"
"sync"
"gitea.benny.dog/torjus/ezshare/pb"
@@ -10,16 +13,22 @@ import (
)
type MemoryStore struct {
filesLock sync.RWMutex
files map[string]*pb.File
// Filestore
filesLock sync.RWMutex
files map[string]*pb.File
// Certstore
certLock sync.RWMutex
certs map[string][]byte
keyLock sync.RWMutex
keys map[string][]byte
usersLock sync.RWMutex
users map[string]*pb.User
revokedCerts map[string]struct{}
revokedLock sync.RWMutex
// Userstore
usersLock sync.RWMutex
users map[string]*pb.User
// Binarystore
binaryLock sync.RWMutex
binaries map[[32]byte]*pb.Binary
}
func NewMemoryStore() *MemoryStore {
@@ -29,6 +38,7 @@ func NewMemoryStore() *MemoryStore {
keys: make(map[string][]byte),
users: make(map[string]*pb.User),
revokedCerts: make(map[string]struct{}),
binaries: make(map[[32]byte]*pb.Binary),
}
}
@@ -212,3 +222,36 @@ func (s *MemoryStore) GetUserByUsername(username string) (*pb.User, error) {
}
return nil, ErrNoSuchItem
}
// Binary store
func (s *MemoryStore) StoreBinary(release *pb.Binary) error {
s.binaryLock.Lock()
defer s.binaryLock.Unlock()
hasher := sha256.New()
_, err := hasher.Write(release.Data)
if err != nil {
return fmt.Errorf("unable to hash binary: %w", err)
}
sum := hasher.Sum(nil)
var byteSum [32]byte
copy(byteSum[:], sum[:32])
s.binaries[byteSum] = release
return nil
}
func (s *MemoryStore) GetBinary(version string, os string, arch string) (*pb.Binary, error) {
s.binaryLock.RLock()
defer s.binaryLock.RUnlock()
for _, release := range s.binaries {
if release.Arch == arch && release.Os == os {
if release.Version == version || strings.EqualFold(os, "latest") {
return release, nil
}
}
}
return nil, ErrNoSuchItem
}

View File

@@ -19,3 +19,7 @@ func TestMemoryUserStore(t *testing.T) {
s := store.NewMemoryStore()
doUserStoreTests(s, t)
}
func TestMemoryBinaryStore(t *testing.T) {
s := store.NewMemoryStore()
doBinaryStoreTests(s, t)
}

View File

@@ -33,3 +33,8 @@ type UserStore interface {
GetUserByUsername(username string) (*pb.User, error)
ListUsers() ([]string, error)
}
type BinaryStore interface {
StoreBinary(release *pb.Binary) error
GetBinary(version, os, arch string) (*pb.Binary, error)
}

View File

@@ -209,3 +209,43 @@ func doUserStoreTests(s store.UserStore, t *testing.T) {
}
})
}
func doBinaryStoreTests(s store.BinaryStore, t *testing.T) {
winBinary := &pb.Binary{
Version: "v1.0.0",
Arch: "amd64",
Os: "windows",
Data: []byte("WINDOWS"),
}
linuxBinary := &pb.Binary{
Version: "v1.0.0",
Arch: "arm",
Os: "linux",
Data: []byte("LINUXLOL"),
}
// Store
if err := s.StoreBinary(winBinary); err != nil {
t.Fatalf("Error storing binary: %s", err)
}
if err := s.StoreBinary(linuxBinary); err != nil {
t.Fatalf("Error storing binary: %s", err)
}
// Get
linux, err := s.GetBinary(linuxBinary.Version, linuxBinary.Os, linuxBinary.Arch)
if err != nil {
t.Fatalf("Error geting linux binary: %s", err)
}
windows, err := s.GetBinary(winBinary.Version, winBinary.Os, winBinary.Arch)
if err != nil {
t.Fatalf("Error geting linux binary: %s", err)
}
if string(linux.Data) != string(linuxBinary.Data) {
t.Fatalf("Data is not the same in linux-binary")
}
if string(windows.Data) != string(winBinary.Data) {
t.Fatalf("Data is not the same in linux-binary")
}
}