diff --git a/package.json b/package.json index fa213d3..252bfbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/utils", - "version": "0.28.6", + "version": "0.28.7", "description": "Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/misc.ts b/src/misc.ts index befca9c..4baae80 100644 --- a/src/misc.ts +++ b/src/misc.ts @@ -76,6 +76,23 @@ export function gravatar(email: string, def='mp') { return `https://www.gravatar.com/avatar/${md5(email)}?d=${def}`; } +/** + * Check if IP address falls within CIDR range + * @param {string} ip IPV4 to check (192.168.0.12) + * @param {string} cidr IP range to check against (example: 192.168.0.0/24) + * @returns {boolean} Whether IP address is within range + */ +export function matchesCidr(ip: string, cidr: string): boolean { + if(!cidr) return true; + if(!ip) return false; + if(!cidr?.includes('/')) return ip === cidr; // Single IP + const [range, bits] = cidr.split('/'); + const mask = ~(2 ** (32 - parseInt(bits)) - 1); + const ipToInt = (str: string) => str.split('.') + .reduce((int, octet) => (int << 8) + parseInt(octet), 0) >>> 0; + return (ipToInt(ip) & mask) === (ipToInt(range) & mask); +} + /** * Convert IPv6 to v4 because who uses that, NAT4Life * @param {string} ip IPv6 address, e.g. 2001:0db8:85a3:0000:0000:8a2e:0370:7334