Fix duplicated server uuid and update debug operators

This commit is contained in:
Simon Stürz 2023-02-24 00:43:17 +01:00
parent b20e6e28f9
commit 06e8457744
18 changed files with 179 additions and 100 deletions

View File

@ -155,7 +155,7 @@ int main(int argc, char *argv[])
QLoggingCategory::installFilter(loggingCategoryFilter);
if (!parser.isSet(tokenOption)) {
qCCritical(dcProxyClient()) << "Please specify the token for authentication using -t <token> or --token <token>." << endl << endl;
qCCritical(dcProxyClient()) << "Please specify the token for authentication using -t <token> or --token <token>." << "\n" << "\n";
parser.showHelp(-1);
}

View File

@ -197,13 +197,13 @@ void AuthenticationProcess::onProcessFinished(int exitCode, QProcess::ExitStatus
{
qCDebug(dcAuthenticationProcess()) << "Authentication process finished (" << m_processTimer.elapsed() << "[ms] )";;
if (exitStatus == QProcess::CrashExit) {
qCWarning(dcAuthenticationProcess()) << "Authentication process crashed:" << endl << qUtf8Printable(m_process->readAll());
qCWarning(dcAuthenticationProcess()) << "Authentication process crashed:" << "\n" << qUtf8Printable(m_process->readAll());
emit authenticationFinished(Authenticator::AuthenticationErrorProxyError);
return;
}
if (exitCode != 0) {
qCWarning(dcAuthenticationProcess()) << "The authentication process finished with error" << exitCode << endl << qUtf8Printable(m_process->readAll());
qCWarning(dcAuthenticationProcess()) << "The authentication process finished with error" << exitCode << "\n" << qUtf8Printable(m_process->readAll());
emit authenticationFinished(Authenticator::AuthenticationErrorProxyError);
return;
}

View File

@ -60,9 +60,9 @@ void SigV4Utils::signRequest(QNetworkAccessManager::Operation operation, QNetwor
}
QByteArray canonicalRequest = SigV4Utils::getCanonicalRequest(operation, request, payload);
qCDebug(dcAuthenticationProcess()) << "canonical request:" << endl << qUtf8Printable(canonicalRequest);
qCDebug(dcAuthenticationProcess()) << "canonical request:" << "\n" << qUtf8Printable(canonicalRequest);
QByteArray stringToSign = SigV4Utils::getStringToSign(canonicalRequest, dateTime, region.toUtf8(), service.toUtf8());
qCDebug(dcAuthenticationProcess()) << "string to sign:" << endl << qUtf8Printable(stringToSign);
qCDebug(dcAuthenticationProcess()) << "string to sign:" << "\n" << qUtf8Printable(stringToSign);
QByteArray signature = SigV4Utils::getSignature(stringToSign, secretAccessKey, dateTime, region, service);
qCDebug(dcAuthenticationProcess()) << "signature:" << signature;
QByteArray authorizeHeader = SigV4Utils::getAuthorizationHeader(accessKeyId, dateTime, region, service, request, signature);

View File

@ -68,10 +68,11 @@ bool UserInformation::isValid()
QDebug operator<<(QDebug debug, const UserInformation &userInformation)
{
QDebugStateSaver saver(debug);
debug.nospace() << "UserInformation(" << userInformation.email();
debug.nospace() << ", cognito:" << userInformation.cognitoUsername() << ") ";
debug.nospace() << ", vendor" << userInformation.vendorId() << ") ";
debug.nospace() << ", userpool" << userInformation.userPoolId() << ") ";
debug.nospace() << ", userpool" << userInformation.userPoolId() << ")";
return debug;
}

View File

@ -60,7 +60,7 @@ void LogEngine::logTunnel(const TunnelConnection &tunnel)
logString << QString::number(tunnel.clientOne()->rxDataCount() + tunnel.clientOne()->txDataCount());
QTextStream textStream(&m_tunnelsFile);
textStream << logString.join(" ") << endl;
textStream << logString.join(" ") << "\n";
}
void LogEngine::logStatistics(int tunnelCount, int connectionCount, int troughput)
@ -76,7 +76,7 @@ void LogEngine::logStatistics(int tunnelCount, int connectionCount, int troughpu
logString << QString::number(troughput);
QTextStream textStream(&m_statisticsFile);
textStream << logString.join(" ") << endl;
textStream << logString.join(" ") << "\n";
// Check if we have to rotate the logfile
if (m_currentDay != QDateTime::currentDateTimeUtc().date().day()) {

View File

@ -145,6 +145,7 @@ QList<QByteArray> ProxyClient::processData(const QByteArray &data)
QDebug operator<<(QDebug debug, ProxyClient *proxyClient)
{
QDebugStateSaver saver(debug);
debug.nospace() << "ProxyClient(";
if (!proxyClient->name().isEmpty()) {
debug.nospace() << proxyClient->name() << ", ";
@ -154,7 +155,7 @@ QDebug operator<<(QDebug debug, ProxyClient *proxyClient)
debug.nospace() << ", " << proxyClient->userName();
debug.nospace() << ", " << proxyClient->peerAddress().toString();
debug.nospace() << ", " << proxyClient->creationTimeString() << ")";
return debug.space();
return debug;
}
}

View File

@ -106,9 +106,10 @@ bool TunnelConnection::isValid() const
QDebug operator<<(QDebug debug, const TunnelConnection &tunnel)
{
debug.nospace() << "TunnelConnection(" << tunnel.creationTimeString() << ")" << endl;
debug.nospace() << " --> " << tunnel.clientOne() << endl;
debug.nospace() << " --> " << tunnel.clientTwo() << endl;
QDebugStateSaver saver(debug);
debug.nospace() << "TunnelConnection(" << tunnel.creationTimeString() << ")\n";
debug.nospace() << " --> " << tunnel.clientOne() << "\n";
debug.nospace() << " --> " << tunnel.clientTwo() << "\n";
return debug;
}

View File

@ -419,60 +419,61 @@ void ProxyConfiguration::setTcpServerTunnelProxyPort(quint16 port)
QDebug operator<<(QDebug debug, ProxyConfiguration *configuration)
{
debug.nospace() << endl << "========== ProxyConfiguration ==========" << endl;
debug.nospace() << "Configuration file:" << configuration->fileName() << endl;
debug.nospace() << "RemoteProxy configuration" << endl;
debug.nospace() << " - Server name:" << configuration->serverName() << endl;
debug.nospace() << " - Write logfile:" << configuration->writeLogFile() << endl;
debug.nospace() << " - Logfile:" << configuration->logFileName() << endl;
debug.nospace() << " - Log engine enabled:" << configuration->logEngineEnabled() << endl;
debug.nospace() << " - JSON RPC timeout:" << configuration->jsonRpcTimeout() << " [ms]" << endl;
debug.nospace() << " - Authentication timeout:" << configuration->authenticationTimeout() << " [ms]" << endl;
debug.nospace() << " - Inactive timeout:" << configuration->inactiveTimeout() << " [ms]" << endl;
debug.nospace() << " - Alone timeout:" << configuration->aloneTimeout() << " [ms]" << endl;
debug.nospace() << "SSL configuration" << endl;
debug.nospace() << " - Enabled:" << configuration->sslEnabled() << endl;
debug.nospace() << " - Certificate:" << configuration->sslCertificateFileName() << endl;
debug.nospace() << " - Certificate key:" << configuration->sslCertificateKeyFileName() << endl;
debug.nospace() << " - Certificate chain:" << configuration->sslCertificateChainFileName() << endl;
debug.nospace() << " - SSL certificate information:" << endl;
debug.nospace() << " Common name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::CommonName) << endl;
debug.nospace() << " Organisation:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::Organization) << endl;
debug.nospace() << " Organisation unit name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::OrganizationalUnitName) << endl;
debug.nospace() << " Country name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::CountryName) << endl;
debug.nospace() << " Locality name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::LocalityName) << endl;
debug.nospace() << " State/Province:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::StateOrProvinceName) << endl;
debug.nospace() << " Email address:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::EmailAddress) << endl;
debug.nospace() << " - SSL certificate issuer information:" << endl;
debug.nospace() << " Common name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::CommonName) << endl;
debug.nospace() << " Organisation:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::Organization) << endl;
debug.nospace() << " Organisation unit name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::OrganizationalUnitName) << endl;
debug.nospace() << " Country name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::CountryName) << endl;
debug.nospace() << " Locality name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::LocalityName) << endl;
debug.nospace() << " State/Province:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::StateOrProvinceName) << endl;
debug.nospace() << " Email address:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::EmailAddress) << endl;
QDebugStateSaver saver(debug);
debug.nospace() << "\n" << "========== ProxyConfiguration ==========" << "\n";
debug.nospace() << "Configuration file:" << configuration->fileName() << "\n";
debug.nospace() << "RemoteProxy configuration" << "\n";
debug.nospace() << " - Server name:" << configuration->serverName() << "\n";
debug.nospace() << " - Write logfile:" << configuration->writeLogFile() << "\n";
debug.nospace() << " - Logfile:" << configuration->logFileName() << "\n";
debug.nospace() << " - Log engine enabled:" << configuration->logEngineEnabled() << "\n";
debug.nospace() << " - JSON RPC timeout:" << configuration->jsonRpcTimeout() << " [ms]" << "\n";
debug.nospace() << " - Authentication timeout:" << configuration->authenticationTimeout() << " [ms]" << "\n";
debug.nospace() << " - Inactive timeout:" << configuration->inactiveTimeout() << " [ms]" << "\n";
debug.nospace() << " - Alone timeout:" << configuration->aloneTimeout() << " [ms]" << "\n";
debug.nospace() << "SSL configuration" << "\n";
debug.nospace() << " - Enabled:" << configuration->sslEnabled() << "\n";
debug.nospace() << " - Certificate:" << configuration->sslCertificateFileName() << "\n";
debug.nospace() << " - Certificate key:" << configuration->sslCertificateKeyFileName() << "\n";
debug.nospace() << " - Certificate chain:" << configuration->sslCertificateChainFileName() << "\n";
debug.nospace() << " - SSL certificate information:" << "\n";
debug.nospace() << " Common name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::CommonName) << "\n";
debug.nospace() << " Organisation:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::Organization) << "\n";
debug.nospace() << " Organisation unit name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::OrganizationalUnitName) << "\n";
debug.nospace() << " Country name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::CountryName) << "\n";
debug.nospace() << " Locality name:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::LocalityName) << "\n";
debug.nospace() << " State/Province:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::StateOrProvinceName) << "\n";
debug.nospace() << " Email address:" << configuration->sslConfiguration().localCertificate().subjectInfo(QSslCertificate::EmailAddress) << "\n";
debug.nospace() << " - SSL certificate issuer information:" << "\n";
debug.nospace() << " Common name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::CommonName) << "\n";
debug.nospace() << " Organisation:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::Organization) << "\n";
debug.nospace() << " Organisation unit name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::OrganizationalUnitName) << "\n";
debug.nospace() << " Country name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::CountryName) << "\n";
debug.nospace() << " Locality name:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::LocalityName) << "\n";
debug.nospace() << " State/Province:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::StateOrProvinceName) << "\n";
debug.nospace() << " Email address:" << configuration->sslConfiguration().localCertificate().issuerInfo(QSslCertificate::EmailAddress) << "\n";
if (configuration->proxyEnabled()) {
debug.nospace() << "AWS configuration" << endl;
debug.nospace() << " - Region:" << configuration->awsRegion() << endl;
debug.nospace() << " - Authorizer lambda function:" << configuration->awsAuthorizerLambdaFunctionName() << endl;
debug.nospace() << " - Credentials URL:" << configuration->awsCredentialsUrl().toString() << endl;
debug.nospace() << "WebSocketServer Proxy" << endl;
debug.nospace() << " - Host:" << configuration->webSocketServerProxyHost().toString() << endl;
debug.nospace() << " - Port:" << configuration->webSocketServerProxyPort() << endl;
debug.nospace() << "TcpServer Proxy" << endl;
debug.nospace() << " - Host:" << configuration->tcpServerHost().toString() << endl;
debug.nospace() << " - Port:" << configuration->tcpServerPort() << endl;
debug.nospace() << "UnixSocketServer Proxy" << endl;
debug.nospace() << " - Filename:" << configuration->unixSocketFileName() << endl;
debug.nospace() << "AWS configuration" << "\n";
debug.nospace() << " - Region:" << configuration->awsRegion() << "\n";
debug.nospace() << " - Authorizer lambda function:" << configuration->awsAuthorizerLambdaFunctionName() << "\n";
debug.nospace() << " - Credentials URL:" << configuration->awsCredentialsUrl().toString() << "\n";
debug.nospace() << "WebSocketServer Proxy" << "\n";
debug.nospace() << " - Host:" << configuration->webSocketServerProxyHost().toString() << "\n";
debug.nospace() << " - Port:" << configuration->webSocketServerProxyPort() << "\n";
debug.nospace() << "TcpServer Proxy" << "\n";
debug.nospace() << " - Host:" << configuration->tcpServerHost().toString() << "\n";
debug.nospace() << " - Port:" << configuration->tcpServerPort() << "\n";
debug.nospace() << "UnixSocketServer Proxy" << "\n";
debug.nospace() << " - Filename:" << configuration->unixSocketFileName() << "\n";
} else {
debug.nospace() << "Proxy Server: disabled" << endl;
debug.nospace() << "Proxy Server: disabled" << "\n";
}
debug.nospace() << "WebSocketServer TunnelProxy" << endl;
debug.nospace() << " - Host:" << configuration->webSocketServerTunnelProxyHost().toString() << endl;
debug.nospace() << " - Port:" << configuration->webSocketServerTunnelProxyPort() << endl;
debug.nospace() << "TcpServer TunnelProxy" << endl;
debug.nospace() << " - Host:" << configuration->tcpServerTunnelProxyHost().toString() << endl;
debug.nospace() << " - Port:" << configuration->tcpServerTunnelProxyPort() << endl;
debug.nospace() << "WebSocketServer TunnelProxy" << "\n";
debug.nospace() << " - Host:" << configuration->webSocketServerTunnelProxyHost().toString() << "\n";
debug.nospace() << " - Port:" << configuration->webSocketServerTunnelProxyPort() << "\n";
debug.nospace() << "TcpServer TunnelProxy" << "\n";
debug.nospace() << " - Host:" << configuration->tcpServerTunnelProxyHost().toString() << "\n";
debug.nospace() << " - Port:" << configuration->tcpServerTunnelProxyPort() << "\n";
debug.nospace() << "========== ProxyConfiguration ==========";
return debug;
}

View File

@ -160,8 +160,6 @@ void TcpSocketServer::onSocketDisconnected(QSslSocket *client)
emit clientDisconnected(clientId);
}
SslServer::SslServer(bool sslEnabled, const QSslConfiguration &config, QObject *parent) :
QTcpServer(parent),
m_sslEnabled(sslEnabled),
@ -173,13 +171,8 @@ SslServer::SslServer(bool sslEnabled, const QSslConfiguration &config, QObject *
connect(this, &QTcpServer::newConnection, this, [this](){
while (hasPendingConnections()) {
QSslSocket *sslSocket = qobject_cast<QSslSocket *>(nextPendingConnection());
if (m_sslEnabled) {
if (sslSocket->isEncrypted()) {
qCDebug(dcTcpSocketServer()) << "SSL encryption established for" << sslSocket;
emit socketConnected(sslSocket);
}
} else {
SslClient *sslSocket = qobject_cast<SslClient *>(nextPendingConnection());
if (!m_sslEnabled) {
emit socketConnected(sslSocket);
}
}
@ -188,7 +181,7 @@ SslServer::SslServer(bool sslEnabled, const QSslConfiguration &config, QObject *
void SslServer::incomingConnection(qintptr socketDescriptor)
{
QSslSocket *sslSocket = new QSslSocket(this);
SslClient *sslSocket = new SslClient(this);
qCDebug(dcTcpSocketServer()) << "New incomming connection. Creating" << sslSocket;
if (!sslSocket->setSocketDescriptor(socketDescriptor)) {
qCWarning(dcTcpSocketServer()) << "Failed to set SSL socket descriptor" << sslSocket << "Discard connection...";
@ -196,39 +189,73 @@ void SslServer::incomingConnection(qintptr socketDescriptor)
return;
}
connect(sslSocket, &QSslSocket::disconnected, this, [this, sslSocket](){
connect(sslSocket, &SslClient::disconnected, this, [this, sslSocket](){
qCDebug(dcTcpSocketServer()) << "Client socket disconnected:" << sslSocket << sslSocket->peerAddress().toString();;
emit socketDisconnected(sslSocket);
if (sslSocket->isEncrypted()) {
emit socketDisconnected(sslSocket);
}
m_clients.removeAll(sslSocket);
qCDebug(dcTcpSocketServer()) << "SSL server client count" << m_clients.count();
sslSocket->deleteLater();
});
typedef void (QAbstractSocket:: *errorSignal)(QAbstractSocket::SocketError);
connect(sslSocket, static_cast<errorSignal>(&QAbstractSocket::error), this, [sslSocket](QAbstractSocket::SocketError error){
qCWarning(dcTcpSocketServer()) << "Socket error occurred on" << sslSocket << error << sslSocket->errorString() << "Explicitly closing the socket connection.";
sslSocket->abort();
connect(sslSocket, &QSslSocket::readyRead, this, [this, sslSocket](){
if (sslSocket->isEncrypted()) {
QByteArray data = sslSocket->readAll();
qCDebug(dcTcpSocketServerTraffic()) << "Data from socket" << sslSocket->peerAddress().toString() << data;
emit dataAvailable(sslSocket, data);
}
});
connect(sslSocket, &QSslSocket::encrypted, this, [this, sslSocket](){
connect(sslSocket, &SslClient::encrypted, this, [this, sslSocket](){
qCDebug(dcTcpSocketServer()) << "SSL encryption established for" << sslSocket;
emit socketConnected(sslSocket);
});
connect(sslSocket, QOverload<const QList<QSslError> &>::of(&QSslSocket::sslErrors), this, [=](const QList<QSslError> &errors){
typedef void (QAbstractSocket:: *errorSignal)(QAbstractSocket::SocketError);
connect(sslSocket, static_cast<errorSignal>(&QAbstractSocket::error), this, [sslSocket](QAbstractSocket::SocketError error){
qCWarning(dcTcpSocketServer()) << "Socket error occurred on" << sslSocket << error << sslSocket->errorString() << "Explicitly closing the client connection.";
sslSocket->close();
});
typedef void (QSslSocket:: *sslErrorsSignal)(const QList<QSslError> &);
connect(sslSocket, static_cast<sslErrorsSignal>(&QSslSocket::sslErrors), this, [sslSocket](const QList<QSslError> &errors) {
qCWarning(dcTcpSocketServer()) << "SSL error occurred in the client connection" << sslSocket;
foreach (const QSslError &error, errors) {
qCWarning(dcTcpSocketServer()) << "SSL error:" << error.error() << error.errorString();
qCWarning(dcTcpSocketServer()) << "--> SSL error:" << error.error() << error.errorString();
}
});
if (m_sslEnabled) {
qCDebug(dcTcpSocketServer()) << "Start SSL encryption for" << sslSocket;
qCDebug(dcTcpSocketServer()) << "Starting SSL encryption for" << sslSocket;
sslSocket->setSslConfiguration(m_config);
sslSocket->startServerEncryption();
sslSocket->startWaitingForEncrypted();
}
m_clients.append(sslSocket);
qCDebug(dcTcpSocketServer()) << "SSL server client count" << m_clients.count();
addPendingConnection(sslSocket);
}
SslClient::SslClient(QObject *parent) :
QSslSocket(parent)
{
m_timer.setSingleShot(true);
m_timer.setInterval(5000);
connect(&m_timer, &QTimer::timeout, this, [this](){
qCWarning(dcTcpSocketServer()) << "SSL socket timeout occurred. The client has not encrypted the connection within" << (m_timer.interval() / 1000) << "seconds. Terminate connection";
close();
});
connect(this, &SslClient::encrypted, &m_timer, &QTimer::stop);
}
void SslClient::startWaitingForEncrypted()
{
m_timer.start();
}
}

View File

@ -29,6 +29,7 @@
#define TCPSOCKETSERVER_H
#include <QUuid>
#include <QTimer>
#include <QObject>
#include <QTcpServer>
#include <QSslConfiguration>
@ -37,6 +38,20 @@
namespace remoteproxy {
class SslClient: public QSslSocket
{
Q_OBJECT
public:
explicit SslClient(QObject *parent = nullptr);
void startWaitingForEncrypted();
private:
QTimer m_timer;
};
class SslServer: public QTcpServer
{
Q_OBJECT
@ -56,6 +71,8 @@ private:
bool m_sslEnabled = false;
QSslConfiguration m_config;
QVector<SslClient *> m_clients;
};

View File

@ -85,13 +85,14 @@ void TunnelProxyClient::makeClientActive()
QDebug operator<<(QDebug debug, TunnelProxyClient *tunnelProxyClient)
{
QDebugStateSaver saver(debug);
debug.nospace() << "TunnelProxyClient(";
debug.nospace() << tunnelProxyClient->name() << ", ";
debug.nospace() << tunnelProxyClient->interface()->serverName()<< ", ";
debug.nospace() << tunnelProxyClient->clientId().toString()<< ", ";
debug.nospace() << tunnelProxyClient->peerAddress().toString() << ", ";
debug.nospace() << tunnelProxyClient->creationTimeString() << ")";
return debug.space();
return debug;
}
}

View File

@ -88,12 +88,13 @@ void TunnelProxyClientConnection::setSocketAddress(quint16 socketAddress)
QDebug operator<<(QDebug debug, TunnelProxyClientConnection *clientConnection)
{
QDebugStateSaver saver(debug);
debug.nospace() << "TunnelProxyClientConnection(";
debug.nospace() << clientConnection->clientName() << ", ";
debug.nospace() << clientConnection->clientUuid().toString() << ", ";
debug.nospace() << "server: " << clientConnection->serverUuid().toString() << ", ";
debug.nospace() << clientConnection->transportClient() << ")";
return debug.space();
return debug;
}
}

View File

@ -85,7 +85,7 @@ TunnelProxyServer::TunnelProxyError TunnelProxyServer::registerServer(const QUui
{
qCDebug(dcTunnelProxyServer()) << "Register new server" << m_proxyClients.value(clientId) << serverName << serverUuid.toString();
// Check if requested already as client
// Make sure we have a proxy client for this id
TunnelProxyClient *tunnelProxyClient = m_proxyClients.value(clientId);
if (!tunnelProxyClient) {
qCWarning(dcTunnelProxyServer()) << "There is no client with client uuid" << clientId.toString();
@ -99,8 +99,22 @@ TunnelProxyServer::TunnelProxyError TunnelProxyServer::registerServer(const QUui
return TunnelProxyServer::TunnelProxyErrorAlreadyRegistered;
}
// Make sure there is no server trying to make multiple server tunnel connections. We allow only one
if (m_tunnelProxyServerConnections.contains(serverUuid)) {
qCWarning(dcTunnelProxyServer()) << "Client tried to register as server" << tunnelProxyClient << "but there is already a server registered with this server uuid:" << serverUuid.toString();
tunnelProxyClient->killConnectionAfterResponse("Already registered");
return TunnelProxyServer::TunnelProxyErrorAlreadyRegistered;
}
// Also make sure this uuid has not been alreay used for any client connections...
if (m_tunnelProxyClientConnections.contains(serverUuid)) {
qCWarning(dcTunnelProxyServer()) << "Client tried to register as server" << tunnelProxyClient << "but there is already a client connection using this server uuid:" << serverUuid.toString();
tunnelProxyClient->killConnectionAfterResponse("UUID cross registeration");
return TunnelProxyServer::TunnelProxyErrorAlreadyRegistered;
}
// This client has been registered successfully.
// Make sure it does not get disconnected any more because due to inactivity.
// Make sure it does not get disconnected any more because of inactivity.
tunnelProxyClient->makeClientActive();
tunnelProxyClient->setType(TunnelProxyClient::TypeServer);
@ -116,8 +130,9 @@ TunnelProxyServer::TunnelProxyError TunnelProxyServer::registerServer(const QUui
qCDebug(dcTunnelProxyServer()) << "New server connection registered successfully" << serverConnection;
// For debugging
qCDebug(dcTunnelProxyServer()) << "####" << "Total clients" << m_proxyClients.count() << "JSON RPC clients" << m_jsonRpcServer->registeredClientCount() << "interface connections" << tunnelProxyClient->interface()->connectionsCount()
<< "Servers" << m_tunnelProxyServerConnections.count() << "Clients" << m_tunnelProxyClientConnections.count();
qCDebug(dcTunnelProxyServer()) << "#### Total clients:" << m_proxyClients.count() << "JSON RPC clients:" << m_jsonRpcServer->registeredClientCount()
<< "Interface connections:" << tunnelProxyClient->interface()->connectionsCount()
<< "Servers:" << m_tunnelProxyServerConnections.count() << "Clients:" << m_tunnelProxyClientConnections.count();
return TunnelProxyServer::TunnelProxyErrorNoError;
}
@ -143,6 +158,14 @@ TunnelProxyServer::TunnelProxyError TunnelProxyServer::registerClient(const QUui
return TunnelProxyServer::TunnelProxyErrorAlreadyRegistered;
}
// Also make sure this uuid has not been alreay used for any client connections...
if (m_tunnelProxyServerConnections.contains(clientUuid)) {
qCWarning(dcTunnelProxyServer()) << "Client tried to register as client" << tunnelProxyClient << "but there is already a server connection using this client uuid:" << clientUuid.toString();
tunnelProxyClient->killConnectionAfterResponse("UUID cross registeration");
return TunnelProxyServer::TunnelProxyErrorAlreadyRegistered;
}
// Get the desired server connection
TunnelProxyServerConnection *serverConnection = m_tunnelProxyServerConnections.value(serverUuid);
if (!serverConnection) {
@ -160,7 +183,7 @@ TunnelProxyServer::TunnelProxyError TunnelProxyServer::registerClient(const QUui
tunnelProxyClient->setUuid(clientUuid);
tunnelProxyClient->setName(clientName);
TunnelProxyClientConnection *clientConnection = new TunnelProxyClientConnection(tunnelProxyClient, clientUuid, clientName, tunnelProxyClient);
TunnelProxyClientConnection *clientConnection = new TunnelProxyClientConnection(tunnelProxyClient, clientUuid, clientName, this);
clientConnection->setServerConnection(serverConnection);
m_tunnelProxyClientConnections.insert(clientUuid, clientConnection);
@ -291,9 +314,15 @@ void TunnelProxyServer::tick()
}
void TunnelProxyServer::onClientConnected(const QUuid &clientId, const QHostAddress &address)
{
{
TransportInterface *interface = static_cast<TransportInterface *>(sender());
qCDebug(dcTunnelProxyServer()) << "New client connected" << interface->serverName() << clientId.toString() << address.toString();
qCDebug(dcTunnelProxyServer()) << "New client connected" << interface->serverName() << address.toString() << clientId.toString();
if (m_proxyClients.contains(clientId)) {
qCWarning(dcTunnelProxyServer()) << "Internal error. A client with clientId" << clientId.toString() << "has already connected before. Terminate new connection.";
interface->killClientConnection(clientId, "Internal server error");
return;
}
TunnelProxyClient *tunnelProxyClient = new TunnelProxyClient(interface, clientId, address, this);
m_proxyClients.insert(clientId, tunnelProxyClient);
@ -308,8 +337,6 @@ void TunnelProxyServer::onClientConnected(const QUuid &clientId, const QHostAddr
void TunnelProxyServer::onClientDisconnected(const QUuid &clientId)
{
TransportInterface *interface = static_cast<TransportInterface *>(sender());
qCDebug(dcTunnelProxyServer()) << "Client disconnected" << interface->serverName() << clientId.toString();
TunnelProxyClient *tunnelProxyClient = m_proxyClients.take(clientId);
if (!tunnelProxyClient) {
qCWarning(dcTunnelProxyServer()) << "Unknown client disconnected from proxy server." << clientId.toString();
@ -321,6 +348,7 @@ void TunnelProxyServer::onClientDisconnected(const QUuid &clientId)
if (!serverConnection) {
qCWarning(dcTunnelProxyServer()) << "Could not find server connection for disconnected tunnel proxy client claiming to be a server.";
} else {
qCDebug(dcTunnelProxyServer()) << "Server connection disconnected" << interface->serverName() << clientId.toString();
foreach (TunnelProxyClientConnection *clientConnection, serverConnection->clientConnections()) {
serverConnection->unregisterClientConnection(clientConnection);
clientConnection->transportClient()->killConnection("Server disconnected");

View File

@ -100,11 +100,12 @@ quint16 TunnelProxyServerConnection::getFreeAddress()
QDebug operator<<(QDebug debug, TunnelProxyServerConnection *serverConnection)
{
QDebugStateSaver saver(debug);
debug.nospace() << "TunnelProxyServerConnection(";
debug.nospace() << serverConnection->serverName() << ", ";
debug.nospace() << serverConnection->serverUuid().toString() << ", ";
debug.nospace() << serverConnection->transportClient() << ")";
return debug.space();
return debug;
}
}

View File

@ -91,12 +91,13 @@ void TunnelProxySocket::setDisconnected()
QDebug operator<<(QDebug debug, TunnelProxySocket *tunnelProxySocket)
{
QDebugStateSaver saver(debug);
debug.nospace() << "TunnelProxySocket(";
debug.nospace() << tunnelProxySocket->clientName() << ", ";
debug.nospace() << tunnelProxySocket->clientUuid().toString() << ", ";
debug.nospace() << tunnelProxySocket->clientPeerAddress().toString() << ", ";
debug.nospace() << tunnelProxySocket->socketAddress() << ")";
return debug.space();
return debug;
}
}

View File

@ -94,7 +94,7 @@ static void consoleLogHandler(QtMsgType type, const QMessageLogContext& context,
if (s_logFile.isOpen()) {
QTextStream textStream(&s_logFile);
textStream << messageString << endl;
textStream << messageString << "\n";
}
}

View File

@ -1,7 +1,7 @@
#!/bin/bash
CHILD_PROCESSES=()
SERVER_URL=tcp://127.0.0.1:2213
SERVER_URL=ssl://127.0.0.1:2213
SERVER_COUNTER=0
CLIENT_COUNTER=0

View File

@ -441,7 +441,6 @@ void RemoteProxyTestsTunnelProxy::registerClientDuplicated()
addDebugCategory("TunnelProxyServer.debug=true");
addDebugCategory("JsonRpcTraffic.debug=true");
// Create the server and keep it up
QString serverName = "creative server name";
QUuid serverUuid = QUuid::createUuid();