14#ifndef OPENVPN_SERVER_SERVPROTO_H
15#define OPENVPN_SERVER_SERVPROTO_H
35#ifdef OPENVPN_DEBUG_SERVPROTO
36#define OPENVPN_LOG_SERVPROTO(x) OPENVPN_LOG(x)
38#define OPENVPN_LOG_SERVPROTO(x)
58 Factory(openvpn_io::io_context &io_context_arg,
127 const int local_peer_id,
216#ifdef OPENVPN_PACKET_LOG
217 log_packet(buf,
false);
242 catch (
const std::exception &e)
267 unsigned int &keepalive_timeout)
override
271 ManLink::send->keepalive_override(keepalive_ping, keepalive_timeout);
288 Session(openvpn_io::io_context &io_context_arg,
327 const std::string &peer_info,
330 constexpr size_t MAX_USERNAME_SIZE = 256;
331 constexpr size_t MAX_PASSWORD_SIZE = 16384;
346 const std::string
msg = ProtoContext::template read_control_string<std::string>(*app_bp);
350 const std::string reason(
"Control channel message with invalid characters received");
355 if (
msg ==
"PUSH_REQUEST")
362 else if (
msg ==
"EXIT")
364 OPENVPN_LOG(
"Client disconnecting from server, EXIT received");
368 else if (
msg.starts_with(
"ACC,"))
386 const std::string &client_reason)
override
409 buf->null_terminate();
433 for (
auto &
msg : push_msgs)
435 msg->null_terminate();
455 const std::string &reason,
456 const std::string &client_reason)
override
473 if (!client_reason.empty())
476 os <<
"client was disconnected from server";
484 if (!client_reason.empty())
487 os <<
"server requested a client reconnect";
493 ts =
"RESTART_PASSIVE";
494 os <<
"RESTART,[P]:";
495 if (!client_reason.empty())
498 os <<
"server requested a client reconnect";
502 os <<
"RESTART,[P]:";
503 if (!client_reason.empty())
506 os <<
"server requested a client reconnect";
513 if (!client_reason.empty())
514 os <<
',' << client_reason;
521 const size_t pos = reason.find_first_of(
',');
522 if (pos != std::string::npos)
523 ts = reason.substr(0, pos);
538 buf->null_terminate();
571 msg->null_terminate();
659 error(
"disconnect triggered");
665 auth_failed(
"Auth Pending Timeout",
"Auth Pending Timeout");
668 error(
"unknown disconnect");
676 catch (
const std::exception &exc)
694 { self->housekeeping_callback(
error); });
745 return "UNNAMED_CLIENT";
std::size_t expires_at(const Time &t)
bool similar(const Time &t) const
void init(const Time::Duration &pre, const Time::Duration &post)
void reset(const Time &t)
size_t size() const
Returns the size of the buffer in T objects.
bool empty() const
Returns true if the buffer is empty.
void set_factory(const CryptoDCFactory::Ptr &factory)
bool client_supports_request_push() const
bool tls_crypt_enabled() const
bool tls_auth_enabled() const
bool tls_crypt_v2_enabled() const
void data_limit_notify(const unsigned int key_id, const DataLimit::Mode cdl_mode, const DataLimit::State cdl_status)
bool control_net_recv(const PacketType &type, BufferPtr &&net_bp)
void set_local_peer_id(const int local_peer_id)
CryptoDCSettings & dc_settings()
void flush(const bool control_channel)
void control_send(BufferPtr &&app_bp)
PacketType packet_type(const Buffer &buf)
bool is_keepalive_enabled() const
ProtoConfig::Ptr conf_ptr() const
std::string dump_packet(const Buffer &buf)
bool data_decrypt(const PacketType &type, BufferAllocated &in_out)
void disable_keepalive(unsigned int &keepalive_ping, unsigned int &keepalive_timeout)
Error::Type invalidation_reason() const
Time next_housekeeping() const
void reset(const ProtoSessionID cookie_psid=ProtoSessionID())
Resets ProtoContext *this to it's initial state.
void start(const ProtoSessionID cookie_psid=ProtoSessionID())
Initialize the state machine and start protocol negotiation.
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
static Ptr Create(ArgsT &&...args)
Creates a new instance of RcEnable with the given arguments.
A string-like type that clears the buffer contents on delete.
ProtoContext::TLSWrapPreValidate::Ptr tls_crypt_preval
Factory(openvpn_io::io_context &io_context_arg, const ProtoConfig &c)
TransportClientInstance::Recv::Ptr new_client_instance() override
ProtoConfig::Ptr proto_context_config
TunClientInstance::Factory::Ptr tun_factory
ProtoContext::ProtoConfig ProtoConfig
ProtoConfig::Ptr clone_proto_config() const
ProtoContext::TLSWrapPreValidate::Ptr tls_auth_preval
bool validate_initial_packet(const BufferAllocated &net_buf) override
openvpn_io::io_context & io_context
ManClientInstance::Factory::Ptr man_factory
void disable_keepalive(unsigned int &keepalive_ping, unsigned int &keepalive_timeout) override
void disconnect_in(const Time::Duration &dur)
CoarseTime housekeeping_schedule
void housekeeping_callback(const openvpn_io::error_code &e)
void override_dc_factory(const CryptoDCFactory::Ptr &dc_factory) override
void error(const std::exception &e)
void tun_recv(BufferAllocated &buf) override
void control_net_send(const Buffer &net_buf) override
void push_halt_restart_msg(const HaltRestart::Type type, const std::string &reason, const std::string &client_reason) override
TunClientInstance::Recv * override_tun(TunClientInstance::Send *tun) override
void schedule_disconnect(const unsigned int seconds) override
ManClientInstance::Factory::Ptr man_factory
void active(bool primary) override
Called when KeyContext transitions to ACTIVE state.
bool supports_epoch_data() override
void data_limit_notify(const int key_id, const DataLimit::Mode cdl_mode, const DataLimit::State cdl_status) override
void control_recv(BufferPtr &&app_bp) override
TunClientInstance::Factory::Ptr tun_factory
bool should_preserve_session_id() override
bool defined() const override
void error(const std::string &error)
void relay(const IP::Addr &target, const int port) override
TunClientInstance::NativeHandle tun_native_handle() override
ProtoContext proto_context
bool transport_recv(BufferAllocated &buf) override
std::string instance_name() const
void server_auth(const std::string &username, const SafeString &password, const std::string &peer_info, const AuthCert::Ptr &auth_cert) override
void stats_notify(const PeerStats &ps, const bool final) override
void schedule_auth_pending_timeout(const unsigned int seconds) override
void push_reply(std::vector< BufferPtr > &&push_msgs) override
Session(openvpn_io::io_context &io_context_arg, const Factory &factory, ManClientInstance::Factory::Ptr man_factory_arg, TunClientInstance::Factory::Ptr tun_factory_arg)
void start(const TransportClientInstance::Send::Ptr &parent, const PeerAddr::Ptr &addr, const int local_peer_id, const ProtoSessionID cookie_psid=ProtoSessionID()) override
bool is_keepalive_enabled() const override
void auth_failed(const std::string &reason, const std::string &client_reason) override
AsioTimer housekeeping_timer
void ipma_notify(const struct ovpn_tun_head_ipma &ipma) override
void invalidation_error(const Error::Type err)
std::string client_endpoint_render()
void float_notify(const PeerAddr::Ptr &addr) override
PeerStats stats_poll() override
void post_cc_msg(BufferPtr &&msg) override
void set_housekeeping_timer()
virtual void error(const size_t type, const std::string *text=nullptr)
static TimeType infinite()
void max(const TimeType &t)
void min(const TimeType &t)
#define OPENVPN_LOG(args)
constexpr BufferFlags GROW(1U<< 2)
if enabled, buffer will grow (otherwise buffer_full exception will be thrown)
const char * name(const size_t type)
STRING utf8_printable(const STRING &str, size_t max_len_flags)
bool is_valid_utf8(const STRING &str, const size_t max_len_flags=0)
void buf_append_string(Buffer &buf, const std::string &str)
#define OPENVPN_LOG_SERVPROTO(x)