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 (;;) {