summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2022-08-24 14:37:05 +0200
committerjwijenbergh <jeroenwijenbergh@protonmail.com>2022-08-24 14:37:05 +0200
commit03f0fc68168de8db1735cc7d1c4d328c4bdd03f2 (patch)
tree53218a27cbfbfccf8fb792835e31f28d36aadbfa
parentfea086334359e715ee388e01c4a4a00f5f379fe4 (diff)
State + Server + Exports: Implement removing a server
-rw-r--r--exports/exports.go33
-rw-r--r--internal/fsm/fsm.go1
-rw-r--r--internal/server/custom.go6
-rw-r--r--internal/server/instituteaccess.go14
-rw-r--r--internal/server/secureinternet.go10
-rw-r--r--state.go45
-rw-r--r--wrappers/python/src/__init__.py3
-rw-r--r--wrappers/python/src/main.py18
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
}
diff --git a/state.go b/state.go
index d0b15d1..53324c4 100644
--- a/state.go
+++ b/state.go
@@ -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