| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- import { collapseIPv6Number, IPv4CidrRange, IPv6CidrRange, Validator } from 'ip-num'
- const privateIPv4Ranges = [
- IPv4CidrRange.fromCidr('10.0.0.0/8'),
- IPv4CidrRange.fromCidr('172.16.0.0/12'),
- IPv4CidrRange.fromCidr('192.168.0.0/16'),
- ]
- const privateIPv6Ranges = [IPv6CidrRange.fromCidr('fc00::/7')]
- export const isValidAddress = (address: string) => {
- // Only validating address, should not include cidr block size
- if (address.includes('/')) return false
- const [isIpv4] = Validator.isValidIPv4String(address)
- const [isIpv6] = Validator.isValidIPv6String(address)
- return isIpv4 || isIpv6
- }
- export const checkIfPrivate = (type: 'IPv4' | 'IPv6' | undefined, cidr: string) => {
- try {
- if (type === undefined) return false
- if (type === 'IPv4') {
- const address = IPv4CidrRange.fromCidr(`${cidr}/32`)
- const res = privateIPv4Ranges.map((range) => address.inside(range))
- return res.includes(true)
- } else {
- const address = IPv6CidrRange.fromCidr(`${cidr}/128`)
- const res = privateIPv6Ranges.map((range) => address.inside(range))
- return res.includes(true)
- }
- } catch (error) {
- return false
- }
- }
- const padHexadecimal = (str: string) => `${'0'.repeat(4 - str.length)}${str}`
- export const getAddressEndRange = (type: 'IPv4' | 'IPv6', address: string) => {
- if (type === 'IPv4') {
- try {
- const cidr = IPv4CidrRange.fromCidr(address)
- const start = cidr.getFirst().octets.join('.')
- const end = cidr.getLast().octets.join('.')
- return { start, end }
- } catch (error: any) {
- return undefined
- }
- } else {
- try {
- const cidr = IPv6CidrRange.fromCidr(address)
- const start = cidr.getFirst().hexadecatet.toString().split(',').map(padHexadecimal).join(':')
- const end = cidr.getLast().hexadecatet.toString().split(',').map(padHexadecimal).join(':')
- return { start, end }
- } catch (error: any) {
- return undefined
- }
- }
- }
- // [Joshen] Using same logic as worker
- // https://github.com/briven/platform/blob/840c9596e8bf9e9090ec94de1756bd511e67393a/worker/src/tasks/db/add_as_pooler_tenant.ts#L176C15-L176C15
- export const normalize = (address: string) => {
- const [isIpV4] = Validator.isValidIPv4String(address.split('/')[0])
- if (isIpV4) {
- const cidr = IPv4CidrRange.fromCidr(address)
- const base = cidr.getFirst().toString()
- const mask = cidr.getPrefix().toString()
- return `${base}/${mask}`
- } else {
- const cidr = IPv6CidrRange.fromCidr(address)
- const base = collapseIPv6Number(cidr.getFirst().toString())
- const mask = cidr.getPrefix().toString()
- return `${base}/${mask}`
- }
- }
|