summaryrefslogtreecommitdiff
path: root/internal/server/servers.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/server/servers.go')
-rw-r--r--internal/server/servers.go113
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)
+}