// OnValidationUpdate is called when a given Authorization is updated by the VA. func (ra *RegistrationAuthorityImpl) OnValidationUpdate(authz core.Authorization) error { // Consider validation successful if any of the combinations // specified in the authorization has been fulfilled validated := map[int]bool{} for i, ch := range authz.Challenges { if ch.Status == core.StatusValid { validated[i] = true } } for _, combo := range authz.Combinations { comboValid := true for _, i := range combo { if !validated[i] { comboValid = false break } } if comboValid { authz.Status = core.StatusValid } } // If no validation succeeded, then the authorization is invalid // NOTE: This only works because we only ever do one validation if authz.Status != core.StatusValid { authz.Status = core.StatusInvalid } else { // TODO: Enable configuration of expiry time exp := time.Now().Add(365 * 24 * time.Hour) authz.Expires = &exp } // Finalize the authorization (error ignored) return ra.SA.FinalizeAuthorization(authz) }
func TestAddAuthorization(t *testing.T) { sa, _, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) PA := core.Authorization{RegistrationID: reg.ID} PA, err := sa.NewPendingAuthorization(PA) test.AssertNotError(t, err, "Couldn't create new pending authorization") test.Assert(t, PA.ID != "", "ID shouldn't be blank") dbPa, err := sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get pending authorization with ID "+PA.ID) test.AssertMarshaledEquals(t, PA, dbPa) expectedPa := core.Authorization{ID: PA.ID} test.AssertMarshaledEquals(t, dbPa.ID, expectedPa.ID) combos := make([][]int, 1) combos[0] = []int{0, 1} exp := time.Now().AddDate(0, 0, 1) identifier := core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "wut.com"} newPa := core.Authorization{ID: PA.ID, Identifier: identifier, RegistrationID: reg.ID, Status: core.StatusPending, Expires: &exp, Combinations: combos} err = sa.UpdatePendingAuthorization(newPa) test.AssertNotError(t, err, "Couldn't update pending authorization with ID "+PA.ID) newPa.Status = core.StatusValid err = sa.FinalizeAuthorization(newPa) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+PA.ID) dbPa, err = sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get authorization with ID "+PA.ID) }
func TestCountPendingAuthorizations(t *testing.T) { sa, fc, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) expires := fc.Now().Add(time.Hour) pendingAuthz := core.Authorization{ RegistrationID: reg.ID, Expires: &expires, } pendingAuthz, err := sa.NewPendingAuthorization(ctx, pendingAuthz) test.AssertNotError(t, err, "Couldn't create new pending authorization") count, err := sa.CountPendingAuthorizations(ctx, reg.ID) test.AssertNotError(t, err, "Couldn't count pending authorizations") test.AssertEquals(t, count, 0) pendingAuthz.Status = core.StatusPending pendingAuthz, err = sa.NewPendingAuthorization(ctx, pendingAuthz) test.AssertNotError(t, err, "Couldn't create new pending authorization") count, err = sa.CountPendingAuthorizations(ctx, reg.ID) test.AssertNotError(t, err, "Couldn't count pending authorizations") test.AssertEquals(t, count, 1) fc.Add(2 * time.Hour) count, err = sa.CountPendingAuthorizations(ctx, reg.ID) test.AssertNotError(t, err, "Couldn't count pending authorizations") test.AssertEquals(t, count, 0) }
// OnValidationUpdate is called when a given Authorization is updated by the VA. func (ra *RegistrationAuthorityImpl) OnValidationUpdate(authz core.Authorization) error { // Consider validation successful if any of the combinations // specified in the authorization has been fulfilled validated := map[int]bool{} for i, ch := range authz.Challenges { if ch.Status == core.StatusValid { validated[i] = true } } for _, combo := range authz.Combinations { comboValid := true for _, i := range combo { if !validated[i] { comboValid = false break } } if comboValid { authz.Status = core.StatusValid } } // If no validation succeeded, then the authorization is invalid // NOTE: This only works because we only ever do one validation if authz.Status != core.StatusValid { authz.Status = core.StatusInvalid } else { exp := ra.clk.Now().Add(ra.authorizationLifetime) authz.Expires = &exp } // Finalize the authorization err := ra.SA.FinalizeAuthorization(authz) if err != nil { return err } ra.stats.Inc("RA.FinalizedAuthorizations", 1, 1.0) return nil }
func (ra *RegistrationAuthorityImpl) OnValidationUpdate(authz core.Authorization) error { // Check to see whether the updated validations are sufficient // Current policy is to accept if any validation succeeded for _, val := range authz.Challenges { if val.Status == core.StatusValid { authz.Status = core.StatusValid break } } // If no validation succeeded, then the authorization is invalid // NOTE: This only works because we only ever do one validation if authz.Status != core.StatusValid { authz.Status = core.StatusInvalid } else { // TODO: Enable configuration of expiry time authz.Expires = time.Now().Add(365 * 24 * time.Hour) } // Finalize the authorization (error ignored) return ra.SA.FinalizeAuthorization(authz) }
func TestAddAuthorization(t *testing.T) { sa := initSA(t) PA := core.Authorization{} PA, err := sa.NewPendingAuthorization(PA) test.AssertNotError(t, err, "Couldn't create new pending authorization") test.Assert(t, PA.ID != "", "ID shouldn't be blank") dbPa, err := sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get pending authorization with ID "+PA.ID) test.AssertMarshaledEquals(t, PA, dbPa) expectedPa := core.Authorization{ID: PA.ID} test.AssertMarshaledEquals(t, dbPa.ID, expectedPa.ID) var jwk jose.JsonWebKey err = json.Unmarshal([]byte(theKey), &jwk) if err != nil { t.Errorf("JSON unmarshal error: %+v", err) return } uu, err := url.Parse("test.com") u := core.AcmeURL(*uu) chall := core.Challenge{Type: "simpleHttp", Status: core.StatusPending, URI: u, Token: "THISWOULDNTBEAGOODTOKEN", Path: "test-me"} combos := make([][]int, 1) combos[0] = []int{0, 1} exp := time.Now().AddDate(0, 0, 1) newPa := core.Authorization{ID: PA.ID, Identifier: core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "wut.com"}, RegistrationID: 0, Status: core.StatusPending, Expires: &exp, Challenges: []core.Challenge{chall}, Combinations: combos} err = sa.UpdatePendingAuthorization(newPa) test.AssertNotError(t, err, "Couldn't update pending authorization with ID "+PA.ID) newPa.Status = core.StatusValid err = sa.FinalizeAuthorization(newPa) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+PA.ID) dbPa, err = sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get authorization with ID "+PA.ID) }
func TestAddAuthorization(t *testing.T) { sa, cleanUp := initSA(t) defer cleanUp() PA := core.Authorization{} PA, err := sa.NewPendingAuthorization(PA) test.AssertNotError(t, err, "Couldn't create new pending authorization") test.Assert(t, PA.ID != "", "ID shouldn't be blank") dbPa, err := sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get pending authorization with ID "+PA.ID) test.AssertMarshaledEquals(t, PA, dbPa) expectedPa := core.Authorization{ID: PA.ID} test.AssertMarshaledEquals(t, dbPa.ID, expectedPa.ID) var jwk jose.JsonWebKey err = json.Unmarshal([]byte(theKey), &jwk) if err != nil { t.Errorf("JSON unmarshal error: %+v", err) return } combos := make([][]int, 1) combos[0] = []int{0, 1} exp := time.Now().AddDate(0, 0, 1) identifier := core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "wut.com"} newPa := core.Authorization{ID: PA.ID, Identifier: identifier, RegistrationID: 0, Status: core.StatusPending, Expires: &exp, Combinations: combos} err = sa.UpdatePendingAuthorization(newPa) test.AssertNotError(t, err, "Couldn't update pending authorization with ID "+PA.ID) newPa.Status = core.StatusValid err = sa.FinalizeAuthorization(newPa) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+PA.ID) dbPa, err = sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get authorization with ID "+PA.ID) }