summaryrefslogtreecommitdiff
path: root/bitmaskd
diff options
context:
space:
mode:
authorRuben Pollan <meskio@sindominio.net>2019-01-12 18:18:23 +0100
committerRuben Pollan <meskio@sindominio.net>2019-01-15 14:39:21 +0100
commitbea32af5d45702e5608d347bf2bf6314d899f2e0 (patch)
tree3a3b65123a751624a866176d9d59424707474363 /bitmaskd
parent933ad2aeda754499753e91be05aa9f5556539d35 (diff)
[feat] Reorganize code
Let's use a more structured folder system: https://github.com/golang-standards/project-layout - Resolves: #99
Diffstat (limited to 'bitmaskd')
-rw-r--r--bitmaskd/events.go50
-rw-r--r--bitmaskd/main.go163
-rw-r--r--bitmaskd/vpn.go98
3 files changed, 0 insertions, 311 deletions
diff --git a/bitmaskd/events.go b/bitmaskd/events.go
deleted file mode 100644
index e97804c..0000000
--- a/bitmaskd/events.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2018 LEAP
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-package bitmask
-
-import (
- "log"
- "net/http"
-)
-
-const (
- statusEvent = "VPN_STATUS_CHANGED"
-)
-
-func (b *Bitmask) eventsHandler() {
- b.send("events", "register", statusEvent)
- client := &http.Client{
- Timeout: 0,
- }
- for {
- resJSON, err := send(b.apiToken, client, "events", "poll")
- res, ok := resJSON.([]interface{})
- if err != nil || !ok || len(res) < 1 {
- continue
- }
- event, ok := res[0].(string)
- if !ok || event != statusEvent {
- continue
- }
-
- status, err := b.GetStatus()
- if err != nil {
- log.Printf("Error receiving status: %v", err)
- continue
- }
- b.statusCh <- status
- }
-}
diff --git a/bitmaskd/main.go b/bitmaskd/main.go
deleted file mode 100644
index 2ff2268..0000000
--- a/bitmaskd/main.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright (C) 2018 LEAP
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-package bitmask
-
-import (
- "bytes"
- "encoding/json"
- "errors"
- "io/ioutil"
- "log"
- "net/http"
- "path"
- "time"
-
- "0xacab.org/leap/bitmask-systray/bitmask"
-)
-
-const (
- timeout = time.Second * 15
- url = "http://localhost:7070/API/"
- headerAuth = "X-Bitmask-Auth"
-)
-
-// Bitmask holds the bitmask client data
-type Bitmask struct {
- client *http.Client
- apiToken string
- statusCh chan string
-}
-
-// Init the connection to bitmask
-func Init() (*Bitmask, error) {
- statusCh := make(chan string)
- client := &http.Client{
- Timeout: timeout,
- }
-
- err := waitForBitmaskd()
- if err != nil {
- return nil, err
- }
-
- apiToken, err := getToken()
- if err != nil {
- return nil, err
- }
-
- b := Bitmask{client, apiToken, statusCh}
- go b.eventsHandler()
- return &b, nil
-}
-
-// GetStatusCh returns a channel that will recieve VPN status changes
-func (b *Bitmask) GetStatusCh() <-chan string {
- return b.statusCh
-}
-
-// Close the connection to bitmask
-func (b *Bitmask) Close() {
- _, err := b.send("core", "stop")
- if err != nil {
- log.Printf("Got an error stopping bitmaskd: %v", err)
- }
-}
-
-// Version gets the bitmask version string
-func (b *Bitmask) Version() (string, error) {
- res, err := b.send("core", "version")
- if err != nil {
- return "", err
- }
- return res["version_core"].(string), nil
-}
-
-func waitForBitmaskd() error {
- var err error
- for i := 0; i < 30; i++ {
- resp, err := http.Post(url, "", nil)
- if err == nil {
- resp.Body.Close()
- return nil
- }
- log.Printf("Bitmask is not ready (iteration %d): %v", i, err)
- time.Sleep(1 * time.Second)
- }
- return err
-}
-
-func (b *Bitmask) send(parts ...interface{}) (map[string]interface{}, error) {
- 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
- }
- 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) (interface{}, error) {
- var response struct {
- Result interface{}
- Error string
- }
- err := json.Unmarshal(resJSON, &response)
- if response.Error != "" {
- return nil, errors.New(response.Error)
- }
- return response.Result, err
-}
-
-func getToken() (string, error) {
- var err error
- path := path.Join(bitmask.ConfigPath, "authtoken")
- for i := 0; i < 30; i++ {
- b, err := ioutil.ReadFile(path)
- if err == nil {
- return string(b), nil
- }
- log.Printf("Auth token is not ready (iteration %d): %v", i, err)
- time.Sleep(1 * time.Second)
- }
- return "", err
-}
diff --git a/bitmaskd/vpn.go b/bitmaskd/vpn.go
deleted file mode 100644
index cfbe7df..0000000
--- a/bitmaskd/vpn.go
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (C) 2018 LEAP
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-package bitmask
-
-import (
- "errors"
- "log"
-)
-
-// StartVPN for provider
-func (b *Bitmask) StartVPN(provider string) error {
- _, err := b.send("vpn", "start", provider)
- return err
-}
-
-// StopVPN or cancel
-func (b *Bitmask) StopVPN() error {
- _, err := b.send("vpn", "stop")
- return err
-}
-
-// ReloadFirewall restarts the firewall
-func (b *Bitmask) ReloadFirewall() error {
- _, err := b.send("vpn", "fw_reload")
- return err
-}
-
-// GetStatus returns the VPN status
-func (b *Bitmask) GetStatus() (string, error) {
- res, err := b.send("vpn", "status")
- if err != nil {
- return "", err
- }
- return res["status"].(string), nil
-}
-
-// InstallHelpers into the system
-func (b *Bitmask) InstallHelpers() error {
- _, err := b.send("vpn", "install")
- return err
-}
-
-// VPNCheck returns if the helpers are installed and up to date and if polkit is running
-func (b *Bitmask) VPNCheck() (helpers bool, priviledge bool, err error) {
- res, err := b.send("vpn", "check", "")
- if err != nil {
- return false, false, err
- }
- installed, ok := res["installed"].(bool)
- if !ok {
- log.Printf("Unexpected value for installed on 'vpn check': %v", res)
- return false, false, errors.New("Invalid response format")
- }
- privcheck, ok := res["privcheck"].(bool)
- if !ok {
- log.Printf("Unexpected value for privcheck on 'vpn check': %v", res)
- return installed, false, errors.New("Invalid response format")
- }
- return installed, privcheck, nil
-}
-
-// ListGateways return the names of the gateways
-func (b *Bitmask) ListGateways(provider string) ([]string, error) {
- res, err := b.send("vpn", "list")
- if err != nil {
- return nil, err
- }
-
- names := []string{}
- locations, ok := res[provider].([]interface{})
- if !ok {
- return nil, errors.New("Can't read the locations for provider " + provider)
- }
- for i := range locations {
- loc := locations[i].(map[string]interface{})
- names = append(names, loc["name"].(string))
- }
- return names, nil
-}
-
-// UseGateway selects name as the default gateway
-func (b *Bitmask) UseGateway(name string) error {
- _, err := b.send("vpn", "locations", name)
- return err
-}