diff --git a/tests/testdata b/tests/testdata index 7497b116a0..b5eb9900ee 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 7497b116a019beb26215cbea4028df068dea06be +Subproject commit b5eb9900ee2147b40d3e681fe86efa4fd693959a diff --git a/whisper/mailserver/mailserver.go b/whisper/mailserver/mailserver.go index 7312bbe23d..98e796b83c 100644 --- a/whisper/mailserver/mailserver.go +++ b/whisper/mailserver/mailserver.go @@ -21,15 +21,16 @@ import ( "encoding/binary" "fmt" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/syndtr/goleveldb/leveldb/util" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" ) // WMailServer represents the state data of the mailserver. @@ -122,9 +123,28 @@ func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope) } ok, lower, upper, bloom := s.validateRequest(peer.ID(), request) - if ok { - s.processRequest(peer, lower, upper, bloom) + if !ok { + return } + + s.processRequest(peer, lower, upper, bloom) +} + + +// DeliverMail responds with saved messages upon request by the +// messages' owner. +func (s *WMailServer) DeliverResponsiveMail(peer *whisper.Peer, request *whisper.Envelope) []*whisper.Envelope { + if peer == nil { + log.Error("Whisper peer is nil") + return nil + } + + ok, lower, upper, bloom := s.validateRequest(peer.ID(), request) + if !ok { + return nil + } + + return s.processRequest(nil, lower, upper, bloom) } func (s *WMailServer) processRequest(peer *whisper.Peer, lower, upper uint32, bloom []byte) []*whisper.Envelope { diff --git a/whisper/whisperv6/doc.go b/whisper/whisperv6/doc.go index 44c0c3271c..40a00b5fc6 100644 --- a/whisper/whisperv6/doc.go +++ b/whisper/whisperv6/doc.go @@ -49,6 +49,7 @@ const ( messagesCode = 1 // normal whisper message powRequirementCode = 2 // PoW requirement bloomFilterExCode = 3 // bloom filter exchange + requestMessages = 100 // peer-to-peer message, used by Dapp protocol p2pRequestCode = 126 // peer-to-peer message, used by Dapp protocol p2pMessageCode = 127 // peer-to-peer message (to be consumed by the peer, but not forwarded any further) NumberOfMessageCodes = 128 @@ -89,4 +90,5 @@ const ( type MailServer interface { Archive(env *Envelope) DeliverMail(whisperPeer *Peer, request *Envelope) + DeliverResponsiveMail(whisperPeer *Peer, request *Envelope) []*Envelope } diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go index af513888d0..3ea943a648 100644 --- a/whisper/whisperv6/whisper.go +++ b/whisper/whisperv6/whisper.go @@ -768,6 +768,17 @@ func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error { } whisper.mailServer.DeliverMail(p, &request) } + case requestMessages: + if whisper.mailServer != nil { + var request Envelope + if err := packet.Decode(&request); err != nil { + log.Warn("failed to decode p2p request message, peer will be disconnected", "peer", p.peer.ID(), "err", err) + return errors.New("invalid p2p request") + } + r := whisper.mailServer.DeliverResponsiveMail(p, &request) + + p2p.Send(p.ws, messagesCode, r) + } default: // New message types might be implemented in the future versions of Whisper. // For forward compatibility, just ignore.