1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 14:07:02 +09:00

Marshall fixes

This commit is contained in:
mcrakhman 2024-07-05 12:24:03 +02:00
parent 6dac7dcda4
commit ec87ee56de
No known key found for this signature in database
GPG key ID: DED12CFEF5B8396B
4 changed files with 828 additions and 60 deletions

View file

@ -51,6 +51,7 @@ func (c *nonVerifiableChangeBuilder) Unmarshall(rawChange *treechangeproto.RawTr
type ChangeBuilder interface {
Unmarshall(rawIdChange *treechangeproto.RawTreeChangeWithId, verify bool) (ch *Change, err error)
UnmarshallReduced(rawIdChange *treechangeproto.RawTreeChangeWithId) (ch *Change, err error)
Build(payload BuilderContent) (ch *Change, raw *treechangeproto.RawTreeChangeWithId, err error)
BuildRoot(payload InitialContent) (ch *Change, raw *treechangeproto.RawTreeChangeWithId, err error)
BuildDerivedRoot(payload InitialDerivedContent) (ch *Change, raw *treechangeproto.RawTreeChangeWithId, err error)
@ -111,6 +112,26 @@ func (c *changeBuilder) Unmarshall(rawIdChange *treechangeproto.RawTreeChangeWit
return
}
func (c *changeBuilder) UnmarshallReduced(rawIdChange *treechangeproto.RawTreeChangeWithId) (ch *Change, err error) {
if rawIdChange.GetRawChange() == nil {
err = ErrEmptyChange
return
}
c.rawTreeCh.Signature = c.rawTreeCh.Signature[:0]
c.rawTreeCh.Payload = c.rawTreeCh.Payload[:0]
raw := c.rawTreeCh
err = proto.Unmarshal(rawIdChange.GetRawChange(), raw)
if err != nil {
return
}
ch, err = c.unmarshallReducedRawChange(raw, rawIdChange.Id)
if err != nil {
return
}
return
}
func (c *changeBuilder) BuildRoot(payload InitialContent) (ch *Change, rawIdChange *treechangeproto.RawTreeChangeWithId, err error) {
identity, err := payload.PrivKey.GetPublic().Marshall()
if err != nil {
@ -308,6 +329,36 @@ func (c *changeBuilder) unmarshallRawChange(raw *treechangeproto.RawTreeChange,
return
}
func (c *changeBuilder) unmarshallReducedRawChange(raw *treechangeproto.RawTreeChange, id string) (ch *Change, err error) {
if c.isRoot(id) {
unmarshalled := &treechangeproto.RootChange{}
err = proto.Unmarshal(raw.Payload, unmarshalled)
if err != nil {
return
}
// key will be empty for derived roots
var key crypto.PubKey
if !unmarshalled.IsDerived {
key, err = c.keys.PubKeyFromProto(unmarshalled.Identity)
if err != nil {
return
}
}
ch = NewChangeFromRoot(id, key, unmarshalled, raw.Signature, unmarshalled.IsDerived)
return
}
unmarshalled := &treechangeproto.ReducedTreeChange{}
err = proto.Unmarshal(raw.Payload, unmarshalled)
if err != nil {
return
}
ch = &Change{
Id: id,
PreviousIds: unmarshalled.TreeHeadIds,
}
return
}
func (c *changeBuilder) isRoot(id string) bool {
if c.rootChange != nil {
return c.rootChange.Id == id