AmendHub

Download:

jcs

/

subtext

/

amendments

/

142

session: Remove session_output_string, enforce login timeout


jcs made amendment 142 about 1 year ago
--- ansi.c Thu Apr 28 14:03:36 2022 +++ ansi.c Mon Jun 13 15:52:50 2022 @@ -262,16 +262,15 @@ ansi_probe_screen_size(struct session *s) /* save cursor position */ session_clear_input(s); - session_output_string(s, "\33[s"); - session_flush(s); + session_printf(s, "\33[s"); /* go to the (hopefully) edge of the screen */ - session_output_string(s, "\33[200B\33[200C"); + session_printf(s, "\33[200B\33[200C"); session_flush(s); /* report cursor position */ session_clear_input(s); - session_output_string(s, "\33[6n"); + session_printf(s, "\33[6n"); session_flush(s); session_wait_for_chars(s, 1500, 100); @@ -292,6 +291,6 @@ ansi_probe_screen_size(struct session *s) /* restore saved cursor position */ session_clear_input(s); - session_output_string(s, "\33[u"); + session_printf(s, "\33[u"); session_flush(s); } --- board.c Thu Jun 9 16:03:02 2022 +++ board.c Sun Jun 12 22:24:45 2022 @@ -363,7 +363,7 @@ board_compose(struct session *s, struct board *board, short c, ret; if (!s->user) { - session_output_string(s, "Posting is not available to guests.\r\n" + session_printf(s, "Posting is not available to guests.\r\n" "Please create an account first.\r\n"); session_flush(s); return 0; @@ -459,15 +459,15 @@ post_compose_start: case '\n': case '\r': /* send */ - session_output_string(s, "Posting message... "); + session_printf(s, "Posting message... "); session_flush(s); if (board_post_create(board, thread, &post) == 0) { session_log(s, "Posted message %ld to %s", post.id, board->name); - session_output_string(s, "done\r\n"); + session_printf(s, "done\r\n"); } else - session_output_string(s, "failed!\r\n"); + session_printf(s, "failed!\r\n"); session_flush(s); @@ -488,7 +488,7 @@ post_compose_start: } post_compose_error: - session_output_string(s, "Failed saving message!\r\n"); + session_printf(s, "Failed saving message!\r\n"); session_flush(s); post_compose_done: @@ -557,9 +557,9 @@ board_post_read(struct session *s, struct board *board session_printf(s, "{{B}}Subject:{{/B}}{{#}} %s%s\r\n", (post.parent_post_id ? "Re: " : ""), thread.subject); session_flush(s); - session_output_string(s, "\r\n"); + session_printf(s, "\r\n"); session_output(s, post.body, post.body_size); - session_output_string(s, "\r\n"); + session_printf(s, "\r\n"); snprintf(prompt, sizeof(prompt), "%s:%ld", board->name, post.id); @@ -572,7 +572,7 @@ board_post_read(struct session *s, struct board *board case 'd': if (!(s->user && (s->user->is_sysop || s->user->id == post.id))) { - session_output_string(s, "Invalid option\r\n"); + session_printf(s, "Invalid option\r\n"); session_flush(s); break; } --- chat.c Wed Jun 1 13:08:31 2022 +++ chat.c Sun Jun 12 22:24:55 2022 @@ -155,7 +155,7 @@ chat_start(struct session *s, char *with_node) else s->chatting_with_node[0] = '\0'; - session_output_string(s, + session_printf(s, ansi(s, ANSI_CURSOR_LINE_COL, s->terminal_lines, 1, ANSI_END)); chat_printf_line(s, 0, "%sWelcome to Multi-User Chat%s", @@ -185,7 +185,7 @@ chat_start(struct session *s, char *with_node) s->terminal_columns - 1, NULL, false, 0); if (!input) break; - session_output_string(s, + session_printf(s, ansi(s, ANSI_COL_N, 1, ANSI_ERASE_LINE, ANSI_END)); session_flush(s); @@ -231,7 +231,7 @@ chat_start(struct session *s, char *with_node) memset(s->chatting_with_node, 0, sizeof(s->chatting_with_node)); /* clear chat bar */ - session_output_string(s, ansi(s, ANSI_CURSOR_LINE_COL, + session_printf(s, ansi(s, ANSI_CURSOR_LINE_COL, s->terminal_lines - 1, 1, ANSI_ERASE_LINE, ANSI_END)); if (lagged) { --- mail.c Tue Jun 7 22:57:36 2022 +++ mail.c Sun Jun 12 22:25:08 2022 @@ -136,7 +136,7 @@ mail_menu(struct session *s) bool show_list = true; if (!s->user) { - session_output_string(s, "Mail is not available to guests.\r\n" + session_printf(s, "Mail is not available to guests.\r\n" "Please create an account first.\r\n"); session_flush(s); return; @@ -362,14 +362,14 @@ mail_compose_start: case '\n': case '\r': /* send */ - session_output_string(s, "Sending mail..."); + session_printf(s, "Sending mail..."); session_flush(s); msg.time = Time; msg.sender_user_id = s->user->id; mail_save(s, &msg); - session_output_string(s, " sent!\r\n"); + session_printf(s, " sent!\r\n"); session_flush(s); goto mail_compose_done; @@ -480,15 +480,15 @@ mail_read(struct session *s, unsigned long id, short i db->config.timezone); session_printf(s, "{{B}}Subject:{{/B}}{{#}} %s\r\n", msg.subject); session_flush(s); - session_output_string(s, "\r\n"); - session_output_string(s, msg.body); - session_output_string(s, "\r\n"); + session_printf(s, "\r\n"); + session_printf(s, msg.body); + session_printf(s, "\r\n"); session_flush(s); if (!msg.read) { msg.read = Time; if (mail_save(s, &msg) != 0) - session_output_string(s, "Failed marking message read!\r\n"); + session_printf(s, "Failed marking message read!\r\n"); } snprintf(prompt, sizeof(prompt), "Mail:Message %d", idx); --- session.c Sun Jun 12 15:29:47 2022 +++ session.c Sun Jun 12 22:23:50 2022 @@ -45,6 +45,7 @@ size_t session_expand_var(struct session *session, cha void session_page_sysop(struct session *s); void session_answer_page(struct session *s); void sysop_edit_settings(struct session *s); +bool session_idled_out(struct session *session); struct session * session_create(char *node, char *via, struct node_funcs *node_funcs) @@ -68,7 +69,7 @@ session_create(char *node, char *via, struct node_func strlcpy(session->node, node, sizeof(session->node)); strlcpy(session->log.node, node, sizeof(session->log.node)); strlcpy(session->via, via, sizeof(session->via)); - session->last_input_at = Time; + session->last_input_at = session->established_at = Time; for (n = 0; n < MAX_SESSIONS; n++) { if (sessions[n] == NULL) { @@ -156,7 +157,7 @@ session_run(struct uthread *uthread, void *arg) main_menu: if (!session_output_view(s, DB_TEXT_MENU_ID)) - session_output_string(s, "\r\n[ Menu missing! ]\r\n\r\n"); + session_printf(s, "\r\n[ Menu missing! ]\r\n\r\n"); session_flush(s); while (!done && !s->ending) { @@ -188,13 +189,13 @@ get_another_char: case 'f': case 'F': /* files */ - session_output_string(s, "Coming soon!\r\n"); + session_printf(s, "Coming soon!\r\n"); session_flush(s); break; case 'g': case 'G': /* goodbye */ - session_output_string(s, "Goodbye!\r\n"); + session_printf(s, "Goodbye!\r\n"); session_flush(s); done = true; break; @@ -242,7 +243,7 @@ get_another_char: break; case '!': if (!s->user || !s->user->is_sysop) { - session_output_string(s, "Invalid option\r\n"); + session_printf(s, "Invalid option\r\n"); session_flush(s); break; } @@ -252,13 +253,13 @@ get_another_char: /* short menu */ if (!session_output_view(s, DB_TEXT_SHORTMENU_ID)) { if (!session_output_view(s, DB_TEXT_MENU_ID)) - session_output_string(s, "\r\n[ Short and long menu " + session_printf(s, "\r\n[ Short and long menu " "missing! ]\r\n\r\n"); } session_flush(s); break; default: - session_output_string(s, "Invalid option\r\n"); + session_printf(s, "Invalid option\r\n"); session_flush(s); break; } @@ -374,15 +375,9 @@ session_output(struct session *session, const char *st } size_t -session_output_string(struct session *session, const char *str) -{ - return session_output(session, str, strlen(str)); -} - -size_t session_printf(struct session *session, const char *format, ...) { - static char session_printf_tbuf[256]; + static char session_printf_tbuf[192]; va_list ap; size_t len; char *expanded; @@ -441,6 +436,22 @@ session_output_template(struct session *session, const } bool +session_idled_out(struct session *session) +{ + if (session->logged_in) { + if (Time - session->last_input_at > + (db->config.max_idle_minutes * 60)) + return true; + } else { + if (Time - session->established_at > + db->config.max_login_seconds) + return true; + } + + return false; +} + +bool session_wait_for_chars(struct session *session, unsigned short timeout_ms, unsigned short num_chars) { @@ -459,8 +470,7 @@ session_wait_for_chars(struct session *session, unsign return false; if (expire && Ticks > expire) return false; - if (Time - session->last_input_at > - (db->config.max_idle_minutes * 60)) + if (session_idled_out(session)) return false; if (session->ibuflen >= num_chars) break; @@ -481,10 +491,8 @@ session_input_char(struct session *session) wait_for_char: if (session->ibuflen < waiting_for && !session_wait_for_chars(session, 0, waiting_for)) { - if (Time - session->last_input_at > - (db->config.max_idle_minutes * 60)) + if (session_idled_out(session)) goto idled_out; - return 0; } @@ -546,7 +554,7 @@ done_consuming: idled_out: session_log(session, "Idle too long, logging out"); - session_output_string(session, + session_printf(session, "\r\n\r\nYou have been idle too long, goodbye.\r\n\r\n"); session_flush(session); session->ending = 1; @@ -587,7 +595,7 @@ session_field_input(struct session *session, unsigned if (initial_input) { ipos = ilen = strlcpy(field, initial_input, size); /* TODO: handle initial value being longer than width */ - session_output_string(session, field); + session_printf(session, field); session_flush(session); } @@ -623,7 +631,7 @@ session_field_input(struct session *session, unsigned if (field[ipos - 1] == '\n') { /* need to jump up a line and go over */ - session_output_string(session, + session_printf(session, ansi(session, ANSI_UP_N, 1, ANSI_END)); over = 1; for (n = ipos - 2; n >= 0; n--) { @@ -631,7 +639,7 @@ session_field_input(struct session *session, unsigned break; over++; } - session_output_string(session, + session_printf(session, ansi(session, ANSI_COL_N, over, ANSI_END)); session_flush(session); } @@ -642,16 +650,16 @@ session_field_input(struct session *session, unsigned ilen--; field[ilen] = '\0'; - session_output_string(session, + session_printf(session, ansi(session, ANSI_BACKSPACE, ANSI_END)); } if (redraw) { - session_output_string(session, + session_printf(session, ansi(session, ANSI_SAVE_CURSOR, ANSI_END)); session_output(session, field + ipos, ilen - ipos); session_output(session, " ", 1); - session_output_string(session, + session_printf(session, ansi(session, ANSI_RESTORE_SAVED_CURSOR, ANSI_END)); } @@ -666,7 +674,7 @@ session_field_input(struct session *session, unsigned if (ipos == ilen) continue; ipos++; - session_output_string(session, + session_printf(session, ansi(session, ANSI_FORWARD_N, 1, ANSI_END)); session_flush(session); break; @@ -690,11 +698,11 @@ append_char: if (mask) { /* TODO: repeat mask */ } else { - session_output_string(session, + session_printf(session, ansi(session, ANSI_SAVE_CURSOR, ANSI_END)); session_output(session, field + ipos, ilen - ipos); - session_output_string(session, + session_printf(session, ansi(session, ANSI_RESTORE_SAVED_CURSOR, ANSI_END)); } } @@ -723,7 +731,7 @@ session_login(struct session *s) short n; for (n = 1; n <= 3; n++) { - session_output_string(s, "login: "); + session_printf(s, "login: "); if (s->autologin_username[0]) { session_printf(s, "{{#}}%s\r\n", s->autologin_username); @@ -782,7 +790,7 @@ session_login(struct session *s) sizeof(s->autologin_username)); } - session_output_string(s, "Password: "); + session_printf(s, "Password: "); session_flush(s); password = session_field_input(s, 64, 64, NULL, false, '*'); session_output(s, "\r\n", 2); @@ -825,7 +833,7 @@ session_login(struct session *s) } uthread_msleep(60); - session_output_string(s, "Login incorrect\r\n"); + session_printf(s, "Login incorrect\r\n"); session_flush(s); } @@ -834,7 +842,7 @@ login_bail: free(username); if (password != NULL) free(password); - session_output_string(s, "Thanks for playing\r\n"); + session_printf(s, "Thanks for playing\r\n"); session_flush(s); return AUTH_USER_FAILED; } @@ -1108,9 +1116,9 @@ session_pause_return(struct session *s, short enforce, session_output_template(s, "{{/B}}Press {{B}}<Enter>{{/B}} "); if (msg) - session_output_string(s, msg); + session_printf(s, msg); else - session_output_string(s, "to return to the main menu..."); + session_printf(s, "to return to the main menu..."); session_flush(s); for (;;) { @@ -1304,7 +1312,7 @@ get_menu_option: } } - session_output_string(s, "Invalid option\r\n"); + session_printf(s, "Invalid option\r\n"); session_flush(s); } } --- session.h Sun Jun 12 11:45:43 2022 +++ session.h Sun Jun 12 22:18:30 2022 @@ -77,6 +77,7 @@ struct session { enum session_input_state input_state; unsigned short last_input; unsigned char abort_input; + unsigned long established_at; unsigned long last_input_at; unsigned short terminal_columns; unsigned short terminal_lines; @@ -124,7 +125,6 @@ void session_clear_input(struct session *session); void session_flush(struct session *session); size_t session_log(struct session *session, const char *format, ...); size_t session_output(struct session *session, const char *str, size_t len); -size_t session_output_string(struct session *session, const char *str); size_t session_printf(struct session *session, const char *format, ...); size_t session_output_view(struct session *session, short id); size_t session_output_template(struct session *session, const char *str); --- settings.c Wed Jun 1 13:10:12 2022 +++ settings.c Sun Jun 12 22:25:20 2022 @@ -73,7 +73,7 @@ print_options: switch (sf->type) { case CONFIG_TYPE_STRING: - session_output_string(s, new_data + sf->off); + session_printf(s, new_data + sf->off); break; case CONFIG_TYPE_SHORT: sval = (new_data[sf->off] << 8) | new_data[sf->off + 1]; @@ -92,7 +92,7 @@ print_options: break; } - session_output_string(s, "]\r\n"); + session_printf(s, "]\r\n"); } session_printf(s, "{{B}}S{{/B}}: Save and return to main menu\r\n"); @@ -217,9 +217,9 @@ get_input: break; case CONFIG_TYPE_BOOLEAN: if (new_data[sf->off]) - session_output_string(s, "[Y/n] "); + session_printf(s, "[Y/n] "); else - session_output_string(s, "[y/N] "); + session_printf(s, "[y/N] "); session_flush(s); for (;;) {