aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgluk256 <gluk256@users.noreply.github.com>2018-04-19 21:34:24 +0800
committerFelix Lange <fjl@users.noreply.github.com>2018-04-19 21:34:24 +0800
commita16f12ba8695c15b5dac7a7fbb30c9177672bf8f (patch)
tree438781241fb32a5120b4cf469cfa2105e876e433
parent8feb31825e50753bb63193c54fc13fda7655c062 (diff)
downloaddexon-a16f12ba8695c15b5dac7a7fbb30c9177672bf8f.tar.gz
dexon-a16f12ba8695c15b5dac7a7fbb30c9177672bf8f.tar.zst
dexon-a16f12ba8695c15b5dac7a7fbb30c9177672bf8f.zip
whisper/whisperv6: post returns the hash of sent message (#16495)
-rw-r--r--whisper/whisperv6/api.go40
1 files changed, 26 insertions, 14 deletions
diff --git a/whisper/whisperv6/api.go b/whisper/whisperv6/api.go
index 3f25785fe..c60bc46a1 100644
--- a/whisper/whisperv6/api.go
+++ b/whisper/whisperv6/api.go
@@ -227,8 +227,9 @@ type newMessageOverride struct {
Padding hexutil.Bytes
}
-// Post a message on the Whisper network.
-func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, error) {
+// Post posts a message on the Whisper network.
+// returns the hash of the message in case of success.
+func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (hexutil.Bytes, error) {
var (
symKeyGiven = len(req.SymKeyID) > 0
pubKeyGiven = len(req.PublicKey) > 0
@@ -237,7 +238,7 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
// user must specify either a symmetric or an asymmetric key
if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) {
- return false, ErrSymAsym
+ return nil, ErrSymAsym
}
params := &MessageParams{
@@ -252,20 +253,20 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
// Set key that is used to sign the message
if len(req.Sig) > 0 {
if params.Src, err = api.w.GetPrivateKey(req.Sig); err != nil {
- return false, err
+ return nil, err
}
}
// Set symmetric key that is used to encrypt the message
if symKeyGiven {
if params.Topic == (TopicType{}) { // topics are mandatory with symmetric encryption
- return false, ErrNoTopics
+ return nil, ErrNoTopics
}
if params.KeySym, err = api.w.GetSymKey(req.SymKeyID); err != nil {
- return false, err
+ return nil, err
}
if !validateDataIntegrity(params.KeySym, aesKeyLength) {
- return false, ErrInvalidSymmetricKey
+ return nil, ErrInvalidSymmetricKey
}
}
@@ -273,36 +274,47 @@ func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, er
if pubKeyGiven {
params.Dst = crypto.ToECDSAPub(req.PublicKey)
if !ValidatePublicKey(params.Dst) {
- return false, ErrInvalidPublicKey
+ return nil, ErrInvalidPublicKey
}
}
// encrypt and sent message
whisperMsg, err := NewSentMessage(params)
if err != nil {
- return false, err
+ return nil, err
}
+ var result []byte
env, err := whisperMsg.Wrap(params)
if err != nil {
- return false, err
+ return nil, err
}
// send to specific node (skip PoW check)
if len(req.TargetPeer) > 0 {
n, err := discover.ParseNode(req.TargetPeer)
if err != nil {
- return false, fmt.Errorf("failed to parse target peer: %s", err)
+ return nil, fmt.Errorf("failed to parse target peer: %s", err)
+ }
+ err = api.w.SendP2PMessage(n.ID[:], env)
+ if err == nil {
+ hash := env.Hash()
+ result = hash[:]
}
- return true, api.w.SendP2PMessage(n.ID[:], env)
+ return result, err
}
// ensure that the message PoW meets the node's minimum accepted PoW
if req.PowTarget < api.w.MinPow() {
- return false, ErrTooLowPoW
+ return nil, ErrTooLowPoW
}
- return true, api.w.Send(env)
+ err = api.w.Send(env)
+ if err == nil {
+ hash := env.Hash()
+ result = hash[:]
+ }
+ return result, err
}
//go:generate gencodec -type Criteria -field-override criteriaOverride -out gen_criteria_json.go