in lib/scim/scim_group.go [370:404]
func (h *GroupHandler) normalizeMember(member *spb.Member, name string, idx int) error {
switch member.Type {
case "User":
case "":
member.Type = "User"
default:
return errutil.NewIndexError(codes.InvalidArgument, errutil.ErrorPath("scim", "groups", name, "members", strconv.Itoa(idx), "type"), idx, "invalid member type")
}
email, err := mail.ParseAddress(member.Value)
if err != nil {
return errutil.NewIndexError(codes.InvalidArgument, errutil.ErrorPath("scim", "groups", name, "members", strconv.Itoa(idx), "value"), idx, fmt.Sprintf("%q must be an email address", member.Value))
}
member.Value = email.Address
if member.Display == "" && email.Name != "" {
member.Display = strings.TrimSpace(email.Name)
}
if member.Display != "" && strings.Contains(member.Display, "@") {
// Do not accept email addresses as the display name.
// Reject when a different email address, or remove display field when it repeats the value field.
if member.Display != member.Value {
return errutil.NewIndexError(codes.InvalidArgument, errutil.ErrorPath("scim", "groups", name, "members", strconv.Itoa(idx), "display"), idx, "display name as an email address not allowed")
}
member.Display = ""
}
if member.ExtensionIssuer != "" && !strutil.IsURL(member.ExtensionIssuer) {
return errutil.NewIndexError(codes.InvalidArgument, errutil.ErrorPath("scim", "groups", name, "members", strconv.Itoa(idx), "issuer"), idx, fmt.Sprintf("invalid member issuer %q", member.ExtensionIssuer))
}
if member.ExtensionIssuer != "" && len(member.ExtensionIssuer) > 256 {
return errutil.NewIndexError(codes.InvalidArgument, errutil.ErrorPath("scim", "groups", name, "members", strconv.Itoa(idx), "issuer"), idx, fmt.Sprintf("member issuer %q exceeds maximum length", member.ExtensionIssuer))
}
if member.ExtensionSubject != "" && len(member.ExtensionSubject) > 60 {
return errutil.NewIndexError(codes.InvalidArgument, errutil.ErrorPath("scim", "groups", name, "members", strconv.Itoa(idx), "subject"), idx, fmt.Sprintf("member subject %q exceeds maximum length", member.ExtensionSubject))
}
return nil
}