mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
WebSocketServer: Various code cleanup
This commit is contained in:
parent
29a72f9af8
commit
2e079ad681
@ -114,9 +114,10 @@ void WebSocketServer::Start()
|
|||||||
|
|
||||||
_serverPort = conf->ServerPort;
|
_serverPort = conf->ServerPort;
|
||||||
_serverPassword = conf->ServerPassword;
|
_serverPassword = conf->ServerPassword;
|
||||||
AuthenticationRequired = conf->AuthRequired;
|
_authenticationRequired = conf->AuthRequired;
|
||||||
AuthenticationSalt = Utils::Crypto::GenerateSalt();
|
|
||||||
AuthenticationSecret = Utils::Crypto::GenerateSecret(conf->ServerPassword.toStdString(), AuthenticationSalt);
|
_authenticationSalt = Utils::Crypto::GenerateSalt();
|
||||||
|
_authenticationSecret = Utils::Crypto::GenerateSecret(conf->ServerPassword.toStdString(), _authenticationSalt);
|
||||||
|
|
||||||
// Set log levels if debug is enabled
|
// Set log levels if debug is enabled
|
||||||
if (IsDebugEnabled()) {
|
if (IsDebugEnabled()) {
|
||||||
@ -264,7 +265,7 @@ void WebSocketServer::onOpen(websocketpp::connection_hdl hdl)
|
|||||||
// Configure session details
|
// Configure session details
|
||||||
session->SetRemoteAddress(conn->get_remote_endpoint());
|
session->SetRemoteAddress(conn->get_remote_endpoint());
|
||||||
session->SetConnectedAt(QDateTime::currentSecsSinceEpoch());
|
session->SetConnectedAt(QDateTime::currentSecsSinceEpoch());
|
||||||
session->SetAuthenticationRequired(AuthenticationRequired);
|
session->SetAuthenticationRequired(_authenticationRequired);
|
||||||
std::string selectedSubprotocol = conn->get_subprotocol();
|
std::string selectedSubprotocol = conn->get_subprotocol();
|
||||||
if (!selectedSubprotocol.empty()) {
|
if (!selectedSubprotocol.empty()) {
|
||||||
if (selectedSubprotocol == "obswebsocket.json")
|
if (selectedSubprotocol == "obswebsocket.json")
|
||||||
@ -277,13 +278,13 @@ void WebSocketServer::onOpen(websocketpp::connection_hdl hdl)
|
|||||||
json helloMessageData;
|
json helloMessageData;
|
||||||
helloMessageData["obsWebSocketVersion"] = OBS_WEBSOCKET_VERSION;
|
helloMessageData["obsWebSocketVersion"] = OBS_WEBSOCKET_VERSION;
|
||||||
helloMessageData["rpcVersion"] = OBS_WEBSOCKET_RPC_VERSION;
|
helloMessageData["rpcVersion"] = OBS_WEBSOCKET_RPC_VERSION;
|
||||||
if (AuthenticationRequired) {
|
if (_authenticationRequired) {
|
||||||
session->SetSecret(AuthenticationSecret);
|
session->SetSecret(_authenticationSecret);
|
||||||
std::string sessionChallenge = Utils::Crypto::GenerateSalt();
|
std::string sessionChallenge = Utils::Crypto::GenerateSalt();
|
||||||
session->SetChallenge(sessionChallenge);
|
session->SetChallenge(sessionChallenge);
|
||||||
helloMessageData["authentication"] = json::object();
|
helloMessageData["authentication"] = json::object();
|
||||||
helloMessageData["authentication"]["challenge"] = sessionChallenge;
|
helloMessageData["authentication"]["challenge"] = sessionChallenge;
|
||||||
helloMessageData["authentication"]["salt"] = AuthenticationSalt;
|
helloMessageData["authentication"]["salt"] = _authenticationSalt;
|
||||||
}
|
}
|
||||||
json helloMessage;
|
json helloMessage;
|
||||||
helloMessage["op"] = 0;
|
helloMessage["op"] = 0;
|
||||||
|
@ -58,7 +58,7 @@ class WebSocketServer : QObject
|
|||||||
void Start();
|
void Start();
|
||||||
void Stop();
|
void Stop();
|
||||||
void InvalidateSession(websocketpp::connection_hdl hdl);
|
void InvalidateSession(websocketpp::connection_hdl hdl);
|
||||||
void BroadcastEvent(uint64_t requiredIntent, std::string eventType, json eventData = nullptr, uint8_t rpcVersion = 0);
|
void BroadcastEvent(uint64_t requiredIntent, const std::string &eventType, const json &eventData = nullptr, uint8_t rpcVersion = 0);
|
||||||
|
|
||||||
bool IsListening() {
|
bool IsListening() {
|
||||||
return _server.is_listening();
|
return _server.is_listening();
|
||||||
@ -70,10 +70,6 @@ class WebSocketServer : QObject
|
|||||||
return &_threadPool;
|
return &_threadPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AuthenticationRequired;
|
|
||||||
std::string AuthenticationSecret;
|
|
||||||
std::string AuthenticationSalt;
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void ClientConnected(WebSocketSessionState state);
|
void ClientConnected(WebSocketSessionState state);
|
||||||
void ClientDisconnected(WebSocketSessionState state, uint16_t closeCode);
|
void ClientDisconnected(WebSocketSessionState state, uint16_t closeCode);
|
||||||
@ -93,16 +89,22 @@ class WebSocketServer : QObject
|
|||||||
void onClose(websocketpp::connection_hdl hdl);
|
void onClose(websocketpp::connection_hdl hdl);
|
||||||
void onMessage(websocketpp::connection_hdl hdl, websocketpp::server<websocketpp::config::asio>::message_ptr message);
|
void onMessage(websocketpp::connection_hdl hdl, websocketpp::server<websocketpp::config::asio>::message_ptr message);
|
||||||
|
|
||||||
void SetSessionParameters(SessionPtr session, WebSocketServer::ProcessResult &ret, json &payloadData);
|
void SetSessionParameters(SessionPtr session, WebSocketServer::ProcessResult &ret, const json &payloadData);
|
||||||
void ProcessMessage(SessionPtr session, ProcessResult &ret, WebSocketOpCode::WebSocketOpCode opCode, json &payloadData);
|
void ProcessMessage(SessionPtr session, ProcessResult &ret, WebSocketOpCode::WebSocketOpCode opCode, const json &payloadData);
|
||||||
|
|
||||||
void ProcessRequestBatch(SessionPtr session, ObsWebSocketRequestBatchExecutionType executionType, std::vector<json> &requests, std::vector<json> &results, json &variables);
|
void ProcessRequestBatch(SessionPtr session, ObsWebSocketRequestBatchExecutionType executionType, const std::vector<json> &requests, std::vector<json> &results, json &variables);
|
||||||
|
|
||||||
|
QThreadPool _threadPool;
|
||||||
|
|
||||||
std::thread _serverThread;
|
std::thread _serverThread;
|
||||||
websocketpp::server<websocketpp::config::asio> _server;
|
websocketpp::server<websocketpp::config::asio> _server;
|
||||||
QThreadPool _threadPool;
|
|
||||||
std::mutex _sessionMutex;
|
|
||||||
std::map<websocketpp::connection_hdl, SessionPtr, std::owner_less<websocketpp::connection_hdl>> _sessions;
|
|
||||||
uint16_t _serverPort;
|
uint16_t _serverPort;
|
||||||
QString _serverPassword;
|
QString _serverPassword;
|
||||||
|
bool _authenticationRequired;
|
||||||
|
|
||||||
|
std::string _authenticationSecret;
|
||||||
|
std::string _authenticationSalt;
|
||||||
|
|
||||||
|
std::mutex _sessionMutex;
|
||||||
|
std::map<websocketpp::connection_hdl, SessionPtr, std::owner_less<websocketpp::connection_hdl>> _sessions;
|
||||||
};
|
};
|
||||||
|
@ -33,7 +33,7 @@ bool IsSupportedRpcVersion(uint8_t requestedVersion)
|
|||||||
return (requestedVersion == 1);
|
return (requestedVersion == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketServer::SetSessionParameters(SessionPtr session, ProcessResult &ret, json &payloadData)
|
void WebSocketServer::SetSessionParameters(SessionPtr session, ProcessResult &ret, const json &payloadData)
|
||||||
{
|
{
|
||||||
if (payloadData.contains("ignoreInvalidMessages")) {
|
if (payloadData.contains("ignoreInvalidMessages")) {
|
||||||
if (!payloadData["ignoreInvalidMessages"].is_boolean()) {
|
if (!payloadData["ignoreInvalidMessages"].is_boolean()) {
|
||||||
@ -54,7 +54,7 @@ void WebSocketServer::SetSessionParameters(SessionPtr session, ProcessResult &re
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::ProcessResult &ret, WebSocketOpCode::WebSocketOpCode opCode, json &payloadData)
|
void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::ProcessResult &ret, WebSocketOpCode::WebSocketOpCode opCode, const json &payloadData)
|
||||||
{
|
{
|
||||||
if (!payloadData.is_object()) {
|
if (!payloadData.is_object()) {
|
||||||
if (payloadData.is_null()) {
|
if (payloadData.is_null()) {
|
||||||
@ -289,7 +289,7 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
|
|||||||
}
|
}
|
||||||
|
|
||||||
// It isn't consistent to directly call the WebSocketServer from the events system, but it would also be dumb to make it unnecessarily complicated.
|
// It isn't consistent to directly call the WebSocketServer from the events system, but it would also be dumb to make it unnecessarily complicated.
|
||||||
void WebSocketServer::BroadcastEvent(uint64_t requiredIntent, std::string eventType, json eventData, uint8_t rpcVersion)
|
void WebSocketServer::BroadcastEvent(uint64_t requiredIntent, const std::string &eventType, const json &eventData, uint8_t rpcVersion)
|
||||||
{
|
{
|
||||||
if (!_server.is_listening())
|
if (!_server.is_listening())
|
||||||
return;
|
return;
|
||||||
|
@ -193,7 +193,7 @@ void ObsTickCallback(void *param, float)
|
|||||||
profile_end("obs-websocket-request-batch-frame-tick");
|
profile_end("obs-websocket-request-batch-frame-tick");
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketServer::ProcessRequestBatch(SessionPtr session, ObsWebSocketRequestBatchExecutionType executionType, std::vector<json> &requests, std::vector<json> &results, json &variables)
|
void WebSocketServer::ProcessRequestBatch(SessionPtr session, ObsWebSocketRequestBatchExecutionType executionType, const std::vector<json> &requests, std::vector<json> &results, json &variables)
|
||||||
{
|
{
|
||||||
RequestHandler requestHandler(session);
|
RequestHandler requestHandler(session);
|
||||||
if (executionType == OBS_WEBSOCKET_REQUEST_BATCH_EXECUTION_TYPE_SERIAL_REALTIME) {
|
if (executionType == OBS_WEBSOCKET_REQUEST_BATCH_EXECUTION_TYPE_SERIAL_REALTIME) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user