// newReg creates a reg model object from a core.Registration func registrationToModel(r *core.Registration) (*regModel, error) { key, err := json.Marshal(r.Key) if err != nil { return nil, err } sha, err := core.KeyDigest(r.Key) if err != nil { return nil, err } if r.InitialIP == nil { return nil, fmt.Errorf("initialIP was nil") } if r.Contact == nil { r.Contact = &[]*core.AcmeURL{} } rm := ®Model{ ID: r.ID, Key: key, KeySHA256: sha, Contact: *r.Contact, Agreement: r.Agreement, InitialIP: []byte(r.InitialIP.To16()), CreatedAt: r.CreatedAt, } return rm, nil }
// MergeUpdate copies a subset of information from the input Registration // into the Registration r. It returns true if an update was performed and the base object // was changed, and false if no change was made. func mergeUpdate(r *core.Registration, input core.Registration) bool { var changed bool // Note: we allow input.Contact to overwrite r.Contact even if the former is // empty in order to allow users to remove the contact associated with // a registration. Since the field type is a pointer to slice of pointers we // can perform a nil check to differentiate between an empty value and a nil // (e.g. not provided) value if input.Contact != nil && !contactsEqual(r, input) { r.Contact = input.Contact changed = true } // If there is an agreement in the input and it's not the same as the base, // then we update the base if len(input.Agreement) > 0 && input.Agreement != r.Agreement { r.Agreement = input.Agreement changed = true } if features.Enabled(features.AllowKeyRollover) && input.Key != nil { sameKey, _ := core.PublicKeysEqual(r.Key.Key, input.Key.Key) if !sameKey { r.Key = input.Key changed = true } } return changed }
// newReg creates a reg model object from a core.Registration func registrationToModel(r *core.Registration) (interface{}, error) { key, err := json.Marshal(r.Key) if err != nil { return nil, err } sha, err := core.KeyDigest(r.Key) if err != nil { return nil, err } if r.InitialIP == nil { return nil, fmt.Errorf("initialIP was nil") } if r.Contact == nil { r.Contact = &[]string{} } rm := regModelv1{ ID: r.ID, Key: key, KeySHA256: sha, Contact: *r.Contact, Agreement: r.Agreement, InitialIP: []byte(r.InitialIP.To16()), CreatedAt: r.CreatedAt, } if features.Enabled(features.AllowAccountDeactivation) { return ®Modelv2{ regModelv1: rm, Status: string(r.Status), }, nil } return &rm, nil }
func TestRegistration(t *testing.T) { contacts := []string{"email"} var key jose.JsonWebKey err := json.Unmarshal([]byte(` { "e": "AQAB", "kty": "RSA", "n": "tSwgy3ORGvc7YJI9B2qqkelZRUC6F1S5NwXFvM4w5-M0TsxbFsH5UH6adigV0jzsDJ5imAechcSoOhAh9POceCbPN1sTNwLpNbOLiQQ7RD5mY_pSUHWXNmS9R4NZ3t2fQAzPeW7jOfF0LKuJRGkekx6tXP1uSnNibgpJULNc4208dgBaCHo3mvaE2HV2GmVl1yxwWX5QZZkGQGjNDZYnjFfa2DKVvFs0QbAk21ROm594kAxlRlMMrvqlf24Eq4ERO0ptzpZgm_3j_e4hGRD39gJS7kAzK-j2cacFQ5Qi2Y6wZI2p-FCq_wiYsfEAIkATPBiLKl_6d_Jfcvs_impcXQ" } `), &key) test.AssertNotError(t, err, "Could not unmarshal testing key") inReg := core.Registration{ ID: 1, Key: &key, Contact: &contacts, Agreement: "yup", InitialIP: net.ParseIP("1.1.1.1"), CreatedAt: time.Now(), Status: core.StatusValid, } pbReg, err := registrationToPB(inReg) test.AssertNotError(t, err, "registrationToPB failed") outReg, err := pbToRegistration(pbReg) test.AssertNotError(t, err, "pbToRegistration failed") test.AssertDeepEquals(t, inReg, outReg) inReg.Contact = nil pbReg, err = registrationToPB(inReg) test.AssertNotError(t, err, "registrationToPB failed") pbReg.Contact = []string{} outReg, err = pbToRegistration(pbReg) test.AssertNotError(t, err, "pbToRegistration failed") test.AssertDeepEquals(t, inReg, outReg) var empty []string inReg.Contact = &empty pbReg, err = registrationToPB(inReg) test.AssertNotError(t, err, "registrationToPB failed") outReg, err = pbToRegistration(pbReg) test.AssertNotError(t, err, "pbToRegistration failed") test.Assert(t, *outReg.Contact != nil, "Empty slice was converted to a nil slice") }