summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Pollan <meskio@sindominio.net>2018-01-22 19:51:37 +0100
committerRuben Pollan <meskio@sindominio.net>2018-01-22 19:51:37 +0100
commit78afb3d88fbdc69df9d04505a51b5fa40a2ea37d (patch)
tree94cff657d3df0097af5926bf5a7633d0c48b717e
parent96a892f8400bc60a3a4021d7783776e2315036ba (diff)
[feat] add event support
-rw-r--r--bitmask/darwin.go7
-rw-r--r--bitmask/events.go48
-rw-r--r--bitmask/main.go12
-rw-r--r--bitmask/unix.go7
-rw-r--r--bitmask/vpn.go5
-rw-r--r--bitmask/windows.go7
6 files changed, 71 insertions, 15 deletions
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"