diff options
-rw-r--r-- | Kconfig | 6 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | door.c | 2 | ||||
-rw-r--r-- | libterm/examples/Makefile | 3 | ||||
-rw-r--r-- | libterm/examples/readline.c | 40 | ||||
-rw-r--r-- | libterm/term.c | 22 | ||||
-rw-r--r-- | libterm/term.h | 26 | ||||
-rw-r--r-- | libterm/term_io.c | 107 | ||||
-rw-r--r-- | libterm/term_io.h | 10 | ||||
-rw-r--r-- | logs.c | 2 | ||||
-rw-r--r-- | logs.h | 2 | ||||
-rw-r--r-- | microbbs.c | 19 | ||||
-rw-r--r-- | user.c | 243 | ||||
-rw-r--r-- | user.h | 54 |
14 files changed, 510 insertions, 28 deletions
@@ -23,6 +23,9 @@ menuconfig DOORGAMES default n if DOORGAMES + config DOOR_DEFAULT_DIR + string "Default game dir" + default "door" endif menuconfig BOARD @@ -39,6 +42,9 @@ menuconfig LOGIN default n if LOGIN + config USER_DEFAULT_DIR + string "Defaul user data directory" + default "./users" endif menuconfig ARTICLES @@ -1,7 +1,7 @@ PROJECT=microbbs CC=gcc CFLAGS= -SOURCES=articles.c bbsconfig.c buildinfo.c captcha.c file_use.c ini.c list.c login.c logs.c mmm.c motd.c sds.c session.c statistics.c sysinfo.c telnetd.c textview.c todo.c vote.c +SOURCES=articles.c bbsconfig.c buildinfo.c captcha.c door.c file_use.c ini.c list.c logs.c mmm.c motd.c sds.c session.c statistics.c sysinfo.c telnetd.c textview.c todo.c user.c vote.c OBJECTS=$(SOURCES:.c=.o) BUILD_DIR=build_dir @@ -88,6 +88,8 @@ int bbs_door( term_screen *ts, const char *dir_name ) sds pathname = sds_new( door_game_dir ); sds_cat( pathname, d_name ); + //!!!possible memleak unfreed d_name? + //check if its file term_cur_set_c( ts, 0 ); if ( stat( pathname, &path_node ) == 0 ) diff --git a/libterm/examples/Makefile b/libterm/examples/Makefile index 00583f8..ffc3d1d 100644 --- a/libterm/examples/Makefile +++ b/libterm/examples/Makefile @@ -1,6 +1,7 @@ CC=gcc CFLAGS=-I../ ../libterm.o -SOURCES=detect_resize.c detect_screen_size.c filtered_input.c invisible_input.c restore_screen.c print_8025.c +SOURCES=detect_resize.c detect_screen_size.c filtered_input.c invisible_input.c \ +readline.c restore_screen.c print_8025.c EXE=$(SOURCES:.c=) BUILD_DIR=. diff --git a/libterm/examples/readline.c b/libterm/examples/readline.c new file mode 100644 index 0000000..cd4467d --- /dev/null +++ b/libterm/examples/readline.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <term.h> +#include <term_io.h> + +int main() +{ + + const int sz = 31; + char name[sz]; + char passsword[sz]; + + struct term_screen ts; memset( &ts, 0, sizeof(ts) ); + + if ( term_init( &ts ) == -1 ) + printf("Some err when init\n"); + + term_set_raw_mode( &ts ); + + term_clr_scr( &ts ); + + term_cur_set_c( &ts, 0); + term_cur_set_r( &ts, 1 ); + term_readline( &ts, name, sz, READLINE_TEXT ); + + term_cur_set_c( &ts, 0 ); + term_cur_set_r( &ts, 2 ); + term_readline( &ts, passsword, sz, READLINE_HIDDEN ); + + + term_clr_scr( &ts ); + + term_set_orig_mode( &ts ); + + printf("Name:%s\n", name); + printf("passsword:%s\n", passsword ); + + return 0; +}
\ No newline at end of file diff --git a/libterm/term.c b/libterm/term.c index e279e81..412253b 100644 --- a/libterm/term.c +++ b/libterm/term.c @@ -2,28 +2,6 @@ #include "debug.h" -enum KEY_ACTION{ - KEY_NULL = 0, /* NULL */ - CTRL_A = 1, /* Ctrl+a */ - CTRL_B = 2, /* Ctrl-b */ - CTRL_C = 3, /* Ctrl-c */ - CTRL_D = 4, /* Ctrl-d */ - CTRL_E = 5, /* Ctrl-e */ - CTRL_F = 6, /* Ctrl-f */ - CTRL_H = 8, /* Ctrl-h */ - TAB = 9, /* Tab */ - CTRL_K = 11, /* Ctrl+k */ - CTRL_L = 12, /* Ctrl+l */ - ENTER = 13, /* Enter */ - CTRL_N = 14, /* Ctrl-n */ - CTRL_P = 16, /* Ctrl-p */ - CTRL_T = 20, /* Ctrl-t */ - CTRL_U = 21, /* Ctrl+u */ - CTRL_W = 23, /* Ctrl+w */ - ESC = 27, /* Escape */ - BACKSPACE = 127 /* Backspace */ -}; - #define T_ESC "\x1b" //setup initial terminal stuff diff --git a/libterm/term.h b/libterm/term.h index 0be7391..b399cd6 100644 --- a/libterm/term.h +++ b/libterm/term.h @@ -16,6 +16,32 @@ #include "screen_modes.h" #include "debug.h" +enum TERM_KEY_ACTION { + KEY_NULL = 0, /* NULL */ + CTRL_A = 1, /* Ctrl+a */ + CTRL_B = 2, /* Ctrl-b */ + CTRL_C = 3, /* Ctrl-c */ + CTRL_D = 4, /* Ctrl-d */ + CTRL_E = 5, /* Ctrl-e */ + CTRL_F = 6, /* Ctrl-f */ + CTRL_H = 8, /* Ctrl-h */ + TAB = 9, /* Tab */ + CTRL_K = 11, /* Ctrl+k */ + CTRL_L = 12, /* Ctrl+l */ + ENTER = 13, /* Enter */ + CTRL_N = 14, /* Ctrl-n */ + CTRL_P = 16, /* Ctrl-p */ + CTRL_T = 20, /* Ctrl-t */ + CTRL_U = 21, /* Ctrl+u */ + CTRL_W = 23, /* Ctrl+w */ + ESC = 27, /* Escape */ + BACKSPACE = 127 /* Backspace */ +}; + + +#define TK_ENTER 13 +#define TK_ESC 27 +#define TK_BACKSPACE 127 typedef struct term_screen { diff --git a/libterm/term_io.c b/libterm/term_io.c index 5ef682b..cd1b3c1 100644 --- a/libterm/term_io.c +++ b/libterm/term_io.c @@ -102,4 +102,111 @@ int term_getc( term_screen *ts ) return ret; } +int term_putc( term_screen *ts, char c ) +{ + int ret = 0; + int fret = -1; + fret = write( ts->ofd, &c, 1 ); + if ( fret != 1 ) + { + ret = -1; + } + + return ret; +} + +//return amoutn fo characters readed +//on error or if nothing is imputed 0 returned +int term_readline( term_screen *ts, char *str, size_t str_size, int flag ) +{ + int ret = 0; + int max_row, max_column; + char *buf = NULL; + int buf_size = str_size-1; + int buf_curent = 0; + int menu_input=0; + char menu_cmd = 0; + int orig_row; + int orig_col; + + buf = malloc( buf_size ); + memset( buf, 0, buf_size ); + + max_row = term_get_maxrow( ts ); + max_column = term_get_maxcol( ts ); + orig_row = term_cur_get_r( ts ); + orig_col = term_cur_get_c( ts ); + + menu_cmd = 0; + buf_curent = 0; + while ( menu_cmd != TK_ESC ) + { + menu_input = term_getc( ts ); + if ( menu_input != -1 ) + { + menu_cmd = (char)menu_input; + //add to buffer any pritable char + //if ( (isgraph( menu_cmd ) && flag == READLINE_TEXT ) || + // (isalpha( menu_cmd ) && flag == READLINE_ALPHA ) ) + if ( isalpha( menu_cmd ) ) + { + if ( buf_curent < buf_size ) + { + buf[ buf_curent ] = menu_cmd; + buf_curent += 1; + } + //deleteone char from buffer + } else if ( menu_cmd == TK_BACKSPACE ) + { + if ( buf_curent > 0) + { + buf[ buf_curent ] = 0x0; + buf_curent -= 1; + } + //input ready + } else if ( menu_cmd == TK_ENTER ) + { + ret = buf_curent; + memcpy( str, buf, buf_size ); + str[ str_size-1 ] = 0x0; + break; + } else if ( menu_cmd == TK_ESC ) + { + ret = -1; + } + + { + int i; + term_cur_set_r( ts, orig_row ); + term_cur_set_c( ts, orig_col ); + for (i=0;i<buf_size;i++) + { + if ( i < buf_curent ) + { + if ( (flag == READLINE_TEXT) || (flag == READLINE_ALPHA) ) + { + term_putc( ts, buf[i] ); + } else if ( flag == READLINE_HIDDEN ) + { + term_putc( ts, '*'); + } + } else + { + term_putc( ts, ' ' ); + } + } + term_cur_set_c( ts, orig_col+buf_curent ); + term_cur_set_r( ts, orig_row ); + } + } + } + + if ( buf != NULL) + { + free( buf ); + buf = NULL; + } + + return ret; +} diff --git a/libterm/term_io.h b/libterm/term_io.h index 8c57282..3c84972 100644 --- a/libterm/term_io.h +++ b/libterm/term_io.h @@ -7,11 +7,19 @@ #include "screen_modes.h" #include "term.h" +#define READLINE_NONE 0 +#define READLINE_ALPHA 1 +#define READLINE_TEXT 2 +#define READLINE_HIDDEN 3 + + int term_fprint( screen_mode_e mode, FILE *f ); int term_print( term_screen *ts, const char *s, size_t n ); int term_print_xy( term_screen *ts, const char *buf, size_t size, - int init_column, int init_row); + int init_column, int init_row); int term_draw_hline( term_screen *ts, int pc, int pr, int sz, char ch ); int term_getc( term_screen *ts ); +int term_putc( term_screen *ts, char c ); +int term_readline( term_screen *ts, char *str, size_t str_size, int flag ); #endif @@ -14,7 +14,7 @@ int bbs_log_main( const char *syslname ) openlog ( syslname, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1 ); } - syslog( LOG_NOTICE, "BBS visitor" ); + syslog( LOG_NOTICE, "BBS visitor %s", BUILD_VERSION ); closelog (); @@ -6,6 +6,8 @@ #include <syslog.h> #include <unistd.h> +#include "buildinfo.h" + #define BBS_DEFAULT_SYSLOG "microbbs" int bbs_log_main( const char* ); @@ -1,16 +1,22 @@ +#define __MICROBBS_MAIN + #include <stdio.h> #include <stdlib.h> + #include "kconfig.h" #include "logs.h" #include "motd.h" #include "sysinfo.h" #include "articles.h" +#include "user.h" + #include "libterm/term.h" #include "libterm/term_io.h" #include "ini.h" + int main( int argc, char **argv ) { int quit_main_menu = 0; @@ -23,6 +29,9 @@ int main( int argc, char **argv ) term_set_raw_mode( &ts ); term_clr_scr( &ts ); + //init global variable of bbs user + bbs_user_init( &g_user ); + //lunch captcha and try to detect if its random bot #ifdef CONFIG_CAPTCHA if ( captcha_test1( ts ) != 1) @@ -50,6 +59,11 @@ int main( int argc, char **argv ) term_cur_set_r( &ts, 0 ); term_cur_set_c( &ts, 0 ); + #ifdef CONFIG_LOGIN + if ( bbs_user_get_status( &g_user ) == BBS_USER_LOGEDIN ) + printf("[LOGEDIN] "); + #endif + #ifdef CONFIG_MOTD printf("(M)otd "); #endif @@ -71,7 +85,8 @@ int main( int argc, char **argv ) #endif #ifdef CONFIG_LOGIN - printf("(L)ogin "); + if ( bbs_user_get_status( &g_user ) != BBS_USER_LOGEDIN ) + printf("(L)ogin "); #endif #ifdef CONFIG_TODO @@ -171,7 +186,7 @@ int main( int argc, char **argv ) case 'l': case 'L': { - printf("Login?\n"); + bbs_login( &ts ); } break; #endif @@ -0,0 +1,243 @@ +#include "user.h" + +int bbs_login( term_screen *ts ) +{ + int ret=0; + int fret = 0; + + int ret_len; + size_t in_size=0; + char *in_buf=NULL; + int quit_loop=0; + int menu_input = 0; + char menu_cmd = 0; + int row = 0; + char *todo_fname = NULL; + int orig_row, orig_col; + int max_row, max_col; + int box_row, box_col; + char *userdata_dir = CONFIG_USER_DEFAULT_DIR; + + //loginname and password buffers + const int username_max_size = 32; + char username_buf[username_max_size]; + const int password_max_size = username_max_size; + char password_buf[password_max_size]; + int username_ready = 0; + + + if ( ts == NULL ) + return ret; + + term_clr_scr( ts ); + max_row = term_get_maxrow( ts ); + max_col = term_get_maxcol( ts ); + orig_col = term_cur_get_c( ts ); + orig_row = term_cur_get_r( ts ); + box_row = max_row/2; + box_col = max_col/2-username_max_size/2; + + memset( username_buf, 0, username_max_size+1 ); + memset( password_buf, 0, password_max_size+1 ); + + + //get username + term_cur_set_r( ts, box_row ); + term_cur_set_c( ts, box_col-6); + term_print( ts, "Login:", 6 ); + term_cur_set_c( ts, box_col ); + term_cur_set_r( ts, box_row ); + fret = term_readline( ts, username_buf, username_max_size, READLINE_ALPHA ); + if ( fret < 1) + { + if ( fret == 0) + { + term_print( ts, "Username empty!", 15 ); + } else if ( fret == -1 ) + { + term_print( ts, "Error reading username", 22 ); + } + sleep( 3 ); + ret = -1; + goto exit_login; + }; + + //get password + term_cur_set_r( ts, box_row+2 ); + term_cur_set_c( ts, box_col-9 ); + term_print( ts, "Password:", 9 ); + term_cur_set_c( ts, box_col ); + term_cur_set_r( ts, box_row+2 ); + fret = term_readline( ts, password_buf, password_max_size, READLINE_HIDDEN ); + if ( fret < 1) + { + if ( fret == 0) + { + term_print( ts, "Password empty!", 15 ); + } else if ( fret == -1 ) + { + term_print( ts, "Error reading password", 22 ); + } + sleep( 3 ); + ret = -1; + goto exit_login; + }; + + //check if username file exists in dir + //open it check pass and auth user if pass succesfull + fret = bbs_login_auth( userdata_dir, username_buf, password_buf ); + if ( fret == -1 ) + { + ERROR("No such user\n"); sleep(3); + } else if ( fret == 0 ) + { + bbs_user_set_status( &g_user, BBS_USER_LOGEDIN ); + + { + sds lg = sds_new("Loged in as "); + sds usrn = sds_new( username_buf ); + sds_cat( lg, usrn ); + bbs_log( NULL, lg ); + sds_free( lg ); + sds_free( usrn ); + } + } + +exit_login: + return ret; +} + + +//just for full fill libc example +static int dir_username_selector (const struct dirent *unused) +{ + return 1; +} + +static int user_cfg_handler( void *user, const char *section, const char *name, + const char *value ) +{ + user_config_file *cfg = (user_config_file *)user; + + #define MATCH(s,n) strcmp(section,s) == 0 && strcmp(name,n)==0 + + if ( MATCH("user","password") ) + { + cfg->password = strdup( value ); + } + return 1; + +} + +int bbs_login_auth( const char *dir, const char *username, const char *password ) +{ + int ret=-1; + int fret = -1; + + int n,cnt; + struct dirent **eps; + struct stat dir_node; + int found_file=0; + + //name that should have user config file + sds crct_dir = sds_new( dir ); + sds crct_fn = sds_new( username ); + sds crct_postfix = sds_new( ".user" ); + sds srch_f = sds_empty(); + sds_cat( srch_f, crct_dir ); + sds_cat( srch_f, crct_fn ); + sds_cat( srch_f, crct_postfix ); + + //check dir for username pass + n = scandir( dir, &eps, dir_username_selector, alphasort ); + + if ( n < 0 ) return -1;//mem leak + + for ( cnt=0; cnt<n; cnt++ ) + { + sds file_name = sds_new( eps[cnt]->d_name ); + sds path_dir = sds_new( dir ); + sds path_name = sds_new( "" ); + sds_cat( path_name, path_dir ); + sds_cat( path_name, file_name ); + //config file exist + //PRINT("%s || %s \n", path_name, srch_f ); sleep( 3 ); + if ( sds_cmp( path_name, srch_f ) == 0 ) + { + cnt = n; + + found_file = 1; + } + //sds_free( file_name ); + //sds_free( path_dir ); + //sds_free( path_name ); + //free( eps[cnt] ); + } + //free( eps ); + + //not good style + //now we have patch and just open file and check if password match + if ( found_file ) + { + user_config_file cfg; + if ( ini_parse( srch_f, user_cfg_handler, &cfg ) < 0 ) + { + } else + { + //PRINT("config pass [%s][%s]!\n", cfg.password, password); + //sleep(3); + if ( strcmp( cfg.password, password ) == 0 ) + { + + //PRINT("Correct pass!\n");sleep(3); + ret = 0; + } else + { + //ERROR("InCorrect pass!\n");sleep(3); + } + } + } + + sds_free( crct_dir ); + sds_free( crct_fn ); + sds_free( crct_postfix ); + sds_free( srch_f ); + + return ret; +} + + +int bbs_user_init( bbs_user *bu ) +{ + if ( bu != NULL) + { + memset( bu, 0, sizeof(bbs_user) ); + bu->login_status = BBS_USER_GUEST; + } +} + + +int bbs_user_auth( bbs_user *bu ) +{ + +} + + +int bbs_user_set_status( bbs_user *bu, int status ) +{ + if ( bu != NULL ) + { + bu->login_status = status; + } +} + + +int bbs_user_get_status( bbs_user *bu ) +{ + if ( bu != NULL ) + { + return bu->login_status; + } + return BBS_USER_GUEST; +} + @@ -0,0 +1,54 @@ +#ifndef __MICROBBS_USER_H +#define __MICROBBS_USER_H + +#include <stdlib.h> +#include <stdio.h> +#include <dirent.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <termios.h> + +#include "kconfig.h" +#include "sds.h" + +#include "libterm/term.h" +#include "libterm/term_io.h" + +#define BBS_USER_GUEST 0 +#define BBS_USER_LOGEDIN 1 +#define BBS_USER_BLOCKED 2 +#define BBS_USER_LOGEDOUT 3 + + +#define BBS_USER_UN_SZ 32 +typedef struct bbs_user +{ + int login_status; + char username[BBS_USER_UN_SZ]; +} bbs_user; + +typedef struct user_config_file +{ + char *password; +} user_config_file; + +#define BBS_USER_INIT { BBS_USER_GUEST, {0} }; + +//GLOBAL USER +#ifdef __MICROBBS_MAIN +bbs_user g_user = BBS_USER_INIT; +#else +extern bbs_user g_user; +#endif + +int bbs_login( term_screen *ts ); +int bbs_login_auth( const char *dir, const char *username, const char *password ); + +int bbs_user_init( bbs_user *bu ); +int bbs_user_auth( bbs_user *bu ); +int bbs_user_set_status( bbs_user *bu, int status ); +int bbs_user_get_status( bbs_user *bu ); + +#endif
\ No newline at end of file |