6#include <ascii-chat/network/errors.h>
7#include <ascii-chat/network/network.h>
8#include <ascii-chat/log/logging.h>
16 if (sockfd == INVALID_SOCKET_VALUE) {
17 return SET_ERRNO(ERROR_INVALID_PARAM,
"Invalid socket");
25 acip_error_t error = {0};
27 SAFE_STRNCPY(error.error_message, message,
sizeof(error.error_message));
30 int result =
send_packet(sockfd, PACKET_TYPE_ACIP_ERROR, &error,
sizeof(error));
32 return SET_ERRNO(ERROR_NETWORK,
"Failed to send error packet");
39 socket_t client_socket,
const char *operation_name) {
41 asciichat_error_t rate_check =
rate_limiter_check(rate_limiter, client_ip, event_type, NULL, &allowed);
43 if (rate_check != ASCIICHAT_OK || !allowed) {
45 log_warn(
"Rate limit exceeded for %s from %s", operation_name, client_ip);
55 packet_type_t packet_type) {
57 rate_event_type_t event_type;
58 const char *packet_name;
60 switch (packet_type) {
61 case PACKET_TYPE_IMAGE_FRAME:
62 event_type = RATE_EVENT_IMAGE_FRAME;
63 packet_name =
"IMAGE_FRAME";
66 case PACKET_TYPE_AUDIO_BATCH:
67 case PACKET_TYPE_AUDIO_OPUS_BATCH:
68 event_type = RATE_EVENT_AUDIO;
69 packet_name =
"AUDIO";
72 case PACKET_TYPE_PING:
73 case PACKET_TYPE_PONG:
74 event_type = RATE_EVENT_PING;
78 case PACKET_TYPE_CLIENT_JOIN:
79 event_type = RATE_EVENT_CLIENT_JOIN;
80 packet_name =
"CLIENT_JOIN";
83 case PACKET_TYPE_CLIENT_CAPABILITIES:
84 case PACKET_TYPE_STREAM_START:
85 case PACKET_TYPE_STREAM_STOP:
86 case PACKET_TYPE_CLIENT_LEAVE:
87 event_type = RATE_EVENT_CONTROL;
88 packet_name =
"CONTROL";
asciichat_error_t error_code
bool check_and_record_rate_limit(rate_limiter_t *rate_limiter, const char *client_ip, rate_event_type_t event_type, socket_t client_socket, const char *operation_name)
asciichat_error_t send_error_packet(socket_t sockfd, asciichat_error_t error_code)
bool check_and_record_packet_rate_limit(rate_limiter_t *rate_limiter, const char *client_ip, socket_t client_socket, packet_type_t packet_type)
asciichat_error_t send_error_packet_message(socket_t sockfd, asciichat_error_t error_code, const char *message)
int send_packet(socket_t sockfd, packet_type_t type, const void *data, size_t len)
Send a basic packet without encryption.
asciichat_error_t rate_limiter_record(rate_limiter_t *limiter, const char *ip_address, rate_event_type_t event_type)
asciichat_error_t rate_limiter_check(rate_limiter_t *limiter, const char *ip_address, rate_event_type_t event_type, const rate_limit_config_t *config, bool *allowed)