From 47ac0543b9ed2d4afb8814a19e2f4dc3c30030e1 Mon Sep 17 00:00:00 2001
From: kali <kali@leap.se>
Date: Tue, 29 Sep 2020 20:41:55 +0200
Subject: [PATCH] [feat] improve error handling during login

---
 gui/backend.go               |  1 -
 gui/qml/main.qml             |  2 +-
 pkg/backend/api.go           |  7 ++++---
 pkg/vpn/bonafide/auth_sip.go | 12 +++++++++---
 pkg/vpn/bonafide/bonafide.go |  3 +++
 5 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/gui/backend.go b/gui/backend.go
index f8ee2bdb..9453d88f 100644
--- a/gui/backend.go
+++ b/gui/backend.go
@@ -3,7 +3,6 @@ package main
 /* a wrapper around bitmask that exposes status to a QtQml gui.
    Have a look at the pkg/backend module for further enlightment. */
 
-// #cgo CXXFLAGS: -mmacosx-version-min=10.10
 import (
 	"C"
 	"unsafe"
diff --git a/gui/qml/main.qml b/gui/qml/main.qml
index 80f8e7ca..ce72fffc 100644
--- a/gui/qml/main.qml
+++ b/gui/qml/main.qml
@@ -48,7 +48,7 @@ ApplicationWindow {
     function showInitFailure(msg) {
       console.debug("ERRORS:", ctx.errors)
       if (msg == undefined) {
-          if (ctx.errors == 'bad_auth_502') {
+          if (ctx.errors == 'bad_auth_502' || ctx.errors == 'bad_auth_timeout') {
                   msg = qsTr("Oops! The authentication service seems down. Please try again later")
               initFailure.title = qsTr("Service Error")
           }
diff --git a/pkg/backend/api.go b/pkg/backend/api.go
index 1d44f8a5..4390fef7 100644
--- a/pkg/backend/api.go
+++ b/pkg/backend/api.go
@@ -18,10 +18,12 @@ import (
 func Login(username, password string) {
 	success, err := ctx.bm.DoLogin(username, password)
 	if err != nil {
-		log.Printf("Error on login: %v", err)
-		if err.Error() == "Cannot get token: Error 502" {
+		if err.Error() == "TokenErrTimeout" {
+			ctx.Errors = "bad_auth_timeout"
+		} else if err.Error() == "TokenErrBadStatus 502" {
 			ctx.Errors = "bad_auth_502"
 		} else {
+			log.Println("ERROR: bad login", err)
 			ctx.Errors = "bad_auth"
 		}
 	} else if success {
@@ -29,7 +31,6 @@ func Login(username, password string) {
 		ctx.LoginOk = true
 		ctx.LoginDialog = false
 	} else {
-		// TODO: display login again with an err
 		log.Printf("Failed to login as %s", username)
 		ctx.LoginDialog = true
 		ctx.Errors = "bad_auth"
diff --git a/pkg/vpn/bonafide/auth_sip.go b/pkg/vpn/bonafide/auth_sip.go
index 5da562d5..cc9d967d 100644
--- a/pkg/vpn/bonafide/auth_sip.go
+++ b/pkg/vpn/bonafide/auth_sip.go
@@ -44,15 +44,21 @@ func (a *sipAuthentication) getToken(user, password string) ([]byte, error) {
 	}
 	credJSON, err := formatCredentials(user, password)
 	if err != nil {
-		return nil, fmt.Errorf("Cannot encode credentials: %s", err)
+		log.Println("ERROR: cannot encode credentials.", err)
+		return nil, fmt.Errorf("TokenErrBadCred")
 	}
 	resp, err := a.client.Post(a.authURI, "text/json", strings.NewReader(credJSON))
 	if err != nil {
-		return nil, fmt.Errorf("Error on auth request: %v", err)
+		log.Println("ERROR: failed auth request", err)
+		if os.IsTimeout(err) {
+			return nil, fmt.Errorf("TokenErrTimeout")
+		} else {
+			return nil, fmt.Errorf("TokenErrBadPost")
+		}
 	}
 	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
-		return nil, fmt.Errorf("Cannot get token: Error %d", resp.StatusCode)
+		return nil, fmt.Errorf("TokenErrBadStatus %d", resp.StatusCode)
 	}
 	token, err := ioutil.ReadAll(resp.Body)
 	if err != nil {
diff --git a/pkg/vpn/bonafide/bonafide.go b/pkg/vpn/bonafide/bonafide.go
index 973416a6..4203ba29 100644
--- a/pkg/vpn/bonafide/bonafide.go
+++ b/pkg/vpn/bonafide/bonafide.go
@@ -85,6 +85,7 @@ func New() *Bonafide {
 				RootCAs: certs,
 			},
 		},
+		Timeout: time.Second * 10,
 	}
 	_, tzOffsetSeconds := time.Now().Zone()
 	tzOffsetHours := tzOffsetSeconds / secondsPerHour
@@ -129,6 +130,8 @@ func (b *Bonafide) DoLogin(username, password string) (bool, error) {
 	}
 
 	var err error
+
+	log.Println("Bonafide: getting token...")
 	b.token, err = b.auth.getToken(username, password)
 	if err != nil {
 		return false, err
-- 
GitLab