package native import ( "errors" ) // LOW-002: Common input validation constants and helpers for all native contracts. // These ensure consistent validation and prevent DoS attacks via oversized inputs. // Maximum string lengths for input validation. const ( // Identity-related limits MaxNameLength = 256 // Names of laws, roles, etc. MaxDescriptionLength = 4096 // Detailed descriptions MaxReasonLength = 1024 // Reasons for actions MaxPurposeLength = 128 // Auth purposes // Identifiers MaxBucketLength = 64 // Bucket/category identifiers MaxTagLength = 128 // Tags and labels MaxKeyLength = 256 // Attribute keys // Content MaxAttributeValueLength = 4096 // Attribute values MaxEvidenceLength = 32768 // Evidence/proof data // Query limits MaxQueryLimit = 100 // Maximum items returned per query DefaultPageSize = 20 // Default page size for pagination ) // Validation errors. var ( ErrInputTooLong = errors.New("input exceeds maximum allowed length") ErrNameTooLong = errors.New("name exceeds maximum length") ErrDescriptionTooLong = errors.New("description exceeds maximum length") ErrReasonTooLong = errors.New("reason exceeds maximum length") ErrBucketTooLong = errors.New("bucket identifier exceeds maximum length") ErrTagTooLong = errors.New("tag exceeds maximum length") ErrKeyTooLong = errors.New("key exceeds maximum length") ErrValueTooLong = errors.New("value exceeds maximum length") ErrEvidenceTooLong = errors.New("evidence exceeds maximum length") ErrInvalidPageSize = errors.New("page size exceeds maximum") ) // ValidateName checks if a name is within allowed length. func ValidateName(name string) error { if len(name) > MaxNameLength { return ErrNameTooLong } return nil } // ValidateDescription checks if a description is within allowed length. func ValidateDescription(desc string) error { if len(desc) > MaxDescriptionLength { return ErrDescriptionTooLong } return nil } // ValidateReason checks if a reason is within allowed length. func ValidateReason(reason string) error { if len(reason) > MaxReasonLength { return ErrReasonTooLong } return nil } // ValidateBucket checks if a bucket identifier is within allowed length. func ValidateBucket(bucket string) error { if len(bucket) > MaxBucketLength { return ErrBucketTooLong } return nil } // ValidateTag checks if a tag is within allowed length. func ValidateTag(tag string) error { if len(tag) > MaxTagLength { return ErrTagTooLong } return nil } // ValidateKey checks if a key is within allowed length. func ValidateKey(key string) error { if len(key) > MaxKeyLength { return ErrKeyTooLong } return nil } // ValidateValue checks if a value is within allowed length. func ValidateValue(value string) error { if len(value) > MaxAttributeValueLength { return ErrValueTooLong } return nil } // ValidateEvidence checks if evidence data is within allowed length. func ValidateEvidence(evidence []byte) error { if len(evidence) > MaxEvidenceLength { return ErrEvidenceTooLong } return nil } // ValidatePageSize ensures page size is within limits. // Returns the validated page size (clamped to max if needed). func ValidatePageSize(size int) int { if size <= 0 { return DefaultPageSize } if size > MaxQueryLimit { return MaxQueryLimit } return size } // ValidateOffset ensures offset is non-negative. func ValidateOffset(offset int) int { if offset < 0 { return 0 } return offset }