mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 15:16:43 +00:00
whisper: API updated + new tests
This commit is contained in:
parent
7056e82374
commit
3b7288006c
5 changed files with 68 additions and 24 deletions
|
|
@ -198,11 +198,16 @@ func (api *PublicWhisperAPI) HasSymmetricKey(id string) (bool, error) {
|
|||
return res, nil
|
||||
}
|
||||
|
||||
func (api *PublicWhisperAPI) GetSymmetricKey(name string) ([]byte, error) {
|
||||
func (api *PublicWhisperAPI) GetSymmetricKey(name string) (string, error) {
|
||||
if api.whisper == nil {
|
||||
return nil, whisperOffLineErr
|
||||
return "", whisperOffLineErr
|
||||
}
|
||||
return api.whisper.GetSymKey(name)
|
||||
|
||||
b, err := api.whisper.GetSymKey(name)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return fmt.Sprintf("%x", b), nil
|
||||
}
|
||||
|
||||
// DeleteSymKey deletes the key associated with the name string if it exists.
|
||||
|
|
@ -232,14 +237,14 @@ func (api *PublicWhisperAPI) Subscribe(args WhisperFilterArgs) (string, error) {
|
|||
|
||||
err := ValidateKeyID(args.Key)
|
||||
if err != nil {
|
||||
info := "NewFilter: " + err.Error()
|
||||
info := "Subscribe: " + err.Error()
|
||||
log.Error(info)
|
||||
return "", errors.New(info)
|
||||
}
|
||||
|
||||
if len(args.SignedWith) > 0 {
|
||||
if !ValidatePublicKey(filter.Src) {
|
||||
info := "NewFilter: Invalid 'SignedWith' field"
|
||||
info := "Subscribe: Invalid 'SignedWith' field"
|
||||
log.Error(info)
|
||||
return "", errors.New(info)
|
||||
}
|
||||
|
|
@ -247,18 +252,18 @@ func (api *PublicWhisperAPI) Subscribe(args WhisperFilterArgs) (string, error) {
|
|||
|
||||
if args.Symmetric {
|
||||
if len(args.Topics) == 0 {
|
||||
info := "NewFilter: at least one topic must be specified with symmetric encryption"
|
||||
info := "Subscribe: at least one topic must be specified with symmetric encryption"
|
||||
log.Error(info)
|
||||
return "", errors.New(info)
|
||||
}
|
||||
symKey, err := api.whisper.GetSymKey(args.Key)
|
||||
if err != nil {
|
||||
info := "NewFilter: invalid key ID"
|
||||
info := "Subscribe: invalid key ID"
|
||||
log.Error(info)
|
||||
return "", errors.New(info)
|
||||
}
|
||||
if !validateSymmetricKey(symKey) {
|
||||
info := "NewFilter: retrieved key is invalid"
|
||||
info := "Subscribe: retrieved key is invalid"
|
||||
log.Error(info)
|
||||
return "", errors.New(info)
|
||||
}
|
||||
|
|
@ -268,12 +273,12 @@ func (api *PublicWhisperAPI) Subscribe(args WhisperFilterArgs) (string, error) {
|
|||
} else {
|
||||
filter.KeyAsym, err = api.whisper.GetPrivateKey(args.Key)
|
||||
if err != nil {
|
||||
info := "NewFilter: invalid key ID"
|
||||
info := "Subscribe: invalid key ID"
|
||||
log.Error(info)
|
||||
return "", errors.New(info)
|
||||
}
|
||||
if filter.KeyAsym == nil {
|
||||
info := "NewFilter: non-existent identity provided"
|
||||
info := "Subscribe: non-existent identity provided"
|
||||
log.Error(info)
|
||||
return "", errors.New(info)
|
||||
}
|
||||
|
|
@ -288,7 +293,7 @@ func (api *PublicWhisperAPI) Unsubscribe(id string) {
|
|||
}
|
||||
|
||||
// GetFilterChanges retrieves all the new messages matched by a filter since the last retrieval.
|
||||
func (api *PublicWhisperAPI) GetFilterChanges(filterId string) []*WhisperMessage {
|
||||
func (api *PublicWhisperAPI) GetSubscriptionMessages(filterId string) []*WhisperMessage {
|
||||
f := api.whisper.GetFilter(filterId)
|
||||
if f != nil {
|
||||
newMail := f.Retrieve()
|
||||
|
|
@ -409,6 +414,10 @@ func (api *PublicWhisperAPI) Post(args PostArgs) error {
|
|||
return errors.New(info)
|
||||
}
|
||||
return api.whisper.SendP2PMessage(n.ID[:], envelope)
|
||||
} else if args.PowTarget < api.whisper.minPoW {
|
||||
info := "Post: target PoW is less than minimum PoW, the message can not be sent"
|
||||
log.Error(info)
|
||||
return errors.New(info)
|
||||
}
|
||||
|
||||
return api.whisper.Send(envelope)
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
package whisperv5
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
|
|
@ -43,7 +42,7 @@ func TestBasic(t *testing.T) {
|
|||
t.Fatalf("wrong version: %d.", ver)
|
||||
}
|
||||
|
||||
mail := api.GetFilterChanges("non-existent-id")
|
||||
mail := api.GetSubscriptionMessages("non-existent-id")
|
||||
if len(mail) != 0 {
|
||||
t.Fatalf("failed GetFilterChanges: premature result")
|
||||
}
|
||||
|
|
@ -148,7 +147,7 @@ func TestBasic(t *testing.T) {
|
|||
t.Fatalf("failed GetSymKey(id2): %s.", err)
|
||||
}
|
||||
|
||||
if !bytes.Equal(k1, k2) {
|
||||
if k1 != k2 {
|
||||
t.Fatalf("installed keys are not equal")
|
||||
}
|
||||
|
||||
|
|
@ -171,7 +170,7 @@ func TestBasic(t *testing.T) {
|
|||
|
||||
func TestUnmarshalFilterArgs(t *testing.T) {
|
||||
s := []byte(`{
|
||||
"type":"asym",
|
||||
"type":"sym",
|
||||
"key":"0x70c87d191324e6712a591f304b4eedef6ad9bb9d",
|
||||
"signedWith":"0x9b2055d370f73ec7d8a03e965129118dc8f5bf83",
|
||||
"minPoW":2.34,
|
||||
|
|
@ -185,7 +184,7 @@ func TestUnmarshalFilterArgs(t *testing.T) {
|
|||
t.Fatalf("failed UnmarshalJSON: %s.", err)
|
||||
}
|
||||
|
||||
if f.Symmetric {
|
||||
if !f.Symmetric {
|
||||
t.Fatalf("wrong type.")
|
||||
}
|
||||
if f.Key != "0x70c87d191324e6712a591f304b4eedef6ad9bb9d" {
|
||||
|
|
@ -282,7 +281,7 @@ func waitForMessages(api *PublicWhisperAPI, id string, target int) []*WhisperMes
|
|||
// timeout: 2 seconds
|
||||
result := make([]*WhisperMessage, 0, target)
|
||||
for i := 0; i < 100; i++ {
|
||||
mail := api.GetFilterChanges(id)
|
||||
mail := api.GetSubscriptionMessages(id)
|
||||
if len(mail) > 0 {
|
||||
for _, m := range mail {
|
||||
result = append(result, m)
|
||||
|
|
@ -592,3 +591,40 @@ func TestIntegrationSymWithFilter(t *testing.T) {
|
|||
t.Fatalf("failed to decrypt second message: %s.", text)
|
||||
}
|
||||
}
|
||||
|
||||
func TestKey(t *testing.T) {
|
||||
w := New()
|
||||
api := NewPublicWhisperAPI(w)
|
||||
if api == nil {
|
||||
t.Fatalf("failed to create API.")
|
||||
}
|
||||
|
||||
k, err := api.AddSymmetricKeyFromPassword("wwww")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create key: %s.", err)
|
||||
}
|
||||
|
||||
s, err := api.GetSymmetricKey(k)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get sym key: %s.", err)
|
||||
}
|
||||
|
||||
b := common.FromHex(s)
|
||||
k2, err := api.AddSymmetricKeyDirect(b)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to add sym key: %s.", err)
|
||||
}
|
||||
|
||||
s2, err := api.GetSymmetricKey(k2)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get sym key: %s.", err)
|
||||
}
|
||||
|
||||
if s != "448652d595bd6ec00b2a9ea220ad6c26592d9bf4cf79023d3c1b30cb681e6e07" {
|
||||
t.Fatalf("wrong key from password")
|
||||
}
|
||||
|
||||
if s != s2 {
|
||||
t.Fatalf("wrong key")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ package whisperv5
|
|||
import (
|
||||
"crypto/ecdsa"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
gmath "math"
|
||||
"math/big"
|
||||
|
|
@ -121,7 +120,7 @@ func (e *Envelope) Seal(options *MessageParams) error {
|
|||
}
|
||||
|
||||
if target > 0 && bestBit < target {
|
||||
return errors.New("Failed to reach the PoW target, insufficient work time")
|
||||
return fmt.Errorf("Failed to reach the PoW target, specified pow time (%d seconds) was insufficient", options.WorkTime)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ func sendMsg(t *testing.T, expected bool, id int) {
|
|||
return
|
||||
}
|
||||
|
||||
opt := MessageParams{KeySym: sharedKey, Topic: sharedTopic, Payload: expectedMessage, PoW: 0.00000001}
|
||||
opt := MessageParams{KeySym: sharedKey, Topic: sharedTopic, Payload: expectedMessage, PoW: 0.00000001, WorkTime: 1}
|
||||
if !expected {
|
||||
opt.KeySym[0]++
|
||||
opt.Topic[0]++
|
||||
|
|
@ -267,12 +267,12 @@ func sendMsg(t *testing.T, expected bool, id int) {
|
|||
msg := NewSentMessage(&opt)
|
||||
envelope, err := msg.Wrap(&opt)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to seal message.")
|
||||
t.Fatalf("failed to seal message: %s", err)
|
||||
}
|
||||
|
||||
err = nodes[id].shh.Send(envelope)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to send message.")
|
||||
t.Fatalf("failed to send message: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ func (w *Whisper) GetSymKey(id string) ([]byte, error) {
|
|||
if w.symKeys[id] != nil {
|
||||
return w.symKeys[id], nil
|
||||
}
|
||||
return nil, fmt.Errorf("non-existent ID")
|
||||
return nil, fmt.Errorf("non-existent key ID")
|
||||
}
|
||||
|
||||
// Watch installs a new message handler to run in case a matching packet arrives
|
||||
|
|
@ -383,7 +383,7 @@ func (w *Whisper) Send(envelope *Envelope) error {
|
|||
// Start implements node.Service, starting the background data propagation thread
|
||||
// of the Whisper protocol.
|
||||
func (w *Whisper) Start(*p2p.Server) error {
|
||||
log.Info(fmt.Sprint("Whisper started"))
|
||||
log.Info(fmt.Sprintf("Whisper v%d started", ProtocolVersion))
|
||||
go w.update()
|
||||
|
||||
numCPU := runtime.NumCPU()
|
||||
|
|
|
|||
Loading…
Reference in a new issue