summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/fsm.go12
-rw-r--r--exports/exports.go9
-rw-r--r--internal/server/api.go6
-rw-r--r--internal/server/server.go4
-rw-r--r--wrappers/python/eduvpn_common/loader.py1
-rw-r--r--wrappers/python/eduvpn_common/main.py5
6 files changed, 26 insertions, 11 deletions
diff --git a/client/fsm.go b/client/fsm.go
index c156fba..88f2cf9 100644
--- a/client/fsm.go
+++ b/client/fsm.go
@@ -2,6 +2,7 @@ package client
import (
"github.com/eduvpn/eduvpn-common/internal/fsm"
+ "github.com/eduvpn/eduvpn-common/internal/oauth"
"github.com/eduvpn/eduvpn-common/internal/server"
"github.com/go-errors/errors"
)
@@ -294,7 +295,7 @@ func (c *Client) SetDisconnecting() error {
// This indicates that the VPN is currently disconnected from the server.
// This also sends the /disconnect API call to the server.
// Returns an error if this state transition is not possible.
-func (c *Client) SetDisconnected(cleanup bool) error {
+func (c *Client) SetDisconnected(cleanup bool, ct oauth.Token) error {
if c.InFSMState(StateDisconnected) {
// already disconnected, show no error
c.Logger.Warningf("Already disconnected")
@@ -312,8 +313,15 @@ func (c *Client) SetDisconnected(cleanup bool) error {
}
if cleanup {
+ // If we need to relogin, update tokens
+ if server.NeedsRelogin(srv) {
+ server.UpdateTokens(srv, ct)
+ }
// Do the /disconnect API call and go to disconnected after...
- server.Disconnect(srv)
+ err := server.Disconnect(srv)
+ if err != nil {
+ c.Logger.Warningf("Error disconnecting %v", err)
+ }
}
c.FSM.GoTransitionWithData(StateDisconnected, srv)
diff --git a/exports/exports.go b/exports/exports.go
index 904fbec..db353c9 100644
--- a/exports/exports.go
+++ b/exports/exports.go
@@ -415,13 +415,18 @@ func SetSearchServer(name *C.char) *C.error {
}
//export SetDisconnected
-func SetDisconnected(name *C.char, cleanup C.int) *C.error {
+func SetDisconnected(name *C.char, cleanup C.int, prevTokens C.token) *C.error {
nameStr := C.GoString(name)
state, stateErr := GetVPNState(nameStr)
if stateErr != nil {
return getError(stateErr)
}
- setDisconnectedErr := state.SetDisconnected(int(cleanup) == 1)
+ t := oauth.Token{
+ Access: C.GoString(prevTokens.access),
+ Refresh: C.GoString(prevTokens.refresh),
+ ExpiredTimestamp: time.Unix(int64(prevTokens.expired), 0),
+ }
+ setDisconnectedErr := state.SetDisconnected(int(cleanup) == 1, t)
return getError(setDisconnectedErr)
}
diff --git a/internal/server/api.go b/internal/server/api.go
index 145d24e..2ce3db5 100644
--- a/internal/server/api.go
+++ b/internal/server/api.go
@@ -194,7 +194,7 @@ func APIConnectOpenVPN(srv Server, profileID string, preferTCP bool) (string, ti
}
// APIDisconnect disconnects from the API.
-// This needs no further return value as it's best effort.
-func APIDisconnect(server Server) {
- _, _, _ = apiAuthorized(server, http.MethodPost, "/disconnect", nil)
+func APIDisconnect(server Server) error {
+ _, _, err := apiAuthorized(server, http.MethodPost, "/disconnect", nil)
+ return err
}
diff --git a/internal/server/server.go b/internal/server/server.go
index 1585264..7503219 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -299,6 +299,6 @@ func Config(server Server, wireguardSupport bool, preferTCP bool) (*ConfigData,
}
}
-func Disconnect(server Server) {
- APIDisconnect(server)
+func Disconnect(server Server) error {
+ return APIDisconnect(server)
}
diff --git a/wrappers/python/eduvpn_common/loader.py b/wrappers/python/eduvpn_common/loader.py
index f0f31d6..988d827 100644
--- a/wrappers/python/eduvpn_common/loader.py
+++ b/wrappers/python/eduvpn_common/loader.py
@@ -143,6 +143,7 @@ def initialize_functions(lib: CDLL) -> None:
lib.SetDisconnected.argtypes, lib.SetDisconnected.restype = [
c_char_p,
c_int,
+ cToken,
], c_void_p
lib.SetDisconnecting.argtypes, lib.SetDisconnecting.restype = [c_char_p], c_void_p
lib.SetProfileID.argtypes, lib.SetProfileID.restype = [c_char_p, c_char_p], c_void_p
diff --git a/wrappers/python/eduvpn_common/main.py b/wrappers/python/eduvpn_common/main.py
index 07e3b6d..4204239 100644
--- a/wrappers/python/eduvpn_common/main.py
+++ b/wrappers/python/eduvpn_common/main.py
@@ -332,14 +332,15 @@ class EduVPN(object):
if connecting_err:
raise connecting_err
- def set_disconnected(self, cleanup: bool = True) -> None:
+ def set_disconnected(self, cleanup: bool = True, tokens: Optional[Token] = None) -> None:
"""Set the FSM to disconnected
:param cleanup: bool: (Default value = True): Whether or not to call /disconnect to the server. This invalidates the OpenVPN/WireGuard configuration
+ :param tokens: Optional[Token] (Default value = None): The OAuth tokens if available
:raises WrappedError: An error by the Go library
"""
- disconnect_err = self.go_function(self.lib.SetDisconnected, cleanup)
+ disconnect_err = self.go_function(self.lib.SetDisconnected, cleanup, encode_tokens(tokens))
if disconnect_err:
raise disconnect_err