diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-08-24 14:37:05 +0200 |
|---|---|---|
| committer | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-08-24 14:37:05 +0200 |
| commit | 03f0fc68168de8db1735cc7d1c4d328c4bdd03f2 (patch) | |
| tree | 53218a27cbfbfccf8fb792835e31f28d36aadbfa | |
| parent | fea086334359e715ee388e01c4a4a00f5f379fe4 (diff) | |
State + Server + Exports: Implement removing a server
| -rw-r--r-- | exports/exports.go | 33 | ||||
| -rw-r--r-- | internal/fsm/fsm.go | 1 | ||||
| -rw-r--r-- | internal/server/custom.go | 6 | ||||
| -rw-r--r-- | internal/server/instituteaccess.go | 14 | ||||
| -rw-r--r-- | internal/server/secureinternet.go | 10 | ||||
| -rw-r--r-- | state.go | 45 | ||||
| -rw-r--r-- | wrappers/python/src/__init__.py | 3 | ||||
| -rw-r--r-- | wrappers/python/src/main.py | 18 |
8 files changed, 130 insertions, 0 deletions
diff --git a/exports/exports.go b/exports/exports.go index a5169d4..e2b02a1 100644 --- a/exports/exports.go +++ b/exports/exports.go @@ -145,6 +145,39 @@ func getConfigJSON(config string, configType string) *C.char { return C.CString(string(jsonBytes)) } +//export RemoveSecureInternet +func RemoveSecureInternet(name *C.char) (*C.char) { + nameStr := C.GoString(name) + state, stateErr := GetVPNState(nameStr) + if stateErr != nil { + return C.CString(ErrorToString(stateErr)) + } + removeErr := state.RemoveSecureInternet() + return C.CString(ErrorToString(removeErr)) +} + +//export RemoveInstituteAccess +func RemoveInstituteAccess(name *C.char, url *C.char) (*C.char) { + nameStr := C.GoString(name) + state, stateErr := GetVPNState(nameStr) + if stateErr != nil { + return C.CString(ErrorToString(stateErr)) + } + removeErr := state.RemoveInstituteAccess(C.GoString(url)) + return C.CString(ErrorToString(removeErr)) +} + +//export RemoveCustomServer +func RemoveCustomServer(name *C.char, url *C.char) (*C.char) { + nameStr := C.GoString(name) + state, stateErr := GetVPNState(nameStr) + if stateErr != nil { + return C.CString(ErrorToString(stateErr)) + } + removeErr := state.RemoveCustomServer(C.GoString(url)) + return C.CString(ErrorToString(removeErr)) +} + //export GetConfigSecureInternet func GetConfigSecureInternet(name *C.char, orgID *C.char, forceTCP C.int) (*C.char, *C.char) { nameStr := C.GoString(name) diff --git a/internal/fsm/fsm.go b/internal/fsm/fsm.go index 0b32f84..ec19899 100644 --- a/internal/fsm/fsm.go +++ b/internal/fsm/fsm.go @@ -144,6 +144,7 @@ func (fsm *FSM) Init( DEREGISTERED: FSMState{Transitions: []FSMTransition{{NO_SERVER, "Client registers"}}}, NO_SERVER: FSMState{ Transitions: []FSMTransition{ + {NO_SERVER, "Reload list"}, {CHOSEN_SERVER, "User chooses a server"}, {SEARCH_SERVER, "The user is trying to choose a Server in the UI"}, {CONNECTED, "The user is already connected"}, diff --git a/internal/server/custom.go b/internal/server/custom.go new file mode 100644 index 0000000..c757f76 --- /dev/null +++ b/internal/server/custom.go @@ -0,0 +1,6 @@ +package server + +func (servers *Servers) RemoveCustomServer(url string) { + servers.CustomServers.Remove(url) +} + diff --git a/internal/server/instituteaccess.go b/internal/server/instituteaccess.go index 6ac248d..e948480 100644 --- a/internal/server/instituteaccess.go +++ b/internal/server/instituteaccess.go @@ -22,6 +22,20 @@ type InstituteAccessServers struct { CurrentURL string `json:"current_url"` } +func (servers *Servers) RemoveInstituteAccess(url string) { + servers.InstituteServers.Remove(url) +} + +func (servers *InstituteAccessServers) Remove(url string) { + // Reset the current url + if servers.CurrentURL == url { + servers.CurrentURL = "" + } + + // Delete the url from the map + delete(servers.Map, url) +} + // For an institute, we can simply get the OAuth func (institute *InstituteAccessServer) GetOAuth() *oauth.OAuth { return &institute.OAuth diff --git a/internal/server/secureinternet.go b/internal/server/secureinternet.go index 3498bcc..40c429b 100644 --- a/internal/server/secureinternet.go +++ b/internal/server/secureinternet.go @@ -24,6 +24,16 @@ type SecureInternetHomeServer struct { CurrentLocation string `json:"current_location"` } +func (servers *Servers) RemoveSecureInternet() { + // Empty out the struct + servers.SecureInternetHomeServer = SecureInternetHomeServer{} + + // If the current server is secure internet, default to custom server + if servers.IsType == SecureInternetServerType { + servers.IsType = CustomServerType + } +} + func (secure *SecureInternetHomeServer) GetOAuth() *oauth.OAuth { return &secure.OAuth } @@ -212,6 +212,51 @@ func (state *VPNState) addSecureInternetHomeServer(orgID string) (server.Server, return server, nil } +func (state *VPNState) RemoveSecureInternet() error { + if state.InFSMState(fsm.DEREGISTERED) { + return &types.WrappedErrorMessage{ + Message: "failed to remove Secure Internet", + Err: fsm.DeregisteredError{}.CustomError(), + } + } + // No error because we can only have one secure internet server and if there are no secure internet servers, this is a NO-OP + state.Servers.RemoveSecureInternet() + state.FSM.GoTransitionWithData(fsm.NO_SERVER, state.GetSavedServers(), false) + // Save the config + state.Config.Save(&state) + return nil +} + +func (state *VPNState) RemoveInstituteAccess(url string) error { + if state.InFSMState(fsm.DEREGISTERED) { + return &types.WrappedErrorMessage{ + Message: "failed to remove Institute Access", + Err: fsm.DeregisteredError{}.CustomError(), + } + } + // No error because this is a NO-OP if the server doesn't exist + state.Servers.RemoveInstituteAccess(url) + state.FSM.GoTransitionWithData(fsm.NO_SERVER, state.GetSavedServers(), false) + // Save the config + state.Config.Save(&state) + return nil +} + +func (state *VPNState) RemoveCustomServer(url string) error { + if state.InFSMState(fsm.DEREGISTERED) { + return &types.WrappedErrorMessage{ + Message: "failed to remove Custom Server", + Err: fsm.DeregisteredError{}.CustomError(), + } + } + // No error because this is a NO-OP if the server doesn't exist + state.Servers.RemoveCustomServer(url) + state.FSM.GoTransitionWithData(fsm.NO_SERVER, state.GetSavedServers(), false) + // Save the config + state.Config.Save(&state) + return nil +} + func (state *VPNState) GetConfigSecureInternet( orgID string, forceTCP bool, diff --git a/wrappers/python/src/__init__.py b/wrappers/python/src/__init__.py index eba497c..bf97bce 100644 --- a/wrappers/python/src/__init__.py +++ b/wrappers/python/src/__init__.py @@ -50,6 +50,9 @@ VPNStateChange = CFUNCTYPE(None, c_char_p, c_int, c_int, c_char_p) # Exposed functions # We have to use c_void_p instead of c_char_p to free it properly # See https://stackoverflow.com/questions/13445568/python-ctypes-how-to-free-memory-getting-invalid-pointer-error +lib.RemoveSecureInternet.argtypes, lib.RemoveSecureInternet.restype = [c_char_p], c_void_p +lib.RemoveInstituteAccess.argtypes, lib.RemoveInstituteAccess.restype = [c_char_p, c_char_p], c_void_p +lib.RemoveCustomServer.argtypes, lib.RemoveCustomServer.restype = [c_char_p, c_char_p], c_void_p lib.GetConfigSecureInternet.argtypes, lib.GetConfigSecureInternet.restype = [ c_char_p, c_char_p, diff --git a/wrappers/python/src/main.py b/wrappers/python/src/main.py index 7ebeae6..b37842f 100644 --- a/wrappers/python/src/main.py +++ b/wrappers/python/src/main.py @@ -98,6 +98,24 @@ class EduVPN(object): return organizations + def remove_secure_internet(self): + remove_err = self.go_function(lib.RemoveSecureInternet) + + if remove_err: + raise Exception(remove_err) + + def remove_institute_access(self, url: str): + remove_err = self.go_function(lib.RemoveInstituteAccess, url) + + if remove_err: + raise Exception(remove_err) + + def remove_custom_server(self, url: str): + remove_err = self.go_function(lib.RemoveCustomServer, url) + + if remove_err: + raise Exception(remove_err) + def get_config(self, url: str, func: callable, force_tcp: bool = False): # Because it could be the case that a profile callback is started, store a threading event # In the constructor, we have defined a wait event for Ask_Profile, this waits for this event to be set |
