package acme import "time" // Authorization request type Authorization struct { Resource Resource `json:"resource"` // new-authz ID string `json:"id,omitempty"` Identifier Identifier `json:"identifier"` Status Status `json:"status,omitempty"` // e.g. valid Expires *time.Time `json:"expires,omitempty"` Challenges []Challenge `json:"challenges,omitempty"` Combinations [][]int `json:"combinations,omitempty"` } // Identifier ... type Identifier struct { Type IdentType `json:"type"` // dns Value string `json:"value"` // example.com } type IdentType string const IdentDNS IdentType = "dns" func (a Authorization) Supported(sols Solvers) []Challenge { supported := func(com []int) bool { for _, n := range com { if n < 0 || n >= len(a.Challenges) { return false } if _, ok := sols[a.Challenges[n].Type]; !ok { return false } } return true } for _, com := range a.Combinations { if supported(com) { c := make([]Challenge, len(com)) for i, n := range com { c[i] = a.Challenges[n] } return c } } return nil } func (p *Provider) Authorize(sols Solvers, domain string) error { req := &Authorization{ Resource: ResNewAuthz, Identifier: Identifier{ Type: IdentDNS, Value: domain, }, } resp, err := p.postJson(p.NewAuthz, req) if err != nil { return err } if err := parseJson(resp, req); err != nil { return err } for _, ch := range req.Supported(sols) { if err := p.Solve(ch, sols[ch.Type]); err != nil { return err } } return nil }