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/discovery.go | |
| parent | 343836597df3efd6f31a68e29ff82b6ec4979f69 (diff) | |
Refactor: Structures changed and added Token refresh function
Diffstat (limited to 'src/discovery.go')
| -rw-r--r-- | src/discovery.go | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/discovery.go b/src/discovery.go new file mode 100644 index 0000000..ced7716 --- /dev/null +++ b/src/discovery.go @@ -0,0 +1,96 @@ +package eduvpn + +import ( + "fmt" +) + +type DiscoFileError struct { + URL string + Err error +} + +func (e *DiscoFileError) Error() string { + return fmt.Sprintf("failed obtaining disco file %s with error %v", e.URL, e.Err) +} + +type DiscoSigFileError struct { + URL string + Err error +} + +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) +} + +// 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) + + if sigFileErr != nil { + return "", &DiscoSigFileError{URL: sigURL, Err: sigFileErr} + } + + // 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) + + if !verifySuccess || verifyErr != nil { + return "", &DiscoVerifyError{File: jsonFile, Sigfile: sigFile, Err: verifyErr} + } + + return string(fileBody), nil +} + +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 +} |
