13 #ifndef hifi_DomainServer_h
14 #define hifi_DomainServer_h
16 #include <QtCore/QCoreApplication>
17 #include <QtCore/QHash>
18 #include <QtCore/QJsonObject>
19 #include <QtCore/QQueue>
20 #include <QtCore/QSharedPointer>
21 #include <QtCore/QStringList>
22 #include <QtCore/QThread>
23 #include <QtCore/QUrl>
24 #include <QHostAddress>
25 #include <QAbstractNativeEventFilter>
27 #include <Assignment.h>
28 #include <HTTPSConnection.h>
29 #include <LimitedNodeList.h>
30 #include <shared/WebRTC.h>
31 #include <webrtc/WebRTCSignalingServer.h>
33 #include "AssetsBackupHandler.h"
34 #include "DomainGatekeeper.h"
35 #include "DomainMetadata.h"
36 #include "DomainServerSettingsManager.h"
37 #include "DomainServerWebSessionData.h"
38 #include "DomainContentBackupManager.h"
40 #include "PendingAssignedNodeData.h"
41 #include "DomainServerExporter.h"
43 #include <QLoggingCategory>
45 Q_DECLARE_LOGGING_CATEGORY(domain_server)
46 Q_DECLARE_LOGGING_CATEGORY(domain_server_ice)
47 Q_DECLARE_LOGGING_CATEGORY(domain_server_auth)
49 typedef QSharedPointer<Assignment> SharedAssignmentPointer;
51 using Subnet = QPair<QHostAddress, int>;
52 using SubnetList = std::vector<Subnet>;
54 const int INVALID_ICE_LOOKUP_ID = -1;
56 enum ReplicationServerDirection {
61 class DomainServer :
public QCoreApplication,
public HTTPSRequestHandler {
64 DomainServer(
int argc,
char* argv[]);
67 static void parseCommandLine(
int argc,
char* argv[]);
72 MetaverseTemporaryDomain
75 static int const EXIT_CODE_REBOOT;
77 bool handleHTTPRequest(
HTTPConnection* connection,
const QUrl& url,
bool skipSubHandler =
false)
override;
78 bool handleHTTPSRequest(HTTPSConnection* connection,
const QUrl& url,
bool skipSubHandler =
false)
override;
80 static const QString REPLACEMENT_FILE_EXTENSION;
82 bool isAssetServerEnabled();
84 static bool forceCrashReporting() {
return _forceCrashReporting; }
88 void nodeAdded(SharedNodePointer node);
90 void nodeKilled(SharedNodePointer node);
95 void processRequestAssignmentPacket(QSharedPointer<ReceivedMessage> packet);
96 void processListRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
97 void processNodeJSONStatsPacket(QSharedPointer<ReceivedMessage> packetList, SharedNodePointer sendingNode);
98 void processPathQueryPacket(QSharedPointer<ReceivedMessage> packet);
99 void processNodeDisconnectRequestPacket(QSharedPointer<ReceivedMessage> message);
100 void processICEServerHeartbeatDenialPacket(QSharedPointer<ReceivedMessage> message);
101 void processICEServerHeartbeatACK(QSharedPointer<ReceivedMessage> message);
102 void processAvatarZonePresencePacket(QSharedPointer<ReceivedMessage> packet);
104 void handleDomainContentReplacementFromURLRequest(QSharedPointer<ReceivedMessage> message);
105 void handleOctreeFileReplacementRequest(QSharedPointer<ReceivedMessage> message);
106 bool handleOctreeFileReplacement(QByteArray octreeFile, QString sourceFilename, QString name, QString username);
108 void processOctreeDataRequestMessage(QSharedPointer<ReceivedMessage> message);
109 void processOctreeDataPersistMessage(QSharedPointer<ReceivedMessage> message);
111 void performIPAddressPortUpdate(
const SockAddr& newPublicSockAddr);
112 void sendHeartbeatToMetaverse() { sendHeartbeatToMetaverse(QString(),
int()); }
113 void sendHeartbeatToIceServer();
114 void nodePingMonitor();
116 void handleConnectedNode(SharedNodePointer newNode, quint64 requestReceiveTime);
117 void handleTempDomainSuccess(QNetworkReply* requestReply);
118 void handleTempDomainError(QNetworkReply* requestReply);
120 void handleMetaverseHeartbeatError(QNetworkReply* requestReply);
122 void queuedQuit(QString quitMessage,
int exitCode);
124 void handleKeypairChange();
126 void updateICEServerAddresses();
127 void handleICEHostInfo(
const QHostInfo& hostInfo);
129 void sendICEServerAddressToMetaverseAPI();
130 void handleSuccessfulICEServerAddressUpdate(QNetworkReply* requestReply);
131 void handleFailedICEServerAddressUpdate(QNetworkReply* requestReply);
133 void updateReplicatedNodes();
134 void updateDownstreamNodes();
135 void updateUpstreamNodes();
137 void initializeExporter();
138 void initializeMetadataExporter();
140 void tokenGrantFinished();
141 void profileRequestFinished();
143 #if defined(WEBRTC_DATA_CHANNELS)
144 void forwardAssignmentClientSignalingMessageToUserClient(QSharedPointer<ReceivedMessage> message);
150 void iceServerChanged();
151 void userConnected();
152 void userDisconnected();
154 #if defined(WEBRTC_DATA_CHANNELS)
155 void webrtcSignalingMessageForDomainServer(
const QJsonObject& json);
156 void webrtcSignalingMessageForUserClient(
const QJsonObject& json);
163 QString getContentBackupDir();
164 QString getEntitiesDirPath();
165 QString getEntitiesFilePath();
166 QString getEntitiesReplacementFilePath();
168 void maybeHandleReplacementEntityFile();
170 void setupNodeListAndAssignments();
171 bool optionallySetupOAuth();
172 bool optionallyReadX509KeyAndCertificate();
174 void getTemporaryName(
bool force =
false);
176 static bool isPacketVerified(
const udt::Packet& packet);
178 bool resetAccountManagerAccessToken();
180 void setupAutomaticNetworking();
181 void setupICEHeartbeatForFullNetworking();
182 void setupHeartbeatToMetaverse();
183 void sendHeartbeatToMetaverse(
const QString& networkAddress,
const int port);
185 void randomizeICEServerAddress(
bool shouldTriggerHostLookup);
187 unsigned int countConnectedUsers();
189 void handleKillNode(SharedNodePointer nodeToKill);
190 void broadcastNodeDisconnect(
const SharedNodePointer& disconnnectedNode);
192 void sendDomainListToNode(
const SharedNodePointer& node, quint64 requestPacketReceiveTime,
const SockAddr& senderSockAddr,
bool newConnection);
194 bool isInInterestSet(
const SharedNodePointer& nodeA,
const SharedNodePointer& nodeB);
196 QUuid connectionSecretForNodes(
const SharedNodePointer& nodeA,
const SharedNodePointer& nodeB);
197 void broadcastNewNode(
const SharedNodePointer& node);
199 void parseAssignmentConfigs(QSet<Assignment::Type>& excludedTypes);
200 void addStaticAssignmentToAssignmentHash(
Assignment* newAssignment);
201 void createStaticAssignmentsForType(Assignment::Type type,
const QVariantList& configList);
202 void populateDefaultStaticAssignmentsExcludingTypes(
const QSet<Assignment::Type>& excludedTypes);
203 void populateStaticScriptedAssignmentsFromSettings();
205 SharedAssignmentPointer dequeueMatchingAssignment(
const QUuid& checkInUUID,
NodeType_t nodeType);
206 SharedAssignmentPointer deployableAssignmentForRequest(
const Assignment& requestAssignment);
207 void refreshStaticAssignmentAndAddToQueue(SharedAssignmentPointer& assignment);
208 void addStaticAssignmentsToQueue();
210 QUrl oauthRedirectURL();
211 QUrl oauthAuthorizationURL(
const QUuid& stateUUID = QUuid::createUuid());
213 std::pair<bool, QString> isAuthenticatedRequest(
HTTPConnection* connection);
215 QNetworkReply* profileRequestGivenTokenReply(QNetworkReply* tokenReply);
216 Headers setupCookieHeadersFromProfileReply(QNetworkReply* profileReply);
218 QJsonObject jsonForSocket(
const SockAddr& socket);
219 QJsonObject jsonObjectForNode(
const SharedNodePointer& node);
221 bool shouldReplicateNode(
const Node& node);
223 void setupGroupCacheRefresh();
225 QString pathForRedirect(QString path = QString())
const;
227 void updateReplicationNodes(ReplicationServerDirection direction);
229 HTTPSConnection* connectionFromReplyWithState(QNetworkReply* reply);
231 bool processPendingContent(
HTTPConnection* connection, QString itemName, QString filename, QByteArray dataChunk);
234 const QUrl& requestUrl,
235 const QString& metaversePath,
236 const QString& requestSubobjectKey =
"",
237 std::initializer_list<QString> requiredData = { },
238 std::initializer_list<QString> optionalData = { },
239 bool requireAccessToken =
true);
241 #if defined(WEBRTC_DATA_CHANNELS)
242 void setUpWebRTCSignalingServer();
243 void routeWebRTCSignalingMessage(
const QJsonObject& json);
244 void sendWebRTCSignalingMessageToAssignmentClient(
const QJsonObject& json);
247 QString operationToString(
const QNetworkAccessManager::Operation &op);
249 SubnetList _acSubnetAllowlist;
251 std::vector<QString> _replicatedUsernames;
253 DomainGatekeeper _gatekeeper;
258 HTTPManager* _httpMetadataExporterManager {
nullptr };
260 std::unique_ptr<HTTPSManager> _httpsManager;
262 QHash<QUuid, SharedAssignmentPointer> _allAssignments;
263 QQueue<SharedAssignmentPointer> _unfulfilledAssignments;
265 bool _isUsingDTLS {
false };
267 bool _oauthEnable {
false };
268 QUrl _oauthProviderURL;
269 QString _oauthClientID;
270 QString _oauthClientSecret;
273 std::unordered_map<QUuid, QByteArray> _ephemeralACScripts;
275 QSet<QUuid> _webAuthenticationStateSet;
276 QHash<QUuid, DomainServerWebSessionData> _cookieSessionHash;
278 QString _automaticNetworkingSetting;
282 SockAddr _iceServerSocket;
283 std::unique_ptr<NLPacket> _iceServerHeartbeatPacket;
286 DomainMetadata* _metadata {
nullptr };
287 QTimer* _iceHeartbeatTimer {
nullptr };
288 QTimer* _metaverseHeartbeatTimer {
nullptr };
289 QTimer* _metaverseGroupCacheTimer {
nullptr };
290 QTimer* _nodePingMonitorTimer {
nullptr };
292 QList<QHostAddress> _iceServerAddresses;
293 QSet<QHostAddress> _failedIceServerAddresses;
294 int _iceAddressLookupID { INVALID_ICE_LOOKUP_ID };
295 int _noReplyICEHeartbeats { 0 };
296 int _numHeartbeatDenials { 0 };
297 bool _connectedToICEServer {
false };
299 DomainType _type { DomainType::NonMetaverse };
301 friend class DomainGatekeeper;
302 friend class DomainMetadata;
304 static QString _iceServerAddr;
305 static int _iceServerPort;
306 static bool _overrideDomainID;
307 static QUuid _overridingDomainID;
308 static bool _getTempName;
309 static QString _userConfigFilename;
310 static int _parentPID;
311 static bool _forceCrashReporting;
314 bool _sendICEServerAddressToMetaverseAPIInProgress {
false };
315 bool _sendICEServerAddressToMetaverseAPIRedo {
false };
317 std::unique_ptr<DomainContentBackupManager> _contentManager {
nullptr };
319 QHash<QUuid, QPointer<HTTPSConnection>> _pendingOAuthConnections;
321 std::unordered_map<int, QByteArray> _pendingUploadedContents;
322 std::unordered_map<int, std::unique_ptr<QTemporaryFile>> _pendingContentFiles;
324 QThread _assetClientThread;
326 #if defined(WEBRTC_DATA_CHANNELS)
327 std::unique_ptr<WebRTCSignalingServer> _webrtcSignalingServer {
nullptr };
quint8 NodeType_t
An 8-bit value identifying the type of a node - domain server, audio mixer, etc.
Definition: NodeType.h:22
Holds information used for request, creation, and deployment of assignments.
Definition: Assignment.h:28
Prometheus exporter for domain stats.
Definition: DomainServerExporter.h:35
Manages the domain-wide settings.
Definition: DomainServerSettingsManager.h:75
Handles a single HTTP connection.
Definition: HTTPConnection.h:43
Handles HTTP connections.
Definition: HTTPManager.h:32