11package core
22
33import (
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, 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+ }()
181168 return nil
182169}
183170
0 commit comments