summaryrefslogtreecommitdiff
path: root/src/server.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2022-03-18 13:58:08 +0100
committerjwijenbergh <jeroenwijenbergh@protonmail.com>2022-04-05 12:26:16 +0200
commit2d5c7dad599b3f8b70ab07382973c51d1de2193d (patch)
tree3ca48a1104f958f896813a4d70093cdc27429133 /src/server.go
parent343836597df3efd6f31a68e29ff82b6ec4979f69 (diff)
Refactor: Structures changed and added Token refresh function
Diffstat (limited to 'src/server.go')
-rw-r--r--src/server.go107
1 files changed, 34 insertions, 73 deletions
diff --git a/src/server.go b/src/server.go
index ced7716..bf1fb3d 100644
--- a/src/server.go
+++ b/src/server.go
@@ -1,96 +1,57 @@
package eduvpn
import (
- "fmt"
+ "encoding/json"
)
-type DiscoFileError struct {
- URL string
- Err error
+type Server struct {
+ BaseURL string
+ Endpoints *ServerEndpoints
+ OAuth *OAuth
}
-func (e *DiscoFileError) Error() string {
- return fmt.Sprintf("failed obtaining disco file %s with error %v", e.URL, e.Err)
+type ServerEndpointList struct {
+ API string `json:"api_endpoint"`
+ Authorization string `json:"authorization_endpoint"`
+ Token string `json:"token_endpoint"`
}
-type DiscoSigFileError struct {
- URL string
- Err error
+// Struct that defines the json format for /.well-known/vpn-user-portal"
+type ServerEndpoints struct {
+ API struct {
+ V2 ServerEndpointList `json:"http://eduvpn.org/api#2"`
+ V3 ServerEndpointList `json:"http://eduvpn.org/api#3"`
+ } `json:"api"`
+ V string `json:"v"`
}
-func (e *DiscoSigFileError) Error() string {
- return fmt.Sprintf("failed obtaining disco signature file %s with error %v", e.URL, e.Err)
-}
-
-type DiscoVerifyError struct {
- File string
- Sigfile string
- Err error
-}
-func (e *DiscoVerifyError) Error() string {
- return fmt.Sprintf("failed verifying file %s with signature %s due to error %v", e.File, e.Sigfile, e.Err)
+func (server *Server) Initialize(url string) error {
+ server.BaseURL = url
+ endpointsErr := server.GetEndpoints()
+ if endpointsErr != nil {
+ return endpointsErr
+ }
+ return nil
}
-// Helper function that gets a disco json
-func getDiscoFile(jsonFile string) (string, error) {
- // Get json data
- discoURL := "https://disco.eduvpn.org/v2/"
- fileURL := discoURL + jsonFile
- fileBody, fileErr := HTTPGet(fileURL)
- if fileErr != nil {
- return "", &DiscoFileError{fileURL, fileErr}
- }
-
- // Get signature
- sigFile := jsonFile + ".minisig"
- sigURL := discoURL + sigFile
- sigBody, sigFileErr := HTTPGet(sigURL)
+func (server *Server) GetEndpoints() error {
+ url := server.BaseURL + "/.well-known/vpn-user-portal"
+ body, bodyErr := HTTPGet(url)
- if sigFileErr != nil {
- return "", &DiscoSigFileError{URL: sigURL, Err: sigFileErr}
+ if bodyErr != nil {
+ return bodyErr
}
- // Verify signature
- // TODO: Handle this by keeping track of the previous sign time
- // Wrappers must do this?
- var previousSigTime uint64 = 0
- forcePrehash := false
- verifySuccess, verifyErr := Verify(string(sigBody), fileBody, jsonFile, previousSigTime, forcePrehash)
+ endpoints := &ServerEndpoints{}
+ jsonErr := json.Unmarshal(body, &endpoints)
- if !verifySuccess || verifyErr != nil {
- return "", &DiscoVerifyError{File: jsonFile, Sigfile: sigFile, Err: verifyErr}
+ if jsonErr != nil {
+ return jsonErr
}
- return string(fileBody), nil
-}
+ server.Endpoints = endpoints
-type GetListError struct {
- File string
- Err error
-}
-
-func (e *GetListError) Error() string {
- return fmt.Sprintf("failed getting disco list file %s with error %v", e.File, e.Err)
-}
-
-// Get the organization list
-func GetOrganizationsList() (string, error) {
- file := "organization_list.json"
- body, err := getDiscoFile(file)
- if err != nil {
- return "", &GetListError{File: file, Err: err}
- }
- return body, nil
-}
-
-// Get the server list
-func GetServersList() (string, error) {
- file := "server_list.json"
- body, err := getDiscoFile("server_list.json")
- if err != nil {
- return "", &GetListError{File: file, Err: err}
- }
- return body, nil
+ return nil
}