Skip to content
This repository was archived by the owner on Mar 28, 2023. It is now read-only.

Commit 8c4e021

Browse files
committed
Update sending offline messages to include relay
1 parent 6bc2acd commit 8c4e021

File tree

1 file changed

+68
-81
lines changed

1 file changed

+68
-81
lines changed

core/net.go

Lines changed: 68 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
package core
22

33
import (
4-
"crypto/rand"
4+
"encoding/base64"
55
"errors"
66
"fmt"
7+
"github.com/OpenBazaar/openbazaar-go/net"
78
"gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore"
89
"gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing"
910
"sync"
1011
"time"
1112

12-
"golang.org/x/crypto/nacl/box"
13-
1413
libp2p "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto"
1514
"gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid"
1615
"gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer"
16+
"gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash"
17+
"github.com/OpenBazaar/openbazaar-go/ipfs"
1718

1819
"github.com/OpenBazaar/openbazaar-go/pb"
1920
"github.com/OpenBazaar/openbazaar-go/repo"
@@ -74,11 +75,6 @@ func (n *OpenBazaarNode) SendOfflineMessage(p peer.ID, k *libp2p.PubKey, m *pb.M
7475
return merr
7576
}
7677

77-
// Encrypt envelope for relay server
78-
79-
// Generate an ephemeral key pair
80-
_, ephemPriv, _ := box.GenerateKey(rand.Reader)
81-
8278
ctx, cancel := context.WithTimeout(context.Background(), n.OfflineMessageFailoverTimeout)
8379
defer cancel()
8480
if k == nil {
@@ -100,84 +96,75 @@ func (n *OpenBazaarNode) SendOfflineMessage(p peer.ID, k *libp2p.PubKey, m *pb.M
10096
k = &pubKey
10197
}
10298

103-
// Generate nonce
104-
var nonce [24]byte
105-
noncedata := make([]byte, 24)
106-
rand.Read(noncedata)
107-
for i := 0; i < 24; i++ {
108-
nonce[i] = noncedata[i]
99+
relayciphertext, err := net.Encrypt(*k, messageBytes)
100+
if err != nil {
101+
fmt.Errorf("Error: %s", err.Error())
109102
}
110103

111-
// Encrypt
112-
var ciphertext []byte
113-
keybytes, _ := libp2p.MarshalPublicKey(*k)
114-
var pkey *[32]byte
115-
copy(pkey[:], keybytes[:32])
104+
// Base64 encode
105+
encodedCipherText := base64.StdEncoding.EncodeToString(relayciphertext)
116106

117-
box.Seal(ciphertext, messageBytes, &nonce, pkey, ephemPriv)
107+
n.WebRelayManager.SendRelayMessage(encodedCipherText, p.String())
118108

119109
// TODO: this function blocks if the recipient's public key is not on the local machine
120-
//ciphertext, cerr := n.EncryptMessage(p, k, messageBytes)
121-
//if cerr != nil {
122-
// return cerr
123-
//}
124-
125-
// Send to webrelay
126-
127-
//
128-
//addr, aerr := n.MessageStorage.Store(p, ciphertext)
129-
//if aerr != nil {
130-
// return aerr
131-
//}
132-
//mh, mherr := multihash.FromB58String(p.Pretty())
133-
//if mherr != nil {
134-
// return mherr
135-
//}
136-
///* TODO: We are just using a default prefix length for now. Eventually we will want to customize this,
137-
// but we will need some way to get the recipient's desired prefix length. Likely will be in profile. */
138-
//pointer, err := ipfs.NewPointer(mh, DefaultPointerPrefixLength, addr, ciphertext)
139-
//if err != nil {
140-
// return err
141-
//}
142-
//if m.MessageType != pb.Message_OFFLINE_ACK {
143-
// pointer.Purpose = ipfs.MESSAGE
144-
// pointer.CancelID = &p
145-
// err = n.Datastore.Pointers().Put(pointer)
146-
// if err != nil {
147-
// return err
148-
// }
149-
//}
150-
//log.Debugf("Sending offline message to: %s, Message Type: %s, PointerID: %s, Location: %s", p.Pretty(), m.MessageType.String(), pointer.Cid.String(), pointer.Value.Addrs[0].String())
151-
//OfflineMessageWaitGroup.Add(2)
152-
//go func() {
153-
// ctx, cancel := context.WithCancel(context.Background())
154-
// defer cancel()
155-
// err := ipfs.PublishPointer(n.DHT, ctx, pointer)
156-
// if err != nil {
157-
// log.Error(err)
158-
// }
159-
//
160-
// // Push provider to our push nodes for redundancy
161-
// for _, p := range n.PushNodes {
162-
// ctx, cancel := context.WithCancel(context.Background())
163-
// defer cancel()
164-
// err := ipfs.PutPointerToPeer(n.DHT, ctx, p, pointer)
165-
// if err != nil {
166-
// log.Error(err)
167-
// }
168-
// }
169-
//
170-
// OfflineMessageWaitGroup.Done()
171-
//}()
172-
//go func() {
173-
// ctx, cancel := context.WithCancel(context.Background())
174-
// defer cancel()
175-
// err := n.Pubsub.Publisher.Publish(ctx, pointer.Cid.String(), ciphertext)
176-
// if err != nil {
177-
// log.Error(err)
178-
// }
179-
// OfflineMessageWaitGroup.Done()
180-
//}()
110+
ciphertext, cerr := n.EncryptMessage(p, k, messageBytes)
111+
if cerr != nil {
112+
return cerr
113+
}
114+
115+
addr, aerr := n.MessageStorage.Store(p, ciphertext)
116+
if aerr != nil {
117+
return aerr
118+
}
119+
mh, mherr := multihash.FromB58String(p.Pretty())
120+
if mherr != nil {
121+
return mherr
122+
}
123+
/* TODO: We are just using a default prefix length for now. Eventually we will want to customize this,
124+
but we will need some way to get the recipient's desired prefix length. Likely will be in profile. */
125+
pointer, err := ipfs.NewPointer(mh, DefaultPointerPrefixLength, addr, ciphertext)
126+
if err != nil {
127+
return err
128+
}
129+
if m.MessageType != pb.Message_OFFLINE_ACK {
130+
pointer.Purpose = ipfs.MESSAGE
131+
pointer.CancelID = &p
132+
err = n.Datastore.Pointers().Put(pointer)
133+
if err != nil {
134+
return err
135+
}
136+
}
137+
log.Debugf("Sending offline message to: %s, Message Type: %s, PointerID: %s, Location: %s", p.Pretty(), m.MessageType.String(), pointer.Cid.String(), pointer.Value.Addrs[0].String())
138+
OfflineMessageWaitGroup.Add(2)
139+
go func() {
140+
ctx, cancel := context.WithCancel(context.Background())
141+
defer cancel()
142+
err := ipfs.PublishPointer(n.DHT, ctx, pointer)
143+
if err != nil {
144+
log.Error(err)
145+
}
146+
147+
// Push provider to our push nodes for redundancy
148+
for _, p := range n.PushNodes {
149+
ctx, cancel := context.WithCancel(context.Background())
150+
defer cancel()
151+
err := ipfs.PutPointerToPeer(n.DHT, ctx, p, pointer)
152+
if err != nil {
153+
log.Error(err)
154+
}
155+
}
156+
157+
OfflineMessageWaitGroup.Done()
158+
}()
159+
go func() {
160+
ctx, cancel := context.WithCancel(context.Background())
161+
defer cancel()
162+
err := n.Pubsub.Publisher.Publish(ctx, pointer.Cid.String(), ciphertext)
163+
if err != nil {
164+
log.Error(err)
165+
}
166+
OfflineMessageWaitGroup.Done()
167+
}()
181168
return nil
182169
}
183170

0 commit comments

Comments
 (0)