whisper: Move msg/filter key correspondance check to NotifyFilter

Some messages get checked with MatchMessage and others with
MatchEnvelope. By moving the check to the calling location, both
cases get covered.
This commit adds some tests to check this occurence and also fixes
a proof of work issue when the calculation of the proof of work
would timeout.
This commit is contained in:
Guillaume Ballet 2017-09-26 10:26:54 +02:00
parent d8efd010ea
commit 91686bb818
2 changed files with 138 additions and 16 deletions

View file

@ -124,9 +124,11 @@ func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
if match && msg != nil { if match && msg != nil {
log.Trace("processing message: decrypted", "hash", env.Hash().Hex()) log.Trace("processing message: decrypted", "hash", env.Hash().Hex())
if watcher.Src == nil || IsPubKeyEqual(msg.Src, watcher.Src) {
watcher.Trigger(msg) watcher.Trigger(msg)
} }
} }
}
} }
func (f *Filter) processEnvelope(env *Envelope) *ReceivedMessage { func (f *Filter) processEnvelope(env *Envelope) *ReceivedMessage {
@ -177,9 +179,6 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool {
if f.PoW > 0 && msg.PoW < f.PoW { if f.PoW > 0 && msg.PoW < f.PoW {
return false return false
} }
if f.Src != nil && !IsPubKeyEqual(msg.Src, f.Src) {
return false
}
if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() { if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() {
return IsPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst) && f.MatchTopic(msg.Topic) return IsPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst) && f.MatchTopic(msg.Topic)

View file

@ -223,7 +223,6 @@ func TestInstallIdenticalFilters(t *testing.T) {
func TestSymmetricSendCycle(t *testing.T) { func TestSymmetricSendCycle(t *testing.T) {
InitSingleTest() InitSingleTest()
//mrand.Seed(1505987108)
w := New(&DefaultConfig) w := New(&DefaultConfig)
defer w.SetMinimumPoW(DefaultMinimumPoW) defer w.SetMinimumPoW(DefaultMinimumPoW)
@ -235,6 +234,7 @@ func TestSymmetricSendCycle(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
} }
filter1.PoW = DefaultMinimumPoW
// Copy the first filter since some of its fields // Copy the first filter since some of its fields
// are randomly gnerated. // are randomly gnerated.
@ -300,7 +300,6 @@ func TestSymmetricSendCycle(t *testing.T) {
// check w.messages() // check w.messages()
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
mail1 := filter1.Retrieve() mail1 := filter1.Retrieve()
mail2 := filter2.Retrieve() mail2 := filter2.Retrieve()
if len(mail2) == 0 { if len(mail2) == 0 {
t.Fatalf("did not receive any email for filter 2") t.Fatalf("did not receive any email for filter 2")
@ -311,6 +310,140 @@ func TestSymmetricSendCycle(t *testing.T) {
} }
func TestSymmetricSendWithoutAKey(t *testing.T) {
InitSingleTest()
w := New(&DefaultConfig)
defer w.SetMinimumPoW(DefaultMinimumPoW)
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
w.Start(nil)
defer w.Stop()
filter, err := generateFilter(t, true)
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
filter.PoW = DefaultMinimumPoW
params, err := generateMessageParams()
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
filter.Src = nil
params.KeySym = filter.KeySym
params.Topic = BytesToTopic(filter.Topics[2])
params.PoW = filter.PoW
params.WorkTime = 10
params.TTL = 50
msg, err := NewSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
env, err := msg.Wrap(params)
if err != nil {
t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
}
_, err = w.Subscribe(filter)
if err != nil {
t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
}
err = w.Send(env)
if err != nil {
t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
}
// wait till received or timeout
var received bool
for j := 0; j < 200; j++ {
time.Sleep(10 * time.Millisecond)
if len(w.Envelopes()) > 0 {
received = true
break
}
}
if !received {
t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
}
// check w.messages()
time.Sleep(100 * time.Millisecond)
mail := filter.Retrieve()
if len(mail) == 0 {
t.Fatalf("did not receive message in spite of not setting a public key")
}
}
func TestSymmetricSendKeyMismatch(t *testing.T) {
InitSingleTest()
w := New(&DefaultConfig)
defer w.SetMinimumPoW(DefaultMinimumPoW)
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
w.Start(nil)
defer w.Stop()
filter, err := generateFilter(t, true)
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
filter.PoW = DefaultMinimumPoW
params, err := generateMessageParams()
if err != nil {
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
}
params.KeySym = filter.KeySym
params.Topic = BytesToTopic(filter.Topics[2])
params.PoW = filter.PoW
params.WorkTime = 10
params.TTL = 50
msg, err := NewSentMessage(params)
if err != nil {
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
}
env, err := msg.Wrap(params)
if err != nil {
t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
}
_, err = w.Subscribe(filter)
if err != nil {
t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
}
err = w.Send(env)
if err != nil {
t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
}
// wait till received or timeout
var received bool
for j := 0; j < 200; j++ {
time.Sleep(10 * time.Millisecond)
if len(w.Envelopes()) > 0 {
received = true
break
}
}
if !received {
t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
}
// check w.messages()
time.Sleep(100 * time.Millisecond)
mail := filter.Retrieve()
if len(mail) > 0 {
t.Fatalf("received a message when keys weren't matching")
}
}
func TestComparePubKey(t *testing.T) { func TestComparePubKey(t *testing.T) {
InitSingleTest() InitSingleTest()
@ -524,11 +657,6 @@ func TestMatchMessageSym(t *testing.T) {
t.Fatalf("failed Open with seed %d.", seed) t.Fatalf("failed Open with seed %d.", seed)
} }
// Src mismatch
if f.MatchMessage(msg) {
t.Fatalf("failed MatchMessage(src mismatch) with seed %d.", seed)
}
// Src: match // Src: match
*f.Src.X = *params.Src.PublicKey.X *f.Src.X = *params.Src.PublicKey.X
*f.Src.Y = *params.Src.PublicKey.Y *f.Src.Y = *params.Src.PublicKey.Y
@ -622,11 +750,6 @@ func TestMatchMessageAsym(t *testing.T) {
t.Fatalf("failed to open with seed %d.", seed) t.Fatalf("failed to open with seed %d.", seed)
} }
// Src mismatch
if f.MatchMessage(msg) {
t.Fatalf("failed MatchMessage(src mismatch) with seed %d.", seed)
}
// Src: match // Src: match
*f.Src.X = *params.Src.PublicKey.X *f.Src.X = *params.Src.PublicKey.X
*f.Src.Y = *params.Src.PublicKey.Y *f.Src.Y = *params.Src.PublicKey.Y