Overte C++ Documentation
IceServer.h
1 //
2 // IceServer.h
3 // ice-server/src
4 //
5 // Created by Stephen Birarda on 2014-10-01.
6 // Copyright 2014 High Fidelity, Inc.
7 // Copyright 2021 Vircadia contributors.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 //
12 
13 #ifndef hifi_IceServer_h
14 #define hifi_IceServer_h
15 
16 #include <QtCore/QCoreApplication>
17 #include <QUdpSocket>
18 
19 #include <openssl/rsa.h>
20 
21 #include <UUIDHasher.h>
22 
23 #include <NetworkPeer.h>
24 #include <HTTPConnection.h>
25 #include <HTTPManager.h>
26 #include <NLPacket.h>
27 #include <udt/Socket.h>
28 
29 class QNetworkReply;
30 
31 class IceServer : public QCoreApplication {
32  Q_OBJECT
33 public:
34  IceServer(int argc, char* argv[]);
35 private slots:
36  void clearInactivePeers();
37  void publicKeyReplyFinished(QNetworkReply* reply);
38 private:
39  bool packetVersionMatch(const udt::Packet& packet);
40  void processPacket(std::unique_ptr<udt::Packet> packet);
41 
42  SharedNetworkPeer addOrUpdateHeartbeatingPeer(NLPacket& incomingPacket);
43  void sendPeerInformationPacket(const NetworkPeer& peer, const SockAddr* destinationSockAddr);
44 
45  bool isVerifiedHeartbeat(const QUuid& domainID, const QByteArray& plaintext, const QByteArray& signature);
46  void requestDomainPublicKey(const QUuid& domainID);
47 
48  QUuid _id;
49  udt::Socket _serverSocket;
50 
51  using NetworkPeerHash = QHash<QUuid, SharedNetworkPeer>;
52  NetworkPeerHash _activePeers;
53 
54  using RSAUniquePtr = std::unique_ptr<RSA, std::function<void(RSA*)>>;
55  using DomainPublicKeyHash = std::unordered_map<QUuid, RSAUniquePtr>;
56  DomainPublicKeyHash _domainPublicKeys;
57 
58  QSet<QUuid> _pendingPublicKeyRequests;
59 };
60 
61 #endif // hifi_IceServer_h