bool SignalProxy::IODevicePeer::isSecure() const { #ifdef HAVE_SSL QSslSocket *sslSocket = qobject_cast<QSslSocket *>(_device); if(sslSocket) return sslSocket->isEncrypted() || sslSocket->localAddress() == QHostAddress::LocalHost || sslSocket->localAddress() == QHostAddress::LocalHostIPv6; #endif QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(_device); if(socket) return socket->localAddress() == QHostAddress::LocalHost || socket->localAddress() == QHostAddress::LocalHostIPv6; return false; }
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; } } }