From c790c8bd08ad7e3940d29b83269c821b3c06b721 Mon Sep 17 00:00:00 2001 From: WolverinDEV Date: Sat, 6 Jul 2019 15:38:31 +0200 Subject: [PATCH] Fixed build --- bugs | 7 +++++- modules/crash_handler/index.ts | 8 +++++-- native/CMakeLists.txt | 1 - ...t_381fc65c-2a4a-46d9-e59385b6-64cd1080.dmp | Bin 0 -> 277672 bytes native/serverconnection/CMakeLists.txt | 10 ++++++-- native/serverconnection/src/bindings.cpp | 11 +++++++-- .../src/connection/ProtocolHandler.cpp | 11 +++++---- .../src/connection/ProtocolHandler.h | 9 +++---- .../src/connection/ProtocolHandlerCrypto.cpp | 13 ++++------- .../src/connection/ServerConnection.cpp | 22 ++++++++++++++++-- .../src/connection/ServerConnection.h | 2 ++ .../src/connection/Socket.cpp | 10 ++++---- .../serverconnection/src/connection/Socket.h | 4 +++- package.json | 2 +- 14 files changed, 76 insertions(+), 34 deletions(-) create mode 100644 native/crash_handler/test/test_crash/crash_dump_test_381fc65c-2a4a-46d9-e59385b6-64cd1080.dmp diff --git a/bugs b/bugs index 345a464..1ef39e9 100644 --- a/bugs +++ b/bugs @@ -16,4 +16,9 @@ General: Tasks designer: TeaCup steam animated Client redesign dark [+ Chat system] - Redesign loading animation (Web) \ No newline at end of file + Redesign loading animation (Web) + + + +Notice: +electron-package-manager must be at 8.7.2 (Node 6 support)! \ No newline at end of file diff --git a/modules/crash_handler/index.ts b/modules/crash_handler/index.ts index 1aa2cd9..8c69744 100644 --- a/modules/crash_handler/index.ts +++ b/modules/crash_handler/index.ts @@ -84,11 +84,15 @@ export const handler = require( "teaclient_crash_handler"); export function initialize_handler(component_name: string, requires_file: boolean) { const start_path = requires_file ? (" " + path.join(__dirname, "..", "..")) : ""; + const success_arguments = process.argv[0] + start_path + " crash-handler success=1 dump_path=%crash_path%"; + const error_arguments = process.argv[0] + start_path + " crash-handler success=0 error=%error_message%"; + + console.log("Setting up crash handler. Success callback: %s; Error callback: %s", success_arguments, error_arguments); handler.setup_crash_handler( component_name, path.join((remote || electron).app.getPath('userData'), "crash_dumps"), - process.argv[0] + start_path + " crash-handler success=1 dump_path=%crash_path%", - process.argv[0] + start_path + " crash-handler success=0 error=%error_message%" + success_arguments, + error_arguments ); } diff --git a/native/CMakeLists.txt b/native/CMakeLists.txt index 8ea0f78..c914766 100644 --- a/native/CMakeLists.txt +++ b/native/CMakeLists.txt @@ -57,7 +57,6 @@ function(setup_nodejs) ) target_include_directories(${NAME} PUBLIC ${NODEJS_INCLUDE_DIRS}) set_target_properties(${NAME} PROPERTIES CXX_STANDARD 17) #Needs to be overridden after _add_nodejs_module sets it to 11 - message("Add lib: ${NODEJS_LIBRARIES}") if(MSVC) add_custom_command(TARGET ${NAME} POST_BUILD diff --git a/native/crash_handler/test/test_crash/crash_dump_test_381fc65c-2a4a-46d9-e59385b6-64cd1080.dmp b/native/crash_handler/test/test_crash/crash_dump_test_381fc65c-2a4a-46d9-e59385b6-64cd1080.dmp new file mode 100644 index 0000000000000000000000000000000000000000..ef7a41c6b733d71e6b810cfb9549711affae699f GIT binary patch literal 277672 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

