diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2024-02-06 16:27:45 +0100 |
|---|---|---|
| committer | Jeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com> | 2024-02-19 14:15:07 +0100 |
| commit | a84050a5e93f5fb9f5bbb79ca21b37e8359cf289 (patch) | |
| tree | ecdf0cea81b0bd6a3cf669f2b31c45a222d1c5f5 /internal/server/servers.go | |
| parent | 3152078aec8334357a61171838f664eb03299211 (diff) | |
Server: Refactor internal server package to use new state file
This completely rewrites the internal server package. Some advantages:
- Caches less
- Uses a callback interface so that the client package does not get so
convoluted
- Introduce a new API package that only deals with the server API and
uses github.com/jwijenbergh/eduoauth-go
Diffstat (limited to 'internal/server/servers.go')
| -rw-r--r-- | internal/server/servers.go | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/internal/server/servers.go b/internal/server/servers.go new file mode 100644 index 0000000..fe2550c --- /dev/null +++ b/internal/server/servers.go @@ -0,0 +1,113 @@ +package server + +import ( + "context" + "errors" + "fmt" + + "github.com/eduvpn/eduvpn-common/internal/api" + "github.com/eduvpn/eduvpn-common/internal/config/v2" + "github.com/eduvpn/eduvpn-common/internal/discovery" + srvtypes "github.com/eduvpn/eduvpn-common/types/server" + "github.com/jwijenbergh/eduoauth-go" +) + +type Callbacks interface { + api.Callbacks + GettingConfig() error + InvalidProfile(context.Context, *Server) (string, error) +} + +type Servers struct { + clientID string + cb Callbacks + WGSupport bool + config *v2.V2 +} + +func (s *Servers) Remove(identifier string, t srvtypes.Type) error { + return s.config.RemoveServer(identifier, t) +} + +func NewServers(name string, cb Callbacks, wgSupport bool, cfg *v2.V2) Servers { + return Servers{ + clientID: name, + cb: cb, + WGSupport: wgSupport, + config: cfg, + } +} + +type CurrentServer struct { + *v2.Server + T v2.ServerType + srvs *Servers +} + +func (cs *CurrentServer) ServerWithCallbacks(ctx context.Context, disco *discovery.Discovery, tokens *eduoauth.Token, disableAuth bool) (*Server, error) { + switch cs.T.T { + case srvtypes.TypeInstituteAccess: + return cs.srvs.GetInstitute(ctx, cs.T.ID, disco, tokens, disableAuth) + case srvtypes.TypeSecureInternet: + return cs.srvs.GetSecure(ctx, cs.T.ID, disco, tokens, disableAuth) + case srvtypes.TypeCustom: + return cs.srvs.GetCustom(ctx, cs.T.ID, tokens, disableAuth) + default: + return nil, fmt.Errorf("no such server type: %d", cs.T.T) + } +} + +func (s *Servers) GetServer(id string, t srvtypes.Type) (*v2.Server, error) { + if s.config == nil { + return nil, errors.New("no configuration available") + } + return s.config.GetServer(id, t) +} + +func (s *Servers) CurrentServer() (*CurrentServer, error) { + curr, k, err := s.config.CurrentServer() + if err != nil { + return nil, err + } + return &CurrentServer{ + Server: curr, + T: *k, + srvs: s, + }, nil +} + +func (s *Servers) PublicCurrent(disco *discovery.Discovery) (*srvtypes.Current, error) { + return s.config.PublicCurrent(disco) +} + +func (s *Servers) ConnectWithCallbacks(ctx context.Context, srv *Server, pTCP bool) (*srvtypes.Configuration, error) { + err := srv.SetCurrent() + if err != nil { + return nil, err + } + err = s.cb.GettingConfig() + if err != nil { + return nil, err + } + cfg, err := srv.connect(ctx, s.WGSupport, pTCP) + if err == nil { + return cfg, nil + } + if !errors.Is(err, ErrInvalidProfile) { + return cfg, err + } + // Get a new profile from the callback + pr, err := s.cb.InvalidProfile(ctx, srv) + if err != nil { + return cfg, err + } + err = srv.SetProfileID(pr) + if err != nil { + return nil, err + } + err = s.cb.GettingConfig() + if err != nil { + return nil, err + } + return srv.connect(ctx, s.WGSupport, pTCP) +} |
