Skip to content

Commit

Permalink
Merge branch 'dev' into add-api-clients
Browse files Browse the repository at this point in the history
  • Loading branch information
StephenButtolph authored Nov 20, 2020
2 parents 2f95102 + b06e146 commit d39b857
Show file tree
Hide file tree
Showing 90 changed files with 1,446 additions and 885 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:experimental

FROM golang:1.13.4-buster
FROM golang:1.15.5-buster

RUN mkdir -p /go/src/github.com/ava-labs

Expand Down
31 changes: 20 additions & 11 deletions api/keystore/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ const (

maxPackerSize = 1 << 30 // max size, in bytes, of something being marshalled by Marshal()
maxSliceLength = 1 << 18

codecVersion = 0
)

var (
Expand All @@ -56,7 +58,7 @@ type UserDB struct {
type Keystore struct {
lock sync.Mutex
log logging.Logger
codec codec.Codec
codec codec.Manager

// Key: username
// Value: The user with that name
Expand All @@ -75,12 +77,19 @@ type Keystore struct {
}

// Initialize the keystore
func (ks *Keystore) Initialize(log logging.Logger, db database.Database) {
func (ks *Keystore) Initialize(log logging.Logger, db database.Database) error {
c := codec.New(codec.DefaultTagName, maxSliceLength)
manager := codec.NewManager(maxPackerSize)
if err := manager.RegisterCodec(codecVersion, c); err != nil {
return err
}

ks.log = log
ks.codec = codec.New(maxPackerSize, maxSliceLength)
ks.codec = manager
ks.users = make(map[string]*password.Hash)
ks.userDB = prefixdb.New([]byte("users"), db)
ks.bcDB = prefixdb.New([]byte("bcs"), db)
return nil
}

// CreateHandler returns a new service object that can send requests to thisAPI.
Expand Down Expand Up @@ -109,7 +118,8 @@ func (ks *Keystore) getUser(username string) (*password.Hash, error) {
}

user = &password.Hash{}
return user, ks.codec.Unmarshal(userBytes, user)
_, err = ks.codec.Unmarshal(userBytes, user)
return user, err
}

// CreateUser creates an empty user with the provided username and password
Expand Down Expand Up @@ -197,7 +207,7 @@ func (ks *Keystore) ExportUser(_ *http.Request, args *ExportUserArgs, reply *Exp
}

// Get byte representation of user
b, err := ks.codec.Marshal(&userData)
b, err := ks.codec.Marshal(codecVersion, &userData)
if err != nil {
return err
}
Expand Down Expand Up @@ -244,14 +254,14 @@ func (ks *Keystore) ImportUser(r *http.Request, args *ImportUserArgs, reply *api
}

userData := UserDB{}
if err := ks.codec.Unmarshal(userBytes, &userData); err != nil {
if _, err := ks.codec.Unmarshal(userBytes, &userData); err != nil {
return err
}
if !userData.Hash.Check(args.Password) {
return fmt.Errorf("incorrect password for user %q", args.Username)
}

usrBytes, err := ks.codec.Marshal(&userData.Hash)
usrBytes, err := ks.codec.Marshal(codecVersion, &userData.Hash)
if err != nil {
return err
}
Expand Down Expand Up @@ -383,7 +393,7 @@ func (ks *Keystore) AddUser(username, pword string) error {
return err
}

userBytes, err := ks.codec.Marshal(user)
userBytes, err := ks.codec.Marshal(codecVersion, user)
if err != nil {
return err
}
Expand All @@ -397,8 +407,7 @@ func (ks *Keystore) AddUser(username, pword string) error {
}

// CreateTestKeystore returns a new keystore that can be utilized for testing
func CreateTestKeystore() *Keystore {
func CreateTestKeystore() (*Keystore, error) {
ks := &Keystore{}
ks.Initialize(logging.NoLog{}, memdb.New())
return ks
return ks, ks.Initialize(logging.NoLog{}, memdb.New())
}
52 changes: 41 additions & 11 deletions api/keystore/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ var (
)

func TestServiceListNoUsers(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

reply := ListUsersReply{}
if err := ks.ListUsers(nil, nil, &reply); err != nil {
Expand All @@ -34,7 +37,10 @@ func TestServiceListNoUsers(t *testing.T) {
}

func TestServiceCreateUser(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

{
reply := api.SuccessResponse{}
Expand Down Expand Up @@ -73,7 +79,10 @@ func genStr(n int) string {
// TestServiceCreateUserArgsCheck generates excessively long usernames or
// passwords to assure the sanity checks on string length are not exceeded
func TestServiceCreateUserArgsCheck(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

{
reply := api.SuccessResponse{}
Expand Down Expand Up @@ -114,7 +123,10 @@ func TestServiceCreateUserArgsCheck(t *testing.T) {
// TestServiceCreateUserWeakPassword tests creating a new user with a weak
// password to ensure the password strength check is working
func TestServiceCreateUserWeakPassword(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

{
reply := api.SuccessResponse{}
Expand All @@ -134,7 +146,10 @@ func TestServiceCreateUserWeakPassword(t *testing.T) {
}

func TestServiceCreateDuplicate(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

{
reply := api.SuccessResponse{}
Expand All @@ -161,7 +176,10 @@ func TestServiceCreateDuplicate(t *testing.T) {
}

func TestServiceCreateUserNoName(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

reply := api.SuccessResponse{}
if err := ks.CreateUser(nil, &api.UserPass{
Expand All @@ -172,7 +190,10 @@ func TestServiceCreateUserNoName(t *testing.T) {
}

func TestServiceUseBlockchainDB(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

{
reply := api.SuccessResponse{}
Expand Down Expand Up @@ -213,7 +234,10 @@ func TestServiceUseBlockchainDB(t *testing.T) {
func TestServiceExportImport(t *testing.T) {
encodings := []formatting.Encoding{formatting.Hex, formatting.CB58}
for _, encoding := range encodings {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

{
reply := api.SuccessResponse{}
Expand Down Expand Up @@ -250,7 +274,10 @@ func TestServiceExportImport(t *testing.T) {
t.Fatal(err)
}

newKS := CreateTestKeystore()
newKS, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

{
reply := api.SuccessResponse{}
Expand Down Expand Up @@ -363,15 +390,18 @@ func TestServiceDeleteUser(t *testing.T) {

for _, tt := range tests {
t.Run(tt.desc, func(t *testing.T) {
ks := CreateTestKeystore()
ks, err := CreateTestKeystore()
if err != nil {
t.Fatal(err)
}

if tt.setup != nil {
if err := tt.setup(ks); err != nil {
t.Fatalf("failed to create user setup in keystore: %v", err)
}
}
got := &api.SuccessResponse{}
err := ks.DeleteUser(nil, tt.request, got)
err = ks.DeleteUser(nil, tt.request, got)
if (err != nil) != tt.wantError {
t.Fatalf("DeleteUser() failed: error %v, wantError %v", err, tt.wantError)
}
Expand Down
19 changes: 15 additions & 4 deletions chains/atomic/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import (
"github.com/ava-labs/avalanchego/utils/logging"
)

const (
codecVersion = 0
)

type rcLock struct {
lock sync.Mutex
count int
Expand All @@ -25,17 +29,24 @@ type rcLock struct {
type Memory struct {
lock sync.Mutex
log logging.Logger
codec codec.Codec
codec codec.Manager
locks map[ids.ID]*rcLock
db database.Database
}

// Initialize the SharedMemory
func (m *Memory) Initialize(log logging.Logger, db database.Database) {
func (m *Memory) Initialize(log logging.Logger, db database.Database) error {
c := codec.NewDefault()
manager := codec.NewDefaultManager()
if err := manager.RegisterCodec(codecVersion, c); err != nil {
return err
}

m.log = log
m.codec = codec.NewDefault()
m.codec = manager
m.locks = make(map[ids.ID]*rcLock)
m.db = db
return nil
}

// NewSharedMemory returns a new SharedMemory
Expand Down Expand Up @@ -95,7 +106,7 @@ func (m *Memory) sharedID(id1, id2 ids.ID) ids.ID {
id1, id2 = id2, id1
}

combinedBytes, err := m.codec.Marshal([2]ids.ID{id1, id2})
combinedBytes, err := m.codec.Marshal(codecVersion, [2]ids.ID{id1, id2})
m.log.AssertNoError(err)

return hashing.ComputeHash256Array(combinedBytes)
Expand Down
15 changes: 12 additions & 3 deletions chains/atomic/memory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ var (

func TestMemorySharedID(t *testing.T) {
m := Memory{}
m.Initialize(logging.NoLog{}, memdb.New())
err := m.Initialize(logging.NoLog{}, memdb.New())
if err != nil {
t.Fatal(err)
}

sharedID0 := m.sharedID(blockchainID0, blockchainID1)
sharedID1 := m.sharedID(blockchainID1, blockchainID0)
Expand All @@ -30,7 +33,10 @@ func TestMemorySharedID(t *testing.T) {

func TestMemoryMakeReleaseLock(t *testing.T) {
m := Memory{}
m.Initialize(logging.NoLog{}, memdb.New())
err := m.Initialize(logging.NoLog{}, memdb.New())
if err != nil {
t.Fatal(err)
}

sharedID := m.sharedID(blockchainID0, blockchainID1)

Expand All @@ -55,7 +61,10 @@ func TestMemoryMakeReleaseLock(t *testing.T) {

func TestMemoryUnknownFree(t *testing.T) {
m := Memory{}
m.Initialize(logging.NoLog{}, memdb.New())
err := m.Initialize(logging.NoLog{}, memdb.New())
if err != nil {
t.Fatal(err)
}

sharedID := m.sharedID(blockchainID0, blockchainID1)

Expand Down
9 changes: 5 additions & 4 deletions chains/atomic/shared_memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ func (sm *sharedMemory) Remove(peerChainID ids.ID, keys [][]byte, batches ...dat
}

type state struct {
c codec.Codec
c codec.Manager
valueDB database.Database
indexDB database.Database
}
Expand Down Expand Up @@ -252,7 +252,7 @@ func (s *state) SetValue(e *Element) error {
Traits: e.Traits,
}

valueBytes, err := s.c.Marshal(&dbElem)
valueBytes, err := s.c.Marshal(codecVersion, &dbElem)
if err != nil {
return err
}
Expand All @@ -269,7 +269,7 @@ func (s *state) RemoveValue(key []byte) error {

// The value doesn't exist, so we should optimistically deleted it
dbElem := dbElement{Present: false}
valueBytes, err := s.c.Marshal(&dbElem)
valueBytes, err := s.c.Marshal(codecVersion, &dbElem)
if err != nil {
return err
}
Expand All @@ -293,7 +293,8 @@ func (s *state) loadValue(key []byte) (*dbElement, error) {

// The key was in the database
value := &dbElement{}
return value, s.c.Unmarshal(valueBytes, value)
_, err = s.c.Unmarshal(valueBytes, value)
return value, err
}

func (s *state) getKeys(traits [][]byte, startTrait, startKey []byte, limit int) ([][]byte, []byte, []byte, error) {
Expand Down
7 changes: 5 additions & 2 deletions chains/atomic/shared_memory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,18 @@ import (

func TestSharedMemory(t *testing.T) {
m := Memory{}
m.Initialize(logging.NoLog{}, memdb.New())
err := m.Initialize(logging.NoLog{}, memdb.New())
if err != nil {
t.Fatal(err)
}

chainID0 := ids.GenerateTestID()
chainID1 := ids.GenerateTestID()

sm0 := m.NewSharedMemory(chainID0)
sm1 := m.NewSharedMemory(chainID1)

err := sm0.Put(chainID1, []*Element{{
err = sm0.Put(chainID1, []*Element{{
Key: []byte{0},
Value: []byte{1},
Traits: [][]byte{
Expand Down
Loading

0 comments on commit d39b857

Please sign in to comment.