void SslServer::encrypted() { QSslSocket *socket = qobject_cast<QSslSocket*>(sender()); if (!socket) return; connect(socket, &QSslSocket::readyRead, this, &SslServer::readyReadPrivate); QHostAddress host = socket->peerAddress(); DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "Connected with encryption!"); }
QString QXmppIncomingServerPrivate::origin() const { QSslSocket *socket = q->socket(); if (socket) return socket->peerAddress().toString() + " " + QString::number(socket->peerPort()); else return "<unknown>"; }
// Receive notification that the SSL handshake has completed successfully void Server::handshakeComplete() { QSslSocket *socket = dynamic_cast<QSslSocket *>(sender()); assert(socket); connect(socket, SIGNAL(disconnected()), this, SLOT(connectionClosed())); connect(socket, SIGNAL(readyRead()), this, SLOT(receiveMessage())); std::cout << "Accepted connection from " << socket->peerAddress().toString().toStdString() << ":" << socket->peerPort() << " .Encrypted : " << socket->isEncrypted() << std::endl; sockets.push_back(socket); }
// Receive notification that the SSL handshake has completed successfully void Server::handshakeComplete() { QSslSocket *socket = dynamic_cast<QSslSocket *>(sender()); assert(socket); connect(socket, SIGNAL(disconnected()), this, SLOT(connectionClosed())); connect(socket, SIGNAL(readyRead()), this, SLOT(receiveMessage())); ui->logTextEdit->append(QString("[%1] Accepted connection from %2:%3") .arg(QDateTime::currentDateTime().toString("hh:mm:ss.zzz ap")) .arg(socket->peerAddress().toString()) .arg(socket->peerPort())); sockets.push_back(socket); users.push_back(socket->peerPort()); }
void SslServer::readyReadPrivate() { QSslSocket *socket = qobject_cast<QSslSocket*>(sender()); if (!socket) return; QByteArray *m_buffer = &m_buffer_hash[socket]; qint32 &m_size = m_size_hash[socket]; while (socket->bytesAvailable() > 0) { m_buffer->append(socket->readAll()); while ((m_size == 0 && m_buffer->size() >= 4) || (m_size > 0 && m_buffer->size() >= m_size)) { if (m_size == 0 && m_buffer->size() >= 4) { m_size = getValue<qint32>(m_buffer->mid(0, 4)); m_buffer->remove(0, 4); if (m_size < 0 || m_size > MAX_NETWORK_CHUNK_SIZE) { socket->abort(); return; } } if (m_size > 0 && m_buffer->size() >= m_size) { QByteArray data = m_buffer->mid(0, m_size); m_buffer->remove(0, m_size); m_size = 0; QHostAddress host = socket->peerAddress(); qintptr descriptor = socket->socketDescriptor(); PeerData pd; pd.data = data; pd.host = host; pd.descriptor = descriptor; QMetaObject::invokeMethod(this, "process", Qt::QueuedConnection, Q_ARG(PeerData, pd)); } } } }
//======================= // PRIVATE SLOTS //======================= //GENERIC SERVER SIGNALS // New Connection Signals void WebServer::NewSocketConnection(){ WebSocket *sock = 0; if(WSServer!=0){ if(WSServer->hasPendingConnections()){ QWebSocket *ws = WSServer->nextPendingConnection(); if( !allowConnection(ws->peerAddress()) ){ ws->close(); } else{ sock = new WebSocket( ws, generateID(), AUTH); } } }else if(TCPServer!=0){ if(TCPServer->hasPendingConnections()){ QSslSocket *ss = TCPServer->nextPendingConnection(); if( !allowConnection(ss->peerAddress()) ){ ss->close(); } else{ sock = new WebSocket( ss, generateID(), AUTH); } } } if(sock==0){ return; } //no new connection //qDebug() << "New Socket Connection"; connect(sock, SIGNAL(SocketClosed(QString)), this, SLOT(SocketClosed(QString)) ); connect(EVENTS, SIGNAL(NewEvent(EventWatcher::EVENT_TYPE, QJsonValue)), sock, SLOT(EventUpdate(EventWatcher::EVENT_TYPE, QJsonValue)) ); OpenSockets << sock; }
void SslServer::process(const PeerData &pd) { QByteArray data = pd.data; if (data.isEmpty()) return; quint8 command = getValue<quint8>(data.mid(0, 1)); data.remove(0, 1); QSslSocket *socket = m_socket_hash[pd.descriptor]; if (!socket) return; switch (command) { case ServerCommand::PeerTryConnect: { if (data.size() != 20) { removeSocket(socket); return; } QByteArray peer_id = data; peer_id = cleanString(QLatin1String(peer_id)).toLatin1().leftJustified(peer_id.length(), char(0), true); if (m_unavailable_list.contains(peer_id)) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User target:" << qPrintable(peer_id) << "Attempt to connect to unavailable user!"); writeWarning(socket, "You're trying to connect to a unavailable user!"); return; } if (peer_id == m_id_hash[socket]) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User target:" << qPrintable(peer_id) << "Attempt to connect to itself!"); writeWarning(socket, "You're trying to connect to itself!"); return; } if (!m_id_list.contains(peer_id)) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User target:" << qPrintable(peer_id) << "Attempt to connect to non connected user!"); writeWarning(socket, "You're trying to connect to a non connected user!"); return; } QSslSocket *target_socket = m_id_hash.key(peer_id); if (m_connecting_connected_list.contains(target_socket)) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User target:" << qPrintable(peer_id) << "Attempt to connect to already connected user!"); writeWarning(socket, "User already connected!"); return; } m_connecting_connected_list.append(socket); m_connecting_connected_list.append(target_socket); QByteArray data; data.append(getBytes<quint8>(ServerCommand::ConnectionRequested)); data.append(getBytes<quint32>(socket->localAddress().toIPv4Address())); data.append(m_id_hash[socket]); m_accept_hash.insert(target_socket, socket); DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User target:" << qPrintable(peer_id) << "Trying to connect to peer!"); target_socket->write(getBytes<qint32>(data.size())); target_socket->write(data); break; } case ServerCommand::ConnectionAnswer: { if (data.size() != 1) { removeSocket(socket); return; } QSslSocket *socket_starter = m_accept_hash[socket]; bool accepted = getValue<bool>(data.mid(0, 1)); if (!socket_starter) { m_connecting_connected_list.removeAll(socket_starter); m_connecting_connected_list.removeAll(socket); if (accepted) { DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User disconnected or canceled operation!"); writeWarning(socket, "Can't connect to user because it's disconnected or canceled operation!"); } return; } if (!accepted) { QSslSocket *socket1 = socket_starter; QSslSocket *socket2 = socket; m_accept_hash.remove(socket1); m_accept_hash.remove(socket2); m_connecting_connected_list.removeAll(socket1); m_connecting_connected_list.removeAll(socket2); DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User target:" << qPrintable(m_id_hash.value(socket_starter)) << "User refused connection!"); writeWarning(socket_starter, "User refused connection!"); return; } QSslSocket *socket1 = socket; QSslSocket *socket2 = socket_starter; m_connected_1.insert(socket1, socket2); m_connected_2.insert(socket2, socket1); QByteArray data1; QByteArray data2; data1.append(getBytes<quint8>(ServerCommand::ConnectedToPeer)); data2.append(getBytes<quint8>(ServerCommand::ConnectedToPeer)); QByteArray password = OpenSslLib::RANDbytes(32); data1.append(m_id_hash[socket1]); data1.append(password); data2.append(m_id_hash[socket2]); data2.append(password); socket1->write(getBytes<qint32>(data2.size())); socket1->write(data2); socket2->write(getBytes<qint32>(data1.size())); socket2->write(data1); DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket_starter)) << "User target:" << qPrintable(m_id_hash.value(socket)) << "Connected!"); break; } case ServerCommand::DisconnectedFromPeer: { QSslSocket *target_socket = m_connected_1.value(socket); if (!target_socket) target_socket = m_connected_2.value(socket); DEBUG_FUNCTION("IP:" << qPrintable(socket->peerAddress().toString()) << "User origin:" << qPrintable(m_id_hash.value(socket)) << "User target:" << qPrintable(m_id_hash.value(target_socket)) << "Disconnected from peer!"); disconnectedFromPeer(socket); break; } case ServerCommand::P2PData: { QSslSocket *target_socket = m_connected_1.value(socket); if (!target_socket) target_socket = m_connected_2.value(socket); if (!target_socket) break; data.prepend(getBytes<quint8>(ServerCommand::P2PData)); target_socket->write(getBytes<qint32>(data.size())); target_socket->write(data); m_alive_hash[socket].restart(); m_alive_hash[target_socket].restart(); break; } case ServerCommand::Alive: { m_alive_hash[socket].restart(); break; } case ServerCommand::XML: { processCommandXML(socket, data); break; } default: { removeSocket(socket); return; } } }
// Accept connection from server and initiate the SSL handshake void Server::acceptConnection() { if (sockets.empty() == false) std::cout << "Server is mad efor 1 connection also. Need to update to handle multiple connections" << std::endl; QSslSocket *socket = dynamic_cast<QSslSocket *>(server.nextPendingConnection()); assert(socket); // Report any SSL errors that occur connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(sslErrors(const QList<QSslError> &))); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionFailure())); // QSslSocket emits the encrypted() signal after the encrypted connection is established #define _USE_ENCRYPTION #ifdef _USE_ENCRYPTION connect(socket, SIGNAL(encrypted()), this, SLOT(handshakeComplete())); socket->setPrivateKey(key); socket->setLocalCertificate(certificate); socket->setPeerVerifyMode(QSslSocket::VerifyNone); socket->startServerEncryption(); #else connect(socket, SIGNAL(disconnected()), this, SLOT(connectionClosed())); connect(socket, SIGNAL(readyRead()), this, SLOT(receiveMessage())); sockets.push_back(socket); std::cout << "Accepted connection from " << socket->peerAddress().toString().toStdString() << ":" << socket->peerPort() << " .Encrypted : " << socket->isEncrypted() << std::endl; #endif }