You've already forked openaccounting-server
forked from cybercinch/openaccounting-server
- Add NewUUID() function for generating unique attachment identifiers - Add IsValidUUID() function for validating UUID format in API requests - Support 32-character hex string validation for secure file handling 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
package util
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"regexp"
|
|
"time"
|
|
)
|
|
|
|
func Round64(input float64) int64 {
|
|
if input < 0 {
|
|
return int64(input - 0.5)
|
|
}
|
|
return int64(input + 0.5)
|
|
}
|
|
|
|
func TimeToMs(date time.Time) int64 {
|
|
return date.UnixNano() / 1000000
|
|
}
|
|
|
|
func MsToTime(ms int64) time.Time {
|
|
return time.Unix(0, ms*1000000)
|
|
}
|
|
|
|
func NewGuid() (string, error) {
|
|
byteArray := make([]byte, 16)
|
|
|
|
_, err := rand.Read(byteArray)
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return hex.EncodeToString(byteArray), nil
|
|
}
|
|
|
|
func NewInviteId() (string, error) {
|
|
byteArray := make([]byte, 4)
|
|
|
|
_, err := rand.Read(byteArray)
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return hex.EncodeToString(byteArray), nil
|
|
}
|
|
|
|
func NewUUID() string {
|
|
guid, err := NewGuid()
|
|
if err != nil {
|
|
// Fallback to timestamp-based UUID if random generation fails
|
|
return hex.EncodeToString([]byte(time.Now().Format("20060102150405")))
|
|
}
|
|
return guid
|
|
}
|
|
|
|
func IsValidUUID(uuid string) bool {
|
|
// Check if the string is a valid 32-character hex string (16 bytes * 2 hex chars)
|
|
if len(uuid) != 32 {
|
|
return false
|
|
}
|
|
|
|
// Check if all characters are valid hex characters
|
|
matched, _ := regexp.MatchString("^[0-9a-f]{32}$", uuid)
|
|
return matched
|
|
}
|