1
0
2025-09-01 12:53:41 -05:00

211 lines
8.6 KiB
C++

/*
EQ2Emulator: Everquest II Server Emulator
Copyright (C) 2007 EQ2EMulator Development Team (http://www.eq2emulator.net)
This file is part of EQ2Emulator.
*/
#pragma once
// Linux network headers
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
// Standard library includes
#include <atomic>
#include <cstdint>
#include <string>
#include <string_view>
#include <memory>
// Project includes
#include "../common/types.h"
#include "../common/Web/WebServer.h"
#include "../common/MiscFunctions.h"
// Forward declarations
class LWorld;
/**
* @brief Signal handler for graceful shutdown
* @param sig_num Signal number received
*/
void CatchSignal(int sig_num);
/**
* @brief Server operation modes
*/
enum class ServerMode : std::uint8_t
{
Standalone, // Server operates independently
Master, // Server acts as master node
Slave, // Server acts as slave node
Mesh // Server participates in mesh network
};
/**
* @brief Main network connection manager for the login server
*
* This class handles all network operations for the login server including:
* - Client connections and authentication
* - World server connections
* - Configuration management
* - Web server integration
*/
class NetConnection
{
public:
/**
* @brief Default constructor - initializes all network settings to defaults
*/
NetConnection() noexcept;
/**
* @brief Destructor - ensures proper cleanup of network resources
*/
~NetConnection();
// Disable copy operations (network connection should be unique)
NetConnection(const NetConnection&) = delete;
NetConnection& operator=(const NetConnection&) = delete;
// Enable move operations for potential future use
NetConnection(NetConnection&&) = default;
NetConnection& operator=(NetConnection&&) = default;
/**
* @brief Updates the console window title with server statistics
* @param new_title Optional custom title (nullptr uses default format)
* Note: This is a no-op on Linux but kept for API compatibility
*/
void UpdateWindowTitle(const char* new_title = nullptr);
/**
* @brief Initializes the network connection
* @return true if initialization successful, false otherwise
*/
bool Init();
/**
* @brief Listens for new client connections
*/
void ListenNewClients();
/**
* @brief Reads configuration from the login config file
* @return true if config loaded successfully, false otherwise
*/
bool ReadLoginConfig();
/**
* @brief Displays the welcome header with version and copyright info
*/
void WelcomeHeader();
/**
* @brief Initializes the web server for HTTP/HTTPS API access
* @param web_ipaddr IP address to bind the web server to
* @param web_port Port number for the web server
* @param cert_file Path to SSL certificate file
* @param key_file Path to SSL key file
* @param key_password Password for the SSL key
* @param hardcode_user Hardcoded username for basic auth
* @param hardcode_password Hardcoded password for basic auth
*/
void InitWebServer(std::string_view web_ipaddr,
std::uint16_t web_port,
std::string_view cert_file,
std::string_view key_file,
std::string_view key_password,
std::string_view hardcode_user,
std::string_view hardcode_password);
// Static web server request handlers
/**
* @brief Handles /status endpoint requests
* @param req HTTP request object
* @param res HTTP response object to populate
*/
static void Web_loginhandle_status(const http::request<http::string_body>& req,
http::response<http::string_body>& res);
/**
* @brief Handles /worlds endpoint requests
* @param req HTTP request object
* @param res HTTP response object to populate
*/
static void Web_loginhandle_worlds(const http::request<http::string_body>& req,
http::response<http::string_body>& res);
// Getter methods for configuration values
[[nodiscard]] std::uint16_t GetPort() const noexcept { return port_; }
[[nodiscard]] ServerMode GetLoginMode() const noexcept { return login_mode_; }
[[nodiscard]] const char* GetMasterAddress() const noexcept { return master_address_.data(); }
[[nodiscard]] std::uint16_t GetUplinkPort() const noexcept
{
return (uplink_port_ != 0) ? uplink_port_ : port_;
}
[[nodiscard]] const char* GetUplinkAccount() const noexcept { return uplink_account_.data(); }
[[nodiscard]] const char* GetUplinkPassword() const noexcept { return uplink_password_.data(); }
[[nodiscard]] bool IsAllowingAccountCreation() const noexcept { return allow_account_creation_; }
[[nodiscard]] std::uint32_t GetExpansionFlag() const noexcept { return expansion_flag_; }
[[nodiscard]] std::uint8_t GetCitiesFlag() const noexcept { return cities_flag_; }
[[nodiscard]] std::uint32_t GetDefaultSubscriptionLevel() const noexcept { return default_subscription_level_; }
[[nodiscard]] std::uint32_t GetEnabledRaces() const noexcept { return enabled_races_; }
[[nodiscard]] const std::string& GetWebLoginAddress() const noexcept { return web_login_address_; }
[[nodiscard]] std::uint16_t GetWebLoginPort() const noexcept { return web_login_port_; }
[[nodiscard]] const std::string& GetWebCertFile() const noexcept { return web_cert_file_; }
[[nodiscard]] const std::string& GetWebKeyFile() const noexcept { return web_key_file_; }
[[nodiscard]] const std::string& GetWebKeyPassword() const noexcept { return web_key_password_; }
[[nodiscard]] const std::string& GetWebHardcodeUser() const noexcept { return web_hardcode_user_; }
[[nodiscard]] const std::string& GetWebHardcodePassword() const noexcept { return web_hardcode_password_; }
// Setter methods for configuration values
void SetPort(std::uint16_t port) noexcept { port_ = port; }
// Public state variables
char address[1024]{}; // Server address buffer
std::atomic<std::int32_t> numclients{0}; // Current number of connected clients
std::atomic<std::int32_t> numservers{0}; // Current number of connected world servers
std::atomic<bool> login_running{false}; // Flag indicating if login server is running
std::atomic<std::int64_t> login_uptime{0}; // Timestamp when server started
protected:
friend class LWorld; // Allow LWorld access to protected members
/**
* @brief Flag indicating uplink version mismatch
*/
bool uplink_wrong_version_{false};
private:
// Network configuration
std::uint16_t port_{5999}; // Server listening port
int listening_socket_{0}; // Main listening socket descriptor
// Master server configuration (for non-standalone modes)
std::array<char, 300> master_address_{}; // Master server address
std::uint16_t uplink_port_{0}; // Port for uplink connection
std::array<char, 300> uplink_account_{}; // Account for uplink authentication
std::array<char, 300> uplink_password_{}; // Password for uplink authentication
ServerMode login_mode_{ServerMode::Standalone}; // Current server operation mode
// Account and expansion settings
bool allow_account_creation_{true}; // Allow new account creation
std::uint32_t expansion_flag_{0x7CFF}; // Enabled expansions bitfield
std::uint8_t cities_flag_{0xFF}; // Enabled starting cities bitfield
std::uint32_t default_subscription_level_{0xFFFFFFFF}; // Default subscription level for new accounts
std::uint32_t enabled_races_{0xFFFF}; // Enabled races bitfield
// Web server configuration
std::string web_login_address_; // Web server bind address
std::string web_cert_file_; // SSL certificate file path
std::string web_key_file_; // SSL key file path
std::string web_key_password_; // SSL key password
std::string web_hardcode_user_; // Basic auth username
std::string web_hardcode_password_; // Basic auth password
std::uint16_t web_login_port_{0}; // Web server port
std::unique_ptr<WebServer> login_webserver_; // Web server instance
};