XfH3x) 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 literal 0 HcmV?d00001 diff --git a/native/serverconnection/CMakeLists.txt b/native/serverconnection/CMakeLists.txt index daae3c4..e7fc6b9 100644 --- a/native/serverconnection/CMakeLists.txt +++ b/native/serverconnection/CMakeLists.txt @@ -83,8 +83,9 @@ include_directories(${DataPipes_INCLUDE_DIR}) find_package(Libevent REQUIRED) include_directories(${LIBEVENT_INCLUDE_DIRS}) +message("libevent include dir: ${LIBEVENT_INCLUDE_DIRS}") +message("libevent static libraries: ${LIBEVENT_STATIC_LIBRARIES}") -message(${TeaSpeak_SharedLib_ROOT_DIR}) find_package(TeaSpeak_SharedLib REQUIRED) include_directories(${TeaSpeak_SharedLib_INCLUDE_DIR}) @@ -139,6 +140,7 @@ if (WIN32) set(REQUIRED_LIBRARIES ${REQUIRED_LIBRARIES} "Ws2_32.Lib") else() set(REQUIRED_LIBRARIES ${REQUIRED_LIBRARIES} + libstdc++fs.a asound jack pthread @@ -150,4 +152,8 @@ target_link_libraries(${MODULE_NAME} ${REQUIRED_LIBRARIES}) target_compile_definitions(${MODULE_NAME} PUBLIC -DNODEJS_API) add_executable(Audio-Test ${SOURCE_FILES} test/audio/main.cpp) -target_link_libraries(Audio-Test ${REQUIRED_LIBRARIES}) \ No newline at end of file +target_link_libraries(Audio-Test ${REQUIRED_LIBRARIES}) + +#U SHA512_Final +#U SHA512_Init +#U SHA512_Update \ No newline at end of file diff --git a/native/serverconnection/src/bindings.cpp b/native/serverconnection/src/bindings.cpp index d7d5a28..dac764a 100644 --- a/native/serverconnection/src/bindings.cpp +++ b/native/serverconnection/src/bindings.cpp @@ -50,7 +50,12 @@ void testTomMath(){ mp_int r{}; mp_init(&r); - assert(mp_exptmod(&x, &exp, &n, &r) != CRYPT_OK); //if this method succeed than tommath failed. Unknown why but it is so + + if(mp_exptmod(&x, &exp, &n, &r) != CRYPT_OK) { + Nan::ThrowError("Tomcrypt library is too modern. Use an oder one!"); + return; + } + //assert(mp_exptmod(&x, &exp, &n, &r) != CRYPT_OK); //if this method succeed than tommath failed. Unknown why but it is so mp_clear_multi(&x, &n, &exp, &r, nullptr); } @@ -63,7 +68,7 @@ tc::audio::AudioOutput* global_audio_output; NAN_MODULE_INIT(init) { logger::initialize_node(); - logger::error(category::general, "Hello World from C"); + logger::info(category::general, "Hello World from C"); string error; //TODO here @@ -72,6 +77,7 @@ NAN_MODULE_INIT(init) { std::thread(audio::devices).detach(); /* cache the devices */ + logger::info(category::general, "Loading crypt modules"); std::string descriptors = "LTGE"; { int crypt_init = false; @@ -93,6 +99,7 @@ NAN_MODULE_INIT(init) { testTomMath(); } + logger::info(category::general, "Crypt modules loaded"); #ifdef WIN32 evthread_use_windows_threads(); diff --git a/native/serverconnection/src/connection/ProtocolHandler.cpp b/native/serverconnection/src/connection/ProtocolHandler.cpp index 4a14090..e05272b 100644 --- a/native/serverconnection/src/connection/ProtocolHandler.cpp +++ b/native/serverconnection/src/connection/ProtocolHandler.cpp @@ -88,13 +88,15 @@ void ProtocolHandler::execute_tick() { if(this->connection_state == connection_state::INIT_LOW || this->connection_state == connection_state::INIT_HIGH) { if(this->connect_timestamp < now - seconds(15)) { this->handle->call_connect_result.call(this->handle->errors.register_error("timeout (" + to_string(this->connection_state) + ")"), true); - this->close_connection(); + this->handle->close_connection(); + return; } } if(this->connection_state == connection_state::DISCONNECTING) { if(this->disconnect_timestamp < now - seconds(5)) { /* disconnect timeout */ - this->close_connection(); + this->handle->close_connection(); + return; } } @@ -108,7 +110,8 @@ void ProtocolHandler::execute_tick() { if(this->ping.ping_received_timestamp.time_since_epoch().count() > 0) { if(now - this->ping.ping_received_timestamp > seconds(30)) { this->handle->execute_callback_disconnect.call(tr("ping timeout"), true); - this->close_connection(); + this->handle->close_connection(); + return; } } else this->ping.ping_received_timestamp = now; @@ -504,7 +507,7 @@ void ProtocolHandler::send_acknowledge(uint16_t packet_id, bool low) { this->send_packet(packet); } -void ProtocolHandler::close_connection() { +void ProtocolHandler::do_close_connection() { this->connection_state = connection_state::DISCONNECTED; for(auto& buffer : this->_packet_buffers) { lock_guard lock(buffer.buffer_lock); diff --git a/native/serverconnection/src/connection/ProtocolHandler.h b/native/serverconnection/src/connection/ProtocolHandler.h index fcfc5ef..646a435 100644 --- a/native/serverconnection/src/connection/ProtocolHandler.h +++ b/native/serverconnection/src/connection/ProtocolHandler.h @@ -54,7 +54,7 @@ namespace tc { class ProtocolHandler { typedef ts::protocol::PacketRingBuffer packet_buffer_t; typedef std::array packet_buffers_t; - + friend class ServerConnection; public: ProtocolHandler(ServerConnection*); ~ProtocolHandler(); @@ -69,16 +69,17 @@ namespace tc { void send_packet(const std::shared_ptr& /* packet */); void send_command(const ts::Command& /* command */, const std::function & /* acknowledge callback */ = NULL); - void send_acknowledge(uint16_t /* packet id */, bool /* low */); - void disconnect(const std::string& /* message */); - void close_connection(); + + void send_acknowledge(uint16_t /* packet id */, bool /* low */); ecc_key& get_identity_key() { return this->crypto.identity; } connection_state::value connection_state = connection_state::INITIALIZING; server_type::value server_type = server_type::TEASPEAK; private: + void do_close_connection(); /* only call from ServerConnection. Close all connections via ServerConnection! */ + void handlePacketCommand(const std::shared_ptr&); void handlePacketAck(const std::shared_ptr&); void handlePacketVoice(const std::shared_ptr&); diff --git a/native/serverconnection/src/connection/ProtocolHandlerCrypto.cpp b/native/serverconnection/src/connection/ProtocolHandlerCrypto.cpp index 3d170af..b5730d3 100644 --- a/native/serverconnection/src/connection/ProtocolHandlerCrypto.cpp +++ b/native/serverconnection/src/connection/ProtocolHandlerCrypto.cpp @@ -41,14 +41,9 @@ std::string ProtocolHandler::generate_client_initiv() { if(this->server_type != server_type::TEAMSPEAK) /* if TEAMSPEAK then TS3 has been enforced */ command.enableParm("teaspeak"); /* using "old" encryption system, we expect a teaspeak=1 within the response */ { - size_t buffer_length = 265 + 5; - char buffer[265 + 5]; + size_t buffer_length = 265; + char buffer[265]; auto result = ecc_export((unsigned char *) buffer, (unsigned long*) &buffer_length, PK_PUBLIC, &this->crypto.identity); - buffer[265] = rand(); - buffer[266] = rand(); - buffer[267] = rand(); - buffer[268] = rand(); - buffer[269] = rand(); if(result == CRYPT_OK) command["omega"] = base64::encode(buffer, buffer_length); else @@ -160,8 +155,8 @@ void ProtocolHandler::handleCommandInitIVExpend2(ts::Command &cmd) { return; } - int result; - if(ecc_verify_hash((u_char*) proof.data(), proof.length(), (u_char*) crypto_hash.data(), crypto_hash.length(), &result, &server_key) != CRYPT_OK || result != 1) { + int result, crypt_result; + if((crypt_result = ecc_verify_hash((u_char*) proof.data(), proof.length(), (u_char*) crypto_hash.data(), crypto_hash.length(), &result, &server_key)) != CRYPT_OK || result != 1) { this->handle->call_connect_result.call(this->handle->errors.register_error(tr("failed to verify server integrity")), true); this->handle->close_connection(); return; diff --git a/native/serverconnection/src/connection/ServerConnection.cpp b/native/serverconnection/src/connection/ServerConnection.cpp index c6cff44..86dc0a2 100644 --- a/native/serverconnection/src/connection/ServerConnection.cpp +++ b/native/serverconnection/src/connection/ServerConnection.cpp @@ -141,6 +141,8 @@ void ServerConnection::event_loop() { auto best = this->next_tick; if(this->next_resend < best) best = this->next_resend; + if(this->event_loop_execute_connection_close) + return system_clock::time_point{}; return best; }; @@ -157,6 +159,10 @@ void ServerConnection::event_loop() { if(this->event_loop_exit) break; } + if(this->event_loop_execute_connection_close) { + this->close_connection(); + this->event_loop_execute_connection_close = false; + } auto date = chrono::system_clock::now(); if(this->next_tick <= date) { this->next_tick = date + chrono::milliseconds(500); @@ -485,10 +491,22 @@ void ServerConnection::send_voice_data(const void *buffer, size_t buffer_length, } void ServerConnection::close_connection() { + if(this_thread::get_id() == this->socket->io_thread().get_id()) { + logger::debug(category::connection, tr("close_connection() called in IO thread. Closing connection within event loop!")); + lock_guard lock(this->disconnect_lock); + if(!this->event_loop_execute_connection_close) { + this->event_loop_execute_connection_close = true; + this->event_condition.notify_one(); + } + return; + } + lock_guard lock(this->disconnect_lock); - if(this->socket) + this->event_loop_execute_connection_close = false; + if(this->socket) { this->socket->finalize(); - this->protocol_handler->close_connection(); + } + this->protocol_handler->do_close_connection(); this->socket = nullptr; this->call_disconnect_result.call(0, true); } diff --git a/native/serverconnection/src/connection/ServerConnection.h b/native/serverconnection/src/connection/ServerConnection.h index c0e1e93..543334f 100644 --- a/native/serverconnection/src/connection/ServerConnection.h +++ b/native/serverconnection/src/connection/ServerConnection.h @@ -105,6 +105,8 @@ namespace tc { bool event_loop_exit = false; /* set to true if we want to exit */ void event_loop(); + bool event_loop_execute_connection_close = false; + std::chrono::system_clock::time_point next_tick; std::chrono::system_clock::time_point next_resend; void execute_tick(); diff --git a/native/serverconnection/src/connection/Socket.cpp b/native/serverconnection/src/connection/Socket.cpp index 0fbade1..fa1bc7e 100644 --- a/native/serverconnection/src/connection/Socket.cpp +++ b/native/serverconnection/src/connection/Socket.cpp @@ -42,11 +42,11 @@ bool UDPSocket::initialize() { this->event_write = event_new(this->io_base, this->file_descriptor, EV_WRITE, &UDPSocket::_callback_write, this); event_add(this->event_read, nullptr); - this->io_thread = thread(&UDPSocket::_io_execute, this); + this->_io_thread = thread(&UDPSocket::_io_execute, this); #ifdef WIN32 //TODO set thread name #else - auto handle = this->io_thread.native_handle(); + auto handle = this->_io_thread.native_handle(); pthread_setname_np(handle, "UDPSocket loop"); #endif return true; @@ -64,7 +64,7 @@ void UDPSocket::finalize() { this->event_write = nullptr; lock.unlock(); - assert(this_thread::get_id() != this->io_thread.get_id()); + assert(this_thread::get_id() != this->_io_thread.get_id()); if(event_read) event_del_block(event_read); if(event_write) @@ -81,8 +81,8 @@ void UDPSocket::finalize() { event_base_loopexit(io_base, nullptr); } - if(this->io_thread.joinable()) - this->io_thread.join(); + if(this->_io_thread.joinable()) + this->_io_thread.join(); if(io_base) event_base_free(io_base); diff --git a/native/serverconnection/src/connection/Socket.h b/native/serverconnection/src/connection/Socket.h index 8eb8b05..605cb0b 100644 --- a/native/serverconnection/src/connection/Socket.h +++ b/native/serverconnection/src/connection/Socket.h @@ -30,6 +30,8 @@ namespace tc { void send_message(const pipes::buffer_view& /* message */); std::function on_data; + + const std::thread& io_thread() { return this->_io_thread; } private: static void _io_execute(void *_ptr_socket); static void _callback_read(evutil_socket_t, short, void*); @@ -44,7 +46,7 @@ namespace tc { int file_descriptor = 0; std::recursive_mutex io_lock; - std::thread io_thread; + std::thread _io_thread; event_base* io_base = nullptr; event* event_read = nullptr; diff --git a/package.json b/package.json index 537f3a1..074c9ce 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "test": "echo \"Error: no test specified\" && exit 1", "start": "electron --js-flags='--expose-gc' --debug --dev-tools --disable-hardware-acceleration .", "start-d": "electron . --debug -t -su http://dev.clientapi.teaspeak.de/", - "start-n": "electron . -t -su http://null.teaspeak.de/", + "start-n": "electron . -t --no-single-instance -su http://null.teaspeak.de/", "start-01": "electron . --updater-channel=test -u=http://dev.clientapi.teaspeak.de/ -d --updater-ui-loader_type=0 --updater-local-version=1.0.1", "compile-sass": "sass --update .:.", "compile-tsc": "tsc",