/* * Copyright (c) 2021 joshua stein * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* forward declarations */ struct session; struct session_menu_option; #ifndef __SESSION_H__ #define __SESSION_H__ #include #include "db.h" #include "uthread.h" #include "user.h" enum session_input_state { SESSION_INPUT_NONE, SESSION_INPUT_LINE, SESSION_INPUT_CHAR }; /* must keep sessions area_labels[] in sync */ enum session_area { SESSION_AREA_MAIN_MENU, SESSION_AREA_MOTD, SESSION_AREA_BOARDS, SESSION_AREA_FTN, SESSION_AREA_CHAT, SESSION_AREA_MAIL, SESSION_AREA_FILES, SESSION_AREA_WHO, SESSION_AREA_RECENT_LOGINS, SESSION_AREA_SETTINGS, SESSION_AREA_SIGNUP }; #define DEFAULT_TERMINAL_COLUMNS 80 #define DEFAULT_TERMINAL_LINES 24 #define MIN_TERMINAL_COLUMNS 20 #define MIN_TERMINAL_LINES 4 #define CONTROL_C 3 #define CONTROL_D 4 #define BACKSPACE 8 #define CONTROL_L 12 #define DELETE 127 #define KEY_UP (0x0100 | 'A') #define KEY_DOWN (0x0100 | 'B') #define KEY_RIGHT (0x0100 | 'C') #define KEY_LEFT (0x0100 | 'D') #define KEY_OTHER (0x0100 | 0xff) typedef struct session session; struct node_funcs { void (*setup)(struct session *session); short (*input)(struct session *session); short (*output)(struct session *session); void (*close)(struct session *session); }; struct session_log { unsigned long id; char username[DB_USERNAME_LENGTH + 1]; char node[10]; char via[10]; unsigned long logged_on_at; unsigned long logged_off_at; unsigned long ip_address; unsigned short tspeed; char location[32]; }; struct session { char node[16]; char via[16]; char location[32]; unsigned char obuf[768]; unsigned long obuf_canary; unsigned char ibuf[512]; unsigned long ibuf_canary; short obuflen; unsigned long obuflen_canary; short ibuflen; unsigned long ibuflen_canary; short ibufoff; unsigned long established_at; char autologin_username[DB_USERNAME_LENGTH + 1]; char terminal_type[24]; enum session_input_state input_state; unsigned short last_input; unsigned long last_input_at; unsigned short terminal_columns; unsigned short terminal_lines; unsigned short tspeed; bool logged_in; bool ending; bool abort_input; bool ban_node_source; bool vt100; bool vt52; bool color; bool direct_output; bool is_telnet; bool can_nomodem; char chatting_with_node[16]; char chat_username[DB_USERNAME_LENGTH + 1]; bool chatting; short area; struct session_log log; struct user *user; void *cookie; struct node_funcs *node_funcs; struct uthread *uthread; }; #define MAX_SESSIONS NUM_UTHREADS extern struct session *sessions[MAX_SESSIONS]; extern short nsessions; struct session_tally { char date[9]; unsigned long calls; }; extern struct session_tally session_today_tally; struct session_menu_option { char ret; char key[15]; char title[50]; }; struct session * session_create(char *node, char *via, struct node_funcs *node_funcs); void session_close(struct session *session); void session_idle(struct session *session); short session_get_char(struct session *session, unsigned char *b); short session_get_chars(struct session *session, unsigned char *b, size_t count); bool session_wait_for_chars(struct session *session, unsigned short timeout_ms, unsigned short num_chars); unsigned short session_input_char(struct session *session); void session_clear_input(struct session *session); void session_flush(struct session *session); size_t session_logf(struct session *session, const char *format, ...); size_t session_logf_buffered(struct session *session, const char *format, ...); size_t session_output(struct session *session, const char *str, size_t len); size_t session_paginate(struct session *session, const char *str, size_t len, size_t first_page_printed); size_t session_printf(struct session *session, const char *format, ...); size_t session_output_view_or_printf(struct session *session, short id, const char *format, ...); size_t session_output_template(struct session *session, const char *str); size_t session_expand_template(struct session *session, const char *str, char **ret); char * session_field_input(struct session *session, unsigned short size, unsigned short width, char *initial_input, bool multiline, char mask); void session_pause_return(struct session *s, char enforce, char *msg); void session_print_motd(struct session *s, bool force); void session_recents(struct session *s); void session_who(struct session *s); char session_menu(struct session *s, char *title, char *prompt, char *prompt_help, const struct session_menu_option *opts, size_t nopts, bool show_opts, char *number_prompt, short *ret_number); void session_prune_logs(short days); void session_check_buf_canaries(struct session *session); #endif /* __SESSION_H__ */