diff options
Diffstat (limited to 'internal/server/list.go')
| -rw-r--r-- | internal/server/list.go | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/internal/server/list.go b/internal/server/list.go new file mode 100644 index 0000000..2660102 --- /dev/null +++ b/internal/server/list.go @@ -0,0 +1,179 @@ +package server + +import ( + "context" + + "github.com/eduvpn/eduvpn-common/internal/server/custom" + "github.com/eduvpn/eduvpn-common/internal/server/institute" + "github.com/eduvpn/eduvpn-common/internal/server/secure" + discotypes "github.com/eduvpn/eduvpn-common/types/discovery" + srvtypes "github.com/eduvpn/eduvpn-common/types/server" + "github.com/go-errors/errors" +) + +type List struct { + CustomServers custom.Servers `json:"custom_servers"` + InstituteServers institute.Servers `json:"institute_servers"` + SecureInternetHomeServer secure.Server `json:"secure_internet_home"` + IsType srvtypes.Type `json:"is_secure_internet"` +} + +// HasSecureInternet returns whether or not we have a secure internet server added +func (l *List) HasSecureInternet() bool { + return len(l.SecureInternetHomeServer.BaseMap) > 0 +} + +func (l *List) HasSecureLocation() bool { + return l.SecureInternetHomeServer.CurrentLocation != "" +} + +func (l *List) Current() (Server, error) { + if l.IsType == srvtypes.TypeUnknown { + return nil, errors.New("no current server") + } + if l.IsType == srvtypes.TypeSecureInternet { + if !l.HasSecureLocation() { + return nil, errors.Errorf("Current server is secure internet but there is no secure internet location: %v", l.IsType) + } + return &l.SecureInternetHomeServer, nil + } + + if l.IsType == srvtypes.TypeCustom { + return l.CustomServers.Current() + } + return l.InstituteServers.Current() +} + +func (l *List) AddCustom(ctx context.Context, url string) (Server, error) { + srv, err := custom.New(ctx, url) + if err != nil { + return nil, err + } + l.CustomServers.Add(srv) + return srv, nil +} + +func (l *List) AddInstituteAccess(ctx context.Context, discoServer *discotypes.Server) (Server, error) { + srv, err := institute.New(ctx, discoServer.BaseURL, discoServer.DisplayName, discoServer.SupportContact) + if err != nil { + return nil, err + } + l.InstituteServers.Add(srv) + return srv, nil +} + +func (l *List) AddSecureInternet( + ctx context.Context, + secureOrg *discotypes.Organization, + secureServer *discotypes.Server, +) (*secure.Server, error) { + // If we have specified an organization ID + // We also need to get an authorization template + err := l.SecureInternetHomeServer.Init(ctx, secureOrg, secureServer) + if err != nil { + return nil, err + } + + l.IsType = srvtypes.TypeSecureInternet + return &l.SecureInternetHomeServer, nil +} + +func (l *List) SecureInternet(identifier string) (*secure.Server, error) { + if l.SecureInternetHomeServer.HomeOrganizationID != identifier { + return nil, errors.Errorf("no secure internet home server with identifier: %s", identifier) + } + return &l.SecureInternetHomeServer, nil +} + +func (l *List) SetSecureInternet(server Server) error { + b, err := server.Base() + if err != nil { + return err + } + + if b.Type != srvtypes.TypeSecureInternet { + return errors.New("not a secure internet server") + } + + // The location should already be configured + // TODO: check for location? + l.IsType = srvtypes.TypeSecureInternet + return nil +} + +func (l *List) RemoveSecureInternet(identifier string) error { + oid := l.SecureInternetHomeServer.HomeOrganizationID + if identifier != oid { + return errors.Errorf("cannot remove secure internet server: identifier: %s, is not equal to the Org ID: %s", identifier, oid) + } + // Empty out the struct + l.SecureInternetHomeServer = secure.Server{} + + // If the current server is secure internet, reset to unknown + if l.IsType == srvtypes.TypeSecureInternet { + l.IsType = srvtypes.TypeUnknown + } + return nil +} + +func (l *List) SetInstituteAccess(srv Server) error { + b, err := srv.Base() + if err != nil { + return err + } + + if b.Type != srvtypes.TypeInstituteAccess { + return errors.Errorf("not an institute access server, URL: %s, type: %v", b.URL, b.Type) + } + + if _, ok := l.InstituteServers.Map[b.URL]; ok { + l.InstituteServers.CurrentURL = b.URL + l.IsType = srvtypes.TypeInstituteAccess + } else { + return errors.Errorf("institute access server with URL: %s, is not yet configured", b.URL) + } + return nil +} + +func (l *List) InstituteAccess(url string) (*institute.Server, error) { + if srv, ok := l.InstituteServers.Map[url]; ok { + return srv, nil + } + return nil, errors.Errorf("no institute access server with URL: %s", url) +} + +func (l *List) RemoveInstituteAccess(url string) error { + // TODO: Reset current to unknown? + return l.InstituteServers.Remove(url) +} + +func (l *List) SetCustom(server Server) error { + b, err := server.Base() + if err != nil { + return err + } + + if b.Type != srvtypes.TypeCustom { + return errors.New("not a custom server") + } + + if _, ok := l.CustomServers.Map[b.URL]; ok { + l.CustomServers.CurrentURL = b.URL + l.IsType = srvtypes.TypeCustom + } else { + return errors.Errorf("this server is not yet added as a custom server: %s", b.URL) + } + return nil +} + +func (l *List) CustomServer(url string) (*institute.Server, error) { + if srv, ok := l.CustomServers.Map[url]; ok { + return srv, nil + } + return nil, errors.Errorf("failed to get institute access server - no custom server with URL '%s'", url) +} + +func (l *List) RemoveCustom(url string) error { + // TODO: Reset current to unknown? + return l.CustomServers.Remove(url) +} |
