summaryrefslogtreecommitdiff
path: root/internal/server/common.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2022-09-07 17:44:07 +0200
committerjwijenbergh <jeroenwijenbergh@protonmail.com>2022-09-07 17:44:07 +0200
commite1bd5ec1c939f5431925ab3bb83352d0a275ebd9 (patch)
tree5272a8592b52757ca288e20a759c244ecb962a3b /internal/server/common.go
parent9be031fda160f7bb8e3294ab6620a1510828bd97 (diff)
Refactor: Remove the usage of the FSM in other internal packages
This removes the FSM from being imported and thus used in other internal packages such as `oauth` or `server`. The benefit is that it becomes much easier now to reason about the FSM as it's only used in the public package. Additionally, we do not have to re-initialize the server and the oauth structure with the FSM pointer.
Diffstat (limited to 'internal/server/common.go')
-rw-r--r--internal/server/common.go155
1 files changed, 51 insertions, 104 deletions
diff --git a/internal/server/common.go b/internal/server/common.go
index c1ce074..801c778 100644
--- a/internal/server/common.go
+++ b/internal/server/common.go
@@ -4,7 +4,6 @@ import (
"fmt"
"time"
- "github.com/jwijenbergh/eduvpn-common/internal/fsm"
"github.com/jwijenbergh/eduvpn-common/internal/oauth"
"github.com/jwijenbergh/eduvpn-common/internal/types"
"github.com/jwijenbergh/eduvpn-common/internal/util"
@@ -22,7 +21,6 @@ type ServerBase struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"expire_time"`
Type string `json:"server_type"`
- FSM *fsm.FSM `json:"-"`
}
type ServerType int8
@@ -214,7 +212,6 @@ func (servers *Servers) GetCurrentServerInfo() (*ServerInfoScreen, error) {
func (servers *Servers) addInstituteAndCustom(
discoServer *types.DiscoveryServer,
isCustom bool,
- fsm *fsm.FSM,
) (Server, error) {
url := discoServer.BaseURL
errorMessage := fmt.Sprintf("failed adding institute access server: %s", url)
@@ -244,7 +241,6 @@ func (servers *Servers) addInstituteAndCustom(
discoServer.DisplayName,
discoServer.Type,
discoServer.SupportContact,
- fsm,
)
if instituteInitErr != nil {
return nil, &types.WrappedErrorMessage{Message: errorMessage, Err: instituteInitErr}
@@ -256,16 +252,14 @@ func (servers *Servers) addInstituteAndCustom(
func (servers *Servers) AddInstituteAccessServer(
instituteServer *types.DiscoveryServer,
- fsm *fsm.FSM,
) (Server, error) {
- return servers.addInstituteAndCustom(instituteServer, false, fsm)
+ return servers.addInstituteAndCustom(instituteServer, false)
}
func (servers *Servers) AddCustomServer(
customServer *types.DiscoveryServer,
- fsm *fsm.FSM,
) (Server, error) {
- return servers.addInstituteAndCustom(customServer, true, fsm)
+ return servers.addInstituteAndCustom(customServer, true)
}
func (servers *Servers) GetSecureLocation() string {
@@ -274,11 +268,10 @@ func (servers *Servers) GetSecureLocation() string {
func (servers *Servers) SetSecureLocation(
chosenLocationServer *types.DiscoveryServer,
- fsm *fsm.FSM,
) error {
errorMessage := "failed to set secure location"
// Make sure to add the current location
- _, addLocationErr := servers.SecureInternetHomeServer.addLocation(chosenLocationServer, fsm)
+ _, addLocationErr := servers.SecureInternetHomeServer.addLocation(chosenLocationServer)
if addLocationErr != nil {
return &types.WrappedErrorMessage{Message: errorMessage, Err: addLocationErr}
@@ -291,12 +284,11 @@ func (servers *Servers) SetSecureLocation(
func (servers *Servers) AddSecureInternet(
secureOrg *types.DiscoveryOrganization,
secureServer *types.DiscoveryServer,
- fsm *fsm.FSM,
) (Server, error) {
errorMessage := "failed adding secure internet server"
// If we have specified an organization ID
// We also need to get an authorization template
- initErr := servers.SecureInternetHomeServer.init(secureOrg, secureServer, fsm)
+ initErr := servers.SecureInternetHomeServer.init(secureOrg, secureServer)
if initErr != nil {
return nil, &types.WrappedErrorMessage{Message: errorMessage, Err: initErr}
@@ -342,24 +334,28 @@ func ShouldRenewButton(server Server) bool {
return true
}
-func Login(server Server) error {
- return server.GetOAuth().Login("org.eduvpn.app.linux", server.GetTemplateAuth())
+func Login(server Server, doAuth func(string) error) error {
+ return server.GetOAuth().Login("org.eduvpn.app.linux", server.GetTemplateAuth(), doAuth)
}
-func EnsureTokens(server Server) error {
- errorMessage := "failed ensuring server tokens"
- if server.GetOAuth().NeedsRelogin() {
- loginErr := Login(server)
+func GetHeaderToken(server Server) string {
+ return server.GetOAuth().Token.Access
+}
- if loginErr != nil {
- return &types.WrappedErrorMessage{Message: errorMessage, Err: loginErr}
- }
+func MarkTokenExpired(server Server) {
+ server.GetOAuth().Token.ExpiredTimestamp = util.GetCurrentTime()
+}
+
+func EnsureTokens(server Server) error {
+ ensureErr := server.GetOAuth().EnsureTokens()
+ if ensureErr != nil {
+ return &types.WrappedErrorMessage{Message: "failed ensuring server tokens", Err: ensureErr}
}
return nil
}
func NeedsRelogin(server Server) bool {
- return server.GetOAuth().NeedsRelogin()
+ return EnsureTokens(server) != nil
}
func CancelOAuth(server Server) {
@@ -466,24 +462,45 @@ func openVPNGetConfig(server Server) (string, string, error) {
return configOpenVPN, "openvpn", nil
}
-func getConfigWithProfile(server Server, forceTCP bool) (string, string, error) {
- errorMessage := "failed getting an OpenVPN/WireGuard configuration with a profile"
- base, baseErr := server.GetBase()
+func HasValidProfile(server Server) (bool, error) {
+ errorMessage := "failed has valid profile check"
+ // Get new profiles using the info call
+ // This does not override the current profile
+ infoErr := APIInfo(server)
+ if infoErr != nil {
+ return false, &types.WrappedErrorMessage{Message: errorMessage, Err: infoErr}
+ }
+
+ base, baseErr := server.GetBase()
if baseErr != nil {
- return "", "", &types.WrappedErrorMessage{Message: errorMessage, Err: baseErr}
+ return false, &types.WrappedErrorMessage{Message: errorMessage, Err: baseErr}
}
- if !base.FSM.HasTransition(fsm.DISCONNECTED) {
- return "", "", &types.WrappedErrorMessage{
- Message: errorMessage,
- Err: fsm.WrongStateTransitionError{
- Got: base.FSM.Current,
- Want: fsm.DISCONNECTED,
- }.CustomError(),
+
+ // If there was a profile chosen and it doesn't exist anymore, reset it
+ if base.Profiles.Current != "" {
+ _, existsProfileErr := getCurrentProfile(server)
+ if existsProfileErr != nil {
+ base.Profiles.Current = ""
}
}
- profile, profileErr := getCurrentProfile(server)
+ // Set the current profile if there is only one profile or profile is already selected
+ if len(base.Profiles.Info.ProfileList) == 1 || base.Profiles.Current != "" {
+ // Set the first profile if none is selected
+ if base.Profiles.Current == "" {
+ base.Profiles.Current = base.Profiles.Info.ProfileList[0].ID
+ }
+ return true, nil
+ }
+
+ return false, nil
+}
+
+func GetConfig(server Server, forceTCP bool) (string, string, error) {
+ errorMessage := "failed getting an OpenVPN/WireGuard configuration"
+
+ profile, profileErr := getCurrentProfile(server)
if profileErr != nil {
return "", "", &types.WrappedErrorMessage{Message: errorMessage, Err: profileErr}
}
@@ -518,76 +535,6 @@ func getConfigWithProfile(server Server, forceTCP bool) (string, string, error)
return config, configType, nil
}
-func askForProfileID(server Server) error {
- errorMessage := "failed asking for a server profile ID"
- base, baseErr := server.GetBase()
-
- if baseErr != nil {
- return &types.WrappedErrorMessage{Message: errorMessage, Err: baseErr}
- }
- if !base.FSM.HasTransition(fsm.ASK_PROFILE) {
- return &types.WrappedErrorMessage{
- Message: errorMessage,
- Err: fsm.WrongStateTransitionError{
- Got: base.FSM.Current,
- Want: fsm.ASK_PROFILE,
- }.CustomError(),
- }
- }
- base.FSM.GoTransitionWithData(fsm.ASK_PROFILE, &base.Profiles, false)
- return nil
-}
-
-func GetConfig(server Server, forceTCP bool) (string, string, error) {
- errorMessage := "failed getting an OpenVPN/WireGuard configuration"
- base, baseErr := server.GetBase()
-
- if baseErr != nil {
- return "", "", &types.WrappedErrorMessage{Message: errorMessage, Err: baseErr}
- }
- if !base.FSM.InState(fsm.REQUEST_CONFIG) {
- return "", "", &types.WrappedErrorMessage{
- Message: errorMessage,
- Err: fsm.WrongStateError{
- Got: base.FSM.Current,
- Want: fsm.REQUEST_CONFIG,
- }.CustomError(),
- }
- }
-
- // Get new profiles using the info call
- // This does not override the current profile
- infoErr := APIInfo(server)
- if infoErr != nil {
- return "", "", &types.WrappedErrorMessage{Message: errorMessage, Err: infoErr}
- }
-
- // If there was a profile chosen and it doesn't exist anymore, reset it
- if base.Profiles.Current != "" {
- _, existsProfileErr := getCurrentProfile(server)
- if existsProfileErr != nil {
- base.Profiles.Current = ""
- }
- }
-
- // Set the current profile if there is only one profile or profile is already selected
- if len(base.Profiles.Info.ProfileList) == 1 || base.Profiles.Current != "" {
- // Set the first profile if none is selected
- if base.Profiles.Current == "" {
- base.Profiles.Current = base.Profiles.Info.ProfileList[0].ID
- }
- return getConfigWithProfile(server, forceTCP)
- }
-
- profileErr := askForProfileID(server)
-
- if profileErr != nil {
- return "", "", &types.WrappedErrorMessage{Message: errorMessage, Err: profileErr}
- }
-
- return getConfigWithProfile(server, forceTCP)
-}
-
func Disconnect(server Server) {
APIDisconnect(server)
}