| 3 |
* user_list_display |
* user_list_display |
| 4 |
* - display user information |
* - display user information |
| 5 |
* |
* |
| 6 |
* Copyright (C) 2004-2025 by Leaflet <leaflet@leafok.com> |
* Copyright (C) 2004-2026 Leaflet <leaflet@leafok.com> |
| 7 |
*/ |
*/ |
| 8 |
|
|
| 9 |
|
#ifdef HAVE_CONFIG_H |
| 10 |
|
#include "config.h" |
| 11 |
|
#endif |
| 12 |
|
|
| 13 |
#include "bbs.h" |
#include "bbs.h" |
| 14 |
#include "ip_mask.h" |
#include "ip_mask.h" |
| 15 |
#include "lml.h" |
#include "lml.h" |
| 24 |
#include <time.h> |
#include <time.h> |
| 25 |
#include <sys/param.h> |
#include <sys/param.h> |
| 26 |
|
|
| 27 |
#define BBS_max_sessions_per_user 10 |
enum _user_info_display_constant_t |
| 28 |
#define LAST_LOGIN_DT_MAX_LEN 50 |
{ |
| 29 |
|
BBS_max_sessions_per_user = 10, |
| 30 |
|
LAST_LOGIN_DT_MAX_LEN = 50, |
| 31 |
|
ASTRO_STR_MAX_LEN = 64, |
| 32 |
|
USER_INFO_MAX_LEN = 8192, |
| 33 |
|
}; |
| 34 |
|
|
| 35 |
static int display_user_info_key_handler(int *p_key, DISPLAY_CTX *p_ctx) |
static int display_user_info_key_handler(int *p_key, DISPLAY_CTX *p_ctx) |
| 36 |
{ |
{ |
| 43 |
int session_cnt = BBS_max_sessions_per_user; |
int session_cnt = BBS_max_sessions_per_user; |
| 44 |
int article_cnt; |
int article_cnt; |
| 45 |
const char *astro_name; |
const char *astro_name; |
| 46 |
char astro_str[LINE_BUFFER_LEN]; |
char astro_str[ASTRO_STR_MAX_LEN]; |
| 47 |
struct tm tm_last_login; |
struct tm tm_last_login; |
| 48 |
char str_last_login_dt[LAST_LOGIN_DT_MAX_LEN + 1]; |
char str_last_login_dt[LAST_LOGIN_DT_MAX_LEN + 1]; |
| 49 |
struct tm tm_last_logout; |
struct tm tm_last_logout; |
| 57 |
const char *user_level_name; |
const char *user_level_name; |
| 58 |
char intro_f[BBS_user_intro_max_len + 1]; |
char intro_f[BBS_user_intro_max_len + 1]; |
| 59 |
int intro_len; |
int intro_len; |
| 60 |
char user_info_f[BUFSIZ]; |
char user_info_f[USER_INFO_MAX_LEN]; |
| 61 |
long line_offsets[BBS_user_intro_max_line + 1]; |
long line_offsets[BBS_user_intro_max_line + 1]; |
| 62 |
long lines; |
long lines; |
| 63 |
char *p; |
char *p; |
| 67 |
|
|
| 68 |
if (p_user_info == NULL) |
if (p_user_info == NULL) |
| 69 |
{ |
{ |
| 70 |
log_error("NULL pointer error\n"); |
log_error("NULL pointer error"); |
| 71 |
return -1; |
return -1; |
| 72 |
} |
} |
| 73 |
|
|
| 111 |
ret = query_user_online_info_by_uid(p_user_info->uid, sessions, &session_cnt, 0); |
ret = query_user_online_info_by_uid(p_user_info->uid, sessions, &session_cnt, 0); |
| 112 |
if (ret < 0) |
if (ret < 0) |
| 113 |
{ |
{ |
| 114 |
log_error("query_user_online_info_by_uid(uid=%d, cnt=%d) error: %d\n", |
log_error("query_user_online_info_by_uid(uid=%d, cnt=%d) error: %d", |
| 115 |
p_user_info->uid, session_cnt, ret); |
p_user_info->uid, session_cnt, ret); |
| 116 |
session_cnt = 0; |
session_cnt = 0; |
| 117 |
} |
} |
| 125 |
|
|
| 126 |
if (p + strlen(p_action_title) + 4 >= action_str + sizeof(action_str)) // buffer overflow |
if (p + strlen(p_action_title) + 4 >= action_str + sizeof(action_str)) // buffer overflow |
| 127 |
{ |
{ |
| 128 |
log_error("action_str of user(uid=%d) truncated at i=%d\n", p_user_info->uid, i); |
log_error("action_str of user(uid=%d) truncated at i=%d", p_user_info->uid, i); |
| 129 |
break; |
break; |
| 130 |
} |
} |
| 131 |
*p++ = '['; |
*p++ = '['; |
| 175 |
p_user_info->username, p_user_info->nickname, p_user_info->visit_count, article_cnt, |
p_user_info->username, p_user_info->nickname, p_user_info->visit_count, article_cnt, |
| 176 |
str_last_login_dt, (session_cnt > 0 ? login_ip : "未知"), p_user_info->exp, |
str_last_login_dt, (session_cnt > 0 ? login_ip : "未知"), p_user_info->exp, |
| 177 |
(session_cnt > 0 ? "在线或因断线不详" : str_last_logout_dt), life, user_level_name, user_level + 1, astro_str, |
(session_cnt > 0 ? "在线或因断线不详" : str_last_logout_dt), life, user_level_name, user_level + 1, astro_str, |
| 178 |
(session_cnt > 0 ? "目前在线,状态如下:\n" : ""), (session_cnt > 0 ? action_str : ""), |
(session_cnt > 0 ? "目前在线,状态如下: \n" : ""), (session_cnt > 0 ? action_str : ""), |
| 179 |
(intro_len > 0 ? "\033[0;36m个人说明档如下:\033[m" : "\033[0;36m没有个人说明档\033[m"), |
(intro_len > 0 ? "\033[0;36m个人说明档如下: \033[m" : "\033[0;36m没有个人说明档\033[m"), |
| 180 |
intro_f); |
intro_f); |
| 181 |
|
|
| 182 |
lines = split_data_lines(user_info_f, SCREEN_COLS + 1, line_offsets, MIN(SCREEN_ROWS - 1, BBS_user_intro_max_line + 8), 1, NULL); |
lines = split_data_lines(user_info_f, SCREEN_COLS + 1, line_offsets, MIN(SCREEN_ROWS - 1, BBS_user_intro_max_line + 9), 1, NULL); |
| 183 |
|
|
| 184 |
clearscr(); |
clearscr(); |
| 185 |
display_data(user_info_f, lines, line_offsets, 1, display_user_info_key_handler, DATA_READ_HELP); |
display_data(user_info_f, lines, line_offsets, 1, display_user_info_key_handler, DATA_READ_HELP); |