summaryrefslogtreecommitdiff
path: root/src/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.go')
-rw-r--r--src/server.go108
1 files changed, 56 insertions, 52 deletions
diff --git a/src/server.go b/src/server.go
index e878a08..ca130d0 100644
--- a/src/server.go
+++ b/src/server.go
@@ -10,40 +10,69 @@ func getFileUrl(url string) ([]byte, error) {
// Do a Get request to the specified url
resp, reqErr := http.Get(url)
if reqErr != nil {
- return nil, detailedVPNError{errRequestFileError, fmt.Sprintf("request failed for file url %s", url), reqErr}
+ return nil, &HTTPResourceError{URL: url, Err: reqErr}
}
// Close the response body at the end
defer resp.Body.Close()
// Check if http response code is ok
if resp.StatusCode != http.StatusOK {
- return nil, detailedVPNError{errRequestFileHTTPError, fmt.Sprintf("http status not ok for file url %s", url), nil}
+ return nil, &HTTPStatusError{URL: url, Status: resp.StatusCode}
}
// Read the body
body, readErr := ioutil.ReadAll(resp.Body)
if readErr != nil {
- return nil, detailedVPNError{errRequestFileReadError, fmt.Sprintf("error reading body from file url %s", url), readErr}
+ return nil, &HTTPReadError{URL: url, Err: readErr}
}
return body, nil
}
+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
-// TODO: Verify signature
func getDiscoFile(jsonFile string) (string, error) {
// Get json data
- fileUrl := "https://disco.eduvpn.org/v2/" + jsonFile
- fileBody, error := getFileUrl(fileUrl)
+ discoURL := "https://disco.eduvpn.org/v2/"
+ fileURL := discoURL + jsonFile
+ fileBody, fileErr := getFileUrl(fileURL)
- if error != nil {
- return "", error
+ if fileErr != nil {
+ return "", &DiscoFileError{fileURL, fileErr}
}
// Get signature
- sigUrl := fileUrl + ".minisig"
- sigBody, error := getFileUrl(sigUrl)
+ sigFile := jsonFile + ".minisig"
+ sigURL := discoURL + sigFile
+ sigBody, sigFileErr := getFileUrl(sigURL)
- if error != nil {
- return "", error
+ if sigFileErr != nil {
+ return "", &DiscoSigFileError{URL: sigURL, Err: sigFileErr}
}
// Verify signature
@@ -54,62 +83,37 @@ func getDiscoFile(jsonFile string) (string, error) {
verifySuccess, verifyErr := Verify(string(sigBody), fileBody, jsonFile, previousSigTime, forcePrehash)
if !verifySuccess || verifyErr != nil {
- return "", detailedVPNError{errVerifySigError, "Signature is not valid", verifyErr}
+ 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) {
- body, err := getDiscoFile("organization_list.json")
+ file := "organization_list.json"
+ body, err := getDiscoFile(file)
if err != nil {
- return "", err.(detailedRequestError).ToRequestError()
+ 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 "", err.(detailedRequestError).ToRequestError()
+ return "", &GetListError{File: file, Err: err}
}
return body, nil
}
-
-// RequestErrorCode Simplified error code for public interface.
-type RequestErrorCode = VPNErrorCode
-type RequestError = VPNError
-
-// detailedRequestErrorCode used for unit tests.
-type detailedRequestErrorCode = detailedVPNErrorCode
-type detailedRequestError = detailedVPNError
-
-const (
- ErrRequestFileError RequestErrorCode = iota + 1
- ErrVerifySigError
-)
-
-const (
- errRequestFileError detailedRequestErrorCode = iota + 1
- errRequestFileHTTPError
- errRequestFileReadError
- errVerifySigError
-)
-
-func (err detailedRequestError) ToRequestError() RequestError {
- return RequestError{err.Code.ToRequestErrorCode(), err}
-}
-
-func (code detailedRequestErrorCode) ToRequestErrorCode() RequestErrorCode {
- switch code {
- case errRequestFileError:
- case errRequestFileReadError:
- case errRequestFileHTTPError:
- return ErrRequestFileError
- case errVerifySigError:
- return ErrVerifySigError
- }
- panic("invalid detailedRequestErrorCode")
-}