package hostclaim type RetainedAdmissionLoss struct { Incarnation string `json:"incarnation"` Location string `json:"location"` Account string `json:"account"` App string `json:"app"` Admission AdmissionRecord `json:"admission"` } func retainNativeAdmissionLosses(c *Claim) error { if c.Holder == nil { return nil } h := c.Holder var retained []RetainedAdmissionLoss for _, a := range h.Admissions { if admissionLossArchived(a) { continue } if a.LossID != "" { return ErrLossEvidencePending } retained = append(retained, RetainedAdmissionLoss{ Incarnation: h.Incarnation, Location: h.Location, Account: h.Account, App: h.App, Admission: a, }) } c.RetainedAdmissionLosses = append(c.RetainedAdmissionLosses, retained...) return validateRetainedAdmissionLosses(c) } func validateRetainedAdmissionLosses(c *Claim) error { seen := map[uint64]bool{} for _, r := range c.RetainedAdmissionLosses { a := r.Admission if !isHex64(r.Incarnation) || r.Account == "" || r.App == "" || (r.Location != "instances/"+c.Host && r.Location != "instances/"+c.Host+"/"+r.Incarnation) || a.Session == 0 || a.Session > c.Gen || seen[a.Session] || a.Region == "" || a.LossID != "" || !admissionHasLoss(a) || !validWriteLosses(a.WritesLost, a.AdditionalWritesLost) || a.LossArchivedClaimGen != 0 { return ErrMalformed } seen[a.Session] = true } return nil }