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
55 lines
1.5 KiB
C
55 lines
1.5 KiB
C
#ifndef SSH_SERVER_H
|
|
#define SSH_SERVER_H
|
|
|
|
#include "common.h"
|
|
#include "chat_room.h"
|
|
#include <arpa/inet.h>
|
|
#include <libssh/libssh.h>
|
|
#include <libssh/server.h>
|
|
|
|
/* Client connection structure */
|
|
typedef struct client {
|
|
ssh_session session; /* SSH session */
|
|
ssh_channel channel; /* SSH channel */
|
|
char username[MAX_USERNAME_LEN];
|
|
char client_ip[INET6_ADDRSTRLEN];
|
|
int width;
|
|
int height;
|
|
client_mode_t mode;
|
|
help_lang_t help_lang;
|
|
int scroll_pos;
|
|
int help_scroll_pos;
|
|
bool show_help;
|
|
char command_input[256];
|
|
char command_output[2048];
|
|
char exec_command[MAX_EXEC_COMMAND_LEN];
|
|
char ssh_login[MAX_USERNAME_LEN];
|
|
atomic_bool redraw_pending;
|
|
pthread_t thread;
|
|
atomic_bool connected;
|
|
int ref_count; /* Reference count for safe cleanup */
|
|
pthread_mutex_t ref_lock; /* Lock for ref_count */
|
|
pthread_mutex_t io_lock; /* Serialize SSH channel writes */
|
|
struct ssh_channel_callbacks_struct *channel_cb;
|
|
} client_t;
|
|
|
|
/* Initialize SSH server */
|
|
int ssh_server_init(int port);
|
|
|
|
/* Start SSH server (blocking) */
|
|
int ssh_server_start(int listen_fd);
|
|
|
|
/* Handle client session */
|
|
void* client_handle_session(void *arg);
|
|
|
|
/* Send data to client */
|
|
int client_send(client_t *client, const char *data, size_t len);
|
|
|
|
/* Send formatted string to client */
|
|
int client_printf(client_t *client, const char *fmt, ...);
|
|
|
|
/* Reference counting helpers */
|
|
void client_addref(client_t *client);
|
|
void client_release(client_t *client);
|
|
|
|
#endif /* SSH_SERVER_H */
|