From 900b5acf1445eab22fc2833828abd5649eb9f12a Mon Sep 17 00:00:00 2001 From: jwijenbergh Date: Tue, 6 Feb 2024 14:23:26 +0100 Subject: Exports + Python: New API for Token Getter and Setter First argument is the server id and type instead of a single argument with JSON --- exports/exports.go | 36 ++++++++++++---------------------- wrappers/python/eduvpn_common/main.py | 8 ++++---- wrappers/python/eduvpn_common/types.py | 4 ++-- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/exports/exports.go b/exports/exports.go index 919b9c8..58b12b4 100644 --- a/exports/exports.go +++ b/exports/exports.go @@ -21,8 +21,8 @@ typedef long long int (*ReadRxBytes)(); typedef int (*StateCB)(int oldstate, int newstate, void* data); -typedef void (*TokenGetter)(const char* server, char* out, size_t len); -typedef void (*TokenSetter)(const char* server, const char* tokens); +typedef void (*TokenGetter)(const char* server_id, int server_type, char* out, size_t len); +typedef void (*TokenSetter)(const char* server_id, int server_type, const char* tokens); static long long int get_read_rx_bytes(ReadRxBytes read) { @@ -32,13 +32,13 @@ static int call_callback(StateCB callback, int oldstate, int newstate, void* dat { return callback(oldstate, newstate, data); } -static void call_token_getter(TokenGetter getter, const char* server, char* out, size_t len) +static void call_token_getter(TokenGetter getter, const char* server_id, int server_type, char* out, size_t len) { - getter(server, out, len); + getter(server_id, server_type, out, len); } -static void call_token_setter(TokenSetter setter, const char* server, const char* tokens) +static void call_token_setter(TokenSetter setter, const char* server_id, int server_type, const char* tokens) { - setter(server, tokens); + setter(server_id, server_type, tokens); } */ import "C" @@ -983,36 +983,26 @@ func SetTokenHandler(getter C.TokenGetter, setter C.TokenSetter) *C.char { if stateErr != nil { return getCError(stateErr) } - state.TokenSetter = func(c srvtypes.Current, t srvtypes.Tokens) { - cJSON, err := getReturnData(c) - if err != nil { - log.Logger.Warningf("failed to get current server for setting tokens in exports: %v", err) - return - } + state.TokenSetter = func(sid string, stype srvtypes.Type, t srvtypes.Tokens) { tJSON, err := getReturnData(t) if err != nil { log.Logger.Warningf("failed to get tokens for setting tokens in exports: %v", err) return } - c1 := C.CString(cJSON) + c1 := C.CString(sid) c2 := C.CString(tJSON) - C.call_token_setter(setter, c1, c2) + C.call_token_setter(setter, c1, C.int(stype), c2) FreeString(c1) FreeString(c2) } - state.TokenGetter = func(c srvtypes.Current) *srvtypes.Tokens { - cJSON, err := getReturnData(c) - if err != nil { - log.Logger.Warningf("failed to get current server for getting tokens in exports: %v", err) - return nil - } - c1 := C.CString(cJSON) + state.TokenGetter = func(sid string, stype srvtypes.Type) *srvtypes.Tokens { // create an output buffer with size 2048 // In my testing tokens seem to be ~1033 bytes marshalled as JSON d := make([]byte, 2048) - C.call_token_getter(getter, c1, (*C.char)(unsafe.Pointer(&d[0])), C.size_t(len(d))) + c1 := C.CString(sid) + C.call_token_getter(getter, c1, C.int(stype), (*C.char)(unsafe.Pointer(&d[0])), C.size_t(len(d))) FreeString(c1) // get null pointer index as unmarshalling wants it without @@ -1029,7 +1019,7 @@ func SetTokenHandler(getter C.TokenGetter, setter C.TokenSetter) *C.char { } var gotT srvtypes.Tokens - err = json.Unmarshal(d[:null], &gotT) + err := json.Unmarshal(d[:null], &gotT) if err != nil { log.Logger.Warningf("failed to get JSON data for getting tokens in exports: %v", err) return nil diff --git a/wrappers/python/eduvpn_common/main.py b/wrappers/python/eduvpn_common/main.py index 2c5165f..798c9a4 100644 --- a/wrappers/python/eduvpn_common/main.py +++ b/wrappers/python/eduvpn_common/main.py @@ -344,23 +344,23 @@ global_object: Optional[EduVPN] = None @TokenSetter -def token_setter(server: ctypes.c_char_p, tokens: ctypes.c_char_p): +def token_setter(server_id: ctypes.c_char_p, server_type: ctypes.c_int, tokens: ctypes.c_char_p): global global_object if global_object is None: return if global_object.token_setter is None: return 0 - global_object.token_setter(server.decode(), tokens.decode()) + global_object.token_setter(server_id.decode(), server_type, tokens.decode()) @TokenGetter -def token_getter(server: ctypes.c_char_p, buf: ctypes.c_char_p, size: ctypes.c_size_t): +def token_getter(server_id: ctypes.c_char_p, server_type: ctypes.c_int, buf: ctypes.c_char_p, size: ctypes.c_size_t): global global_object if global_object is None: return if global_object.token_getter is None: return - got = global_object.token_getter(server.decode()) + got = global_object.token_getter(server_id.decode(), server_type) if got is None: return diff --git a/wrappers/python/eduvpn_common/types.py b/wrappers/python/eduvpn_common/types.py index f1be42c..e2498b3 100644 --- a/wrappers/python/eduvpn_common/types.py +++ b/wrappers/python/eduvpn_common/types.py @@ -35,8 +35,8 @@ class BoolError(Structure): # The type for a Go state change callback VPNStateChange = CFUNCTYPE(c_int, c_int, c_int, c_char_p) ReadRxBytes = CFUNCTYPE(c_ulonglong) -TokenGetter = CFUNCTYPE(c_void_p, c_char_p, POINTER(c_char), c_size_t) -TokenSetter = CFUNCTYPE(c_void_p, c_char_p, c_char_p) +TokenGetter = CFUNCTYPE(c_void_p, c_char_p, c_int, POINTER(c_char), c_size_t) +TokenSetter = CFUNCTYPE(c_void_p, c_char_p, c_int, c_char_p) def encode_args(args: List[Any], types: List[Any]) -> Iterator[Any]: -- cgit v1.2.3