From 91686bb818fef069951ee06add6b4e256748608b Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Tue, 26 Sep 2017 10:26:54 +0200 Subject: [PATCH] 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. --- whisper/whisperv5/filter.go | 7 +- whisper/whisperv5/filter_test.go | 147 ++++++++++++++++++++++++++++--- 2 files changed, 138 insertions(+), 16 deletions(-) diff --git a/whisper/whisperv5/filter.go b/whisper/whisperv5/filter.go index 5775462a7a..81c4c9a65c 100644 --- a/whisper/whisperv5/filter.go +++ b/whisper/whisperv5/filter.go @@ -124,7 +124,9 @@ func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) { if match && msg != nil { log.Trace("processing message: decrypted", "hash", env.Hash().Hex()) - watcher.Trigger(msg) + if watcher.Src == nil || IsPubKeyEqual(msg.Src, watcher.Src) { + watcher.Trigger(msg) + } } } } @@ -177,9 +179,6 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool { if f.PoW > 0 && msg.PoW < f.PoW { return false } - if f.Src != nil && !IsPubKeyEqual(msg.Src, f.Src) { - return false - } if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() { return IsPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst) && f.MatchTopic(msg.Topic) diff --git a/whisper/whisperv5/filter_test.go b/whisper/whisperv5/filter_test.go index 3fcb4eb9cb..c2e4f7b465 100644 --- a/whisper/whisperv5/filter_test.go +++ b/whisper/whisperv5/filter_test.go @@ -223,7 +223,6 @@ func TestInstallIdenticalFilters(t *testing.T) { func TestSymmetricSendCycle(t *testing.T) { InitSingleTest() - //mrand.Seed(1505987108) w := New(&DefaultConfig) defer w.SetMinimumPoW(DefaultMinimumPoW) @@ -235,6 +234,7 @@ func TestSymmetricSendCycle(t *testing.T) { if err != nil { t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) } + filter1.PoW = DefaultMinimumPoW // Copy the first filter since some of its fields // are randomly gnerated. @@ -300,7 +300,6 @@ func TestSymmetricSendCycle(t *testing.T) { // check w.messages() time.Sleep(100 * time.Millisecond) mail1 := filter1.Retrieve() - mail2 := filter2.Retrieve() if len(mail2) == 0 { 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) { InitSingleTest() @@ -524,11 +657,6 @@ func TestMatchMessageSym(t *testing.T) { 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 *f.Src.X = *params.Src.PublicKey.X *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) } - // Src mismatch - if f.MatchMessage(msg) { - t.Fatalf("failed MatchMessage(src mismatch) with seed %d.", seed) - } - // Src: match *f.Src.X = *params.Src.PublicKey.X *f.Src.Y = *params.Src.PublicKey.Y