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

Commit e0cc81b

Browse files
committed
Update sending offline messages to include relay
gofmt gofmt Update deps Updates return error
1 parent 6bc2acd commit e0cc81b

File tree

4 files changed

+89
-97
lines changed

4 files changed

+89
-97
lines changed

cmd/start.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -583,10 +583,10 @@ func (x *Start) Execute(args []string) error {
583583
subscriber := ipfs.NewPubsubSubscriber(context.Background(), nd.PeerHost, nd.Routing, nd.Repo.Datastore(), nd.PubSub)
584584
ps := ipfs.Pubsub{Publisher: publisher, Subscriber: subscriber}
585585

586-
var rootHash string
587-
if cachedIPNSRecord != nil {
588-
rootHash = string(cachedIPNSRecord.Value)
589-
}
586+
var rootHash string
587+
if cachedIPNSRecord != nil {
588+
rootHash = string(cachedIPNSRecord.Value)
589+
}
590590

591591
wm := obnet.NewWebRelayManager(webRelays, identity.PeerID)
592592

@@ -602,7 +602,7 @@ func (x *Start) Execute(args []string) error {
602602
OfflineMessageFailoverTimeout: 30 * time.Second,
603603
Pubsub: ps,
604604
PushNodes: pushNodes,
605-
WebRelayManager: wm,
605+
WebRelayManager: wm,
606606
RegressionTestEnable: x.Regtest,
607607
RepoPath: repoPath,
608608
RootHash: rootHash,

core/net.go

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

33
import (
4-
"crypto/rand"
4+
"encoding/base64"
55
"errors"
66
"fmt"
77
"gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore"
88
"gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing"
99
"sync"
1010
"time"
1111

12-
"golang.org/x/crypto/nacl/box"
12+
"github.com/OpenBazaar/openbazaar-go/net"
1313

1414
libp2p "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto"
1515
"gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid"
1616
"gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer"
17+
"gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash"
18+
19+
"github.com/OpenBazaar/openbazaar-go/ipfs"
1720

1821
"github.com/OpenBazaar/openbazaar-go/pb"
1922
"github.com/OpenBazaar/openbazaar-go/repo"
@@ -74,16 +77,11 @@ func (n *OpenBazaarNode) SendOfflineMessage(p peer.ID, k *libp2p.PubKey, m *pb.M
7477
return merr
7578
}
7679

77-
// Encrypt envelope for relay server
78-
79-
// Generate an ephemeral key pair
80-
_, ephemPriv, _ := box.GenerateKey(rand.Reader)
81-
8280
ctx, cancel := context.WithTimeout(context.Background(), n.OfflineMessageFailoverTimeout)
8381
defer cancel()
8482
if k == nil {
8583
var pubKey libp2p.PubKey
86-
keyval, err := n.IpfsNode.Repo.Datastore().Get(datastore.NewKey(KeyCachePrefix + p.Pretty()))
84+
keyval, err := n.IpfsNode.Repo.Datastore().Get(datastore.NewKey("/pubkey/" + p.Pretty()))
8785
if err != nil {
8886
pubKey, err = routing.GetPublicKey(n.IpfsNode.Routing, ctx, p)
8987
if err != nil {
@@ -100,84 +98,75 @@ func (n *OpenBazaarNode) SendOfflineMessage(p peer.ID, k *libp2p.PubKey, m *pb.M
10098
k = &pubKey
10199
}
102100

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]
101+
relayciphertext, err := net.Encrypt(*k, messageBytes)
102+
if err != nil {
103+
return fmt.Errorf("Error: %s", err.Error())
109104
}
110105

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

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

119111
// 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-
//}()
112+
ciphertext, cerr := n.EncryptMessage(p, k, messageBytes)
113+
if cerr != nil {
114+
return cerr
115+
}
116+
117+
addr, aerr := n.MessageStorage.Store(p, ciphertext)
118+
if aerr != nil {
119+
return aerr
120+
}
121+
mh, mherr := multihash.FromB58String(p.Pretty())
122+
if mherr != nil {
123+
return mherr
124+
}
125+
/* TODO: We are just using a default prefix length for now. Eventually we will want to customize this,
126+
but we will need some way to get the recipient's desired prefix length. Likely will be in profile. */
127+
pointer, err := ipfs.NewPointer(mh, DefaultPointerPrefixLength, addr, ciphertext)
128+
if err != nil {
129+
return err
130+
}
131+
if m.MessageType != pb.Message_OFFLINE_ACK {
132+
pointer.Purpose = ipfs.MESSAGE
133+
pointer.CancelID = &p
134+
err = n.Datastore.Pointers().Put(pointer)
135+
if err != nil {
136+
return err
137+
}
138+
}
139+
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())
140+
OfflineMessageWaitGroup.Add(2)
141+
go func() {
142+
ctx, cancel := context.WithCancel(context.Background())
143+
defer cancel()
144+
err := ipfs.PublishPointer(n.DHT, ctx, pointer)
145+
if err != nil {
146+
log.Error(err)
147+
}
148+
149+
// Push provider to our push nodes for redundancy
150+
for _, p := range n.PushNodes {
151+
ctx, cancel := context.WithCancel(context.Background())
152+
defer cancel()
153+
err := ipfs.PutPointerToPeer(n.DHT, ctx, p, pointer)
154+
if err != nil {
155+
log.Error(err)
156+
}
157+
}
158+
159+
OfflineMessageWaitGroup.Done()
160+
}()
161+
go func() {
162+
ctx, cancel := context.WithCancel(context.Background())
163+
defer cancel()
164+
err := n.Pubsub.Publisher.Publish(ctx, pointer.Cid.String(), ciphertext)
165+
if err != nil {
166+
log.Error(err)
167+
}
168+
OfflineMessageWaitGroup.Done()
169+
}()
181170
return nil
182171
}
183172

mobile/node.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
ipfslogging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log/writer"
2727
"gx/ipfs/Qmc85NSvmSG4Frn9Vb2cBc1rMyULH6D3TNVEfCzSKoUpip/go-multiaddr-net"
2828

29+
_ "net/http/pprof"
30+
2931
"github.com/OpenBazaar/openbazaar-go/api"
3032
"github.com/OpenBazaar/openbazaar-go/core"
3133
"github.com/OpenBazaar/openbazaar-go/ipfs"
@@ -51,7 +53,6 @@ import (
5153
"github.com/natefinch/lumberjack"
5254
"github.com/op/go-logging"
5355
"github.com/tyler-smith/go-bip39"
54-
_ "net/http/pprof"
5556
)
5657

5758
var log = logging.MustGetLogger("mobile")
@@ -290,7 +291,7 @@ func NewNodeWithConfig(config *NodeConfig, password string, mnemonic string) (*N
290291
Multiwallet: mw,
291292
OfflineMessageFailoverTimeout: 5 * time.Second,
292293
PushNodes: pushNodes,
293-
WebRelayManager: wm,
294+
WebRelayManager: wm,
294295
RepoPath: config.RepoPath,
295296
UserAgent: core.USERAGENT,
296297
IPNSQuorumSize: uint(ipnsExtraConfig.DHTQuorumSize),

net/web_relay_manager.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,25 @@ import (
55
"encoding/binary"
66
"encoding/json"
77
"fmt"
8+
9+
"github.com/btcsuite/btcutil/base58"
10+
11+
"gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash"
12+
813
"github.com/gorilla/websocket"
9-
"github.com/mr-tron/base58/base58"
10-
"github.com/multiformats/go-multihash"
1114
)
1215

1316
type WebRelayManager struct {
1417
webrelays []string
15-
peerID string
18+
peerID string
1619
}
1720

1821
type EncryptedMessage struct {
1922
Message string `json:"encryptedMessage"`
2023
Recipient string `json:"recipient"`
2124
}
2225

23-
type TypedMessage struct{
26+
type TypedMessage struct {
2427
Type string
2528
Data json.RawMessage
2629
}
@@ -36,7 +39,7 @@ func NewWebRelayManager(webrelays []string, sender string) *WebRelayManager {
3639

3740
func (wrm *WebRelayManager) SendRelayMessage(ciphertext string, recipient string) {
3841
encryptedmessage := EncryptedMessage{
39-
Message: ciphertext,
42+
Message: ciphertext,
4043
Recipient: recipient,
4144
}
4245

@@ -66,7 +69,7 @@ func (wrm *WebRelayManager) authToWebRelay(server string, msg []byte) {
6669
prefix64 := binary.BigEndian.Uint64(prefix)
6770

6871
// Then shifting
69-
shiftedPrefix64 := prefix64>>uint(48)
72+
shiftedPrefix64 := prefix64 >> uint(48)
7073

7174
// Then converting back to a byte array
7275
shiftedBytes := make([]byte, 8)
@@ -78,8 +81,8 @@ func (wrm *WebRelayManager) authToWebRelay(server string, msg []byte) {
7881

7982
// Generate subscribe message
8083
subscribeMessage := SubscribeMessage{
81-
UserID: wrm.peerID,
82-
SubscriptionKey: base58.Encode([]byte(subscriptionKey)),
84+
UserID: wrm.peerID,
85+
SubscriptionKey: base58.Encode(subscriptionKey),
8386
}
8487

8588
data, _ := json.Marshal(subscribeMessage)
@@ -113,4 +116,3 @@ func (wrm *WebRelayManager) authToWebRelay(server string, msg []byte) {
113116
}
114117

115118
}
116-

0 commit comments

Comments
 (0)