diff --git a/Makefile b/Makefile index 38a94af5..31dda6ee 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ endif export PATH=$(GOPATH)/bin:$(shell echo $$PATH) +# TODO: folders were changed, so we should update Makefile and protos generation protos-go: @echo 'Generating protobuf packages (Go)...' $(eval P_TIMESTAMP := Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types) diff --git a/account/accountdata.go b/account/accountdata.go new file mode 100644 index 00000000..2c06b02a --- /dev/null +++ b/account/accountdata.go @@ -0,0 +1,9 @@ +package account + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + +type AccountData struct { + Identity string + SignKey keys.SigningPrivKey + EncKey keys.EncryptionPrivKey +} diff --git a/acltree/pb/aclchanges.pb.go b/aclchanges/pb/aclchanges.pb.go similarity index 100% rename from acltree/pb/aclchanges.pb.go rename to aclchanges/pb/aclchanges.pb.go diff --git a/acltree/pb/protos/aclchanges.proto b/aclchanges/pb/protos/aclchanges.proto similarity index 100% rename from acltree/pb/protos/aclchanges.proto rename to aclchanges/pb/protos/aclchanges.proto diff --git a/acltree/aclstate.go b/acltree/aclstate.go index ad64dad4..7fce4f3e 100644 --- a/acltree/aclstate.go +++ b/acltree/aclstate.go @@ -6,7 +6,7 @@ import ( "fmt" "hash/fnv" - "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree/pb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/textileio/go-threads/crypto/symmetric" ) diff --git a/acltree/aclstatebuilder.go b/acltree/aclstatebuilder.go index 2bb52301..e09e2538 100644 --- a/acltree/aclstatebuilder.go +++ b/acltree/aclstatebuilder.go @@ -3,7 +3,8 @@ package acltree import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree/pb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" ) @@ -20,7 +21,7 @@ type decreasedPermissionsParameters struct { startChange string } -func NewACLStateBuilder(decoder keys.SigningPubKeyDecoder, accountData *AccountData) *ACLStateBuilder { +func NewACLStateBuilder(decoder keys.SigningPubKeyDecoder, accountData *account.AccountData) *ACLStateBuilder { return &ACLStateBuilder{ decoder: decoder, identity: accountData.Identity, diff --git a/acltree/aclstatebuilder_test.go b/acltree/aclstatebuilder_test.go index 518e1547..4cdc07f2 100644 --- a/acltree/aclstatebuilder_test.go +++ b/acltree/aclstatebuilder_test.go @@ -3,13 +3,78 @@ package acltree import ( "testing" - "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree/pb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb" "github.com/anytypeio/go-anytype-infrastructure-experiments/testutils/threadbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/thread" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/stretchr/testify/assert" ) +type ACLContext struct { + Tree *Tree + ACLState *aclState +} + +func createTreeFromThread(t thread.Thread, fromStart bool) (*Tree, error) { + treeBuilder := NewTreeBuilder(t, keys.NewEd25519Decoder()) + treeBuilder.Init() + return treeBuilder.Build(fromStart) +} + +func createACLStateFromThread( + t thread.Thread, + identity string, + key keys.EncryptionPrivKey, + decoder keys.SigningPubKeyDecoder, + fromStart bool) (*ACLContext, error) { + tree, err := createTreeFromThread(t, fromStart) + if err != nil { + return nil, err + } + + accountData := &account.AccountData{ + Identity: identity, + EncKey: key, + } + + aclTreeBuilder := NewACLTreeBuilder(t, decoder) + aclTreeBuilder.Init() + aclTree, err := aclTreeBuilder.Build() + if err != nil { + return nil, err + } + + if !fromStart { + snapshotValidator := NewSnapshotValidator(decoder, accountData) + snapshotValidator.Init(aclTree) + valid, err := snapshotValidator.ValidateSnapshot(tree.root) + if err != nil { + return nil, err + } + if !valid { + // TODO: think about what to do if the snapshot is invalid - should we rebuild the tree without it + return createACLStateFromThread(t, identity, key, decoder, true) + } + } + + aclBuilder := NewACLStateBuilder(decoder, accountData) + err = aclBuilder.Init(tree) + if err != nil { + return nil, err + } + + aclState, err := aclBuilder.Build() + if err != nil { + return nil, err + } + return &ACLContext{ + Tree: tree, + ACLState: aclState, + }, nil +} + func TestACLStateBuilder_UserJoinBuild(t *testing.T) { thread, err := threadbuilder.NewThreadBuilderFromFile("threadbuilder/userjoinexample.yml") if err != nil { @@ -21,7 +86,6 @@ func TestACLStateBuilder_UserJoinBuild(t *testing.T) { keychain.GetIdentity("A"), keychain.EncryptionKeys["A"], keys.NewEd25519Decoder(), - NewPlainTextDocumentStateProvider(), false) if err != nil { t.Fatalf("should build acl aclState without err: %v", err) @@ -56,7 +120,6 @@ func TestACLStateBuilder_UserRemoveBuild(t *testing.T) { keychain.GetIdentity("A"), keychain.EncryptionKeys["A"], keys.NewEd25519Decoder(), - NewPlainTextDocumentStateProvider(), false) if err != nil { t.Fatalf("should build acl aclState without err: %v", err) @@ -87,7 +150,6 @@ func TestACLStateBuilder_UserRemoveBeforeBuild(t *testing.T) { keychain.GetIdentity("A"), keychain.EncryptionKeys["A"], keys.NewEd25519Decoder(), - NewPlainTextDocumentStateProvider(), false) if err != nil { t.Fatalf("should build acl aclState without err: %v", err) @@ -119,7 +181,6 @@ func TestACLStateBuilder_InvalidSnapshotBuild(t *testing.T) { keychain.GetIdentity("A"), keychain.EncryptionKeys["A"], keys.NewEd25519Decoder(), - NewPlainTextDocumentStateProvider(), false) if err != nil { t.Fatalf("should build acl aclState without err: %v", err) @@ -150,7 +211,6 @@ func TestACLStateBuilder_ValidSnapshotBuild(t *testing.T) { keychain.GetIdentity("A"), keychain.EncryptionKeys["A"], keys.NewEd25519Decoder(), - NewPlainTextDocumentStateProvider(), false) if err != nil { t.Fatalf("should build acl aclState without err: %v", err) diff --git a/acltree/acltreebuilder.go b/acltree/acltreebuilder.go index 680c9c79..ca566359 100644 --- a/acltree/acltreebuilder.go +++ b/acltree/acltreebuilder.go @@ -2,9 +2,9 @@ package acltree import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/thread" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" gothread "github.com/textileio/go-threads/core/thread" ) diff --git a/acltree/change.go b/acltree/change.go index f07f19b1..7af0e511 100644 --- a/acltree/change.go +++ b/acltree/change.go @@ -3,7 +3,7 @@ package acltree import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree/pb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb" "github.com/textileio/go-threads/crypto/symmetric" ) diff --git a/acltree/changeloader.go b/acltree/changeloader.go index 3947cee7..72004477 100644 --- a/acltree/changeloader.go +++ b/acltree/changeloader.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree/pb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb" "github.com/anytypeio/go-anytype-infrastructure-experiments/thread" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/gogo/protobuf/proto" diff --git a/acltree/documentcontext.go b/acltree/documentcontext.go deleted file mode 100644 index b1b29e1a..00000000 --- a/acltree/documentcontext.go +++ /dev/null @@ -1,8 +0,0 @@ -package acltree - -type documentContext struct { - aclTree *Tree // TODO: remove it, because we don't use it - fullTree *Tree - aclState *aclState - docState DocumentState -} diff --git a/acltree/snapshotvalidator.go b/acltree/snapshotvalidator.go index 8b40ec97..5a7aeda1 100644 --- a/acltree/snapshotvalidator.go +++ b/acltree/snapshotvalidator.go @@ -2,19 +2,22 @@ package acltree import ( "fmt" + + "github.com/anytypeio/go-anytype-infrastructure-experiments/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" ) type SnapshotValidator struct { aclTree *Tree identity string - key threadmodels.EncryptionPrivKey - decoder threadmodels.SigningPubKeyDecoder + key keys.EncryptionPrivKey + decoder keys.SigningPubKeyDecoder stateBuilder *ACLStateBuilder } func NewSnapshotValidator( - decoder threadmodels.SigningPubKeyDecoder, - accountData *AccountData) *SnapshotValidator { + decoder keys.SigningPubKeyDecoder, + accountData *account.AccountData) *SnapshotValidator { return &SnapshotValidator{ identity: accountData.Identity, key: accountData.EncKey, diff --git a/acltree/threadhelpers.go b/acltree/threadhelpers.go deleted file mode 100644 index 7e46b697..00000000 --- a/acltree/threadhelpers.go +++ /dev/null @@ -1,88 +0,0 @@ -package acltree - -type ACLContext struct { - Tree *Tree - ACLState *aclState - DocState DocumentState -} - -func createTreeFromThread(t threadmodels.Thread, fromStart bool) (*Tree, error) { - treeBuilder := NewTreeBuilder(t, threadmodels.NewEd25519Decoder()) - treeBuilder.Init() - return treeBuilder.Build(fromStart) -} - -func createACLStateFromThread( - t threadmodels.Thread, - identity string, - key threadmodels.EncryptionPrivKey, - decoder threadmodels.SigningPubKeyDecoder, - provider InitialStateProvider, - fromStart bool) (*ACLContext, error) { - tree, err := createTreeFromThread(t, fromStart) - if err != nil { - return nil, err - } - - accountData := &AccountData{ - Identity: identity, - EncKey: key, - } - - aclTreeBuilder := NewACLTreeBuilder(t, decoder) - aclTreeBuilder.Init() - aclTree, err := aclTreeBuilder.Build() - if err != nil { - return nil, err - } - - if !fromStart { - snapshotValidator := NewSnapshotValidator(decoder, accountData) - snapshotValidator.Init(aclTree) - valid, err := snapshotValidator.ValidateSnapshot(tree.root) - if err != nil { - return nil, err - } - if !valid { - // TODO: think about what to do if the snapshot is invalid - should we rebuild the tree without it - return createACLStateFromThread(t, identity, key, decoder, provider, true) - } - } - - aclBuilder := NewACLStateBuilder(decoder, accountData) - err = aclBuilder.Init(tree) - if err != nil { - return nil, err - } - - aclState, err := aclBuilder.Build() - if err != nil { - return nil, err - } - return &ACLContext{ - Tree: tree, - ACLState: aclState, - }, nil -} - -func createDocumentStateFromThread( - t threadmodels.Thread, - identity string, - key threadmodels.EncryptionPrivKey, - provider InitialStateProvider, - decoder threadmodels.SigningPubKeyDecoder) (*ACLContext, error) { - context, err := createACLStateFromThread(t, identity, key, decoder, provider, false) - if err != nil { - return nil, err - } - - docStateBuilder := newDocumentStateBuilder(provider) - docStateBuilder.init(context.ACLState, context.Tree) - docState, err := docStateBuilder.build() - if err != nil { - return nil, err - } - context.DocState = docState - - return context, nil -} diff --git a/acltree/treebuilder.go b/acltree/treebuilder.go index 05800980..f56790d4 100644 --- a/acltree/treebuilder.go +++ b/acltree/treebuilder.go @@ -3,9 +3,9 @@ package acltree import ( "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/thread" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" //"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/lib/logging" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "github.com/prometheus/common/log" diff --git a/acltree/docstate.go b/exampledocument/docstate.go similarity index 89% rename from acltree/docstate.go rename to exampledocument/docstate.go index dd6f69d0..95bc41b6 100644 --- a/acltree/docstate.go +++ b/exampledocument/docstate.go @@ -1,4 +1,4 @@ -package acltree +package exampledocument type DocumentState interface { ApplyChange(change []byte, id string) (DocumentState, error) diff --git a/acltree/document.go b/exampledocument/document.go similarity index 88% rename from acltree/document.go rename to exampledocument/document.go index 8a89792a..fe378a2d 100644 --- a/acltree/document.go +++ b/exampledocument/document.go @@ -1,7 +1,8 @@ -package acltree +package exampledocument import ( "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/data/pb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "github.com/gogo/protobuf/proto" @@ -20,13 +21,13 @@ type Document struct { accountData *AccountData decoder threadmodels.SigningPubKeyDecoder - treeBuilder *TreeBuilder - aclTreeBuilder *ACLTreeBuilder - aclStateBuilder *ACLStateBuilder - snapshotValidator *SnapshotValidator - docStateBuilder *documentStateBuilder + treeBuilder *acltree.TreeBuilder + aclTreeBuilder *acltree.ACLTreeBuilder + aclStateBuilder *acltree.ACLStateBuilder + snapshotValidator *acltree.SnapshotValidator + docStateBuilder *acltree.documentStateBuilder - docContext *documentContext + docContext *acltree.documentContext } type UpdateResult int @@ -54,12 +55,12 @@ func NewDocument( stateProvider: stateProvider, accountData: accountData, decoder: decoder, - aclTreeBuilder: NewACLTreeBuilder(thread, decoder), - treeBuilder: NewTreeBuilder(thread, decoder), - snapshotValidator: NewSnapshotValidator(decoder, accountData), - aclStateBuilder: NewACLStateBuilder(decoder, accountData), - docStateBuilder: newDocumentStateBuilder(stateProvider), - docContext: &documentContext{}, + aclTreeBuilder: acltree.NewACLTreeBuilder(thread, decoder), + treeBuilder: acltree.NewTreeBuilder(thread, decoder), + snapshotValidator: acltree.NewSnapshotValidator(decoder, accountData), + aclStateBuilder: acltree.NewACLStateBuilder(decoder, accountData), + docStateBuilder: acltree.newDocumentStateBuilder(stateProvider), + docContext: &acltree.documentContext{}, } } @@ -94,7 +95,7 @@ func (d *Document) CreateChange(payload *CreateChangePayload) error { } // TODO: add CID creation logic based on content - ch := NewChange(payload.Id, aclChange) + ch := acltree.NewChange(payload.Id, aclChange) ch.DecryptedDocumentChange = marshalled fullMarshalledChange, err := proto.Marshal(aclChange) @@ -115,7 +116,7 @@ func (d *Document) CreateChange(payload *CreateChangePayload) error { } d.docContext.fullTree.AddFast(ch) - err = d.thread.AddChange(&threadmodels.RawChange{ + err = d.thread.AddChange(&thread.RawChange{ Payload: marshalled, Signature: signature, Id: payload.Id, @@ -130,8 +131,8 @@ func (d *Document) CreateChange(payload *CreateChangePayload) error { return nil } -func (d *Document) Update(changes ...*threadmodels.RawChange) (DocumentState, UpdateResult, error) { - var treeChanges []*Change +func (d *Document) Update(changes ...*thread.RawChange) (DocumentState, UpdateResult, error) { + var treeChanges []*acltree.Change var foundACLChange bool for _, ch := range changes { @@ -162,9 +163,9 @@ func (d *Document) Update(changes ...*threadmodels.RawChange) (DocumentState, Up prevHeads := d.docContext.fullTree.Heads() mode := d.docContext.fullTree.Add(treeChanges...) switch mode { - case Nothing: + case acltree.Nothing: return d.docContext.docState, UpdateResultNoAction, nil - case Rebuild: + case acltree.Rebuild: res, err := d.Build() return res, UpdateResultRebuild, err default: diff --git a/acltree/document_test.go b/exampledocument/document_test.go similarity index 98% rename from acltree/document_test.go rename to exampledocument/document_test.go index f6c868ff..99fea827 100644 --- a/acltree/document_test.go +++ b/exampledocument/document_test.go @@ -1,4 +1,4 @@ -package acltree +package exampledocument import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/testutils/threadbuilder" diff --git a/exampledocument/documentcontext.go b/exampledocument/documentcontext.go new file mode 100644 index 00000000..08a415bb --- /dev/null +++ b/exampledocument/documentcontext.go @@ -0,0 +1,10 @@ +package exampledocument + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree" + +type documentContext struct { + aclTree *acltree.Tree // TODO: remove it, because we don't use it + fullTree *acltree.Tree + aclState *acltree.aclState + docState DocumentState +} diff --git a/acltree/documentstatebuilder.go b/exampledocument/documentstatebuilder.go similarity index 79% rename from acltree/documentstatebuilder.go rename to exampledocument/documentstatebuilder.go index 227999a4..8cff9dc0 100644 --- a/acltree/documentstatebuilder.go +++ b/exampledocument/documentstatebuilder.go @@ -1,14 +1,15 @@ -package acltree +package exampledocument import ( "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree" ) // example -> type documentStateBuilder struct { - tree *Tree - aclState *aclState // TODO: decide if this is needed or not + tree *acltree.Tree + aclState *acltree.aclState // TODO: decide if this is needed or not stateProvider InitialStateProvider } @@ -18,7 +19,7 @@ func newDocumentStateBuilder(stateProvider InitialStateProvider) *documentStateB } } -func (d *documentStateBuilder) init(aclState *aclState, tree *Tree) { +func (d *documentStateBuilder) init(aclState *acltree.aclState, tree *acltree.Tree) { d.tree = tree d.aclState = aclState } @@ -44,7 +45,7 @@ func (d *documentStateBuilder) build() (s DocumentState, err error) { t := d.tree startId = rootChange.Id - t.Iterate(startId, func(c *Change) (isContinue bool) { + t.Iterate(startId, func(c *acltree.Change) (isContinue bool) { count++ if startId == c.Id { return true @@ -67,7 +68,7 @@ func (d *documentStateBuilder) appendFrom(fromId string, init DocumentState) (s // TODO: we should do something like state copy probably s = init // TODO: we should have the same logic as in ACLStateBuilder, that means we should either pass in both methods state from the outside or save the state inside the builder - d.tree.Iterate(fromId, func(c *Change) (isContinue bool) { + d.tree.Iterate(fromId, func(c *acltree.Change) (isContinue bool) { if c.Id == fromId { return true } diff --git a/acltree/documentstatebuilder_test.go b/exampledocument/documentstatebuilder_test.go similarity index 86% rename from acltree/documentstatebuilder_test.go rename to exampledocument/documentstatebuilder_test.go index dd91de24..3f1d7232 100644 --- a/acltree/documentstatebuilder_test.go +++ b/exampledocument/documentstatebuilder_test.go @@ -1,6 +1,7 @@ -package acltree +package exampledocument import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/testutils/threadbuilder" "github.com/stretchr/testify/assert" "testing" @@ -12,7 +13,7 @@ func TestDocumentStateBuilder_UserJoinBuild(t *testing.T) { t.Fatal(err) } keychain := thread.GetKeychain() - ctx, err := createDocumentStateFromThread( + ctx, err := acltree.createDocumentStateFromThread( thread, keychain.GetIdentity("A"), keychain.EncryptionKeys["A"], @@ -32,7 +33,7 @@ func TestDocumentStateBuilder_UserRemoveBuild(t *testing.T) { t.Fatal(err) } keychain := thread.GetKeychain() - ctx, err := createDocumentStateFromThread( + ctx, err := acltree.createDocumentStateFromThread( thread, keychain.GetIdentity("A"), keychain.EncryptionKeys["A"], diff --git a/acltree/plaintextdocstate.go b/exampledocument/plaintextdocstate.go similarity index 98% rename from acltree/plaintextdocstate.go rename to exampledocument/plaintextdocstate.go index 91ba2c3b..e5296e42 100644 --- a/acltree/plaintextdocstate.go +++ b/exampledocument/plaintextdocstate.go @@ -1,8 +1,7 @@ -package acltree +package exampledocument import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/data/pb" "github.com/gogo/protobuf/proto" ) diff --git a/testutils/threadbuilder/pb/protos/testdocumentchanges.proto b/testutils/testchanges/pb/protos/testdocumentchanges.proto similarity index 100% rename from testutils/threadbuilder/pb/protos/testdocumentchanges.proto rename to testutils/testchanges/pb/protos/testdocumentchanges.proto diff --git a/testutils/threadbuilder/pb/testdocumentchanges.pb.go b/testutils/testchanges/pb/testdocumentchanges.pb.go similarity index 100% rename from testutils/threadbuilder/pb/testdocumentchanges.pb.go rename to testutils/testchanges/pb/testdocumentchanges.pb.go diff --git a/testutils/threadbuilder/keychain.go b/testutils/threadbuilder/keychain.go index 74ecf649..c8532a41 100644 --- a/testutils/threadbuilder/keychain.go +++ b/testutils/threadbuilder/keychain.go @@ -4,6 +4,8 @@ import ( "hash/fnv" "strings" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/textileio/go-threads/crypto/symmetric" ) @@ -13,24 +15,24 @@ type SymKey struct { } type Keychain struct { - SigningKeys map[string]threadmodels.SigningPrivKey - SigningKeysByIdentity map[string]threadmodels.SigningPrivKey - EncryptionKeys map[string]threadmodels.EncryptionPrivKey + SigningKeys map[string]keys.SigningPrivKey + SigningKeysByIdentity map[string]keys.SigningPrivKey + EncryptionKeys map[string]keys.EncryptionPrivKey ReadKeys map[string]*SymKey ReadKeysByHash map[uint64]*SymKey GeneratedIdentities map[string]string - coder *threadmodels.Ed25519SigningPubKeyDecoder + coder *keys.Ed25519SigningPubKeyDecoder } func NewKeychain() *Keychain { return &Keychain{ - SigningKeys: map[string]threadmodels.SigningPrivKey{}, - SigningKeysByIdentity: map[string]threadmodels.SigningPrivKey{}, - EncryptionKeys: map[string]threadmodels.EncryptionPrivKey{}, + SigningKeys: map[string]keys.SigningPrivKey{}, + SigningKeysByIdentity: map[string]keys.SigningPrivKey{}, + EncryptionKeys: map[string]keys.EncryptionPrivKey{}, GeneratedIdentities: map[string]string{}, ReadKeys: map[string]*SymKey{}, ReadKeysByHash: map[uint64]*SymKey{}, - coder: threadmodels.NewEd25519Decoder(), + coder: keys.NewEd25519Decoder(), } } @@ -52,7 +54,7 @@ func (k *Keychain) AddEncryptionKey(name string) { if _, exists := k.EncryptionKeys[name]; exists { return } - newPrivKey, _, err := threadmodels.GenerateRandomRSAKeyPair(2048) + newPrivKey, _, err := keys.GenerateRandomRSAKeyPair(2048) if err != nil { panic(err) } @@ -64,7 +66,7 @@ func (k *Keychain) AddSigningKey(name string) { if _, exists := k.SigningKeys[name]; exists { return } - newPrivKey, pubKey, err := threadmodels.GenerateRandomEd25519KeyPair() + newPrivKey, pubKey, err := keys.GenerateRandomEd25519KeyPair() if err != nil { panic(err) } diff --git a/testutils/threadbuilder/threadbuilder.go b/testutils/threadbuilder/threadbuilder.go index 6663281f..b7507b9f 100644 --- a/testutils/threadbuilder/threadbuilder.go +++ b/testutils/threadbuilder/threadbuilder.go @@ -8,7 +8,10 @@ import ( "github.com/gogo/protobuf/proto" "gopkg.in/yaml.v3" - "github.com/anytypeio/go-anytype-infrastructure-experiments/data/pb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges/pb" + testpb "github.com/anytypeio/go-anytype-infrastructure-experiments/testutils/testchanges/pb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/thread" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" ) const plainTextDocType uint16 = 1 @@ -17,7 +20,7 @@ type threadChange struct { *pb.ACLChange id string readKey *SymKey - signKey threadmodels.SigningPrivKey + signKey keys.SigningPrivKey changesDataDecrypted []byte } @@ -45,7 +48,7 @@ func NewThreadBuilderFromFile(file string) (*ThreadBuilder, error) { return nil, err } - thread := YMLThread{Some: &Super{}} + thread := YMLThread{} err = yaml.Unmarshal(content, &thread) if err != nil { return nil, err @@ -74,7 +77,7 @@ func (t *ThreadBuilder) Heads() []string { return t.heads } -func (t *ThreadBuilder) AddChange(change *threadmodels.RawChange) error { +func (t *ThreadBuilder) AddChange(change *thread.RawChange) error { aclChange := new(pb.ACLChange) var err error @@ -121,12 +124,12 @@ func (t *ThreadBuilder) SetHeads(heads []string) { t.heads = heads } -func (t *ThreadBuilder) GetChange(ctx context.Context, recordID string) (*threadmodels.RawChange, error) { +func (t *ThreadBuilder) GetChange(ctx context.Context, recordID string) (*thread.RawChange, error) { return t.getChange(recordID, t.allChanges), nil } -func (t *ThreadBuilder) GetUpdatedChanges() []*threadmodels.RawChange { - var res []*threadmodels.RawChange +func (t *ThreadBuilder) GetUpdatedChanges() []*thread.RawChange { + var res []*thread.RawChange for _, ch := range t.updatedChanges { rawCh := t.getChange(ch.id, t.updatedChanges) res = append(res, rawCh) @@ -134,7 +137,7 @@ func (t *ThreadBuilder) GetUpdatedChanges() []*threadmodels.RawChange { return res } -func (t *ThreadBuilder) getChange(changeId string, m map[string]*threadChange) *threadmodels.RawChange { +func (t *ThreadBuilder) getChange(changeId string, m map[string]*threadChange) *thread.RawChange { rec := m[changeId] if rec.changesDataDecrypted != nil { @@ -156,7 +159,7 @@ func (t *ThreadBuilder) getChange(changeId string, m map[string]*threadChange) * panic("should be able to sign final acl message!") } - transformedRec := &threadmodels.RawChange{ + transformedRec := &thread.RawChange{ Payload: aclMarshaled, Signature: signature, Id: changeId, @@ -208,12 +211,12 @@ func (t *ThreadBuilder) parseChange(ch *Change) *threadChange { } } if len(ch.Changes) > 0 || ch.Snapshot != nil { - changesData := &pb.PlainTextChangeData{} + changesData := &testpb.PlainTextChangeData{} if ch.Snapshot != nil { changesData.Snapshot = t.parseChangeSnapshot(ch.Snapshot) } if len(ch.Changes) > 0 { - var changeContents []*pb.PlainTextChangeContent + var changeContents []*testpb.PlainTextChangeContent for _, ch := range ch.Changes { aclChangeContent := t.parseDocumentChange(ch) changeContents = append(changeContents, aclChangeContent) @@ -236,7 +239,7 @@ func (t *ThreadBuilder) parseThreadId(description *ThreadDescription) string { panic("no author in thread") } key := t.keychain.SigningKeys[description.Author] - id, err := threadmodels.CreateACLThreadID(key.GetPublic(), plainTextDocType) + id, err := thread.CreateACLThreadID(key.GetPublic(), plainTextDocType) if err != nil { panic(err) } @@ -244,8 +247,8 @@ func (t *ThreadBuilder) parseThreadId(description *ThreadDescription) string { return id.String() } -func (t *ThreadBuilder) parseChangeSnapshot(s *PlainTextSnapshot) *pb.PlainTextChangeSnapshot { - return &pb.PlainTextChangeSnapshot{ +func (t *ThreadBuilder) parseChangeSnapshot(s *PlainTextSnapshot) *testpb.PlainTextChangeSnapshot { + return &testpb.PlainTextChangeSnapshot{ Text: s.Text, } } @@ -257,7 +260,7 @@ func (t *ThreadBuilder) parseACLSnapshot(s *ACLSnapshot) *pb.ACLChangeACLSnapsho aclUserState.Identity = t.keychain.GetIdentity(state.Identity) encKey := t.keychain. - GetKey(state.EncryptionKey).(threadmodels.EncryptionPrivKey) + GetKey(state.EncryptionKey).(keys.EncryptionPrivKey) rawKey, _ := encKey.GetPublic().Raw() aclUserState.EncryptionKey = rawKey @@ -270,12 +273,12 @@ func (t *ThreadBuilder) parseACLSnapshot(s *ACLSnapshot) *pb.ACLChangeACLSnapsho } } -func (t *ThreadBuilder) parseDocumentChange(ch *PlainTextChange) (convCh *pb.PlainTextChangeContent) { +func (t *ThreadBuilder) parseDocumentChange(ch *PlainTextChange) (convCh *testpb.PlainTextChangeContent) { switch { case ch.TextAppend != nil: - convCh = &pb.PlainTextChangeContent{ - Value: &pb.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &pb.PlainTextChangeTextAppend{ + convCh = &testpb.PlainTextChangeContent{ + Value: &testpb.PlainTextChangeContentValueOfTextAppend{ + TextAppend: &testpb.PlainTextChangeTextAppend{ Text: ch.TextAppend.Text, }, }, @@ -294,7 +297,7 @@ func (t *ThreadBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChangeACLCo add := ch.UserAdd encKey := t.keychain. - GetKey(add.EncryptionKey).(threadmodels.EncryptionPrivKey) + GetKey(add.EncryptionKey).(keys.EncryptionPrivKey) rawKey, _ := encKey.GetPublic().Raw() convCh = &pb.ACLChangeACLContentValue{ @@ -311,11 +314,11 @@ func (t *ThreadBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChangeACLCo join := ch.UserJoin encKey := t.keychain. - GetKey(join.EncryptionKey).(threadmodels.EncryptionPrivKey) + GetKey(join.EncryptionKey).(keys.EncryptionPrivKey) rawKey, _ := encKey.GetPublic().Raw() idKey, _ := t.keychain.SigningKeys[join.Identity].GetPublic().Raw() - signKey := t.keychain.GetKey(join.AcceptSignature).(threadmodels.SigningPrivKey) + signKey := t.keychain.GetKey(join.AcceptSignature).(keys.SigningPrivKey) signature, err := signKey.Sign(idKey) if err != nil { panic(err) @@ -334,9 +337,9 @@ func (t *ThreadBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChangeACLCo } case ch.UserInvite != nil: invite := ch.UserInvite - rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(threadmodels.SigningPrivKey).GetPublic().Raw() + rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(keys.SigningPrivKey).GetPublic().Raw() encKey := t.keychain. - GetKey(invite.EncryptionKey).(threadmodels.EncryptionPrivKey) + GetKey(invite.EncryptionKey).(keys.EncryptionPrivKey) rawEncKey, _ := encKey.GetPublic().Raw() convCh = &pb.ACLChangeACLContentValue{ @@ -408,7 +411,7 @@ func (t *ThreadBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChangeACLCo return convCh } -func (t *ThreadBuilder) encryptReadKeys(keys []string, encKey threadmodels.EncryptionPrivKey) (enc [][]byte) { +func (t *ThreadBuilder) encryptReadKeys(keys []string, encKey keys.EncryptionPrivKey) (enc [][]byte) { for _, k := range keys { realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes() res, err := encKey.GetPublic().Encrypt(realKey) diff --git a/testutils/threadbuilder/threadbuildergraph_nix.go b/testutils/threadbuilder/threadbuildergraph_nix.go index 30722a53..cca8ad30 100644 --- a/testutils/threadbuilder/threadbuildergraph_nix.go +++ b/testutils/threadbuilder/threadbuildergraph_nix.go @@ -9,12 +9,14 @@ package threadbuilder import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/data/pb" + "github.com/gogo/protobuf/proto" "strings" "unicode" "github.com/awalterschulze/gographviz" + + testpb "github.com/anytypeio/go-anytype-infrastructure-experiments/testutils/testchanges/pb" ) // To quickly look at visualized string you can use https://dreampuf.github.io/GraphvizOnline @@ -44,7 +46,7 @@ func (t *ThreadBuilder) Graph() (string, error) { var chSymbs []string if r.changesDataDecrypted != nil { - res := &pb.PlainTextChangeData{} + res := &testpb.PlainTextChangeData{} err := proto.Unmarshal(r.changesDataDecrypted, res) if err != nil { return err