Add binaryservice
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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")
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user