summaryrefslogtreecommitdiff
path: root/internal/server/secure/secure.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2023-04-12 22:52:49 +0200
committerJeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com>2023-09-25 09:43:37 +0200
commita23c3e61c5d89ef67973891b5b3a176c06e1b174 (patch)
treef1eed03b047f8affd3d5123fa5c9e868ac7d8bec /internal/server/secure/secure.go
parentee95eb45708e1fa766a63866d26d05d13f23e8c9 (diff)
Refactor: Split internal server into multiple packages
- Pass contexts - Have separate packages for e.g. custom, institute and secure - internet servers, profiles.... - Return types from the public ./types package with a Public() method
Diffstat (limited to 'internal/server/secure/secure.go')
-rw-r--r--internal/server/secure/secure.go148
1 files changed, 148 insertions, 0 deletions
diff --git a/internal/server/secure/secure.go b/internal/server/secure/secure.go
new file mode 100644
index 0000000..6fed010
--- /dev/null
+++ b/internal/server/secure/secure.go
@@ -0,0 +1,148 @@
+package secure
+
+import (
+ "context"
+ "github.com/eduvpn/eduvpn-common/internal/oauth"
+ "github.com/eduvpn/eduvpn-common/internal/server/api"
+ "github.com/eduvpn/eduvpn-common/internal/server/base"
+ "github.com/eduvpn/eduvpn-common/internal/util"
+ discotypes "github.com/eduvpn/eduvpn-common/types/discovery"
+ "github.com/eduvpn/eduvpn-common/types/server"
+ "github.com/go-errors/errors"
+)
+
+// Server secure internet server which has its own OAuth tokens
+// It specifies the current location url it is connected to.
+type Server struct {
+ Auth oauth.OAuth `json:"oauth"`
+ DisplayName map[string]string `json:"display_name"`
+
+ // The home server has a list of info for each configured server location
+ BaseMap map[string]*base.Base `json:"base_map"`
+
+ // We have the authorization URL template, the home organization ID and the current location
+ AuthorizationTemplate string `json:"authorization_template"`
+ HomeOrganizationID string `json:"home_organization_id"`
+ CurrentLocation string `json:"current_location"`
+}
+
+func (s *Server) TemplateAuth() func(string) string {
+ return func(authURL string) string {
+ return util.ReplaceWAYF(s.AuthorizationTemplate, authURL, s.HomeOrganizationID)
+ }
+}
+
+func (s *Server) Base() (*base.Base, error) {
+ if s.BaseMap == nil {
+ return nil, errors.Errorf("secure internet map not found")
+ }
+
+ b, ok := s.BaseMap[s.CurrentLocation]
+ if !ok {
+ return nil, errors.Errorf("secure internet base with location '%s' not found", s.CurrentLocation)
+ }
+ return b, nil
+}
+
+func (s *Server) OAuth() *oauth.OAuth {
+ return &s.Auth
+}
+
+func (s *Server) NeedsLocation() bool {
+ if s.CurrentLocation == "" {
+ return true
+ }
+ if len(s.BaseMap) == 0 {
+ return true
+ }
+ return false
+}
+
+func (s *Server) addLocation(ctx context.Context, locSrv *discotypes.Server) (*base.Base, error) {
+ // Initialize the base map if it is non-nil
+ if s.BaseMap == nil {
+ s.BaseMap = make(map[string]*base.Base)
+ }
+
+ // Add the location to the base map
+ b, ok := s.BaseMap[locSrv.CountryCode]
+ if !ok || b == nil {
+ // Create the base to be added to the map
+ b = &base.Base{}
+ b.URL = locSrv.BaseURL
+ b.DisplayName = s.DisplayName
+ b.SupportContact = locSrv.SupportContact
+ b.Type = server.TypeSecureInternet
+ if err := api.Endpoints(ctx, b); err != nil {
+ return nil, err
+ }
+ }
+
+ // Ensure it is in the map
+ s.BaseMap[locSrv.CountryCode] = b
+ return b, nil
+}
+
+func (s *Server) Location(ctx context.Context, locSrv *discotypes.Server) error {
+ if _, err := s.addLocation(ctx, locSrv); err != nil {
+ return err
+ }
+ s.CurrentLocation = locSrv.CountryCode
+ return nil
+}
+
+// Initializes the home server and adds its own location.
+func (s *Server) Init(
+ ctx context.Context,
+ homeOrg *discotypes.Organization, homeLoc *discotypes.Server,
+) error {
+ if s.HomeOrganizationID != homeOrg.OrgID {
+ // New home organisation, clear everything
+ *s = Server{}
+ }
+
+ // Make sure to set the organization ID
+ s.HomeOrganizationID = homeOrg.OrgID
+ s.DisplayName = homeOrg.DisplayName
+
+ // Make sure to set the authorization URL template
+ s.AuthorizationTemplate = homeLoc.AuthenticationURLTemplate
+
+ b, err := s.addLocation(ctx, homeLoc)
+ if err != nil {
+ return err
+ }
+
+ // set the home location as the current
+ err = s.Location(ctx, homeLoc)
+ if err != nil {
+ return err
+ }
+
+ // Set the current location to the home location if there is none
+ if s.CurrentLocation == "" {
+ s.CurrentLocation = homeLoc.CountryCode
+ }
+
+ // Make sure oauth contains our endpoints
+ s.Auth.Init(b.URL, b.Endpoints.API.V3.Authorization, b.Endpoints.API.V3.Token)
+ return nil
+}
+
+func (s *Server) Public() (interface{}, error) {
+ b, err := s.Base()
+ var p server.Profiles
+ dn := s.DisplayName
+ if err == nil {
+ dn = b.DisplayName
+ p = b.Profiles.Public()
+ }
+ return &server.SecureInternet{
+ Server: server.Server{
+ DisplayName: dn,
+ Identifier: s.HomeOrganizationID,
+ Profiles: p,
+ },
+ CountryCode: s.CurrentLocation,
+ }, nil
+}