aboutsummaryrefslogtreecommitdiff
path: root/challenge.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-01-31 23:15:27 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-01-31 23:15:27 +0100
commitc49a0bf48ea10b54dbac3480716d9786a0ce8411 (patch)
tree3ce88f2422f3484aa95f77669fdafdfb6b2e63d9 /challenge.go
parentc9038d2f35945774f6cd32ade7b3abd1cd5ba952 (diff)
Split files (experimental)
Diffstat (limited to 'challenge.go')
-rw-r--r--challenge.go90
1 files changed, 90 insertions, 0 deletions
diff --git a/challenge.go b/challenge.go
new file mode 100644
index 0000000..c39bc12
--- /dev/null
+++ b/challenge.go
@@ -0,0 +1,90 @@
+package acme
+
+import (
+ "log"
+ "time"
+)
+
+// Challege ...
+type Challenge struct {
+ Resource Resource `json:"resource"` // challenge
+ Type ChalType `json:"type"`
+ Token string `json:"token,omitempty"`
+ Status Status `json:"status,omitempty"` // e.g. valid
+ URI string `json:"uri,omitempty"`
+ Validated *time.Time `json:"validated,omitempty"`
+ KeyAuthorization string `json:"keyAuthorization,omitempty"`
+ Err *Problem `json:"error,omitempty"`
+}
+
+// Status of request
+type Status string
+
+// Statuses
+const (
+ StatusUnknown Status = "unknown"
+ StatusPending Status = "pending"
+ StatusProcessing Status = "processing"
+ StatusValid Status = "valid"
+ StatusInvalid Status = "invalid"
+ StatusRevoked Status = "revoked"
+)
+
+type ChalType string
+
+const (
+ ChallengeHTTP ChalType = "http-01"
+ ChallengeTLS ChalType = "tls-sni-01"
+ ChallengePOP ChalType = "proofOfPossession-01"
+ ChallengeDNS ChalType = "dns-01"
+)
+
+func (p *Provider) solve(s Signer, ch Challenge, sol Solver) error {
+ ka, err := s.KeyAuth(ch.Token)
+ if err != nil {
+ return err
+ }
+
+ // prepare solver
+ err = sol.Solve(ch.Token, ka)
+ if err != nil {
+ return err
+ }
+ defer sol.Solved()
+
+ // update challenge
+ ch.Resource = ResChallenge
+ ch.KeyAuthorization = ka
+
+ resp, err := p.post(ch.URI, s, ch)
+ if err != nil {
+ return err
+ }
+ ns := parseHeader(resp)
+
+ return p.pollStatus(ns.Location)
+}
+
+func (p *Provider) pollStatus(uri string) error {
+ t := time.NewTicker(poll)
+ defer t.Stop()
+ for range t.C {
+ resp, err := p.Get(uri)
+ if err != nil {
+ return err
+ }
+ req := new(Challenge)
+ err = parseJson(resp, req)
+ if err != nil {
+ return err
+ }
+ if req.Err != nil {
+ return req.Err
+ }
+ log.Println("status", req.Status)
+ if req.Status == StatusValid {
+ return nil
+ }
+ }
+ return nil
+}