13 #ifndef hifi_IceServer_h
14 #define hifi_IceServer_h
16 #include <QtCore/QCoreApplication>
19 #include <openssl/rsa.h>
21 #include <UUIDHasher.h>
23 #include <NetworkPeer.h>
24 #include <HTTPConnection.h>
25 #include <HTTPManager.h>
27 #include <udt/Socket.h>
31 class IceServer :
public QCoreApplication {
34 IceServer(
int argc,
char* argv[]);
36 void clearInactivePeers();
37 void publicKeyReplyFinished(QNetworkReply* reply);
39 bool packetVersionMatch(
const udt::Packet& packet);
40 void processPacket(std::unique_ptr<udt::Packet> packet);
42 SharedNetworkPeer addOrUpdateHeartbeatingPeer(NLPacket& incomingPacket);
43 void sendPeerInformationPacket(
const NetworkPeer& peer,
const SockAddr* destinationSockAddr);
45 bool isVerifiedHeartbeat(
const QUuid& domainID,
const QByteArray& plaintext,
const QByteArray& signature);
46 void requestDomainPublicKey(
const QUuid& domainID);
49 udt::Socket _serverSocket;
51 using NetworkPeerHash = QHash<QUuid, SharedNetworkPeer>;
52 NetworkPeerHash _activePeers;
54 using RSAUniquePtr = std::unique_ptr<RSA, std::function<void(RSA*)>>;
55 using DomainPublicKeyHash = std::unordered_map<QUuid, RSAUniquePtr>;
56 DomainPublicKeyHash _domainPublicKeys;
58 QSet<QUuid> _pendingPublicKeyRequests;