From 23a706bbaebcc8ec9126d019a276c158581bdb53 Mon Sep 17 00:00:00 2001 From: Janrupf Date: Sat, 22 May 2021 16:14:25 +0200 Subject: NOISSUE Resolve minecraft server using DNS SRV --- api/logic/launch/steps/LookupServerAddress.cpp | 95 ++++++++++++++++++++++++++ api/logic/launch/steps/LookupServerAddress.h | 51 ++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 api/logic/launch/steps/LookupServerAddress.cpp create mode 100644 api/logic/launch/steps/LookupServerAddress.h (limited to 'api/logic/launch') diff --git a/api/logic/launch/steps/LookupServerAddress.cpp b/api/logic/launch/steps/LookupServerAddress.cpp new file mode 100644 index 00000000..c8e2a20c --- /dev/null +++ b/api/logic/launch/steps/LookupServerAddress.cpp @@ -0,0 +1,95 @@ +#include "LookupServerAddress.h" + +#include + +LookupServerAddress::LookupServerAddress(LaunchTask *parent) : + LaunchStep(parent), m_dnsLookup(new QDnsLookup(this)) +{ + connect(m_dnsLookup, &QDnsLookup::finished, this, &LookupServerAddress::on_dnsLookupFinished); + + m_dnsLookup->setType(QDnsLookup::SRV); +} + +void LookupServerAddress::setLookupAddress(const QString &lookupAddress) +{ + m_lookupAddress = lookupAddress; + m_dnsLookup->setName(QString("_minecraft._tcp.%1").arg(lookupAddress)); +} + +void LookupServerAddress::setPort(quint16 port) +{ + m_port = port; +} + +void LookupServerAddress::setOutputAddressPtr(MinecraftServerTargetPtr output) +{ + m_output = std::move(output); +} + +bool LookupServerAddress::abort() +{ + m_dnsLookup->abort(); + emitFailed("Aborted"); + return true; +} + +void LookupServerAddress::executeTask() +{ + m_dnsLookup->lookup(); +} + +void LookupServerAddress::on_dnsLookupFinished() +{ + if (isFinished()) + { + // Aborted + return; + } + + if (m_dnsLookup->error() != QDnsLookup::NoError) + { + emit logLine(QString("Failed to resolve server address (this is NOT an error!) %1: %2\n") + .arg(m_dnsLookup->name(), m_dnsLookup->errorString()), MessageLevel::MultiMC); + resolve(m_lookupAddress, m_port); // Technically the task failed, however, we don't abort the launch + // and leave it up to minecraft to fail (or maybe not) when connecting + return; + } + + const auto records = m_dnsLookup->serviceRecords(); + if (records.empty()) + { + emit logLine( + QString("Failed to resolve server address %1: the DNS lookup succeeded, but no records were returned.\n") + .arg(m_dnsLookup->name()), MessageLevel::Warning); + resolve(m_lookupAddress, m_port); // Technically the task failed, however, we don't abort the launch + // and leave it up to minecraft to fail (or maybe not) when connecting + return; + } + + const auto &firstRecord = records.at(0); + + if (firstRecord.port() != m_port && m_port != 0) + { + emit logLine( + QString("DNS record for %1 suggested %2 as server port, but user supplied %3. Using user override," + " but the port may be wrong!\n").arg(m_dnsLookup->name(), QString::number(firstRecord.port()), QString::number(m_port)), + MessageLevel::Warning); + } + else if (m_port == 0) + { + m_port = firstRecord.port(); + } + + emit logLine(QString("Resolved server address %1 to %2 with port %3\n").arg( + m_dnsLookup->name(), firstRecord.target(), QString::number(m_port)),MessageLevel::MultiMC); + resolve(firstRecord.target(), m_port); +} + +void LookupServerAddress::resolve(const QString &address, quint16 port) +{ + m_output->address = address; + m_output->port = port; + + emitSucceeded(); + m_dnsLookup->deleteLater(); +} diff --git a/api/logic/launch/steps/LookupServerAddress.h b/api/logic/launch/steps/LookupServerAddress.h new file mode 100644 index 00000000..1f70e97b --- /dev/null +++ b/api/logic/launch/steps/LookupServerAddress.h @@ -0,0 +1,51 @@ +/* Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include + +#include "minecraft/launch/MinecraftServerTarget.h" + +class LookupServerAddress: public LaunchStep { +Q_OBJECT +public: + explicit LookupServerAddress(LaunchTask *parent); + virtual ~LookupServerAddress() {}; + + virtual void executeTask(); + virtual bool abort(); + virtual bool canAbort() const + { + return true; + } + + void setLookupAddress(const QString &lookupAddress); + void setPort(quint16 port); + void setOutputAddressPtr(MinecraftServerTargetPtr output); + +private slots: + void on_dnsLookupFinished(); + +private: + void resolve(const QString &address, quint16 port); + + QDnsLookup *m_dnsLookup; + QString m_lookupAddress; + quint16 m_port; + MinecraftServerTargetPtr m_output; +}; -- cgit From d97f13b4aacd00b7157735702fa4484317640a4f Mon Sep 17 00:00:00 2001 From: Janrupf Date: Sat, 22 May 2021 17:00:14 +0200 Subject: NOISSUE Use Vanilla logic for resolving servers --- api/logic/launch/steps/LookupServerAddress.cpp | 26 +++++----------------- api/logic/launch/steps/LookupServerAddress.h | 2 -- api/logic/minecraft/MinecraftInstance.cpp | 20 ++++++++++++----- application/pages/instance/InstanceSettingsPage.ui | 2 +- 4 files changed, 20 insertions(+), 30 deletions(-) (limited to 'api/logic/launch') diff --git a/api/logic/launch/steps/LookupServerAddress.cpp b/api/logic/launch/steps/LookupServerAddress.cpp index c8e2a20c..c6ca5bd5 100644 --- a/api/logic/launch/steps/LookupServerAddress.cpp +++ b/api/logic/launch/steps/LookupServerAddress.cpp @@ -16,11 +16,6 @@ void LookupServerAddress::setLookupAddress(const QString &lookupAddress) m_dnsLookup->setName(QString("_minecraft._tcp.%1").arg(lookupAddress)); } -void LookupServerAddress::setPort(quint16 port) -{ - m_port = port; -} - void LookupServerAddress::setOutputAddressPtr(MinecraftServerTargetPtr output) { m_output = std::move(output); @@ -50,7 +45,7 @@ void LookupServerAddress::on_dnsLookupFinished() { emit logLine(QString("Failed to resolve server address (this is NOT an error!) %1: %2\n") .arg(m_dnsLookup->name(), m_dnsLookup->errorString()), MessageLevel::MultiMC); - resolve(m_lookupAddress, m_port); // Technically the task failed, however, we don't abort the launch + resolve(m_lookupAddress, 25565); // Technically the task failed, however, we don't abort the launch // and leave it up to minecraft to fail (or maybe not) when connecting return; } @@ -61,28 +56,17 @@ void LookupServerAddress::on_dnsLookupFinished() emit logLine( QString("Failed to resolve server address %1: the DNS lookup succeeded, but no records were returned.\n") .arg(m_dnsLookup->name()), MessageLevel::Warning); - resolve(m_lookupAddress, m_port); // Technically the task failed, however, we don't abort the launch + resolve(m_lookupAddress, 25565); // Technically the task failed, however, we don't abort the launch // and leave it up to minecraft to fail (or maybe not) when connecting return; } const auto &firstRecord = records.at(0); - - if (firstRecord.port() != m_port && m_port != 0) - { - emit logLine( - QString("DNS record for %1 suggested %2 as server port, but user supplied %3. Using user override," - " but the port may be wrong!\n").arg(m_dnsLookup->name(), QString::number(firstRecord.port()), QString::number(m_port)), - MessageLevel::Warning); - } - else if (m_port == 0) - { - m_port = firstRecord.port(); - } + quint16 port = firstRecord.port(); emit logLine(QString("Resolved server address %1 to %2 with port %3\n").arg( - m_dnsLookup->name(), firstRecord.target(), QString::number(m_port)),MessageLevel::MultiMC); - resolve(firstRecord.target(), m_port); + m_dnsLookup->name(), firstRecord.target(), QString::number(port)),MessageLevel::MultiMC); + resolve(firstRecord.target(), port); } void LookupServerAddress::resolve(const QString &address, quint16 port) diff --git a/api/logic/launch/steps/LookupServerAddress.h b/api/logic/launch/steps/LookupServerAddress.h index 1f70e97b..5a5c3de1 100644 --- a/api/logic/launch/steps/LookupServerAddress.h +++ b/api/logic/launch/steps/LookupServerAddress.h @@ -35,7 +35,6 @@ public: } void setLookupAddress(const QString &lookupAddress); - void setPort(quint16 port); void setOutputAddressPtr(MinecraftServerTargetPtr output); private slots: @@ -46,6 +45,5 @@ private: QDnsLookup *m_dnsLookup; QString m_lookupAddress; - quint16 m_port; MinecraftServerTargetPtr m_output; }; diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp index 54c7f594..abb360f2 100644 --- a/api/logic/minecraft/MinecraftInstance.cpp +++ b/api/logic/minecraft/MinecraftInstance.cpp @@ -859,12 +859,20 @@ shared_qobject_ptr MinecraftInstance::createLaunchTask(AuthSessionPt if (m_settings->get("JoinServerOnLaunch").toBool()) { - // Resolve server address to join on launch - auto *step = new LookupServerAddress(pptr); - step->setLookupAddress(m_settings->get("JoinServerOnLaunchAddress").toString()); - step->setPort(m_settings->get("JoinServerOnLaunchPort").toInt()); - step->setOutputAddressPtr(serverToJoin); - process->appendStep(step); + quint16 port = m_settings->get("JoinServerOnLaunchPort").toInt(); + QString address = m_settings->get("JoinServerOnLaunchAddress").toString(); + + serverToJoin->port = port; + serverToJoin->address = address; + + if(port == 25565) + { + // Resolve server address to join on launch + auto *step = new LookupServerAddress(pptr); + step->setLookupAddress(address); + step->setOutputAddressPtr(serverToJoin); + process->appendStep(step); + } } // run pre-launch command if that's needed diff --git a/application/pages/instance/InstanceSettingsPage.ui b/application/pages/instance/InstanceSettingsPage.ui index 50c3ac6b..eb8ed13a 100644 --- a/application/pages/instance/InstanceSettingsPage.ui +++ b/application/pages/instance/InstanceSettingsPage.ui @@ -39,7 +39,7 @@ QTabWidget::Rounded - 4 + 0 -- cgit From 58ab005f7e22785a47402b17c54880c5b32292db Mon Sep 17 00:00:00 2001 From: Janrupf Date: Sat, 22 May 2021 18:10:17 +0200 Subject: NOISSUE Add missing license header --- api/logic/launch/steps/LookupServerAddress.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'api/logic/launch') diff --git a/api/logic/launch/steps/LookupServerAddress.cpp b/api/logic/launch/steps/LookupServerAddress.cpp index c6ca5bd5..de56c28a 100644 --- a/api/logic/launch/steps/LookupServerAddress.cpp +++ b/api/logic/launch/steps/LookupServerAddress.cpp @@ -1,3 +1,19 @@ +/* Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #include "LookupServerAddress.h" #include -- cgit