aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-04-09 21:02:31 +0200
committerOvahlord <dreadkiller@gmx.de>2025-04-09 21:09:48 +0200
commit48c8c93ec4791002e473e4ea7af2bea9d693be0a (patch)
tree55c8c295698f9d2542ede02d0c237e582908749d
parent00482e96553ad578dc32591c1b207f769f1d4eb9 (diff)
Core/Network: Move to separate project
(cherry picked from commit 71b681bbf0f5189cd87a6cea66ef51667223f54a)
-rw-r--r--src/common/Asio/AsioHacksFwd.h6
-rw-r--r--src/common/Asio/Resolver.h69
-rw-r--r--src/common/CMakeLists.txt14
-rw-r--r--src/common/Define.h6
-rw-r--r--src/common/Utilities/Util.cpp16
-rw-r--r--src/common/Utilities/Util.h2
-rw-r--r--src/common/network/AsyncAcceptor.h (renamed from src/server/shared/Networking/AsyncAcceptor.h)0
-rw-r--r--src/common/network/CMakeLists.txt53
-rw-r--r--src/common/network/ConnectionInitializers/SocketConnectionInitializer.h (renamed from src/server/shared/Networking/ConnectionInitializers/SocketConnectionInitializer.h)0
-rw-r--r--src/common/network/Http/BaseHttpSocket.cpp (renamed from src/server/shared/Networking/Http/BaseHttpSocket.cpp)0
-rw-r--r--src/common/network/Http/BaseHttpSocket.h (renamed from src/server/shared/Networking/Http/BaseHttpSocket.h)21
-rw-r--r--src/common/network/Http/HttpCommon.h (renamed from src/server/shared/Networking/Http/HttpCommon.h)4
-rw-r--r--src/common/network/Http/HttpService.cpp (renamed from src/server/shared/Networking/Http/HttpService.cpp)0
-rw-r--r--src/common/network/Http/HttpService.h (renamed from src/server/shared/Networking/Http/HttpService.h)4
-rw-r--r--src/common/network/Http/HttpSessionState.h (renamed from src/server/shared/Networking/Http/HttpSessionState.h)0
-rw-r--r--src/common/network/Http/HttpSocket.h (renamed from src/server/shared/Networking/Http/HttpSocket.h)0
-rw-r--r--src/common/network/Http/HttpSslSocket.h (renamed from src/server/shared/Networking/Http/HttpSslSocket.h)0
-rw-r--r--src/common/network/IpAddress.h (renamed from src/common/Asio/IpAddress.h)21
-rw-r--r--src/common/network/IpNetwork.cpp (renamed from src/common/Asio/IpNetwork.cpp)4
-rw-r--r--src/common/network/IpNetwork.h (renamed from src/common/Asio/IpNetwork.h)16
-rw-r--r--src/common/network/NetworkThread.h (renamed from src/server/shared/Networking/NetworkThread.h)0
-rw-r--r--src/common/network/Resolver.cpp47
-rw-r--r--src/common/network/Resolver.h47
-rw-r--r--src/common/network/Socket.h (renamed from src/server/shared/Networking/Socket.h)0
-rw-r--r--src/common/network/SocketMgr.h (renamed from src/server/shared/Networking/SocketMgr.h)0
-rw-r--r--src/common/network/SslStream.h (renamed from src/server/shared/Networking/SslStream.h)0
-rw-r--r--src/server/bnetserver/REST/LoginHttpSession.cpp18
-rw-r--r--src/server/bnetserver/REST/LoginHttpSession.h8
-rw-r--r--src/server/bnetserver/REST/LoginRESTService.cpp2
-rw-r--r--src/server/scripts/Commands/cs_ban.cpp29
-rw-r--r--src/server/shared/CMakeLists.txt1
-rw-r--r--src/server/shared/IpLocation/IPLocation.cpp (renamed from src/common/IPLocation/IPLocation.cpp)0
-rw-r--r--src/server/shared/IpLocation/IPLocation.h (renamed from src/common/IPLocation/IPLocation.h)2
-rw-r--r--src/server/shared/Networking/ConnectionInitializers/IpBanCheckConnectionInitializer.h2
-rw-r--r--src/server/shared/Realm/RealmList.cpp2
-rw-r--r--src/server/shared/Realm/RealmList.h2
-rw-r--r--src/tools/extractor_common/CMakeLists.txt3
-rw-r--r--src/tools/extractor_common/CascHandles.cpp2
38 files changed, 245 insertions, 156 deletions
diff --git a/src/common/Asio/AsioHacksFwd.h b/src/common/Asio/AsioHacksFwd.h
index a8f04b16d81..06f5e531c20 100644
--- a/src/common/Asio/AsioHacksFwd.h
+++ b/src/common/Asio/AsioHacksFwd.h
@@ -60,9 +60,13 @@ namespace Trinity
{
class DeadlineTimer;
class IoContext;
- class Resolver;
class Strand;
}
+
+ namespace Net
+ {
+ class Resolver;
+ }
}
#endif // AsioHacksFwd_h__
diff --git a/src/common/Asio/Resolver.h b/src/common/Asio/Resolver.h
deleted file mode 100644
index 84dedd21bfa..00000000000
--- a/src/common/Asio/Resolver.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef Resolver_h__
-#define Resolver_h__
-
-#include "IoContext.h"
-#include "Optional.h"
-#include <boost/asio/ip/tcp.hpp>
-#include <algorithm>
-#include <string_view>
-#include <vector>
-
-namespace Trinity
-{
- namespace Asio
- {
- /**
- Hack to make it possible to forward declare resolver (one of its template arguments is a typedef to something super long and using nested classes)
- */
- class Resolver
- {
- public:
- explicit Resolver(IoContext& ioContext) : _impl(ioContext) { }
-
- Optional<boost::asio::ip::tcp::endpoint> Resolve(boost::asio::ip::tcp const& protocol, std::string_view host, std::string_view service)
- {
- boost::system::error_code ec;
- boost::asio::ip::resolver_base::flags flagsResolver = boost::asio::ip::resolver_base::all_matching;
- boost::asio::ip::tcp::resolver::results_type results = _impl.resolve(protocol, host, service, flagsResolver, ec);
- if (results.begin() == results.end() || ec)
- return {};
-
- return results.begin()->endpoint();
- }
-
- std::vector<boost::asio::ip::tcp::endpoint> ResolveAll(std::string_view host, std::string_view service)
- {
- boost::system::error_code ec;
- boost::asio::ip::resolver_base::flags flagsResolver = boost::asio::ip::resolver_base::all_matching;
- boost::asio::ip::tcp::resolver::results_type results = _impl.resolve(host, service, flagsResolver, ec);
- std::vector<boost::asio::ip::tcp::endpoint> result;
- if (!ec)
- std::ranges::transform(results, std::back_inserter(result), [](boost::asio::ip::tcp::resolver::results_type::value_type const& entry) { return entry.endpoint(); });
-
- return result;
- }
-
- private:
- boost::asio::ip::tcp::resolver _impl;
- };
- }
-}
-
-#endif // Resolver_h__
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index b202dc5f9a4..8b8ecc0f471 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -14,7 +14,8 @@ CollectSourceFiles(
# Exclude
${CMAKE_CURRENT_SOURCE_DIR}/Debugging/Windows
${CMAKE_CURRENT_SOURCE_DIR}/Platform
- ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders
+ ${CMAKE_CURRENT_SOURCE_DIR}/network)
if(WIN32)
CollectSourceFiles(
@@ -27,6 +28,8 @@ if(WIN32)
WINDOWS_PLATFORM_SOURCES)
list(APPEND PRIVATE_SOURCES
${WINDOWS_PLATFORM_SOURCES})
+ unset(WINDOWS_DEBUGGING_SOURCES)
+ unset(WINDOWS_PLATFORM_SOURCES)
endif()
if(USE_COREPCH)
@@ -43,7 +46,8 @@ CollectIncludeDirectories(
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC_INCLUDES
# Exclude
- ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders
+ ${CMAKE_CURRENT_SOURCE_DIR}/network)
target_include_directories(common
PUBLIC
@@ -95,3 +99,9 @@ endif()
if(USE_COREPCH)
add_cxx_pch(common ${PRIVATE_PCH_HEADER})
endif()
+
+unset(PRIVATE_SOURCES)
+unset(PRIVATE_PCH_HEADER)
+unset(PUBLIC_INCLUDES)
+
+add_subdirectory(network)
diff --git a/src/common/Define.h b/src/common/Define.h
index e4a2333c66d..f918db84314 100644
--- a/src/common/Define.h
+++ b/src/common/Define.h
@@ -111,6 +111,12 @@
# define TC_DATABASE_API TC_API_IMPORT
#endif
+#ifdef TRINITY_API_EXPORT_NETWORK
+# define TC_NETWORK_API TC_API_EXPORT
+#else
+# define TC_NETWORK_API TC_API_IMPORT
+#endif
+
#ifdef TRINITY_API_EXPORT_SHARED
# define TC_SHARED_API TC_API_EXPORT
#else
diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp
index 93bc3b853a5..c374bff9cf1 100644
--- a/src/common/Utilities/Util.cpp
+++ b/src/common/Utilities/Util.cpp
@@ -18,7 +18,6 @@
#include "Util.h"
#include "Common.h"
#include "Containers.h"
-#include "IpAddress.h"
#include "StringConvert.h"
#include "StringFormat.h"
#include <boost/core/demangle.hpp>
@@ -29,6 +28,10 @@
#include <cstdarg>
#include <ctime>
+#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
+#include <Windows.h>
+#endif
+
void Trinity::VerifyOsVersion()
{
#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
@@ -270,17 +273,6 @@ std::string TimeToHumanReadable(time_t t)
return std::string(buf);
}
-/// Check if the string is a valid ip address representation
-bool IsIPAddress(char const* ipaddress)
-{
- if (!ipaddress)
- return false;
-
- boost::system::error_code error;
- Trinity::Net::make_address(ipaddress, error);
- return !error;
-}
-
/// create PID file
uint32 CreatePIDFile(std::string const& filename)
{
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h
index c85fd858806..4907b4edbae 100644
--- a/src/common/Utilities/Util.h
+++ b/src/common/Utilities/Util.h
@@ -390,8 +390,6 @@ TC_COMMON_API bool WriteWinConsole(std::string_view str, bool error = false);
TC_COMMON_API Optional<std::size_t> RemoveCRLF(std::string& str);
-TC_COMMON_API bool IsIPAddress(char const* ipaddress);
-
TC_COMMON_API uint32 CreatePIDFile(std::string const& filename);
TC_COMMON_API uint32 GetPID();
diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/common/network/AsyncAcceptor.h
index dd0857c2b38..dd0857c2b38 100644
--- a/src/server/shared/Networking/AsyncAcceptor.h
+++ b/src/common/network/AsyncAcceptor.h
diff --git a/src/common/network/CMakeLists.txt b/src/common/network/CMakeLists.txt
new file mode 100644
index 00000000000..70408faed51
--- /dev/null
+++ b/src/common/network/CMakeLists.txt
@@ -0,0 +1,53 @@
+# This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES)
+
+GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+
+add_library(network
+ ${PRIVATE_SOURCES})
+
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES)
+
+target_include_directories(network
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
+
+target_link_libraries(network
+ PRIVATE
+ trinity-core-interface
+ PUBLIC
+ common)
+
+set_target_properties(network
+ PROPERTIES
+ COMPILE_WARNING_AS_ERROR ${WITH_WARNINGS_AS_ERRORS}
+ DEFINE_SYMBOL TRINITY_API_EXPORT_NETWORK
+ FOLDER "server"
+ OUTPUT_NAME trinity_network)
+
+if(BUILD_SHARED_LIBS)
+ if(UNIX)
+ install(TARGETS network
+ LIBRARY
+ DESTINATION lib)
+ elseif(WIN32)
+ install(TARGETS network
+ RUNTIME
+ DESTINATION "${CMAKE_INSTALL_PREFIX}")
+ endif()
+endif()
diff --git a/src/server/shared/Networking/ConnectionInitializers/SocketConnectionInitializer.h b/src/common/network/ConnectionInitializers/SocketConnectionInitializer.h
index d3f0bb16dbf..d3f0bb16dbf 100644
--- a/src/server/shared/Networking/ConnectionInitializers/SocketConnectionInitializer.h
+++ b/src/common/network/ConnectionInitializers/SocketConnectionInitializer.h
diff --git a/src/server/shared/Networking/Http/BaseHttpSocket.cpp b/src/common/network/Http/BaseHttpSocket.cpp
index 33053399c14..33053399c14 100644
--- a/src/server/shared/Networking/Http/BaseHttpSocket.cpp
+++ b/src/common/network/Http/BaseHttpSocket.cpp
diff --git a/src/server/shared/Networking/Http/BaseHttpSocket.h b/src/common/network/Http/BaseHttpSocket.h
index 4b7c3bd9dd1..2d58b6d5aa1 100644
--- a/src/server/shared/Networking/Http/BaseHttpSocket.h
+++ b/src/common/network/Http/BaseHttpSocket.h
@@ -19,11 +19,9 @@
#define TRINITYCORE_BASE_HTTP_SOCKET_H
#include "AsyncCallbackProcessor.h"
-#include "DatabaseEnvFwd.h"
#include "HttpCommon.h"
#include "HttpSessionState.h"
#include "Optional.h"
-#include "QueryCallback.h"
#include "Socket.h"
#include "SocketConnectionInitializer.h"
#include <boost/beast/core/basic_stream.hpp>
@@ -67,7 +65,7 @@ public:
using RequestParser = boost::beast::http::request_parser<RequestBody>;
-class TC_SHARED_API AbstractSocket
+class TC_NETWORK_API AbstractSocket
{
public:
AbstractSocket() = default;
@@ -86,8 +84,6 @@ public:
void LogRequestAndResponse(RequestContext const& context, MessageBuffer& buffer) const;
- virtual void QueueQuery(QueryCallback&& queryCallback) = 0;
-
virtual std::string GetClientInfo() const = 0;
static std::string GetClientInfo(boost::asio::ip::address const& address, uint16 port, SessionState const* state);
@@ -197,21 +193,9 @@ public:
this->DelayedCloseSocket();
}
- void QueueQuery(QueryCallback&& queryCallback) final
- {
- this->_queryProcessor.AddCallback(std::move(queryCallback));
- }
-
void Start() override { return this->Base::Start(); }
- bool Update() override
- {
- if (!this->Base::Update())
- return false;
-
- this->_queryProcessor.ProcessReadyCallbacks();
- return true;
- }
+ bool Update() override { return this->Base::Update(); }
boost::asio::ip::address const& GetRemoteIpAddress() const final { return this->Base::GetRemoteIpAddress(); }
@@ -236,7 +220,6 @@ public:
protected:
virtual std::shared_ptr<SessionState> ObtainSessionState(RequestContext& context) const = 0;
- QueryCallbackProcessor _queryProcessor;
Optional<RequestParser> _httpParser;
std::shared_ptr<SessionState> _state;
};
diff --git a/src/server/shared/Networking/Http/HttpCommon.h b/src/common/network/Http/HttpCommon.h
index 5f6ecb6c147..274b59d7536 100644
--- a/src/server/shared/Networking/Http/HttpCommon.h
+++ b/src/common/network/Http/HttpCommon.h
@@ -37,8 +37,8 @@ struct RequestContext
struct RequestHandler const* handler = nullptr;
};
-TC_SHARED_API bool CanLogRequestContent(RequestContext const& context);
-TC_SHARED_API bool CanLogResponseContent(RequestContext const& context);
+TC_NETWORK_API bool CanLogRequestContent(RequestContext const& context);
+TC_NETWORK_API bool CanLogResponseContent(RequestContext const& context);
inline std::string_view ToStdStringView(boost::beast::string_view bsw)
{
diff --git a/src/server/shared/Networking/Http/HttpService.cpp b/src/common/network/Http/HttpService.cpp
index b01e27e296a..b01e27e296a 100644
--- a/src/server/shared/Networking/Http/HttpService.cpp
+++ b/src/common/network/Http/HttpService.cpp
diff --git a/src/server/shared/Networking/Http/HttpService.h b/src/common/network/Http/HttpService.h
index 2a377c734da..1549893576f 100644
--- a/src/server/shared/Networking/Http/HttpService.h
+++ b/src/common/network/Http/HttpService.h
@@ -51,7 +51,7 @@ struct RequestHandler
EnumFlag<RequestHandlerFlag> Flags = RequestHandlerFlag::None;
};
-class TC_SHARED_API DispatcherService
+class TC_NETWORK_API DispatcherService
{
public:
explicit DispatcherService(std::string_view loggerSuffix) : _logger("server.http.dispatcher.")
@@ -79,7 +79,7 @@ private:
std::string _logger;
};
-class TC_SHARED_API SessionService
+class TC_NETWORK_API SessionService
{
public:
explicit SessionService(std::string_view loggerSuffix) : _logger("server.http.session.")
diff --git a/src/server/shared/Networking/Http/HttpSessionState.h b/src/common/network/Http/HttpSessionState.h
index 3012a2efc65..3012a2efc65 100644
--- a/src/server/shared/Networking/Http/HttpSessionState.h
+++ b/src/common/network/Http/HttpSessionState.h
diff --git a/src/server/shared/Networking/Http/HttpSocket.h b/src/common/network/Http/HttpSocket.h
index 2cfc3ba8ed8..2cfc3ba8ed8 100644
--- a/src/server/shared/Networking/Http/HttpSocket.h
+++ b/src/common/network/Http/HttpSocket.h
diff --git a/src/server/shared/Networking/Http/HttpSslSocket.h b/src/common/network/Http/HttpSslSocket.h
index c789cbfefaf..c789cbfefaf 100644
--- a/src/server/shared/Networking/Http/HttpSslSocket.h
+++ b/src/common/network/Http/HttpSslSocket.h
diff --git a/src/common/Asio/IpAddress.h b/src/common/network/IpAddress.h
index 7d85b0028ac..b856d7f6340 100644
--- a/src/common/Asio/IpAddress.h
+++ b/src/common/network/IpAddress.h
@@ -15,22 +15,19 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef IpAddress_h__
-#define IpAddress_h__
+#ifndef TRINITYCORE_IP_ADDRESS_H
+#define TRINITYCORE_IP_ADDRESS_H
#include "Define.h"
#include <boost/asio/ip/address.hpp>
-namespace Trinity
+namespace Trinity::Net
{
- namespace Net
- {
- using boost::asio::ip::make_address;
- using boost::asio::ip::make_address_v4;
- using boost::asio::ip::make_address_v6;
- using boost::asio::ip::v4_mapped_t::v4_mapped;
- inline uint32 address_to_uint(boost::asio::ip::address_v4 const& address) { return address.to_uint(); }
- }
+ using boost::asio::ip::make_address;
+ using boost::asio::ip::make_address_v4;
+ using boost::asio::ip::make_address_v6;
+ using boost::asio::ip::v4_mapped_t::v4_mapped;
+ inline uint32 address_to_uint(boost::asio::ip::address_v4 const& address) { return address.to_uint(); }
}
-#endif // IpAddress_h__
+#endif // TRINITYCORE_IP_ADDRESS_H
diff --git a/src/common/Asio/IpNetwork.cpp b/src/common/network/IpNetwork.cpp
index 85f176d21e4..b6235a5a947 100644
--- a/src/common/Asio/IpNetwork.cpp
+++ b/src/common/network/IpNetwork.cpp
@@ -33,7 +33,7 @@ bool IsInLocalNetwork(boost::asio::ip::address const& clientAddress)
{
if (clientAddress.is_v4())
{
- return std::any_of(LocalV4Networks.begin(), LocalV4Networks.end(), [clientAddressV4 = clientAddress.to_v4()](boost::asio::ip::network_v4 const& network)
+ return std::ranges::any_of(LocalV4Networks, [clientAddressV4 = clientAddress.to_v4()](boost::asio::ip::network_v4 const& network)
{
return IsInNetwork(network, clientAddressV4);
});
@@ -41,7 +41,7 @@ bool IsInLocalNetwork(boost::asio::ip::address const& clientAddress)
if (clientAddress.is_v6())
{
- return std::any_of(LocalV6Networks.begin(), LocalV6Networks.end(), [clientAddressV6 = clientAddress.to_v6()](boost::asio::ip::network_v6 const& network)
+ return std::ranges::any_of(LocalV6Networks, [clientAddressV6 = clientAddress.to_v6()](boost::asio::ip::network_v6 const& network)
{
return IsInNetwork(network, clientAddressV6);
});
diff --git a/src/common/Asio/IpNetwork.h b/src/common/network/IpNetwork.h
index 08db7d49f84..c05c3076598 100644
--- a/src/common/Asio/IpNetwork.h
+++ b/src/common/network/IpNetwork.h
@@ -15,8 +15,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef IpNetwork_h__
-#define IpNetwork_h__
+#ifndef TRINITYCORE_IP_NETWORK_H
+#define TRINITYCORE_IP_NETWORK_H
#include "AsioHacksFwd.h"
#include "Define.h"
@@ -25,15 +25,15 @@
namespace Trinity::Net
{
-TC_COMMON_API bool IsInLocalNetwork(boost::asio::ip::address const& clientAddress);
+TC_NETWORK_API bool IsInLocalNetwork(boost::asio::ip::address const& clientAddress);
-TC_COMMON_API bool IsInNetwork(boost::asio::ip::network_v4 const& network, boost::asio::ip::address_v4 const& clientAddress);
+TC_NETWORK_API bool IsInNetwork(boost::asio::ip::network_v4 const& network, boost::asio::ip::address_v4 const& clientAddress);
-TC_COMMON_API bool IsInNetwork(boost::asio::ip::network_v6 const& network, boost::asio::ip::address_v6 const& clientAddress);
+TC_NETWORK_API bool IsInNetwork(boost::asio::ip::network_v6 const& network, boost::asio::ip::address_v6 const& clientAddress);
-TC_COMMON_API Optional<std::size_t> SelectAddressForClient(boost::asio::ip::address const& clientAddress, std::span<boost::asio::ip::address const> const& addresses);
+TC_NETWORK_API Optional<std::size_t> SelectAddressForClient(boost::asio::ip::address const& clientAddress, std::span<boost::asio::ip::address const> const& addresses);
-TC_COMMON_API void ScanLocalNetworks();
+TC_NETWORK_API void ScanLocalNetworks();
}
-#endif // IpNetwork_h__
+#endif // TRINITYCORE_IP_NETWORK_H
diff --git a/src/server/shared/Networking/NetworkThread.h b/src/common/network/NetworkThread.h
index d16da442149..d16da442149 100644
--- a/src/server/shared/Networking/NetworkThread.h
+++ b/src/common/network/NetworkThread.h
diff --git a/src/common/network/Resolver.cpp b/src/common/network/Resolver.cpp
new file mode 100644
index 00000000000..9bcfcf28e78
--- /dev/null
+++ b/src/common/network/Resolver.cpp
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Resolver.h"
+#include <algorithm>
+
+Optional<boost::asio::ip::tcp::endpoint> Trinity::Net::Resolver::Resolve(boost::asio::ip::tcp const& protocol, std::string_view host, std::string_view service)
+{
+ boost::system::error_code ec;
+ boost::asio::ip::resolver_base::flags flagsResolver = boost::asio::ip::resolver_base::all_matching;
+ boost::asio::ip::tcp::resolver::results_type results = _impl.resolve(protocol, host, service, flagsResolver, ec);
+ Optional<boost::asio::ip::tcp::endpoint> result;
+ if (!ec)
+ if (auto itr = results.begin(); itr != results.end())
+ result.emplace(itr->endpoint());
+
+ return result;
+}
+
+std::vector<boost::asio::ip::tcp::endpoint> Trinity::Net::Resolver::ResolveAll(std::string_view host, std::string_view service)
+{
+ boost::system::error_code ec;
+ boost::asio::ip::resolver_base::flags flagsResolver = boost::asio::ip::resolver_base::all_matching;
+ boost::asio::ip::tcp::resolver::results_type results = _impl.resolve(host, service, flagsResolver, ec);
+ std::vector<boost::asio::ip::tcp::endpoint> result;
+ if (!ec)
+ {
+ result.resize(results.size());
+ std::ranges::transform(results, result.begin(), [](boost::asio::ip::tcp::resolver::results_type::value_type const& entry) { return entry.endpoint(); });
+ }
+
+ return result;
+}
diff --git a/src/common/network/Resolver.h b/src/common/network/Resolver.h
new file mode 100644
index 00000000000..c7d24658aa5
--- /dev/null
+++ b/src/common/network/Resolver.h
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITYCORE_RESOLVER_H
+#define TRINITYCORE_RESOLVER_H
+
+#include "Define.h"
+#include "IoContext.h"
+#include "Optional.h"
+#include <boost/asio/ip/tcp.hpp>
+#include <string_view>
+#include <vector>
+
+namespace Trinity::Net
+{
+/**
+ Hack to make it possible to forward declare resolver (one of its template arguments is a typedef to something super long and using nested classes)
+*/
+class TC_NETWORK_API Resolver
+{
+public:
+ explicit Resolver(Asio::IoContext& ioContext) : _impl(ioContext) { }
+
+ Optional<boost::asio::ip::tcp::endpoint> Resolve(boost::asio::ip::tcp const& protocol, std::string_view host, std::string_view service);
+
+ std::vector<boost::asio::ip::tcp::endpoint> ResolveAll(std::string_view host, std::string_view service);
+
+private:
+ boost::asio::ip::tcp::resolver _impl;
+};
+}
+
+#endif // TRINITYCORE_RESOLVER_H
diff --git a/src/server/shared/Networking/Socket.h b/src/common/network/Socket.h
index 565cc175318..565cc175318 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/common/network/Socket.h
diff --git a/src/server/shared/Networking/SocketMgr.h b/src/common/network/SocketMgr.h
index 07252355308..07252355308 100644
--- a/src/server/shared/Networking/SocketMgr.h
+++ b/src/common/network/SocketMgr.h
diff --git a/src/server/shared/Networking/SslStream.h b/src/common/network/SslStream.h
index 2cced44e5ff..2cced44e5ff 100644
--- a/src/server/shared/Networking/SslStream.h
+++ b/src/common/network/SslStream.h
diff --git a/src/server/bnetserver/REST/LoginHttpSession.cpp b/src/server/bnetserver/REST/LoginHttpSession.cpp
index 23a317d3726..bd8afdbcf2f 100644
--- a/src/server/bnetserver/REST/LoginHttpSession.cpp
+++ b/src/server/bnetserver/REST/LoginHttpSession.cpp
@@ -83,7 +83,7 @@ public:
// build initializer chain
boost::container::static_vector<std::shared_ptr<Trinity::Net::SocketConnectionInitializer>, 4> initializers;
- initializers.stable_emplace_back(std::make_shared<Trinity::Net::IpBanCheckConnectionInitializer<BaseSocket>>(this));
+ initializers.stable_emplace_back(std::make_shared<Trinity::Net::IpBanCheckConnectionInitializer<Battlenet::LoginHttpSession>>(&_owner));
if constexpr (std::is_same_v<BaseSocket, Trinity::Net::Http::SslSocket>)
initializers.stable_emplace_back(std::make_shared<Trinity::Net::SslHandshakeConnectionInitializer<BaseSocket>>(this));
@@ -124,10 +124,26 @@ LoginHttpSession::LoginHttpSession(Trinity::Net::IoContextTcpSocket&& socket)
{
}
+LoginHttpSession::~LoginHttpSession() = default;
+
void LoginHttpSession::Start()
{
TC_LOG_TRACE("server.http.session", "{} Accepted connection", GetClientInfo());
return _socket->Start();
}
+
+bool LoginHttpSession::Update()
+{
+ if (!_socket->Update())
+ return false;
+
+ _queryProcessor.ProcessReadyCallbacks();
+ return true;
+}
+
+void LoginHttpSession::QueueQuery(QueryCallback&& queryCallback)
+{
+ _queryProcessor.AddCallback(std::move(queryCallback));
+}
}
diff --git a/src/server/bnetserver/REST/LoginHttpSession.h b/src/server/bnetserver/REST/LoginHttpSession.h
index c15442f9e0c..9690b02f14a 100644
--- a/src/server/bnetserver/REST/LoginHttpSession.h
+++ b/src/server/bnetserver/REST/LoginHttpSession.h
@@ -18,7 +18,9 @@
#ifndef TRINITYCORE_LOGIN_HTTP_SESSION_H
#define TRINITYCORE_LOGIN_HTTP_SESSION_H
+#include "AsyncCallbackProcessor.h"
#include "BaseHttpSocket.h"
+#include "DatabaseEnvFwd.h"
#include "SRP6.h"
namespace Battlenet
@@ -34,20 +36,22 @@ public:
static constexpr std::string_view SESSION_ID_COOKIE = "JSESSIONID=";
explicit LoginHttpSession(Trinity::Net::IoContextTcpSocket&& socket);
+ ~LoginHttpSession();
void Start() override;
- bool Update() override { return _socket->Update(); }
+ bool Update() override;
boost::asio::ip::address const& GetRemoteIpAddress() const override { return _socket->GetRemoteIpAddress(); }
bool IsOpen() const override { return _socket->IsOpen(); }
void CloseSocket() override { return _socket->CloseSocket(); }
void SendResponse(Trinity::Net::Http::RequestContext& context) override { return _socket->SendResponse(context); }
- void QueueQuery(QueryCallback&& queryCallback) override { return _socket->QueueQuery(std::move(queryCallback)); }
+ void QueueQuery(QueryCallback&& queryCallback);
std::string GetClientInfo() const override { return _socket->GetClientInfo(); }
LoginSessionState* GetSessionState() const override { return static_cast<LoginSessionState*>(_socket->GetSessionState()); }
private:
std::shared_ptr<Trinity::Net::Http::AbstractSocket> _socket;
+ QueryCallbackProcessor _queryProcessor;
};
}
diff --git a/src/server/bnetserver/REST/LoginRESTService.cpp b/src/server/bnetserver/REST/LoginRESTService.cpp
index 1afcc5c88bb..2cb804b4307 100644
--- a/src/server/bnetserver/REST/LoginRESTService.cpp
+++ b/src/server/bnetserver/REST/LoginRESTService.cpp
@@ -80,7 +80,7 @@ bool LoginRESTService::StartNetwork(Trinity::Asio::IoContext& ioContext, std::st
using namespace std::string_literals;
std::array<std::string, 2> configKeys = { { "LoginREST.ExternalAddress"s, "LoginREST.LocalAddress"s } };
- Trinity::Asio::Resolver resolver(ioContext);
+ Trinity::Net::Resolver resolver(ioContext);
for (std::size_t i = 0; i < _hostnames.size(); ++i)
{
diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp
index 5e717b379db..7af5a820ccc 100644
--- a/src/server/scripts/Commands/cs_ban.cpp
+++ b/src/server/scripts/Commands/cs_ban.cpp
@@ -29,6 +29,7 @@ EndScriptData */
#include "ChatCommand.h"
#include "DatabaseEnv.h"
#include "GameTime.h"
+#include "IpAddress.h"
#include "Language.h"
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
@@ -161,6 +162,13 @@ public:
return HandleBanHelper(BAN_IP, args, handler);
}
+ static bool IsIPAddress(std::string const& text)
+ {
+ boost::system::error_code error;
+ Trinity::Net::make_address(text, error);
+ return !error;
+ }
+
static bool HandleBanHelper(BanMode mode, char const* args, ChatHandler* handler)
{
if (!*args)
@@ -199,7 +207,7 @@ public:
}
break;
case BAN_IP:
- if (!IsIPAddress(nameOrIP.c_str()))
+ if (!IsIPAddress(nameOrIP))
return false;
break;
}
@@ -360,22 +368,13 @@ public:
return true;
}
- static bool HandleBanInfoIPCommand(ChatHandler* handler, char const* args)
+ static bool HandleBanInfoIPCommand(ChatHandler* handler, std::string&& ip)
{
- if (!*args)
+ if (!IsIPAddress(ip))
return false;
- char* ipStr = strtok((char*)args, "");
- if (!ipStr)
- return false;
-
- if (!IsIPAddress(ipStr))
- return false;
-
- std::string IP = ipStr;
-
- LoginDatabase.EscapeString(IP);
- QueryResult result = LoginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason, bannedby, unbandate-bandate FROM ip_banned WHERE ip = '{}'", IP);
+ LoginDatabase.EscapeString(ip);
+ QueryResult result = LoginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason, bannedby, unbandate-bandate FROM ip_banned WHERE ip = '{}'", ip);
if (!result)
{
handler->PSendSysMessage(LANG_BANINFO_NOIP);
@@ -745,7 +744,7 @@ public:
}
break;
case BAN_IP:
- if (!IsIPAddress(nameOrIP.c_str()))
+ if (!IsIPAddress(nameOrIP))
return false;
break;
}
diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt
index e5de78eb747..cac46028064 100644
--- a/src/server/shared/CMakeLists.txt
+++ b/src/server/shared/CMakeLists.txt
@@ -41,6 +41,7 @@ target_link_libraries(shared
trinity-core-interface
PUBLIC
database
+ network
rapidjson
proto
zlib)
diff --git a/src/common/IPLocation/IPLocation.cpp b/src/server/shared/IpLocation/IPLocation.cpp
index 72383bd3554..72383bd3554 100644
--- a/src/common/IPLocation/IPLocation.cpp
+++ b/src/server/shared/IpLocation/IPLocation.cpp
diff --git a/src/common/IPLocation/IPLocation.h b/src/server/shared/IpLocation/IPLocation.h
index 5471948586b..233404db241 100644
--- a/src/common/IPLocation/IPLocation.h
+++ b/src/server/shared/IpLocation/IPLocation.h
@@ -35,7 +35,7 @@ struct IpLocationRecord
std::string CountryName;
};
-class TC_COMMON_API IpLocationStore
+class TC_SHARED_API IpLocationStore
{
public:
IpLocationStore();
diff --git a/src/server/shared/Networking/ConnectionInitializers/IpBanCheckConnectionInitializer.h b/src/server/shared/Networking/ConnectionInitializers/IpBanCheckConnectionInitializer.h
index ff8210a7f69..84df525918e 100644
--- a/src/server/shared/Networking/ConnectionInitializers/IpBanCheckConnectionInitializer.h
+++ b/src/server/shared/Networking/ConnectionInitializers/IpBanCheckConnectionInitializer.h
@@ -47,7 +47,7 @@ struct IpBanCheckConnectionInitializer final : SocketConnectionInitializer
if (IpBanCheckHelpers::IsBanned(result))
{
TC_LOG_ERROR("network", "IpBanCheckConnectionInitializer: IP {} is banned.", socket->GetRemoteIpAddress().to_string());
- socket->DelayedCloseSocket();
+ socket->CloseSocket();
return;
}
diff --git a/src/server/shared/Realm/RealmList.cpp b/src/server/shared/Realm/RealmList.cpp
index fb720182bf4..c0e6ba5b2a6 100644
--- a/src/server/shared/Realm/RealmList.cpp
+++ b/src/server/shared/Realm/RealmList.cpp
@@ -68,7 +68,7 @@ void RealmList::Initialize(Trinity::Asio::IoContext& ioContext, uint32 updateInt
{
_updateInterval = updateInterval;
_updateTimer = std::make_unique<Trinity::Asio::DeadlineTimer>(ioContext);
- _resolver = std::make_unique<Trinity::Asio::Resolver>(ioContext);
+ _resolver = std::make_unique<Trinity::Net::Resolver>(ioContext);
ClientBuild::LoadBuildInfo();
// Get the content of the realmlist table in the database
diff --git a/src/server/shared/Realm/RealmList.h b/src/server/shared/Realm/RealmList.h
index ddb42ae7e1f..fdc0cb393b8 100644
--- a/src/server/shared/Realm/RealmList.h
+++ b/src/server/shared/Realm/RealmList.h
@@ -86,7 +86,7 @@ private:
std::unordered_set<std::string> _subRegions;
uint32 _updateInterval;
std::unique_ptr<Trinity::Asio::DeadlineTimer> _updateTimer;
- std::unique_ptr<Trinity::Asio::Resolver> _resolver;
+ std::unique_ptr<Trinity::Net::Resolver> _resolver;
Optional<Battlenet::RealmHandle> _currentRealmId;
};
diff --git a/src/tools/extractor_common/CMakeLists.txt b/src/tools/extractor_common/CMakeLists.txt
index 8455731db7e..cded754666d 100644
--- a/src/tools/extractor_common/CMakeLists.txt
+++ b/src/tools/extractor_common/CMakeLists.txt
@@ -19,7 +19,8 @@ target_link_libraries(extractor_common
trinity-core-interface
PUBLIC
casc
- common)
+ common
+ network)
target_include_directories(extractor_common
PUBLIC
diff --git a/src/tools/extractor_common/CascHandles.cpp b/src/tools/extractor_common/CascHandles.cpp
index a08f1fb9a53..f2964a550a5 100644
--- a/src/tools/extractor_common/CascHandles.cpp
+++ b/src/tools/extractor_common/CascHandles.cpp
@@ -65,7 +65,7 @@ namespace
sslContext.set_options(boost::asio::ssl::context::no_tlsv1_1, error);
sslContext.set_default_verify_paths(error);
- Trinity::Asio::Resolver resolver(ioContext);
+ Trinity::Net::Resolver resolver(ioContext);
Optional<boost::asio::ip::tcp::endpoint> endpoint = resolver.Resolve(boost::asio::ip::tcp::v4(), serverName, std::to_string(port));
if (!endpoint)