forked from TrueCloudLab/lego
Merge pull request #50 from xenolf/better-challenge-errors
Better challenge errors
This commit is contained in:
commit
bf740fa2ca
5 changed files with 47 additions and 16 deletions
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -28,6 +29,27 @@ type TOSError struct {
|
||||||
RemoteError
|
RemoteError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type domainError struct {
|
||||||
|
Domain string
|
||||||
|
Error error
|
||||||
|
}
|
||||||
|
|
||||||
|
type challengeError struct {
|
||||||
|
RemoteError
|
||||||
|
records []validationRecord
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c challengeError) Error() string {
|
||||||
|
|
||||||
|
var errStr string
|
||||||
|
for _, validation := range c.records {
|
||||||
|
errStr = errStr + fmt.Sprintf("\tValidation for %s:%s\n\tResolved to:\n\t\t%s\n\tUsed: %s\n\n",
|
||||||
|
validation.Hostname, validation.Port, strings.Join(validation.ResolvedAddresses, "\n\t\t"), validation.UsedAddress)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%s\nError Detail:\n%s", c.RemoteError.Error(), errStr)
|
||||||
|
}
|
||||||
|
|
||||||
func handleHTTPError(resp *http.Response) error {
|
func handleHTTPError(resp *http.Response) error {
|
||||||
var errorDetail RemoteError
|
var errorDetail RemoteError
|
||||||
decoder := json.NewDecoder(resp.Body)
|
decoder := json.NewDecoder(resp.Body)
|
||||||
|
@ -46,7 +68,6 @@ func handleHTTPError(resp *http.Response) error {
|
||||||
return errorDetail
|
return errorDetail
|
||||||
}
|
}
|
||||||
|
|
||||||
type domainError struct {
|
func handleChallengeError(chlng challenge) error {
|
||||||
Domain string
|
return challengeError{chlng.Error, chlng.ValidationRecords}
|
||||||
Error error
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ Loop:
|
||||||
case "pending":
|
case "pending":
|
||||||
break
|
break
|
||||||
case "invalid":
|
case "invalid":
|
||||||
return errors.New("The server could not validate our request.")
|
return handleChallengeError(challengeResponse)
|
||||||
default:
|
default:
|
||||||
return errors.New("The server returned an unexpected state.")
|
return errors.New("The server returned an unexpected state.")
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,7 +161,7 @@ func TestHTTPInvalidServerState(t *testing.T) {
|
||||||
if err := solver.Solve(clientChallenge, "127.0.0.1"); err == nil {
|
if err := solver.Solve(clientChallenge, "127.0.0.1"); err == nil {
|
||||||
t.Error("UNEXPECTED: Expected Solve to return an error but the error was nil.")
|
t.Error("UNEXPECTED: Expected Solve to return an error but the error was nil.")
|
||||||
} else {
|
} else {
|
||||||
expectedError := "The server could not validate our request."
|
expectedError := "acme: Error 0 - - \nError Detail:\n"
|
||||||
if err.Error() != expectedError {
|
if err.Error() != expectedError {
|
||||||
t.Errorf("Expected error |%s| but instead got |%s|", expectedError, err.Error())
|
t.Errorf("Expected error |%s| but instead got |%s|", expectedError, err.Error())
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,14 @@ type identifier struct {
|
||||||
Value string `json:"value"`
|
Value string `json:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type validationRecord struct {
|
||||||
|
URI string `json:"url,omitempty"`
|
||||||
|
Hostname string `json:"hostname,omitempty"`
|
||||||
|
Port string `json:"port,omitempty"`
|
||||||
|
ResolvedAddresses []string `json:"addressesResolved,omitempty"`
|
||||||
|
UsedAddress string `json:"addressUsed,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
type challenge struct {
|
type challenge struct {
|
||||||
Resource string `json:"resource,omitempty"`
|
Resource string `json:"resource,omitempty"`
|
||||||
Type string `json:"type,omitempty"`
|
Type string `json:"type,omitempty"`
|
||||||
|
@ -81,6 +89,8 @@ type challenge struct {
|
||||||
KeyAuthorization string `json:"keyAuthorization,omitempty"`
|
KeyAuthorization string `json:"keyAuthorization,omitempty"`
|
||||||
TLS bool `json:"tls,omitempty"`
|
TLS bool `json:"tls,omitempty"`
|
||||||
Iterations int `json:"n,omitempty"`
|
Iterations int `json:"n,omitempty"`
|
||||||
|
Error RemoteError `json:"error,omitempty"`
|
||||||
|
ValidationRecords []validationRecord `json:"validationRecord,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type csrMessage struct {
|
type csrMessage struct {
|
||||||
|
|
|
@ -90,7 +90,7 @@ Loop:
|
||||||
case "pending":
|
case "pending":
|
||||||
break
|
break
|
||||||
case "invalid":
|
case "invalid":
|
||||||
return errors.New("The server could not validate our request.")
|
return handleChallengeError(challengeResponse)
|
||||||
default:
|
default:
|
||||||
return errors.New("The server returned an unexpected state.")
|
return errors.New("The server returned an unexpected state.")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue