| @@ -51,11 +51,9 @@ | |||
| //============================================================================== | |||
| static String getMacAddressList() | |||
| { | |||
| Array<MACAddress> macAddresses; | |||
| MACAddress::findAllAddresses (macAddresses); | |||
| String addressList; | |||
| for (auto& addr : macAddresses) | |||
| for (auto& addr : MACAddress::getAllAddresses()) | |||
| addressList << addr.toString() << newLine; | |||
| return addressList; | |||
| @@ -75,12 +73,9 @@ static String getFileSystemRoots() | |||
| static String getIPAddressList() | |||
| { | |||
| Array<IPAddress> addresses; | |||
| IPAddress::findAllAddresses (addresses); | |||
| String addressList; | |||
| for (auto& addr : addresses) | |||
| for (auto& addr : IPAddress::getAllAddresses()) | |||
| addressList << " " << addr.toString() << newLine; | |||
| return addressList; | |||
| @@ -28,16 +28,9 @@ | |||
| namespace | |||
| { | |||
| String getIPAddress() | |||
| { | |||
| Array<IPAddress> addresses; | |||
| IPAddress::findAllAddresses (addresses); | |||
| return addresses[1].toString(); | |||
| } | |||
| String getBroadcastIPAddress() | |||
| { | |||
| return getIPAddress().upToLastOccurrenceOf (".", false, false) + ".255"; | |||
| return IPAddress::getLocalAddress().toString().upToLastOccurrenceOf (".", false, false) + ".255"; | |||
| } | |||
| static const int masterPortNumber = 9001; // the UDP port the master sends on / the clients receive. | |||
| @@ -89,7 +89,8 @@ static String removePort (const String& adr) | |||
| { | |||
| if (adr.containsAnyOf ("[]")) | |||
| return adr.fromFirstOccurrenceOf ("[", false, true).upToLastOccurrenceOf ("]", false, true); | |||
| else if (adr.indexOf (":") == adr.lastIndexOf (":")) | |||
| if (adr.indexOf (":") == adr.lastIndexOf (":")) | |||
| return adr.upToLastOccurrenceOf (":", false, true); | |||
| return adr; | |||
| @@ -199,30 +200,26 @@ int IPAddress::compare (const IPAddress& other) const noexcept | |||
| return 1; | |||
| } | |||
| else | |||
| { | |||
| if (isIPv4MappedAddress (other)) | |||
| return compare (convertIPv4MappedAddressToIPv4 (other)); | |||
| return -1; | |||
| } | |||
| if (isIPv4MappedAddress (other)) | |||
| return compare (convertIPv4MappedAddressToIPv4 (other)); | |||
| return -1; | |||
| } | |||
| for (int i = 0; i < (isIPv6 ? 16 : 4); ++i) | |||
| { | |||
| if (address[i] > other.address[i]) | |||
| return 1; | |||
| else if (address[i] < other.address[i]) | |||
| return -1; | |||
| if (address[i] > other.address[i]) return 1; | |||
| if (address[i] < other.address[i]) return -1; | |||
| } | |||
| return 0; | |||
| } | |||
| IPAddress IPAddress::any() noexcept { return IPAddress(); } | |||
| IPAddress IPAddress::broadcast() noexcept { return IPAddress (255, 255, 255, 255); } | |||
| IPAddress IPAddress::local (bool IPv6) noexcept { return IPv6 ? IPAddress (0, 0, 0, 0, 0, 0, 0, 1) | |||
| : IPAddress (127, 0, 0, 1); } | |||
| IPAddress IPAddress::any() noexcept { return IPAddress(); } | |||
| IPAddress IPAddress::broadcast() noexcept { return IPAddress (255, 255, 255, 255); } | |||
| IPAddress IPAddress::local (bool IPv6) noexcept { return IPv6 ? IPAddress (0, 0, 0, 0, 0, 0, 0, 1) | |||
| : IPAddress (127, 0, 0, 1); } | |||
| String IPAddress::getFormattedAddress (const String& unformattedAddress) | |||
| { | |||
| @@ -304,10 +301,8 @@ bool IPAddress::isIPv4MappedAddress (const IPAddress& mappedAddress) | |||
| return false; | |||
| for (int i = 0; i < 10; ++i) | |||
| { | |||
| if (mappedAddress.address[i] != 0) | |||
| return false; | |||
| } | |||
| if (mappedAddress.address[10] != 255 || mappedAddress.address[11] != 255) | |||
| return false; | |||
| @@ -337,6 +332,23 @@ IPAddress IPAddress::convertIPv4AddressToIPv4Mapped (const IPAddress& addressToM | |||
| static_cast<uint16> ((addressToMap.address[2] << 8) | addressToMap.address[3]) }; | |||
| } | |||
| IPAddress IPAddress::getLocalAddress (bool includeIPv6) | |||
| { | |||
| auto addresses = getAllAddresses (includeIPv6); | |||
| for (auto& a : addresses) | |||
| if (a != local()) | |||
| return a; | |||
| return local(); | |||
| } | |||
| Array<IPAddress> IPAddress::getAllAddresses (bool includeIPv6) | |||
| { | |||
| Array<IPAddress> addresses; | |||
| findAllAddresses (addresses, includeIPv6); | |||
| return addresses; | |||
| } | |||
| #if (! JUCE_WINDOWS) && (! JUCE_ANDROID) | |||
| static void addAddress (const sockaddr_in* addr_in, Array<IPAddress>& result) | |||
| @@ -373,12 +385,12 @@ static void addAddress (const sockaddr_in6* addr_in, Array<IPAddress>& result) | |||
| void IPAddress::findAllAddresses (Array<IPAddress>& result, bool includeIPv6) | |||
| { | |||
| struct ifaddrs *ifaddr, *ifa; | |||
| struct ifaddrs* ifaddr = nullptr; | |||
| if (getifaddrs (&ifaddr) == -1) | |||
| return; | |||
| for (ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) | |||
| for (auto* ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) | |||
| { | |||
| if (ifa->ifa_addr == nullptr) | |||
| continue; | |||
| @@ -33,9 +33,6 @@ class JUCE_API IPAddress final | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** Populates a list of all the IP addresses that this machine is using. */ | |||
| static void findAllAddresses (Array<IPAddress>& results, bool includeIPv6 = false); | |||
| /** Returns an IP address meaning "any", equivalent to 0.0.0.0 (IPv4) or ::, (IPv6) */ | |||
| static IPAddress any() noexcept; | |||
| @@ -45,6 +42,21 @@ public: | |||
| /** Returns an IPv4 or IPv6 address meaning "localhost", equivalent to 127.0.0.1 (IPv4) or ::1 (IPv6) */ | |||
| static IPAddress local (bool IPv6 = false) noexcept; | |||
| //============================================================================== | |||
| /** Populates a list of all the IP addresses that this machine is using. */ | |||
| static void findAllAddresses (Array<IPAddress>& results, bool includeIPv6 = false); | |||
| /** Populates a list of all the IP addresses that this machine is using. */ | |||
| static Array<IPAddress> getAllAddresses (bool includeIPv6 = false); | |||
| /** Returns the first 'real' address for the local machine. | |||
| Unlike local(), this will attempt to find the machine's actual assigned | |||
| address rather than "127.0.0.1". If there are multiple network cards, this | |||
| may return any of their addresses. If it doesn't find any, then it'll return | |||
| local() as a fallback. | |||
| */ | |||
| static IPAddress getLocalAddress (bool includeIPv6 = false); | |||
| //============================================================================== | |||
| /** Creates a null address - 0.0.0.0 (IPv4) or ::, (IPv6) */ | |||
| IPAddress() noexcept; | |||
| @@ -85,6 +85,13 @@ int64 MACAddress::toInt64() const noexcept | |||
| return n; | |||
| } | |||
| Array<MACAddress> MACAddress::getAllAddresses() | |||
| { | |||
| Array<MACAddress> addresses; | |||
| findAllAddresses (addresses); | |||
| return addresses; | |||
| } | |||
| bool MACAddress::isNull() const noexcept { return toInt64() == 0; } | |||
| bool MACAddress::operator== (const MACAddress& other) const noexcept { return memcmp (address, other.address, sizeof (address)) == 0; } | |||
| @@ -33,6 +33,9 @@ class JUCE_API MACAddress final | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** Returns a list of the MAC addresses of all the available network cards. */ | |||
| static Array<MACAddress> getAllAddresses(); | |||
| /** Populates a list of the MAC addresses of all the available network cards. */ | |||
| static void findAllAddresses (Array<MACAddress>& results); | |||
| @@ -590,11 +590,9 @@ bool StreamingSocket::isLocal() const noexcept | |||
| if (! isConnected()) | |||
| return false; | |||
| Array<IPAddress> localAddresses; | |||
| IPAddress::findAllAddresses (localAddresses); | |||
| IPAddress currentIP (SocketHelpers::getConnectedAddress (handle)); | |||
| for (auto& a : localAddresses) | |||
| for (auto& a : IPAddress::getAllAddresses()) | |||
| if (a == currentIP) | |||
| return true; | |||
| @@ -68,7 +68,7 @@ public: | |||
| network address otherwise this function will fail. | |||
| @returns true on success; false may indicate that another socket is already bound | |||
| on the same port | |||
| @see bindToPort(int localPortNumber), IPAddress::findAllAddresses | |||
| @see bindToPort(int localPortNumber), IPAddress::getAllAddresses | |||
| */ | |||
| bool bindToPort (int localPortNumber, const String& localAddress); | |||
| @@ -236,7 +236,7 @@ public: | |||
| network address otherwise this function will fail. | |||
| @returns true on success; false may indicate that another socket is already bound | |||
| on the same port | |||
| @see bindToPort(int localPortNumber), IPAddress::findAllAddresses | |||
| @see bindToPort(int localPortNumber), IPAddress::getAllAddresses | |||
| */ | |||
| bool bindToPort (int localPortNumber, const String& localAddress); | |||
| @@ -73,13 +73,11 @@ StringArray SystemStats::getDeviceIdentifiers() | |||
| } | |||
| else | |||
| { | |||
| Array<MACAddress> addresses; | |||
| MACAddress::findAllAddresses (addresses); | |||
| for (auto& address : addresses) | |||
| for (auto& address : MACAddress::getAllAddresses()) | |||
| ids.add (address.toString()); | |||
| } | |||
| jassert (ids.size() > 0); // Failed to create any IDs! | |||
| jassert (! ids.isEmpty()); // Failed to create any IDs! | |||
| return ids; | |||
| } | |||
| @@ -195,7 +195,7 @@ static var machineNumberAllowed (StringArray numbersFromKeyFile, | |||
| for (int i = 0; i < localMachineNumbers.size(); ++i) | |||
| { | |||
| String localNumber (localMachineNumbers[i].trim()); | |||
| auto localNumber = localMachineNumbers[i].trim(); | |||
| if (localNumber.isNotEmpty()) | |||
| { | |||
| @@ -287,7 +287,7 @@ char OnlineUnlockStatus::MachineIDUtilities::getPlatformPrefix() | |||
| String OnlineUnlockStatus::MachineIDUtilities::getEncodedIDString (const String& input) | |||
| { | |||
| const String platform (String::charToString (static_cast<juce_wchar> (getPlatformPrefix()))); | |||
| auto platform = String::charToString (static_cast<juce_wchar> (getPlatformPrefix())); | |||
| return platform + MD5 ((input + "salt_1" + platform).toUTF8()) | |||
| .toHexString().substring (0, 9).toUpperCase(); | |||
| @@ -295,7 +295,7 @@ String OnlineUnlockStatus::MachineIDUtilities::getEncodedIDString (const String& | |||
| bool OnlineUnlockStatus::MachineIDUtilities::addFileIDToList (StringArray& ids, const File& f) | |||
| { | |||
| if (uint64 num = f.getFileIdentifier()) | |||
| if (auto num = f.getFileIdentifier()) | |||
| { | |||
| ids.add (getEncodedIDString (String::toHexString ((int64) num))); | |||
| return true; | |||
| @@ -306,16 +306,14 @@ bool OnlineUnlockStatus::MachineIDUtilities::addFileIDToList (StringArray& ids, | |||
| void OnlineUnlockStatus::MachineIDUtilities::addMACAddressesToList (StringArray& ids) | |||
| { | |||
| Array<MACAddress> addresses; | |||
| MACAddress::findAllAddresses (addresses); | |||
| for (int i = 0; i < addresses.size(); ++i) | |||
| ids.add (getEncodedIDString (addresses.getReference(i).toString())); | |||
| for (auto& address : MACAddress::getAllAddresses()) | |||
| ids.add (getEncodedIDString (address.toString())); | |||
| } | |||
| StringArray OnlineUnlockStatus::MachineIDUtilities::getLocalMachineIDs() | |||
| { | |||
| auto identifiers = SystemStats::getDeviceIdentifiers(); | |||
| for (auto& identifier : identifiers) | |||
| identifier = getEncodedIDString (identifier); | |||
| @@ -398,7 +396,7 @@ OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::handleXmlReply (XmlElement | |||
| { | |||
| UnlockResult r; | |||
| if (const XmlElement* keyNode = xml.getChildByName ("KEY")) | |||
| if (auto keyNode = xml.getChildByName ("KEY")) | |||
| { | |||
| const String keyText (keyNode->getAllSubText().trim()); | |||
| r.succeeded = keyText.length() > 10 && applyKeyFile (keyText); | |||
| @@ -460,7 +458,7 @@ OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::attemptWebserverUnlock (con | |||
| // This method will block while it contacts the server, so you must run it on a background thread! | |||
| jassert (! MessageManager::getInstance()->isThisTheMessageThread()); | |||
| String reply (readReplyFromWebserver (email, password)); | |||
| auto reply = readReplyFromWebserver (email, password); | |||
| DBG ("Reply from server: " << reply); | |||
| @@ -481,8 +479,8 @@ String KeyGeneration::generateKeyFile (const String& appName, | |||
| const String& machineNumbers, | |||
| const RSAKey& privateKey) | |||
| { | |||
| XmlElement xml (KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "mach")); | |||
| const String comment (KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers)); | |||
| auto xml = KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "mach"); | |||
| auto comment = KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers); | |||
| return KeyFileUtils::createKeyFile (comment, xml, privateKey); | |||
| } | |||
| @@ -494,10 +492,10 @@ String KeyGeneration::generateExpiringKeyFile (const String& appName, | |||
| const Time expiryTime, | |||
| const RSAKey& privateKey) | |||
| { | |||
| XmlElement xml (KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "expiring_mach")); | |||
| auto xml = KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "expiring_mach"); | |||
| xml.setAttribute ("expiryTime", String::toHexString (expiryTime.toMilliseconds())); | |||
| String comment (KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers)); | |||
| auto comment = KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers); | |||
| comment << newLine << "Expires: " << expiryTime.toString (true, true); | |||
| return KeyFileUtils::createKeyFile (comment, xml, privateKey); | |||