From 56b8784e7c2119756358e26ebb0c449d3154d2c5 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Thu, 7 Nov 2019 15:11:04 -0500 Subject: [PATCH 1/7] Send over websocket via relay --- relay.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/relay.go b/relay.go index 7d76b2d..4870555 100644 --- a/relay.go +++ b/relay.go @@ -1,8 +1,10 @@ package main import ( + "encoding/binary" "encoding/json" "github.com/gorilla/websocket" + "github.com/multiformats/go-multihash" "log" "net/http" "sync" @@ -178,6 +180,28 @@ authLoop: } } +func getSubscriptionKeyFromPeerID(peerID string) []byte { + // Generate subscription key for web relay + peerIDMultihash, _ := multihash.FromB58String(peerID) + decoded, _ := multihash.Decode(peerIDMultihash) + digest := decoded.Digest + prefix := digest[:8] + + prefix64 := binary.BigEndian.Uint64(prefix) + + // Then shifting + shiftedPrefix64 := prefix64 >> uint(48) + + // Then converting back to a byte array + shiftedBytes := make([]byte, 8) + binary.BigEndian.PutUint64(shiftedBytes, shiftedPrefix64) + + hashedShiftedPrefix := sha256.Sum256(shiftedBytes) + + subscriptionKey, _ := multihash.Encode(hashedShiftedPrefix[:], multihash.SHA2_256) + return subscriptionKey +} + func (rp *RelayProtocol) handleMessage(m []byte, userID string) error { incomingMessage := new(TypedMessage) err := json.Unmarshal(m, incomingMessage) @@ -201,6 +225,15 @@ func (rp *RelayProtocol) handleMessage(m []byte, userID string) error { if err != nil { return nil } + + subscriptionKey := getSubscriptionKeyFromPeerID(em.Recipient) + + // Send to user over websocket connection + conns := rp.connectedNodes[string(subscriptionKey)] + for _, conn := range conns { + conn.WriteMessage(1, b) + } + return rp.node.OpenBazaarNode.SendOfflineRelay(em.Recipient, b) case "AckMessage": return rp.db.MarkMessageAsRead(message.(AckMessage).MessageID, userID) From b7e9a4dbacc0973c6ee8b9a5cb1c914abef2cc00 Mon Sep 17 00:00:00 2001 From: Brian Date: Fri, 8 Nov 2019 11:30:27 +0000 Subject: [PATCH 2/7] Changes --- main.go | 4 ++-- relay.go | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index 513baaf..a448877 100644 --- a/main.go +++ b/main.go @@ -12,8 +12,8 @@ func main() { RepoPath: "/tmp/webrelay", UserAgent: "webrelay:1.0.0", } - - node, err := mobile.NewNode(cfg) + node, err := mobile.NewNodeWithConfig(&cfg, "", "") + // node, err := mobile.NewNode(cfg) if err != nil { log.Fatal(err) } diff --git a/relay.go b/relay.go index 0116dfa..3eec122 100644 --- a/relay.go +++ b/relay.go @@ -3,6 +3,7 @@ package main import ( "encoding/binary" "encoding/json" + "github.com/btcsuite/btcutil/base58" "github.com/gorilla/websocket" "github.com/multiformats/go-multihash" "log" @@ -44,7 +45,7 @@ func StartRelayProtocol(n *mobile.Node, db Datastore) error { } go rp.handlePublishes() http.HandleFunc("/", rp.handleNewConnection) - return http.ListenAndServe(":8080", nil) + return http.ListenAndServeTLS(":8080", "/etc/letsencrypt/live/webchat.ob1.io/fullchain.pem", "/etc/letsencrypt/live/webchat.ob1.io/privkey.pem", nil) } // Run subscription protocol @@ -219,18 +220,22 @@ func (rp *RelayProtocol) handleMessage(m []byte, userID string) error { em := message.(EncryptedMessage) b, err := base64.StdEncoding.DecodeString(em.Message) if err != nil { + log.Println("error", err.Error()) return err } - _, err = peer.IDB58Decode(em.Recipient) + log.Printf(string(b)) + recipient, err := peer.IDB58Decode(em.Recipient) if err != nil { return nil } - subscriptionKey := getSubscriptionKeyFromPeerID(em.Recipient) - + subscriptionKey := getSubscriptionKeyFromPeerID(recipient.Pretty()) + log.Printf("got sub key: %s", recipient.Pretty()) + // Send to user over websocket connection - conns := rp.connectedNodes[string(subscriptionKey)] + conns := rp.connectedNodes[base58.Encode(subscriptionKey)] for _, conn := range conns { + log.Printf("got a connection") conn.WriteMessage(1, b) } @@ -312,9 +317,9 @@ func (rp *RelayProtocol) subscribe(sub mh.Multihash) error { continue } node.WriteMessage(1, out) - } + } } } }(sub, c) return nil -} \ No newline at end of file +} From 0a86cd67bb1fd68076a7f1d0100557e72cfb92b9 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Fri, 8 Nov 2019 06:46:03 -0500 Subject: [PATCH 3/7] Clean up code --- relay.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/relay.go b/relay.go index 3eec122..6d5b64c 100644 --- a/relay.go +++ b/relay.go @@ -45,7 +45,9 @@ func StartRelayProtocol(n *mobile.Node, db Datastore) error { } go rp.handlePublishes() http.HandleFunc("/", rp.handleNewConnection) - return http.ListenAndServeTLS(":8080", "/etc/letsencrypt/live/webchat.ob1.io/fullchain.pem", "/etc/letsencrypt/live/webchat.ob1.io/privkey.pem", nil) + // Non-https default listener + //return http.ListenAndServe(":8080", nil) + return http.ListenAndServeTLS(":8080", "/etc/letsencrypt/live/webchat.ob1.io/fullchain.pem", "/etc/letsencrypt/live/webchat.ob1.io/privkey.pem", nil) } // Run subscription protocol @@ -220,22 +222,22 @@ func (rp *RelayProtocol) handleMessage(m []byte, userID string) error { em := message.(EncryptedMessage) b, err := base64.StdEncoding.DecodeString(em.Message) if err != nil { - log.Println("error", err.Error()) + log.Println("error", err.Error()) return err } - log.Printf(string(b)) + recipient, err := peer.IDB58Decode(em.Recipient) if err != nil { return nil } subscriptionKey := getSubscriptionKeyFromPeerID(recipient.Pretty()) - log.Printf("got sub key: %s", recipient.Pretty()) + log.Printf("Subscription Key: %s", base58.Encode(subscriptionKey)) // Send to user over websocket connection conns := rp.connectedNodes[base58.Encode(subscriptionKey)] for _, conn := range conns { - log.Printf("got a connection") + log.Printf("Writing message to websocket connection") conn.WriteMessage(1, b) } From 6ec6cf6b07f7d9dab43fa827eebbdf368d7b47ef Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Fri, 8 Nov 2019 09:57:44 -0500 Subject: [PATCH 4/7] Log connected nodes issue --- relay.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/relay.go b/relay.go index 6d5b64c..113b92d 100644 --- a/relay.go +++ b/relay.go @@ -241,6 +241,10 @@ func (rp *RelayProtocol) handleMessage(m []byte, userID string) error { conn.WriteMessage(1, b) } + if len(conns) == 0 { + log.Printf("No connected nodes found to send socket message to: %v", rp.connectedNodes) + } + return rp.node.OpenBazaarNode.SendOfflineRelay(em.Recipient, b) case "AckMessage": return rp.db.MarkMessageAsRead(message.(AckMessage).MessageID, userID) From fe1a8ed0bc7d64422b991eda574b54d3b18f180b Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Fri, 22 Nov 2019 12:51:09 -0500 Subject: [PATCH 5/7] Fix for prefix --- relay.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relay.go b/relay.go index 113b92d..ffd3d50 100644 --- a/relay.go +++ b/relay.go @@ -289,7 +289,7 @@ func (rp *RelayProtocol) subscribe(sub mh.Multihash) error { return err } - topic := ipfs.MessageTopicPrefix+k.String() + topic := "/offlinemessage/"+k.String() currentSubscriptions := rp.node.OpenBazaarNode.Pubsub.Subscriber.GetSubscriptions() for _, s := range currentSubscriptions { From 857ae21a9bc2a615b0b436668a369bb9d1ec1d8d Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Fri, 22 Nov 2019 13:01:49 -0500 Subject: [PATCH 6/7] Refactor --- relay.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/relay.go b/relay.go index ffd3d50..8ab39de 100644 --- a/relay.go +++ b/relay.go @@ -1,26 +1,25 @@ package main import ( + "context" + "crypto/sha256" + "encoding/base64" "encoding/binary" + "encoding/hex" "encoding/json" + "errors" + "github.com/OpenBazaar/openbazaar-go/mobile" "github.com/btcsuite/btcutil/base58" "github.com/gorilla/websocket" "github.com/multiformats/go-multihash" + "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" "log" "net/http" + "strings" "sync" "time" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - "errors" - "github.com/OpenBazaar/openbazaar-go/mobile" - "encoding/base64" - "context" - "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - "crypto/sha256" - "encoding/hex" - "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - "github.com/OpenBazaar/openbazaar-go/ipfs" - "strings" ) var upgrader = websocket.Upgrader{ From e0e2ada734ccf49ff98fc42f1573660c11957e64 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Fri, 22 Nov 2019 13:08:29 -0500 Subject: [PATCH 7/7] Disable SSL listening --- relay.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/relay.go b/relay.go index 8ab39de..0e87a96 100644 --- a/relay.go +++ b/relay.go @@ -45,8 +45,8 @@ func StartRelayProtocol(n *mobile.Node, db Datastore) error { go rp.handlePublishes() http.HandleFunc("/", rp.handleNewConnection) // Non-https default listener - //return http.ListenAndServe(":8080", nil) - return http.ListenAndServeTLS(":8080", "/etc/letsencrypt/live/webchat.ob1.io/fullchain.pem", "/etc/letsencrypt/live/webchat.ob1.io/privkey.pem", nil) + return http.ListenAndServe(":8080", nil) + //return http.ListenAndServeTLS(":8080", "/etc/letsencrypt/live/webchat.ob1.io/fullchain.pem", "/etc/letsencrypt/live/webchat.ob1.io/privkey.pem", nil) } // Run subscription protocol