NetworkRestrictions.utils.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { collapseIPv6Number, IPv4CidrRange, IPv6CidrRange, Validator } from 'ip-num'
  2. const privateIPv4Ranges = [
  3. IPv4CidrRange.fromCidr('10.0.0.0/8'),
  4. IPv4CidrRange.fromCidr('172.16.0.0/12'),
  5. IPv4CidrRange.fromCidr('192.168.0.0/16'),
  6. ]
  7. const privateIPv6Ranges = [IPv6CidrRange.fromCidr('fc00::/7')]
  8. export const isValidAddress = (address: string) => {
  9. // Only validating address, should not include cidr block size
  10. if (address.includes('/')) return false
  11. const [isIpv4] = Validator.isValidIPv4String(address)
  12. const [isIpv6] = Validator.isValidIPv6String(address)
  13. return isIpv4 || isIpv6
  14. }
  15. export const checkIfPrivate = (type: 'IPv4' | 'IPv6' | undefined, cidr: string) => {
  16. try {
  17. if (type === undefined) return false
  18. if (type === 'IPv4') {
  19. const address = IPv4CidrRange.fromCidr(`${cidr}/32`)
  20. const res = privateIPv4Ranges.map((range) => address.inside(range))
  21. return res.includes(true)
  22. } else {
  23. const address = IPv6CidrRange.fromCidr(`${cidr}/128`)
  24. const res = privateIPv6Ranges.map((range) => address.inside(range))
  25. return res.includes(true)
  26. }
  27. } catch (error) {
  28. return false
  29. }
  30. }
  31. const padHexadecimal = (str: string) => `${'0'.repeat(4 - str.length)}${str}`
  32. export const getAddressEndRange = (type: 'IPv4' | 'IPv6', address: string) => {
  33. if (type === 'IPv4') {
  34. try {
  35. const cidr = IPv4CidrRange.fromCidr(address)
  36. const start = cidr.getFirst().octets.join('.')
  37. const end = cidr.getLast().octets.join('.')
  38. return { start, end }
  39. } catch (error: any) {
  40. return undefined
  41. }
  42. } else {
  43. try {
  44. const cidr = IPv6CidrRange.fromCidr(address)
  45. const start = cidr.getFirst().hexadecatet.toString().split(',').map(padHexadecimal).join(':')
  46. const end = cidr.getLast().hexadecatet.toString().split(',').map(padHexadecimal).join(':')
  47. return { start, end }
  48. } catch (error: any) {
  49. return undefined
  50. }
  51. }
  52. }
  53. // [Joshen] Using same logic as worker
  54. // https://github.com/briven/platform/blob/840c9596e8bf9e9090ec94de1756bd511e67393a/worker/src/tasks/db/add_as_pooler_tenant.ts#L176C15-L176C15
  55. export const normalize = (address: string) => {
  56. const [isIpV4] = Validator.isValidIPv4String(address.split('/')[0])
  57. if (isIpV4) {
  58. const cidr = IPv4CidrRange.fromCidr(address)
  59. const base = cidr.getFirst().toString()
  60. const mask = cidr.getPrefix().toString()
  61. return `${base}/${mask}`
  62. } else {
  63. const cidr = IPv6CidrRange.fromCidr(address)
  64. const base = collapseIPv6Number(cidr.getFirst().toString())
  65. const mask = cidr.getPrefix().toString()
  66. return `${base}/${mask}`
  67. }
  68. }