in lib/ga4gh/identity.go [177:242]
func VisasToOldClaims(ctx context.Context, visas []VisaJWT, f JWTVerifier) (map[string][]OldClaim, []*RejectedVisa, error) {
out := make(map[string][]OldClaim)
var rejected []*RejectedVisa
for i, j := range visas {
// Skip this visa on validation errors such that a bad visa doesn't spoil the bunch.
// But do return errors if the visas are not compatible with the old claim format.
v, err := NewVisaFromJWT(VisaJWT(j))
if err != nil {
rejected = append(rejected, NewRejectedVisa(nil, UnspecifiedVisaFormat, "invalid_visa", "", fmt.Sprintf("cannot unpack visa %d", i)))
continue
}
d := v.Data()
if len(d.Issuer) == 0 {
rejected = append(rejected, NewRejectedVisa(d, v.Format(), "iss_missing", "iss", "empty 'iss' field"))
continue
}
if reject := checkViaJKU(v); reject != nil {
rejected = append(rejected, reject)
continue
}
if f != nil {
if err := f(ctx, string(j), v.Data().Issuer, v.JKU()); err != nil {
reason := errutil.ErrorReason(err)
if len(reason) == 0 {
reason = "verify_failed"
}
rejected = append(rejected, NewRejectedVisa(d, v.Format(), reason, "", err.Error()))
continue
}
}
var cond map[string]OldClaimCondition
if len(d.Assertion.Conditions) > 0 {
// Conditions on visas are not supported in non-experimental mode.
if !globalflags.Experimental {
rejected = append(rejected, NewRejectedVisa(d, v.Format(), "condition_not_supported", "visa.condition", "visa conditions not supported"))
continue
}
cond, err = toOldClaimConditions(d.Assertion.Conditions)
if err != nil {
rejected = append(rejected, NewRejectedVisa(d, v.Format(), "condition_not_supported", "visa.condition", err.Error()))
continue
}
}
typ := string(d.Assertion.Type)
values := splitVisaValues(d.Assertion.Value, d.Assertion.Type)
for _, value := range values {
c := OldClaim{
Value: value,
Source: string(d.Assertion.Source),
Asserted: float64(d.Assertion.Asserted),
Expires: float64(d.ExpiresAt),
By: string(d.Assertion.By),
Issuer: d.Issuer,
VisaData: d,
TokenFormat: v.Format(),
Condition: cond,
}
out[typ] = append(out[typ], c)
}
}
return out, rejected, nil
}