From 2d5c7dad599b3f8b70ab07382973c51d1de2193d Mon Sep 17 00:00:00 2001 From: jwijenbergh Date: Fri, 18 Mar 2022 13:58:08 +0100 Subject: Refactor: Structures changed and added Token refresh function --- src/discovery.go | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/discovery.go (limited to 'src/discovery.go') 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 +} -- cgit v1.2.3