Skip to content

Commit

Permalink
review: address comments
Browse files Browse the repository at this point in the history
Signed-off-by: Sander Pick <[email protected]>
  • Loading branch information
sanderpick committed Oct 14, 2019
1 parent 1125a68 commit 1f47883
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 98 deletions.
4 changes: 4 additions & 0 deletions cbor/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,10 @@ func (e *Event) GetHeader(ctx context.Context, dag format.DAGService, key crypto
}
}

if e.header.obj != nil {
return e.header, nil
}

header := new(eventHeader)
if key != nil {
node, err := DecodeBlock(e.header, key)
Expand Down
54 changes: 36 additions & 18 deletions cbor/invite.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package cbor

import (
"fmt"

"github.com/ipfs/go-cid"
cbornode "github.com/ipfs/go-ipld-cbor"
"github.com/ipfs/go-ipld-format"
Expand All @@ -18,8 +20,7 @@ func init() {

// invite defines the node structure of an invite.
type invite struct {
Readable bool
Logs []loginfo
Logs []loginfo
}

// loginfo defines the node structure of loginfo.
Expand Down Expand Up @@ -61,42 +62,44 @@ func NewInvite(logs []thread.LogInfo, readable bool) (format.Node, error) {
}
ls[i] = log
}
return cbornode.WrapObject(&invite{
Readable: readable,
Logs: ls,
}, mh.SHA2_256, -1)
return cbornode.WrapObject(&invite{Logs: ls}, mh.SHA2_256, -1)
}

// InviteFromNode returns invite info from a node.
func InviteFromNode(node format.Node) ([]thread.LogInfo, bool, error) {
i := new(invite)
err := cbornode.DecodeInto(node.RawData(), i)
func InviteFromNode(node format.Node) (*Invite, error) {
n := new(invite)
err := cbornode.DecodeInto(node.RawData(), n)
if err != nil {
return nil, false, err
return nil, err
}

logs := make([]thread.LogInfo, len(i.Logs))
for i, l := range i.Logs {
invite := &Invite{
Logs: make([]thread.LogInfo, len(n.Logs)),
}
for i, l := range n.Logs {
id, err := peer.IDB58Decode(l.ID)
if err != nil {
return nil, false, err
return nil, err
}
pk, err := ic.UnmarshalPublicKey(l.PubKey)
if err != nil {
return nil, false, err
return nil, err
}
if !id.MatchesPublicKey(pk) {
return nil, fmt.Errorf("log id does not match public key")
}
addrs := make([]ma.Multiaddr, len(l.Addrs))
for j, a := range l.Addrs {
addrs[j], err = ma.NewMultiaddrBytes(a)
if err != nil {
return nil, false, err
return nil, err
}
}
heads := make([]cid.Cid, len(l.Heads))
for k, h := range l.Heads {
heads[k], err = cid.Cast(h)
if err != nil {
return nil, false, err
return nil, err
}
}
log := thread.LogInfo{
Expand All @@ -107,8 +110,23 @@ func InviteFromNode(node format.Node) ([]thread.LogInfo, bool, error) {
Addrs: addrs,
Heads: heads,
}
logs[i] = log
invite.Logs[i] = log
}

return logs, i.Readable, nil
return invite, nil
}

// Invite contains logs needed to load a thread.
type Invite struct {
Logs []thread.LogInfo
}

// Readable returns whether or not all logs contain a read key.
func (i *Invite) Readable() bool {
for _, l := range i.Logs {
if l.ReadKey == nil {
return false
}
}
return true
}
19 changes: 12 additions & 7 deletions cbor/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type record struct {

// NewRecord returns a new record from the given block and log private key.
func NewRecord(ctx context.Context, dag format.DAGService, block format.Node, prev cid.Cid, sk ic.PrivKey, key crypto.EncryptionKey) (thread.Record, error) {
payload := block.RawData()
payload := block.Cid().Bytes()
if prev.Defined() {
payload = append(payload, prev.Bytes()...)
}
Expand All @@ -49,7 +49,7 @@ func NewRecord(ctx context.Context, dag format.DAGService, block format.Node, pr
return nil, err
}

err = dag.AddMany(ctx, []format.Node{coded})
err = dag.Add(ctx, coded)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -88,6 +88,7 @@ func RecordFromNode(coded format.Node, key crypto.DecryptionKey) (thread.Record,
}

// RecordToProto returns a proto version of a record for transport.
// Nodes are sent encrypted.
func RecordToProto(ctx context.Context, dag format.DAGService, rec thread.Record) (*pb.Record, error) {
block, err := rec.GetBlock(ctx, dag)
if err != nil {
Expand All @@ -107,7 +108,7 @@ func RecordToProto(ctx context.Context, dag format.DAGService, rec thread.Record
}

return &pb.Record{
Node: rec.RawData(),
RecordNode: rec.RawData(),
EventNode: block.RawData(),
HeaderNode: header.RawData(),
BodyNode: body.RawData(),
Expand All @@ -116,7 +117,11 @@ func RecordToProto(ctx context.Context, dag format.DAGService, rec thread.Record

// Unmarshal returns a node from a serialized version that contains link data.
func RecordFromProto(rec *pb.Record, key crypto.DecryptionKey) (thread.Record, error) {
node, err := cbornode.Decode(rec.Node, mh.SHA2_256, -1)
if key == nil {
return nil, fmt.Errorf("decryption key is required")
}

rnode, err := cbornode.Decode(rec.RecordNode, mh.SHA2_256, -1)
if err != nil {
return nil, err
}
Expand All @@ -133,7 +138,7 @@ func RecordFromProto(rec *pb.Record, key crypto.DecryptionKey) (thread.Record, e
return nil, err
}

decoded, err := DecodeBlock(node, key)
decoded, err := DecodeBlock(rnode, key)
if err != nil {
return nil, err
}
Expand All @@ -157,7 +162,7 @@ func RecordFromProto(rec *pb.Record, key crypto.DecryptionKey) (thread.Record, e
body: body,
}
return &Record{
Node: node,
Node: rnode,
obj: robj,
block: event,
}, nil
Expand Down Expand Up @@ -205,7 +210,7 @@ func (r *Record) Verify(pk ic.PubKey) error {
if r.block == nil {
return fmt.Errorf("block not loaded")
}
payload := r.block.RawData()
payload := r.block.Cid().Bytes()
if r.PrevID().Defined() {
payload = append(payload, r.PrevID().Bytes()...)
}
Expand Down
94 changes: 47 additions & 47 deletions pb/threads.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions pb/threads.proto
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ option (gogoproto.populate_all) = true;

// Record is a thread record containing link data.
message Record {
// node is the top-level record node's raw data.
bytes node = 1;
// recordNode is the top-level node's raw data.
bytes recordNode = 1;

// eventNode is the event node's raw data.
bytes eventNode = 2;
Expand Down
Loading

0 comments on commit 1f47883

Please sign in to comment.