summaryrefslogtreecommitdiff
path: root/internal/server/secureinternet.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2024-02-06 16:27:45 +0100
committerJeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com>2024-02-19 14:15:07 +0100
commita84050a5e93f5fb9f5bbb79ca21b37e8359cf289 (patch)
treeecdf0cea81b0bd6a3cf669f2b31c45a222d1c5f5 /internal/server/secureinternet.go
parent3152078aec8334357a61171838f664eb03299211 (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/secureinternet.go')
-rw-r--r--internal/server/secureinternet.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/internal/server/secureinternet.go b/internal/server/secureinternet.go
new file mode 100644
index 0000000..19e75a1
--- /dev/null
+++ b/internal/server/secureinternet.go
@@ -0,0 +1,91 @@
+package server
+
+import (
+ "context"
+ "errors"
+ "time"
+
+ "github.com/eduvpn/eduvpn-common/internal/api"
+ "github.com/eduvpn/eduvpn-common/internal/config/v2"
+ "github.com/eduvpn/eduvpn-common/internal/discovery"
+ "github.com/eduvpn/eduvpn-common/internal/util"
+ "github.com/eduvpn/eduvpn-common/types/server"
+ "github.com/jwijenbergh/eduoauth-go"
+)
+
+func (s *Servers) AddSecure(ctx context.Context, disco *discovery.Discovery, orgID string, na bool) (*Server, error) {
+ if s.config.HasSecureInternet() {
+ return nil, errors.New("a secure internet server already exists")
+ }
+ dorg, dsrv, err := disco.SecureHomeArgs(orgID)
+ if err != nil {
+ // We mark the organizations as expired because we got an error
+ // Note that in the docs it states that it only should happen when the Org ID doesn't exist
+ // However, this is nice as well because it also catches the error where the SecureInternetHome server is not found
+ disco.MarkOrganizationsExpired()
+ return nil, err
+ }
+
+ sd := api.ServerData{
+ ID: orgID,
+ Type: server.TypeSecureInternet,
+ BaseWK: dsrv.BaseURL,
+ BaseAuthWK: dsrv.BaseURL,
+ ProcessAuth: func(url string) string {
+ return util.ReplaceWAYF(dsrv.AuthenticationURLTemplate, url, dorg.OrgID)
+ },
+ }
+
+ var a *api.API
+ if !na {
+ // Authorize by creating the API object
+ a, err = api.NewAPI(ctx, s.clientID, sd, s.cb, nil)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ err = s.config.AddServer(orgID, server.TypeSecureInternet, v2.Server{CountryCode: dsrv.CountryCode, LastAuthorizeTime: time.Now()})
+ if err != nil {
+ return nil, err
+ }
+
+ sec := s.NewServer(orgID, server.TypeSecureInternet, a)
+ return &sec, nil
+}
+
+func (s *Servers) GetSecure(ctx context.Context, orgID string, disco *discovery.Discovery, tok *eduoauth.Token, disableAuth bool) (*Server, error) {
+ srv, err := s.config.GetServer(orgID, server.TypeSecureInternet)
+ if err != nil {
+ return nil, err
+ }
+
+ dorg, dhome, err := disco.SecureHomeArgs(orgID)
+ if err != nil {
+ return nil, err
+ }
+
+ dloc, err := disco.ServerByCountryCode(srv.CountryCode)
+ if err != nil {
+ return nil, err
+ }
+
+ sd := api.ServerData{
+ ID: dorg.OrgID,
+ Type: server.TypeSecureInternet,
+ BaseWK: dloc.BaseURL,
+ BaseAuthWK: dhome.BaseURL,
+ ProcessAuth: func(url string) string {
+ return util.ReplaceWAYF(dhome.AuthenticationURLTemplate, url, dorg.OrgID)
+ },
+ DisableAuthorize: disableAuth,
+ }
+
+ a, err := api.NewAPI(ctx, s.clientID, sd, s.cb, tok)
+ if err != nil {
+ return nil, err
+ }
+
+ sec := s.NewServer(orgID, server.TypeSecureInternet, a)
+ return &sec, nil
+}