2025-02-12 21:52:58 -05:00
|
|
|
import z from "zod";
|
2025-02-11 23:59:13 -05:00
|
|
|
|
2025-02-12 21:52:58 -05:00
|
|
|
export function isValidCIDR(cidr: string): boolean {
|
|
|
|
return z.string().cidr().safeParse(cidr).success;
|
2025-02-11 23:59:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
export function isValidIP(ip: string): boolean {
|
2025-02-12 21:52:58 -05:00
|
|
|
return z.string().ip().safeParse(ip).success;
|
2025-02-11 23:59:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
export function isValidUrlGlobPattern(pattern: string): boolean {
|
|
|
|
// Remove leading slash if present
|
|
|
|
pattern = pattern.startsWith("/") ? pattern.slice(1) : pattern;
|
|
|
|
|
|
|
|
// Empty string is not valid
|
|
|
|
if (!pattern) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Split path into segments
|
|
|
|
const segments = pattern.split("/");
|
|
|
|
|
|
|
|
// Check each segment
|
|
|
|
for (let i = 0; i < segments.length; i++) {
|
|
|
|
const segment = segments[i];
|
|
|
|
|
|
|
|
// Empty segments are not allowed (double slashes)
|
|
|
|
if (!segment && i !== segments.length - 1) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If segment contains *, it must be exactly *
|
|
|
|
if (segment.includes("*") && segment !== "*") {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check for invalid characters
|
2025-02-14 09:51:17 -05:00
|
|
|
if (!/^[a-zA-Z0-9_.*-]*$/.test(segment)) {
|
2025-02-11 23:59:13 -05:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|