mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
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:
parent
d8efd010ea
commit
91686bb818
2 changed files with 138 additions and 16 deletions
|
|
@ -124,9 +124,11 @@ func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
|
|||
|
||||
if match && msg != nil {
|
||||
log.Trace("processing message: decrypted", "hash", env.Hash().Hex())
|
||||
if watcher.Src == nil || IsPubKeyEqual(msg.Src, watcher.Src) {
|
||||
watcher.Trigger(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue