14#ifndef OPENVPN_SERVER_SERVPROTO_H
15#define OPENVPN_SERVER_SERVPROTO_H
36#ifdef OPENVPN_DEBUG_SERVPROTO
37#define OPENVPN_LOG_SERVPROTO(x) OPENVPN_LOG(x)
39#define OPENVPN_LOG_SERVPROTO(x)
59 Factory(openvpn_io::io_context &io_context_arg,
128 const int local_peer_id,
218#ifdef OPENVPN_PACKET_LOG
219 log_packet(buf,
false);
244 catch (
const std::exception &e)
269 unsigned int &keepalive_timeout)
override
273 ManLink::send->keepalive_override(keepalive_ping, keepalive_timeout);
290 Session(openvpn_io::io_context &io_context_arg,
329 const std::string &peer_info,
332 constexpr size_t MAX_USERNAME_SIZE = 256;
333 constexpr size_t MAX_PASSWORD_SIZE = 16384;
348 const std::string
msg = ProtoContext::template read_control_string<std::string>(*app_bp);
352 const auto reason =
"Control channel message with invalid characters received";
357 if (
msg ==
"PUSH_REQUEST")
364 else if (
msg ==
"EXIT")
366 OPENVPN_LOG(
"Client disconnecting from server, EXIT received");
388 const std::string &client_reason)
override
411 buf->null_terminate();
435 for (
auto &
msg : push_msgs)
437 msg->null_terminate();
458 const std::string &reason,
459 const std::string &client_reason)
override
476 if (!client_reason.empty())
479 os <<
"client was disconnected from server";
487 if (!client_reason.empty())
490 os <<
"server requested a client reconnect";
496 ts =
"RESTART_PASSIVE";
497 os <<
"RESTART,[P]:";
498 if (!client_reason.empty())
501 os <<
"server requested a client reconnect";
505 os <<
"RESTART,[P]:";
506 if (!client_reason.empty())
509 os <<
"server requested a client reconnect";
516 if (!client_reason.empty())
517 os <<
',' << client_reason;
524 const size_t pos = reason.find_first_of(
',');
525 if (pos != std::string::npos)
526 ts = reason.substr(0, pos);
541 buf->null_terminate();
574 msg->null_terminate();
662 error(
"disconnect triggered");
668 auth_failed(
"Auth Pending Timeout",
"Auth Pending Timeout");
671 error(
"unknown disconnect");
679 catch (
const std::exception &exc)
697 { self->housekeeping_callback(
error); });
750 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.
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)
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
bool control_net_recv(const PacketType &type, BufferAllocated &&net_buf)
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::ProtoConfig ProtoConfig
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
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()
Link< TunClientInstance::Send, TunClientInstance::Recv > TunLink
Link< ManClientInstance::Send, ManClientInstance::Recv > ManLink
Link< TransportClientInstance::Send, TransportClientInstance::Recv > TransportLink
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)
bool starts_with(const STRING &str, const std::string &prefix)
void buf_append_string(Buffer &buf, const std::string &str)
#define OPENVPN_LOG_SERVPROTO(x)