package acme import ( "errors" "net" "net/http" "time" "gopkg.in/square/go-jose.v1" ) var ErrMustAgree = errors.New("must agree to TOS") // Registration Objects type Registration struct { Resource Resource `json:"resource"` // new-reg ID int `json:"id,omitempty"` Key *jose.JsonWebKey `json:"key,omitempty"` Contact Contacts `json:"contact,omitempty"` Agreement string `json:"agreement,omitempty"` InitialIP *net.IP `json:"initialIp,omitempty"` // not in draft CreatedAt *time.Time `json:"createdAt,omitempty"` } func (p *Provider) Register(s *Signer, c Contacts, agree func(string) bool) error { // first step: new-reg req := &Registration{ Resource: ResNewReg, Contact: c, } resp, err := p.post(p.NewReg, s, req) if err != nil { return err } defer resp.Body.Close() switch resp.StatusCode { case http.StatusCreated, http.StatusConflict: // pass on default: return errors.New(resp.Status) } ns := parseHeader(resp) tos := ns.Link["terms-of-service"] if !agree(tos) { return ErrMustAgree } // second step: reg, agree to tos req = &Registration{ Resource: ResReg, Contact: c, Agreement: ns.Link["terms-of-service"], } resp, err = p.post(ns.Location, s, req) if err != nil { return err } defer resp.Body.Close() return nil }