good morning!!!!

Skip to content
Snippets Groups Projects
Commit 52b54631 authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Whisper watches fixes

parent 93edae28
Branches
Tags
No related merge requests found
...@@ -20,6 +20,8 @@ Rectangle { ...@@ -20,6 +20,8 @@ Rectangle {
Component.onCompleted: { Component.onCompleted: {
identity = shh.newIdentity() identity = shh.newIdentity()
console.log("New identity:", identity) console.log("New identity:", identity)
var t = shh.watch({topics: ["chat"]})
} }
RowLayout { RowLayout {
...@@ -35,7 +37,6 @@ Rectangle { ...@@ -35,7 +37,6 @@ Rectangle {
id: topics id: topics
placeholderText: "topic1, topic2, topic3, ..." placeholderText: "topic1, topic2, topic3, ..."
} }
Button { Button {
text: "Send" text: "Send"
onClicked: { onClicked: {
......
...@@ -2,20 +2,30 @@ package filter ...@@ -2,20 +2,30 @@ package filter
type Generic struct { type Generic struct {
Str1, Str2, Str3 string Str1, Str2, Str3 string
Data map[string]struct{}
Fn func(data interface{}) Fn func(data interface{})
} }
// self = registered, f = incoming
func (self Generic) Compare(f Filter) bool { func (self Generic) Compare(f Filter) bool {
var strMatch, dataMatch = true, true
filter := f.(Generic) filter := f.(Generic)
if (len(self.Str1) == 0 || filter.Str1 == self.Str1) && if (len(self.Str1) > 0 && filter.Str1 != self.Str1) ||
(len(self.Str2) == 0 || filter.Str2 == self.Str2) && (len(self.Str2) > 0 && filter.Str2 != self.Str2) ||
(len(self.Str3) == 0 || filter.Str3 == self.Str3) { (len(self.Str3) > 0 && filter.Str3 != self.Str3) {
return true strMatch = false
} }
for k, _ := range self.Data {
if _, ok := filter.Data[k]; !ok {
return false return false
} }
}
return strMatch && dataMatch
}
func (self Generic) Trigger(data interface{}) { func (self Generic) Trigger(data interface{}) {
self.Fn(data) self.Fn(data)
......
...@@ -3,6 +3,7 @@ package qwhisper ...@@ -3,6 +3,7 @@ package qwhisper
import ( import (
"fmt" "fmt"
"time" "time"
"unsafe"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/ethutil"
...@@ -18,13 +19,22 @@ func fromHex(s string) []byte { ...@@ -18,13 +19,22 @@ func fromHex(s string) []byte {
} }
func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) } func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) }
type Watch struct {
}
func (self *Watch) Arrived(v unsafe.Pointer) {
fmt.Println(v)
}
type Whisper struct { type Whisper struct {
*whisper.Whisper *whisper.Whisper
view qml.Object view qml.Object
watches map[int]*Watch
} }
func New(w *whisper.Whisper) *Whisper { func New(w *whisper.Whisper) *Whisper {
return &Whisper{w, nil} return &Whisper{w, nil, make(map[int]*Watch)}
} }
func (self *Whisper) SetView(view qml.Object) { func (self *Whisper) SetView(view qml.Object) {
...@@ -37,7 +47,7 @@ func (self *Whisper) Post(data string, to, from string, topics []string, pow, tt ...@@ -37,7 +47,7 @@ func (self *Whisper) Post(data string, to, from string, topics []string, pow, tt
Ttl: time.Duration(ttl), Ttl: time.Duration(ttl),
To: crypto.ToECDSAPub(fromHex(to)), To: crypto.ToECDSAPub(fromHex(to)),
From: crypto.ToECDSA(fromHex(from)), From: crypto.ToECDSA(fromHex(from)),
Topics: whisper.TopicsFromString(topics), Topics: whisper.TopicsFromString(topics...),
}) })
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
...@@ -60,12 +70,15 @@ func (self *Whisper) HasIdentity(key string) bool { ...@@ -60,12 +70,15 @@ func (self *Whisper) HasIdentity(key string) bool {
return self.Whisper.HasIdentity(crypto.ToECDSA(fromHex(key))) return self.Whisper.HasIdentity(crypto.ToECDSA(fromHex(key)))
} }
func (self *Whisper) Watch(opts map[string]interface{}) { func (self *Whisper) Watch(opts map[string]interface{}) *Watch {
filter := filterFromMap(opts) filter := filterFromMap(opts)
filter.Fn = func(msg *whisper.Message) { filter.Fn = func(msg *whisper.Message) {
// TODO POST TO QT WINDOW fmt.Println(msg)
} }
self.Whisper.Watch(filter) i := self.Whisper.Watch(filter)
self.watches[i] = &Watch{}
return self.watches[i]
} }
func filterFromMap(opts map[string]interface{}) (f whisper.Filter) { func filterFromMap(opts map[string]interface{}) (f whisper.Filter) {
...@@ -75,6 +88,11 @@ func filterFromMap(opts map[string]interface{}) (f whisper.Filter) { ...@@ -75,6 +88,11 @@ func filterFromMap(opts map[string]interface{}) (f whisper.Filter) {
if from, ok := opts["from"].(string); ok { if from, ok := opts["from"].(string); ok {
f.From = crypto.ToECDSAPub(fromHex(from)) f.From = crypto.ToECDSAPub(fromHex(from))
} }
if topicList, ok := opts["topics"].(*qml.List); ok {
var topics []string
topicList.Convert(&topics)
f.Topics = whisper.TopicsFromString(topics...)
}
return return
} }
...@@ -74,11 +74,13 @@ func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) { ...@@ -74,11 +74,13 @@ func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) {
message.Flags = data[0] message.Flags = data[0]
message.Signature = data[1:66] message.Signature = data[1:66]
} }
message.Payload = data[dataStart:]
payload := data[dataStart:]
if prv != nil { if prv != nil {
message.Payload, err = crypto.Decrypt(prv, message.Payload) message.Payload, err = crypto.Decrypt(prv, payload)
switch err { switch err {
case ecies.ErrInvalidPublicKey: // Payload isn't encrypted case ecies.ErrInvalidPublicKey: // Payload isn't encrypted
message.Payload = payload
return &message, err return &message, err
default: default:
return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err) return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err)
......
...@@ -18,10 +18,19 @@ func Topics(data [][]byte) [][]byte { ...@@ -18,10 +18,19 @@ func Topics(data [][]byte) [][]byte {
return d return d
} }
func TopicsFromString(data []string) [][]byte { func TopicsFromString(data ...string) [][]byte {
d := make([][]byte, len(data)) d := make([][]byte, len(data))
for i, str := range data { for i, str := range data {
d[i] = hashTopic([]byte(str)) d[i] = hashTopic([]byte(str))
} }
return d return d
} }
func bytesToMap(s [][]byte) map[string]struct{} {
m := make(map[string]struct{})
for _, topic := range s {
m[string(topic)] = struct{}{}
}
return m
}
...@@ -4,7 +4,6 @@ import ( ...@@ -4,7 +4,6 @@ import (
"bytes" "bytes"
"crypto/ecdsa" "crypto/ecdsa"
"errors" "errors"
"fmt"
"sync" "sync"
"time" "time"
...@@ -120,6 +119,7 @@ func (self *Whisper) Watch(opts Filter) int { ...@@ -120,6 +119,7 @@ func (self *Whisper) Watch(opts Filter) int {
return self.filters.Install(filter.Generic{ return self.filters.Install(filter.Generic{
Str1: string(crypto.FromECDSA(opts.To)), Str1: string(crypto.FromECDSA(opts.To)),
Str2: string(crypto.FromECDSAPub(opts.From)), Str2: string(crypto.FromECDSAPub(opts.From)),
Data: bytesToMap(opts.Topics),
Fn: func(data interface{}) { Fn: func(data interface{}) {
opts.Fn(data.(*Message)) opts.Fn(data.(*Message))
}, },
...@@ -150,7 +150,6 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { ...@@ -150,7 +150,6 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error {
continue continue
} }
fmt.Println("recv")
if err := self.add(envelope); err != nil { if err := self.add(envelope); err != nil {
// TODO Punish peer here. Invalid envelope. // TODO Punish peer here. Invalid envelope.
peer.Infoln(err) peer.Infoln(err)
...@@ -233,6 +232,7 @@ func (self *Whisper) postEvent(envelope *Envelope) { ...@@ -233,6 +232,7 @@ func (self *Whisper) postEvent(envelope *Envelope) {
// Create a custom filter? // Create a custom filter?
self.filters.Notify(filter.Generic{ self.filters.Notify(filter.Generic{
Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())),
Data: bytesToMap(envelope.Topics),
}, message) }, message)
} else { } else {
wlogger.Infoln(err) wlogger.Infoln(err)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment