|
|
|
@ -28,7 +28,6 @@
@@ -28,7 +28,6 @@
|
|
|
|
|
* Contact : chris@qbittorrent.org |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <QNetworkAccessManager> |
|
|
|
|
#include <QDebug> |
|
|
|
|
#include <QRegExp> |
|
|
|
|
#include <QStringList> |
|
|
|
@ -37,6 +36,8 @@
@@ -37,6 +36,8 @@
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#include "base/logger.h" |
|
|
|
|
#include "base/net/downloadmanager.h" |
|
|
|
|
#include "base/net/downloadhandler.h" |
|
|
|
|
#include "dnsupdater.h" |
|
|
|
|
|
|
|
|
|
using namespace Net; |
|
|
|
@ -76,65 +77,62 @@ DNSUpdater::~DNSUpdater()
@@ -76,65 +77,62 @@ DNSUpdater::~DNSUpdater()
|
|
|
|
|
void DNSUpdater::checkPublicIP() |
|
|
|
|
{ |
|
|
|
|
Q_ASSERT(m_state == OK); |
|
|
|
|
QNetworkAccessManager *manager = new QNetworkAccessManager(this); |
|
|
|
|
connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(ipRequestFinished(QNetworkReply *))); |
|
|
|
|
|
|
|
|
|
DownloadHandler *handler = DownloadManager::instance()->downloadUrl( |
|
|
|
|
"http://checkip.dyndns.org", false, 0, false, |
|
|
|
|
QString("qBittorrent/%1").arg(VERSION)); |
|
|
|
|
connect(handler, SIGNAL(downloadFinished(QString, QByteArray)), SLOT(ipRequestFinished(QString, QByteArray))); |
|
|
|
|
connect(handler, SIGNAL(downloadFailed(QString, QString)), SLOT(ipRequestFailed(QString, QString))); |
|
|
|
|
|
|
|
|
|
m_lastIPCheckTime = QDateTime::currentDateTime(); |
|
|
|
|
QNetworkRequest request; |
|
|
|
|
request.setUrl(QUrl("http://checkip.dyndns.org")); |
|
|
|
|
request.setRawHeader("User-Agent", "qBittorrent/" VERSION); |
|
|
|
|
manager->get(request); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DNSUpdater::ipRequestFinished(QNetworkReply *reply) |
|
|
|
|
void DNSUpdater::ipRequestFinished(const QString &url, const QByteArray &data) |
|
|
|
|
{ |
|
|
|
|
qDebug() << Q_FUNC_INFO; |
|
|
|
|
if (reply->error()) { |
|
|
|
|
// Error
|
|
|
|
|
qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString(); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
// Parse response
|
|
|
|
|
QRegExp ipregex("Current IP Address:\\s+([^<]+)</body>"); |
|
|
|
|
QString ret = reply->readAll(); |
|
|
|
|
if (ipregex.indexIn(ret) >= 0) { |
|
|
|
|
QString ip_str = ipregex.cap(1); |
|
|
|
|
qDebug() << Q_FUNC_INFO << "Regular expression captured the following IP:" << ip_str; |
|
|
|
|
QHostAddress new_ip(ip_str); |
|
|
|
|
if (!new_ip.isNull()) { |
|
|
|
|
if (m_lastIP != new_ip) { |
|
|
|
|
qDebug() << Q_FUNC_INFO << "The IP address changed, report the change to DynDNS..."; |
|
|
|
|
qDebug() << m_lastIP.toString() << "->" << new_ip.toString(); |
|
|
|
|
m_lastIP = new_ip; |
|
|
|
|
updateDNSService(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
qWarning() << Q_FUNC_INFO << "Failed to construct a QHostAddress from the IP string"; |
|
|
|
|
Q_UNUSED(url); |
|
|
|
|
|
|
|
|
|
// Parse response
|
|
|
|
|
QRegExp ipregex("Current IP Address:\\s+([^<]+)</body>"); |
|
|
|
|
if (ipregex.indexIn(data) >= 0) { |
|
|
|
|
QString ipStr = ipregex.cap(1); |
|
|
|
|
qDebug() << Q_FUNC_INFO << "Regular expression captured the following IP:" << ipStr; |
|
|
|
|
QHostAddress newIp(ipStr); |
|
|
|
|
if (!newIp.isNull()) { |
|
|
|
|
if (m_lastIP != newIp) { |
|
|
|
|
qDebug() << Q_FUNC_INFO << "The IP address changed, report the change to DynDNS..."; |
|
|
|
|
qDebug() << m_lastIP.toString() << "->" << newIp.toString(); |
|
|
|
|
m_lastIP = newIp; |
|
|
|
|
updateDNSService(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
qWarning() << Q_FUNC_INFO << "Regular expression failed to capture the IP address"; |
|
|
|
|
qWarning() << Q_FUNC_INFO << "Failed to construct a QHostAddress from the IP string"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Clean up
|
|
|
|
|
reply->deleteLater(); |
|
|
|
|
sender()->deleteLater(); |
|
|
|
|
else { |
|
|
|
|
qWarning() << Q_FUNC_INFO << "Regular expression failed to capture the IP address"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DNSUpdater::ipRequestFailed(const QString &url, const QString &error) |
|
|
|
|
{ |
|
|
|
|
Q_UNUSED(url); |
|
|
|
|
qWarning() << "IP request failed:" << error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DNSUpdater::updateDNSService() |
|
|
|
|
{ |
|
|
|
|
qDebug() << Q_FUNC_INFO; |
|
|
|
|
// Prepare request
|
|
|
|
|
QNetworkAccessManager *manager = new QNetworkAccessManager(this); |
|
|
|
|
connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(ipUpdateFinished(QNetworkReply *))); |
|
|
|
|
|
|
|
|
|
m_lastIPCheckTime = QDateTime::currentDateTime(); |
|
|
|
|
QNetworkRequest request; |
|
|
|
|
request.setUrl(getUpdateUrl()); |
|
|
|
|
request.setRawHeader("User-Agent", "qBittorrent/" VERSION); |
|
|
|
|
manager->get(request); |
|
|
|
|
DownloadHandler *handler = DownloadManager::instance()->downloadUrl( |
|
|
|
|
getUpdateUrl(), false, 0, false, |
|
|
|
|
QString("qBittorrent/%1").arg(VERSION)); |
|
|
|
|
connect(handler, SIGNAL(downloadFinished(QString, QByteArray)), SLOT(ipUpdateFinished(QString, QByteArray))); |
|
|
|
|
connect(handler, SIGNAL(downloadFailed(QString, QString)), SLOT(ipUpdateFailed(QString, QString))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QUrl DNSUpdater::getUpdateUrl() const |
|
|
|
|
QString DNSUpdater::getUpdateUrl() const |
|
|
|
|
{ |
|
|
|
|
QUrl url; |
|
|
|
|
#ifdef QT_NO_OPENSSL |
|
|
|
@ -172,22 +170,20 @@ QUrl DNSUpdater::getUpdateUrl() const
@@ -172,22 +170,20 @@ QUrl DNSUpdater::getUpdateUrl() const
|
|
|
|
|
Q_ASSERT(url.isValid()); |
|
|
|
|
|
|
|
|
|
qDebug() << Q_FUNC_INFO << url.toString(); |
|
|
|
|
return url; |
|
|
|
|
return url.toString(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DNSUpdater::ipUpdateFinished(QNetworkReply *reply) |
|
|
|
|
void DNSUpdater::ipUpdateFinished(const QString &url, const QByteArray &data) |
|
|
|
|
{ |
|
|
|
|
if (reply->error()) { |
|
|
|
|
// Error
|
|
|
|
|
qWarning() << Q_FUNC_INFO << "Error:" << reply->errorString(); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
// Parse reply
|
|
|
|
|
processIPUpdateReply(reply->readAll()); |
|
|
|
|
} |
|
|
|
|
// Clean up
|
|
|
|
|
reply->deleteLater(); |
|
|
|
|
sender()->deleteLater(); |
|
|
|
|
Q_UNUSED(url); |
|
|
|
|
// Parse reply
|
|
|
|
|
processIPUpdateReply(data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DNSUpdater::ipUpdateFailed(const QString &url, const QString &error) |
|
|
|
|
{ |
|
|
|
|
Q_UNUSED(url); |
|
|
|
|
qWarning() << "IP update failed:" << error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DNSUpdater::processIPUpdateReply(const QString &reply) |
|
|
|
@ -196,16 +192,19 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
@@ -196,16 +192,19 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
|
|
|
|
|
qDebug() << Q_FUNC_INFO << reply; |
|
|
|
|
QString code = reply.split(" ").first(); |
|
|
|
|
qDebug() << Q_FUNC_INFO << "Code:" << code; |
|
|
|
|
if (code == "good" || code == "nochg") { |
|
|
|
|
|
|
|
|
|
if ((code == "good") || (code == "nochg")) { |
|
|
|
|
logger->addMessage(tr("Your dynamic DNS was successfully updated."), Log::INFO); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((code == "911") || (code == "dnserr")) { |
|
|
|
|
logger->addMessage(tr("Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes."), Log::CRITICAL); |
|
|
|
|
m_lastIP.clear(); |
|
|
|
|
// It will retry in 30 minutes because the timer was not stopped
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Everything bellow is an error, stop updating until the user updates something
|
|
|
|
|
m_ipCheckTimer.stop(); |
|
|
|
|
m_lastIP.clear(); |
|
|
|
@ -214,23 +213,27 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
@@ -214,23 +213,27 @@ void DNSUpdater::processIPUpdateReply(const QString &reply)
|
|
|
|
|
m_state = INVALID_CREDS; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (code == "badauth") { |
|
|
|
|
logger->addMessage(tr("Dynamic DNS error: Invalid username/password."), Log::CRITICAL); |
|
|
|
|
m_state = INVALID_CREDS; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (code == "badagent") { |
|
|
|
|
logger->addMessage(tr("Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org."), |
|
|
|
|
Log::CRITICAL); |
|
|
|
|
m_state = FATAL; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (code == "!donator") { |
|
|
|
|
logger->addMessage(tr("Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org.").arg("!donator"), |
|
|
|
|
Log::CRITICAL); |
|
|
|
|
m_state = FATAL; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (code == "abuse") { |
|
|
|
|
logger->addMessage(tr("Dynamic DNS error: Your username was blocked due to abuse."), Log::CRITICAL); |
|
|
|
|
m_state = FATAL; |
|
|
|
|