From 78afb3d88fbdc69df9d04505a51b5fa40a2ea37d Mon Sep 17 00:00:00 2001 From: Ruben Pollan Date: Mon, 22 Jan 2018 19:51:37 +0100 Subject: [feat] add event support --- bitmask/darwin.go | 7 +++++++ bitmask/events.go | 48 ++++++++++++++++++++++++++++++++++++++++++------ bitmask/main.go | 12 ++++++++---- bitmask/unix.go | 7 +++++++ bitmask/vpn.go | 5 ----- bitmask/windows.go | 7 +++++++ 6 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 bitmask/darwin.go create mode 100644 bitmask/unix.go create mode 100644 bitmask/windows.go (limited to 'bitmask') diff --git a/bitmask/darwin.go b/bitmask/darwin.go new file mode 100644 index 0000000..f3e9224 --- /dev/null +++ b/bitmask/darwin.go @@ -0,0 +1,7 @@ +// +build darwin + +package bitmask + +import "os" + +var configPath = os.Getenv("HOME") + "/Library/Preferences/leap" diff --git a/bitmask/events.go b/bitmask/events.go index 3fed26a..8645519 100644 --- a/bitmask/events.go +++ b/bitmask/events.go @@ -1,12 +1,17 @@ package bitmask import ( + "io/ioutil" + "log" + "path/filepath" + "strings" + "github.com/pebbe/zmq4" ) const ( eventsEndpoint = "tcp://127.0.0.1:9001" - //serverKeyPath = "/home/user/.config/leap/events/zmq_certificates/public_keys/server.key" // FIXME + statusEvent = "VPN_STATUS_CHANGED" ) func initEvents() (*zmq4.Socket, error) { @@ -16,20 +21,47 @@ func initEvents() (*zmq4.Socket, error) { } if zmq4.HasCurve() { - // TODO + err = initCurve(socket) + if err != nil { + return nil, err + } } err = socket.Connect(eventsEndpoint) if err != nil { return nil, err } - return socket, nil + + err = socket.SetSubscribe(statusEvent) + return socket, err } -func (b *Bitmask) fetchStatus() { - // TODO: this should be a subscription to the event +func initCurve(socket *zmq4.Socket) error { + serverKeyData, err := ioutil.ReadFile(getServerKeyPath()) + if err != nil { + return err + } + + pubkey, seckey, err := zmq4.NewCurveKeypair() + if err != nil { + return err + } + + serverkey := strings.Split(string(serverKeyData), "\"")[1] + return socket.ClientAuthCurve(serverkey, pubkey, seckey) +} + +func (b *Bitmask) eventsHandler() { for { - time.Sleep(time.Second) + msg, err := b.eventsoc.RecvMessage(0) + if err != nil { + break + } + log.Println(msg[0]) + if msg[0][:len(statusEvent)] != statusEvent { + continue + } + status, err := b.GetStatus() if err != nil { log.Printf("Error receiving status: %v", err) @@ -38,3 +70,7 @@ func (b *Bitmask) fetchStatus() { b.statusCh <- status } } + +func getServerKeyPath() string { + return filepath.Join(configPath, "events", "zmq_certificates", "public_keys", "server.key") +} diff --git a/bitmask/main.go b/bitmask/main.go index b4607b3..a6452ca 100644 --- a/bitmask/main.go +++ b/bitmask/main.go @@ -14,21 +14,25 @@ const ( // Bitmask holds the bitmask client data type Bitmask struct { - //eventsoc *zmq4.Socket coresoc *zmq4.Socket + eventsoc *zmq4.Socket statusCh chan string } // Init the connection to bitmask func Init() (*Bitmask, error) { statusCh := make(chan string) - socket, err := initCore() + coresoc, err := initCore() + if err != nil { + return nil, err + } + eventsoc, err := initEvents() if err != nil { return nil, err } - b := Bitmask{socket, statusCh} - go b.fetchStatus() + b := Bitmask{coresoc, eventsoc, statusCh} + go b.eventsHandler() return &b, nil } diff --git a/bitmask/unix.go b/bitmask/unix.go new file mode 100644 index 0000000..5b50f24 --- /dev/null +++ b/bitmask/unix.go @@ -0,0 +1,7 @@ +// +build !windows,!darwin + +package bitmask + +import "os" + +var configPath = os.Getenv("HOME") + "/.config/leap" diff --git a/bitmask/vpn.go b/bitmask/vpn.go index 025e2e3..9d12f85 100644 --- a/bitmask/vpn.go +++ b/bitmask/vpn.go @@ -1,10 +1,5 @@ package bitmask -import ( - "log" - "time" -) - // StartVPN for provider func (b *Bitmask) StartVPN(provider string) error { _, err := b.send("vpn", "start", provider) diff --git a/bitmask/windows.go b/bitmask/windows.go new file mode 100644 index 0000000..a574c96 --- /dev/null +++ b/bitmask/windows.go @@ -0,0 +1,7 @@ +// +build windows + +package bitmask + +import "os" + +var configPath = os.Getenv("APPDATA") + "\\leap" -- cgit v1.2.3