diff options
Diffstat (limited to 'bitmask')
-rw-r--r-- | bitmask/darwin.go | 8 | ||||
-rw-r--r-- | bitmask/events.go | 64 | ||||
-rw-r--r-- | bitmask/main.go | 71 | ||||
-rw-r--r-- | bitmask/unix.go | 8 | ||||
-rw-r--r-- | bitmask/windows.go | 6 |
5 files changed, 58 insertions, 99 deletions
diff --git a/bitmask/darwin.go b/bitmask/darwin.go index f425078..b71271e 100644 --- a/bitmask/darwin.go +++ b/bitmask/darwin.go @@ -18,14 +18,6 @@ package bitmask import ( "os" - - "github.com/pebbe/zmq4" ) -const coreEndpoint = "ipc:///var/tmp/bitmask.core.sock" - var ConfigPath = os.Getenv("HOME") + "/Library/Preferences/leap" - -func hasCurve() bool { - return zmq4.HasCurve() -} diff --git a/bitmask/events.go b/bitmask/events.go index f8b3725..e97804c 100644 --- a/bitmask/events.go +++ b/bitmask/events.go @@ -16,63 +16,27 @@ package bitmask import ( - "io/ioutil" "log" - "path/filepath" - "strings" - - "github.com/pebbe/zmq4" + "net/http" ) const ( - eventsEndpoint = "tcp://127.0.0.1:9001" - statusEvent = "VPN_STATUS_CHANGED" + statusEvent = "VPN_STATUS_CHANGED" ) -func initEvents() (*zmq4.Socket, error) { - socket, err := zmq4.NewSocket(zmq4.SUB) - if err != nil { - return nil, err - } - - if hasCurve() { - err = initCurve(socket) - if err != nil { - return nil, err - } - } - - err = socket.Connect(eventsEndpoint) - if err != nil { - return nil, err - } - - err = socket.SetSubscribe(statusEvent) - return socket, err -} - -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() { + b.send("events", "register", statusEvent) + client := &http.Client{ + Timeout: 0, + } for { - msg, err := b.eventsoc.RecvMessage(0) - if err != nil { - break + resJSON, err := send(b.apiToken, client, "events", "poll") + res, ok := resJSON.([]interface{}) + if err != nil || !ok || len(res) < 1 { + continue } - if msg[0][:len(statusEvent)] != statusEvent { + event, ok := res[0].(string) + if !ok || event != statusEvent { continue } @@ -84,7 +48,3 @@ func (b *Bitmask) eventsHandler() { 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 a044c58..e303adb 100644 --- a/bitmask/main.go +++ b/bitmask/main.go @@ -16,40 +16,41 @@ package bitmask import ( + "bytes" "encoding/json" "errors" + "io/ioutil" "log" + "net/http" + "path" "time" - - "github.com/pebbe/zmq4" ) const ( - timeout = time.Second * 15 + timeout = time.Second * 15 + url = "http://localhost:7070/API/" + headerAuth = "X-Bitmask-Auth" ) // Bitmask holds the bitmask client data type Bitmask struct { - coresoc *zmq4.Socket - eventsoc *zmq4.Socket + client *http.Client + apiToken string statusCh chan string } // Init the connection to bitmask func Init() (*Bitmask, error) { statusCh := make(chan string) - coresoc, err := initCore() - if err != nil { - return nil, err + client := &http.Client{ + Timeout: timeout, } - eventsoc, err := initEvents() + apiToken, err := getToken() if err != nil { return nil, err } - coresoc.SetRcvtimeo(timeout) - - b := Bitmask{coresoc, eventsoc, statusCh} + b := Bitmask{client, apiToken, statusCh} go b.eventsHandler() return &b, nil } @@ -65,24 +66,48 @@ func (b *Bitmask) Close() { if err != nil { log.Printf("Got an error stopping bitmaskd: %v", err) } - b.coresoc.Close() } func (b *Bitmask) send(parts ...interface{}) (map[string]interface{}, error) { - _, err := b.coresoc.SendMessage(parts...) + resJSON, err := send(b.apiToken, b.client, parts...) + if err != nil { + return nil, err + } + result, ok := resJSON.(map[string]interface{}) + if !ok { + return nil, errors.New("Not valid response") + } + return result, nil +} + +func send(apiToken string, client *http.Client, parts ...interface{}) (interface{}, error) { + apiSection, _ := parts[0].(string) + reqBody, err := json.Marshal(parts[1:]) + if err != nil { + return nil, err + } + req, err := http.NewRequest("POST", url+apiSection, bytes.NewReader(reqBody)) if err != nil { return nil, err } - resJSON, err := b.coresoc.RecvBytes(0) + req.Header.Add(headerAuth, apiToken) + + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + resJSON, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return parseResponse(resJSON) } -func parseResponse(resJSON []byte) (map[string]interface{}, error) { +func parseResponse(resJSON []byte) (interface{}, error) { var response struct { - Result map[string]interface{} + Result interface{} Error string } err := json.Unmarshal(resJSON, &response) @@ -92,12 +117,8 @@ func parseResponse(resJSON []byte) (map[string]interface{}, error) { return response.Result, err } -func initCore() (*zmq4.Socket, error) { - socket, err := zmq4.NewSocket(zmq4.REQ) - if err != nil { - return nil, err - } - - err = socket.Connect(coreEndpoint) - return socket, err +func getToken() (string, error) { + path := path.Join(ConfigPath, "authtoken") + b, err := ioutil.ReadFile(path) + return string(b), err } diff --git a/bitmask/unix.go b/bitmask/unix.go index 321f1c0..d276556 100644 --- a/bitmask/unix.go +++ b/bitmask/unix.go @@ -18,14 +18,6 @@ package bitmask import ( "os" - - "github.com/pebbe/zmq4" ) -const coreEndpoint = "ipc:///var/tmp/bitmask.core.sock" - var ConfigPath = os.Getenv("HOME") + "/.config/leap" - -func hasCurve() bool { - return zmq4.HasCurve() -} diff --git a/bitmask/windows.go b/bitmask/windows.go index de7ece0..221d75b 100644 --- a/bitmask/windows.go +++ b/bitmask/windows.go @@ -18,10 +18,4 @@ package bitmask import "os" -const coreEndpoint = "tcp://127.0.0.1:5001" - var ConfigPath = os.Getenv("LOCALAPPDATA") + "\\leap" - -func hasCurve() bool { - return false -} |