# 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