ultisuite-backend/internal/api/mail/validate_identities.go
2026-05-24 00:03:36 +02:00

107 lines
3.4 KiB
Go

package mail
import (
"strconv"
"strings"
"github.com/ultisuite/ulti-backend/internal/api/apivalidate"
)
const (
maxIdentityRequestBody = 256 << 10 // 256 KiB
maxIdentityName = 128
maxSignatureHTML = 64 << 10 // 64 KiB
maxReplyToAddrs = 10
)
type createIdentityRequest struct {
Email string `json:"email"`
Name string `json:"name"`
IsDefault bool `json:"is_default"`
SignatureHTML string `json:"signature_html"`
DefaultSignatureID string `json:"default_signature_id"`
ReplyToAddrs []string `json:"reply_to_addrs"`
}
type updateIdentityRequest struct {
Email string `json:"email"`
Name string `json:"name"`
IsDefault bool `json:"is_default"`
SignatureHTML string `json:"signature_html"`
DefaultSignatureID string `json:"default_signature_id"`
ReplyToAddrs []string `json:"reply_to_addrs"`
}
func validateReplyToAddrs(field string, addrs []string) []apivalidate.FieldDetail {
if len(addrs) > maxReplyToAddrs {
return []apivalidate.FieldDetail{{
Field: field, Message: "too many entries",
}}
}
var details []apivalidate.FieldDetail
for i, addr := range addrs {
if d := validateRecipient(addr); d != nil {
d.Field = field + "[" + strconv.Itoa(i) + "]"
details = append(details, *d)
}
}
return details
}
func validateCreateIdentity(req *createIdentityRequest) *apivalidate.ValidationError {
var details []apivalidate.FieldDetail
if d := validateEmailField("email", req.Email); d != nil {
details = append(details, *d)
}
if req.Name != "" && len(req.Name) > maxIdentityName {
details = append(details, apivalidate.FieldDetail{Field: "name", Message: "too long"})
}
if len(req.SignatureHTML) > maxSignatureHTML {
details = append(details, apivalidate.FieldDetail{Field: "signature_html", Message: "too long"})
}
if d := validateOptionalUUID("default_signature_id", req.DefaultSignatureID); d != nil {
details = append(details, *d)
}
if req.ReplyToAddrs == nil {
req.ReplyToAddrs = []string{}
}
details = append(details, validateReplyToAddrs("reply_to_addrs", req.ReplyToAddrs)...)
if len(details) == 0 {
return nil
}
return apivalidate.NewValidationError(details...)
}
func validateUpdateIdentity(req *updateIdentityRequest) *apivalidate.ValidationError {
var details []apivalidate.FieldDetail
if d := validateEmailField("email", req.Email); d != nil {
details = append(details, *d)
}
if strings.TrimSpace(req.Name) == "" {
details = append(details, apivalidate.FieldDetail{Field: "name", Message: "required"})
} else if len(req.Name) > maxIdentityName {
details = append(details, apivalidate.FieldDetail{Field: "name", Message: "too long"})
}
if len(req.SignatureHTML) > maxSignatureHTML {
details = append(details, apivalidate.FieldDetail{Field: "signature_html", Message: "too long"})
}
if d := validateOptionalUUID("default_signature_id", req.DefaultSignatureID); d != nil {
details = append(details, *d)
}
if req.ReplyToAddrs == nil {
req.ReplyToAddrs = []string{}
}
details = append(details, validateReplyToAddrs("reply_to_addrs", req.ReplyToAddrs)...)
if len(details) == 0 {
return nil
}
return apivalidate.NewValidationError(details...)
}
func validateOptionalUUID(field, value string) *apivalidate.FieldDetail {
if value == "" {
return nil
}
return validateAccountUUID(value)
}