1
1
package core
2
2
3
3
import (
4
- "crypto/rand "
4
+ "encoding/base64 "
5
5
"errors"
6
6
"fmt"
7
+ "github.com/OpenBazaar/openbazaar-go/net"
7
8
"gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore"
8
9
"gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing"
9
10
"sync"
10
11
"time"
11
12
12
- "golang.org/x/crypto/nacl/box"
13
-
14
13
libp2p "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto"
15
14
"gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid"
16
15
"gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer"
16
+ "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash"
17
+ "github.com/OpenBazaar/openbazaar-go/ipfs"
17
18
18
19
"github.com/OpenBazaar/openbazaar-go/pb"
19
20
"github.com/OpenBazaar/openbazaar-go/repo"
@@ -74,11 +75,6 @@ func (n *OpenBazaarNode) SendOfflineMessage(p peer.ID, k *libp2p.PubKey, m *pb.M
74
75
return merr
75
76
}
76
77
77
- // Encrypt envelope for relay server
78
-
79
- // Generate an ephemeral key pair
80
- _ , ephemPriv , _ := box .GenerateKey (rand .Reader )
81
-
82
78
ctx , cancel := context .WithTimeout (context .Background (), n .OfflineMessageFailoverTimeout )
83
79
defer cancel ()
84
80
if k == nil {
@@ -100,84 +96,75 @@ func (n *OpenBazaarNode) SendOfflineMessage(p peer.ID, k *libp2p.PubKey, m *pb.M
100
96
k = & pubKey
101
97
}
102
98
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 ())
109
102
}
110
103
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 )
116
106
117
- box . Seal ( ciphertext , messageBytes , & nonce , pkey , ephemPriv )
107
+ n . WebRelayManager . SendRelayMessage ( encodedCipherText , p . String () )
118
108
119
109
// 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, ipfs.MessageTopicPrefix+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 , ipfs .MessageTopicPrefix + pointer .Cid .String (), ciphertext )
163
+ if err != nil {
164
+ log .Error (err )
165
+ }
166
+ OfflineMessageWaitGroup .Done ()
167
+ }()
181
168
return nil
182
169
}
183
170
0 commit comments