whisper/whisperv6: post returns the hash of sent message (#16495)

This commit is contained in:
gluk256 2018-04-19 15:34:24 +02:00 committed by Felix Lange
parent 8feb31825e
commit a16f12ba86
1 changed files with 26 additions and 14 deletions

View File

@ -227,8 +227,9 @@ type newMessageOverride struct {
Padding hexutil.Bytes Padding hexutil.Bytes
} }
// Post a message on the Whisper network. // Post posts a message on the Whisper network.
func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (bool, error) { // returns the hash of the message in case of success.
func (api *PublicWhisperAPI) Post(ctx context.Context, req NewMessage) (hexutil.Bytes, error) {
var ( var (
symKeyGiven = len(req.SymKeyID) > 0 symKeyGiven = len(req.SymKeyID) > 0
pubKeyGiven = len(req.PublicKey) > 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 // user must specify either a symmetric or an asymmetric key
if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) { if (symKeyGiven && pubKeyGiven) || (!symKeyGiven && !pubKeyGiven) {
return false, ErrSymAsym return nil, ErrSymAsym
} }
params := &MessageParams{ 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 // Set key that is used to sign the message
if len(req.Sig) > 0 { if len(req.Sig) > 0 {
if params.Src, err = api.w.GetPrivateKey(req.Sig); err != nil { 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 // Set symmetric key that is used to encrypt the message
if symKeyGiven { if symKeyGiven {
if params.Topic == (TopicType{}) { // topics are mandatory with symmetric encryption 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 { if params.KeySym, err = api.w.GetSymKey(req.SymKeyID); err != nil {
return false, err return nil, err
} }
if !validateDataIntegrity(params.KeySym, aesKeyLength) { 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 { if pubKeyGiven {
params.Dst = crypto.ToECDSAPub(req.PublicKey) params.Dst = crypto.ToECDSAPub(req.PublicKey)
if !ValidatePublicKey(params.Dst) { if !ValidatePublicKey(params.Dst) {
return false, ErrInvalidPublicKey return nil, ErrInvalidPublicKey
} }
} }
// encrypt and sent message // encrypt and sent message
whisperMsg, err := NewSentMessage(params) whisperMsg, err := NewSentMessage(params)
if err != nil { if err != nil {
return false, err return nil, err
} }
var result []byte
env, err := whisperMsg.Wrap(params) env, err := whisperMsg.Wrap(params)
if err != nil { if err != nil {
return false, err return nil, err
} }
// send to specific node (skip PoW check) // send to specific node (skip PoW check)
if len(req.TargetPeer) > 0 { if len(req.TargetPeer) > 0 {
n, err := discover.ParseNode(req.TargetPeer) n, err := discover.ParseNode(req.TargetPeer)
if err != nil { 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)
} }
return true, api.w.SendP2PMessage(n.ID[:], env) err = api.w.SendP2PMessage(n.ID[:], env)
if err == nil {
hash := env.Hash()
result = hash[:]
}
return result, err
} }
// ensure that the message PoW meets the node's minimum accepted PoW // ensure that the message PoW meets the node's minimum accepted PoW
if req.PowTarget < api.w.MinPow() { 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 //go:generate gencodec -type Criteria -field-override criteriaOverride -out gen_criteria_json.go