#include "user.h" #ifdef CONFIG_LOGIN int bbs_login( term_screen *ts ) { int ret=0; int fret = 0; 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]; if ( ts == NULL ) return ret; term_clr_scr( ts ); max_row = term_get_maxrow( ts ); max_col = term_get_maxcol( 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 ); lg = 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 n,cnt; struct dirent **eps; 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(); srch_f = sds_cat( srch_f, crct_dir ); srch_f = sds_cat( srch_f, crct_fn ); srch_f = sds_cat( srch_f, crct_postfix ); sds_free( crct_dir ); sds_free( crct_fn ); sds_free( crct_postfix ); //check dir for username pass n = scandir( dir, &eps, dir_username_selector, alphasort ); if ( n < 0 ) { //if there is more stuff to be fried rearrange this block and resource //unitilisation code sds_free( srch_f ); return -1;//mem leak } for ( cnt=0; cntd_name ); sds path_dir = sds_new( dir ); sds path_name = sds_empty( ); path_name = sds_cat( path_name, path_dir ); path_name = 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) && (found_file == 0) ) { 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; memset( &cfg, 0, sizeof(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); } } if ( cfg.password != NULL ) free( cfg.password ); } sds_free( srch_f ); return ret; } int bbs_user_init( bbs_user *bu ) { int ret = -1; if ( bu != NULL) { memset( bu, 0, sizeof(bbs_user) ); bu->login_status = BBS_USER_GUEST; ret = 0; } return ret; } int bbs_user_auth( bbs_user *bu ) { int ret=0; return ret; } int bbs_user_set_status( bbs_user *bu, int status ) { int ret = -1; if ( bu != NULL ) { bu->login_status = status; ret = 0; } return ret; } int bbs_user_get_status( bbs_user *bu ) { if ( bu != NULL ) { return bu->login_status; } return BBS_USER_GUEST; } #endif