// Copyright (c) 2011-2016 The Cryptonote developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "Ipv4Address.h" #include namespace System { namespace { uint8_t readUint8(const std::string& source, size_t& offset) { if (offset == source.size() || source[offset] < '0' || source[offset] > '9') { throw std::runtime_error("Unable to read value from string"); } uint8_t value = source[offset] - '0'; if (offset + 1 == source.size() || source[offset + 1] < '0' || source[offset + 1] > '9') { offset = offset + 1; return value; } if (value == 0) { throw std::runtime_error("Unable to read value from string"); } value = value * 10 + (source[offset + 1] - '0'); if (offset + 2 == source.size() || source[offset + 2] < '0' || source[offset + 2] > '9') { offset = offset + 2; return value; } if ((value == 25 && source[offset + 2] > '5') || value > 25) { throw std::runtime_error("Unable to read value from string"); } value = value * 10 + (source[offset + 2] - '0'); offset = offset + 3; return value; } } Ipv4Address::Ipv4Address(uint32_t value) : value(value) { } Ipv4Address::Ipv4Address(const std::string& dottedDecimal) { size_t offset = 0; value = readUint8(dottedDecimal, offset); if (offset == dottedDecimal.size() || dottedDecimal[offset] != '.') { throw std::runtime_error("Invalid Ipv4 address string"); } ++offset; value = value << 8 | readUint8(dottedDecimal, offset); if (offset == dottedDecimal.size() || dottedDecimal[offset] != '.') { throw std::runtime_error("Invalid Ipv4 address string"); } ++offset; value = value << 8 | readUint8(dottedDecimal, offset); if (offset == dottedDecimal.size() || dottedDecimal[offset] != '.') { throw std::runtime_error("Invalid Ipv4 address string"); } ++offset; value = value << 8 | readUint8(dottedDecimal, offset); if (offset < dottedDecimal.size()) { throw std::runtime_error("Invalid Ipv4 address string"); } } bool Ipv4Address::operator!=(const Ipv4Address& other) const { return value != other.value; } bool Ipv4Address::operator==(const Ipv4Address& other) const { return value == other.value; } uint32_t Ipv4Address::getValue() const { return value; } std::string Ipv4Address::toDottedDecimal() const { std::string result; result += std::to_string(value >> 24); result += '.'; result += std::to_string(value >> 16 & 255); result += '.'; result += std::to_string(value >> 8 & 255); result += '.'; result += std::to_string(value & 255); return result; } bool Ipv4Address::isLoopback() const { // 127.0.0.0/8 return (value & 0xff000000) == (127 << 24); } bool Ipv4Address::isPrivate() const { return // 10.0.0.0/8 (value & 0xff000000) == (10 << 24) || // 172.16.0.0/12 (value & 0xfff00000) == ((172 << 24) | (16 << 16)) || // 192.168.0.0/16 (value & 0xffff0000) == ((192 << 24) | (168 << 16)); } }