From a8e71f7f20a1d5640d08ff637dc209206f536b8d Mon Sep 17 00:00:00 2001 From: jwijenbergh Date: Tue, 20 Dec 2022 17:14:13 +0100 Subject: Client + Exports: Forward tokens for /disconnect --- client/fsm.go | 12 ++++++++++-- exports/exports.go | 9 +++++++-- internal/server/api.go | 6 +++--- internal/server/server.go | 4 ++-- wrappers/python/eduvpn_common/loader.py | 1 + wrappers/python/eduvpn_common/main.py | 5 +++-- 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 -- cgit v1.2.3