diff options
-rw-r--r-- | src/Net.cpp | 10 | ||||
-rw-r--r-- | src/Net.h | 2 | ||||
-rw-r--r-- | src/murmur/Meta.cpp | 6 | ||||
-rw-r--r-- | src/murmur/Server.cpp | 25 | ||||
-rw-r--r-- | src/murmur/Server.h | 2 |
5 files changed, 30 insertions, 15 deletions
diff --git a/src/Net.cpp b/src/Net.cpp index 0cbadedd9..43dc69bbc 100644 --- a/src/Net.cpp +++ b/src/Net.cpp @@ -117,6 +117,16 @@ quint32 qHash(const HostAddress &ha) { return (ha.hash[0] ^ ha.hash[1] ^ ha.hash[2] ^ ha.hash[3]); } +QString HostAddress::toString() const { + if (isV6()) { + QString qs; + qs.sprintf("[%x:%x:%x:%x:%x:%x:%x:%x]", ntohs(shorts[0]), ntohs(shorts[1]), ntohs(shorts[2]), ntohs(shorts[3]), ntohs(shorts[4]), ntohs(shorts[5]), ntohs(shorts[6]), ntohs(shorts[7])); + return qs.replace(QRegExp(QLatin1String("(:0)+")),QLatin1String(":")); + } else { + return QHostAddress(ntohl(hash[3])).toString(); + } +} + bool Ban::operator <(const Ban &other) const { return haAddress < other.haAddress; } @@ -54,6 +54,8 @@ struct HostAddress { bool operator == (const HostAddress &) const; bool match(const HostAddress &, int) const; + + QString toString() const; std::string toStdString() const; QHostAddress toAddress() const; diff --git a/src/murmur/Meta.cpp b/src/murmur/Meta.cpp index a6ac9f978..6c2a1d6d4 100644 --- a/src/murmur/Meta.cpp +++ b/src/murmur/Meta.cpp @@ -53,7 +53,7 @@ MetaParams::MetaParams() { qsDBusService = "net.sourceforge.mumble.murmur"; qsDBDriver = "QSQLITE"; qsLogfile = "murmur.log"; - qhaBind = QHostAddress(QHostAddress::Any); + qhaBind = QHostAddress(QHostAddress::AnyIPv6); iLogDays = 31; @@ -129,12 +129,12 @@ void MetaParams::read(QString fname) { if (! qhaBind.setAddress(qsHost)) { QHostInfo hi = QHostInfo::fromName(qsHost); foreach(QHostAddress qha, hi.addresses()) { - if (qha.protocol() == QAbstractSocket::IPv4Protocol) { + if ((qha.protocol() == QAbstractSocket::IPv4Protocol) || (qha.protocol() == QAbstractSocket::IPv6Protocol)) { qhaBind = qha; break; } } - if ((qhaBind == QHostAddress::Any) || (qhaBind.isNull())) { + if ((qhaBind == QHostAddress::AnyIPv6) || (qhaBind.isNull())) { qFatal("Lookup of bind hostname %s failed", qPrintable(qsHost)); } diff --git a/src/murmur/Server.cpp b/src/murmur/Server.cpp index cfe4b9b15..378b80b2e 100644 --- a/src/murmur/Server.cpp +++ b/src/murmur/Server.cpp @@ -219,12 +219,12 @@ void Server::readParams() { if (! qhaBind.setAddress(qsHost)) { QHostInfo hi = QHostInfo::fromName(qsHost); foreach(QHostAddress qha, hi.addresses()) { - if (qha.protocol() == QAbstractSocket::IPv4Protocol) { + if ((qha.protocol() == QAbstractSocket::IPv4Protocol) || (qha.protocol() == QAbstractSocket::IPv6Protocol)) { qhaBind = qha; break; } } - if ((qhaBind == QHostAddress::Any) || (qhaBind.isNull())) { + if ((qhaBind == QHostAddress::AnyIPv6) || (qhaBind.isNull())) { log(QString("Lookup of bind hostname %1 failed").arg(qsHost)); qhaBind = Meta::mp.qhaBind; } @@ -652,7 +652,7 @@ void Server::newClient() { QHostAddress adr = sock->peerAddress(); if (meta->banCheck(adr)) { - log(QString("Ignoring connection: %1:%2 (Global ban)").arg(addressToString(sock->peerAddress())).arg(sock->peerPort())); + log(QString("Ignoring connection: %1 (Global ban)").arg(addressToString(sock->peerAddress(), sock->peerPort()))); sock->disconnectFromHost(); sock->deleteLater(); return; @@ -662,7 +662,7 @@ void Server::newClient() { foreach(const Ban &ban, qlBans) { if (ban.haAddress.match(ha, ban.iMask)) { - log(QString("Ignoring connection: %1:%2 (Server ban)").arg(addressToString(sock->peerAddress())).arg(sock->peerPort())); + log(QString("Ignoring connection: %1 (Server ban)").arg(addressToString(sock->peerAddress(), sock->peerPort()))); sock->disconnectFromHost(); sock->deleteLater(); return; @@ -697,7 +697,7 @@ void Server::newClient() { connect(u, SIGNAL(handleSslErrors(const QList<QSslError> &)), this, SLOT(sslError(const QList<QSslError> &))); connect(u, SIGNAL(encrypted()), this, SLOT(encrypted())); - log(u, QString("New connection: %1:%2").arg(addressToString(sock->peerAddress())).arg(sock->peerPort())); + log(u, QString("New connection: %1").arg(addressToString(sock->peerAddress(), sock->peerPort()))); u->setToS(); @@ -1003,14 +1003,17 @@ void Server::clearACLCache(User *p) { } } -QString Server::addressToString(const QHostAddress &adr) { - if (Meta::mp.iObfuscate == 0) - return adr.toString(); +QString Server::addressToString(const QHostAddress &adr, unsigned short port) { + HostAddress ha(adr); - quint32 num = adr.toIPv4Address() ^ Meta::mp.iObfuscate; + if ((Meta::mp.iObfuscate != 0) && adr.protocol() == QAbstractSocket::IPv4Protocol) { + quint32 num = adr.toIPv4Address() ^ Meta::mp.iObfuscate; - QHostAddress n(num); - return n.toString(); + QHostAddress n(num); + ha = HostAddress(n); + } + QString p = QString::number(port); + return QString("%1:%2").arg(ha.toString(), p); } bool Server::validateUserName(const QString &name) { diff --git a/src/murmur/Server.h b/src/murmur/Server.h index ba0359389..51cd8c9ad 100644 --- a/src/murmur/Server.h +++ b/src/murmur/Server.h @@ -253,7 +253,7 @@ class Server : public QThread { void setLiveConf(const QString &key, const QString &value); - QString addressToString(const QHostAddress &); + QString addressToString(const QHostAddress &, unsigned short port); void log(const QString &); void log(ServerUser *u, const QString &); |