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