@@ -107,17 +107,16 @@ func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope)
107
107
return
108
108
}
109
109
110
- ok , lower , upper , topic := s .validateRequest (peer .ID (), request )
110
+ ok , lower , upper , bloom := s .validateRequest (peer .ID (), request )
111
111
if ok {
112
- s .processRequest (peer , lower , upper , topic )
112
+ s .processRequest (peer , lower , upper , bloom )
113
113
}
114
114
}
115
115
116
- func (s * WMailServer ) processRequest (peer * whisper.Peer , lower , upper uint32 , topic whisper. TopicType ) []* whisper.Envelope {
116
+ func (s * WMailServer ) processRequest (peer * whisper.Peer , lower , upper uint32 , bloom [] byte ) []* whisper.Envelope {
117
117
ret := make ([]* whisper.Envelope , 0 )
118
118
var err error
119
119
var zero common.Hash
120
- var empty whisper.TopicType
121
120
kl := NewDbKey (lower , zero )
122
121
ku := NewDbKey (upper , zero )
123
122
i := s .db .NewIterator (& util.Range {Start : kl .raw , Limit : ku .raw }, nil )
@@ -130,7 +129,7 @@ func (s *WMailServer) processRequest(peer *whisper.Peer, lower, upper uint32, to
130
129
log .Error (fmt .Sprintf ("RLP decoding failed: %s" , err ))
131
130
}
132
131
133
- if topic == empty || envelope .Topic == topic {
132
+ if whisper . BloomFilterMatch ( bloom , envelope .Bloom ()) {
134
133
if peer == nil {
135
134
// used for test purposes
136
135
ret = append (ret , & envelope )
@@ -152,22 +151,16 @@ func (s *WMailServer) processRequest(peer *whisper.Peer, lower, upper uint32, to
152
151
return ret
153
152
}
154
153
155
- func (s * WMailServer ) validateRequest (peerID []byte , request * whisper.Envelope ) (bool , uint32 , uint32 , whisper.TopicType ) {
156
- var topic whisper.TopicType
154
+ func (s * WMailServer ) validateRequest (peerID []byte , request * whisper.Envelope ) (bool , uint32 , uint32 , []byte ) {
157
155
if s .pow > 0.0 && request .PoW () < s .pow {
158
- return false , 0 , 0 , topic
156
+ return false , 0 , 0 , nil
159
157
}
160
158
161
159
f := whisper.Filter {KeySym : s .key }
162
160
decrypted := request .Open (& f )
163
161
if decrypted == nil {
164
162
log .Warn (fmt .Sprintf ("Failed to decrypt p2p request" ))
165
- return false , 0 , 0 , topic
166
- }
167
-
168
- if len (decrypted .Payload ) < 8 {
169
- log .Warn (fmt .Sprintf ("Undersized p2p request" ))
170
- return false , 0 , 0 , topic
163
+ return false , 0 , 0 , nil
171
164
}
172
165
173
166
src := crypto .FromECDSAPub (decrypted .Src )
@@ -179,15 +172,24 @@ func (s *WMailServer) validateRequest(peerID []byte, request *whisper.Envelope)
179
172
// if !bytes.Equal(peerID, src) {
180
173
if src == nil {
181
174
log .Warn (fmt .Sprintf ("Wrong signature of p2p request" ))
182
- return false , 0 , 0 , topic
175
+ return false , 0 , 0 , nil
183
176
}
184
177
185
- lower := binary .BigEndian .Uint32 (decrypted .Payload [:4 ])
186
- upper := binary .BigEndian .Uint32 (decrypted .Payload [4 :8 ])
187
-
188
- if len (decrypted .Payload ) >= 8 + whisper .TopicLength {
189
- topic = whisper .BytesToTopic (decrypted .Payload [8 :])
178
+ var bloom []byte
179
+ payloadSize := len (decrypted .Payload )
180
+ if payloadSize < 8 {
181
+ log .Warn (fmt .Sprintf ("Undersized p2p request" ))
182
+ return false , 0 , 0 , nil
183
+ } else if payloadSize == 8 {
184
+ bloom = whisper .MakeFullNodeBloom ()
185
+ } else if payloadSize < 8 + whisper .BloomFilterSize {
186
+ log .Warn (fmt .Sprintf ("Undersized bloom filter in p2p request" ))
187
+ return false , 0 , 0 , nil
188
+ } else {
189
+ bloom = decrypted .Payload [8 : 8 + whisper .BloomFilterSize ]
190
190
}
191
191
192
- return true , lower , upper , topic
192
+ lower := binary .BigEndian .Uint32 (decrypted .Payload [:4 ])
193
+ upper := binary .BigEndian .Uint32 (decrypted .Payload [4 :8 ])
194
+ return true , lower , upper , bloom
193
195
}
0 commit comments