diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-03-18 13:58:08 +0100 |
|---|---|---|
| committer | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-04-05 12:26:16 +0200 |
| commit | 2d5c7dad599b3f8b70ab07382973c51d1de2193d (patch) | |
| tree | 3ca48a1104f958f896813a4d70093cdc27429133 /src/server.go | |
| parent | 343836597df3efd6f31a68e29ff82b6ec4979f69 (diff) | |
Refactor: Structures changed and added Token refresh function
Diffstat (limited to 'src/server.go')
| -rw-r--r-- | src/server.go | 107 |
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 } |
