mirror of
https://oauth2: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@github.com/m1ngsama/TNT.git
synced 2026-05-10 19:00:57 +08:00
Critical fixes: - C-1: Use atomic_bool for client->connected and redraw_pending to prevent data races between callback and main threads - C-2: Add reference counting for channel callbacks to prevent use-after-free when callbacks fire during client cleanup - C-3/M-7: Use ssh_channel_read_timeout (5s) for UTF-8 continuation bytes to prevent thread blocking and stream desynchronization High-severity fixes: - H-1: Replace non-thread-safe setenv/tzset with timegm() in parse_rfc3339_utc - H-2: Change room_get_message to return by value copy instead of interior pointer - H-3: Log warning when rate-limit table evicts active IP entry - H-4: Replace strcmp with constant-time comparison for access token validation - H-5: Check signature_state in auth_pubkey to reject unsigned key offers Medium/low fixes: - M-1: Replace all atoi() with strtol() for proper error detection - M-3: Move calloc outside rwlock in tui_render_screen to avoid blocking writers - M-8: Fix off-by-one in rate limit threshold (> to >=) - M-9: Trim partial UTF-8 sequences after snprintf truncation in message_format - L-1: Validate continuation byte mask (0xC0==0x80) in utf8_decode - D-3: Remove vestigial client_t.fd field - L-3: Remove unreachable pthread_attr_destroy after infinite loop
54 lines
1.3 KiB
C
54 lines
1.3 KiB
C
#ifndef CHAT_ROOM_H
|
|
#define CHAT_ROOM_H
|
|
|
|
#include "common.h"
|
|
#include "message.h"
|
|
|
|
/* Forward declaration */
|
|
struct client;
|
|
|
|
/* Chat room structure */
|
|
typedef struct {
|
|
pthread_rwlock_t lock;
|
|
struct client **clients;
|
|
int client_count;
|
|
int client_capacity;
|
|
message_t *messages;
|
|
int message_count;
|
|
uint64_t update_seq;
|
|
} chat_room_t;
|
|
|
|
/* Global chat room instance */
|
|
extern chat_room_t *g_room;
|
|
|
|
/* Initialize chat room */
|
|
chat_room_t* room_create(void);
|
|
|
|
/* Destroy chat room */
|
|
void room_destroy(chat_room_t *room);
|
|
|
|
/* Add client to room */
|
|
int room_add_client(chat_room_t *room, struct client *client);
|
|
|
|
/* Remove client from room */
|
|
void room_remove_client(chat_room_t *room, struct client *client);
|
|
|
|
/* Broadcast message to all clients */
|
|
void room_broadcast(chat_room_t *room, const message_t *msg);
|
|
|
|
/* Add message to room history */
|
|
void room_add_message(chat_room_t *room, const message_t *msg);
|
|
|
|
/* Get message by index (thread-safe value copy) */
|
|
bool room_get_message(chat_room_t *room, int index, message_t *out);
|
|
|
|
/* Get total message count */
|
|
int room_get_message_count(chat_room_t *room);
|
|
|
|
/* Get online client count */
|
|
int room_get_client_count(chat_room_t *room);
|
|
|
|
/* Get room update sequence */
|
|
uint64_t room_get_update_seq(chat_room_t *room);
|
|
|
|
#endif /* CHAT_ROOM_H */
|