summaryrefslogtreecommitdiff
path: root/lib/core_ext/ipaddr.rb
blob: 86b4e714c944c408f34dc0753e72a119df67ab65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# frozen_string_literal: true

require 'ipaddr'

class IPAddr
  # Displays this IP address in CIDR form, e.g. '127.0.0.0/16'.
  #
  # @return [String]
  # @example
  #   IPAddr.new('127.0.0.1/24').to_s
  #   #=> '127.0.0.0'
  #
  #   IPAddr.new('127.0.0.1/24').to_cidr
  #   #=> '127.0.0.0/24'
  #
  #   IPAddr.new('2400:cb00:2001:470::1').to_cidr
  #   #=> '2400:cb00:2001:470::1/128'
  #
  #   IPAddr.new('2400:cb00::/32').to_cidr
  #   #=> '2400:cb00::/32'
  #
  def to_cidr
    "#{self}/#{@mask_addr.to_s(2).count('1')}"
  end

  def to_obfuscated_s(key)
    return self.to_s if self.ipv6? # Fuck you, IPv6 is obfuscated enough :-D

    int = self.to_i
    "!#{((int >> 24) & 0xFF) ^ key[0]}.#{((int >> 16) & 0xFF) ^ key[1]}.#{((int >> 8) & 0xFF) ^ key[2]}.#{((int >> 0) & 0xFF) ^ key[3]}"
  end

  def self.deobfuscate(obfuscated, key)
    IPAddr.new(obfuscated[1..]).to_obfuscated_s(key)
  end
end