extern int account_match(t_account * account, char const * username) { unsigned int namehash; char const * tname; if (!account) { eventlog(eventlog_level_error,"account_match","got NULL account"); return -1; } if (!username) { eventlog(eventlog_level_error,"account_match","got NULL username"); return -1; } if (username[0]=='#') eventlog(eventlog_level_error,"account_match","got old style account name !!!"); /* FIXME: core dump? :> XXXXXX */ namehash = account_hash(username); if (account->namehash==namehash && (tname = account_get_name(account))) { if (strcasecmp(tname,username)==0) { account_unget_name(tname); return 1; } else account_unget_name(tname); } return 0; }
extern int account_check_ignoring(t_account * account, char const * who) { char const * tignstr; char * ignstr; char * pignstr; char * ttok; t_account * tacc; char const * account_name; t_connection * c; if (!account) { eventlog(eventlog_level_error,"account_check_ignoring","got NULL account"); return -1; } if (!(account_name = account_get_name(account))) { eventlog(eventlog_level_error,"account_check_ignoring","got NULL account_name"); return -1; } if ((c = connlist_find_connection_by_accountname(account_name))) { account_unget_name(account_name); return conn_check_ignoring(c,who); } if (!(tignstr = account_get_ignore(account))) { eventlog(eventlog_level_error,"account_chceck_ignoring","got NULL tignstr"); account_unget_name(account_name); return -1; } if (!(ignstr = strdup(tignstr))) { eventlog(eventlog_level_error,"conn_check_ignoring","cannot allocate memory for ignstr"); account_unget_ignore(ignstr); account_unget_name(account_name); return -1; } account_unget_ignore(tignstr); pignstr = ignstr; while ((ttok = strsep(&ignstr,","))) if ((tacc = accountlist_find_account(ttok))) if (strcasecmp(account_name,ttok)==0) { account_unget_name(account_name); free(pignstr); return 1; } account_unget_name(account_name); free(pignstr); return 0; }
extern t_friend * friendlist_find_username(t_list * flist, const char * accname) { t_elem * curr; t_friend * fr; if(flist==NULL) return NULL; LIST_TRAVERSE(flist,curr) { if (!(fr = elem_get_data(curr))) { eventlog(eventlog_level_error,__FUNCTION__,"found NULL entry in list"); continue; } if (strcasecmp(account_get_name(fr->friendacc),accname)==0) return fr; } return NULL; }
extern void guiOnUpdateUserList() { t_connection * c; t_elem const * curr; t_account * acc; char UserCount[80]; SendMessage(gui.hwndUsers, LB_RESETCONTENT, 0, 0); LIST_TRAVERSE_CONST(connlist(), curr) { if (!(c = (t_connection *)elem_get_data(curr))) continue; if (!(acc = conn_get_account(c))) continue; SendMessage(gui.hwndUsers, LB_ADDSTRING, 0, (LPARAM)account_get_name(acc)); } sprintf(UserCount, "%d", connlist_login_get_length()); strcat(UserCount, " user(s) online:"); SendMessage(gui.hwndUserCount, WM_SETTEXT, 0, (LPARAM)UserCount); }
extern int account_match(t_account * account, char const * username) { unsigned int userid=0; unsigned int namehash; char const * tname; if (!account) { eventlog(eventlog_level_error,__FUNCTION__,"got NULL account"); return -1; } if (!username) { eventlog(eventlog_level_error,__FUNCTION__,"got NULL username"); return -1; } if (username[0]=='#') if (str_to_uint(&username[1],&userid)<0) userid = 0; if (userid) { if (account->uid==userid) return 1; } else { namehash = account_hash(username); if (account->namehash==namehash && (tname = account_get_name(account))) { if (strcasecmp(tname,username)==0) return 1; } } return 0; }
// add new line at the end of log file extern void userlog_append(t_account * account, const char * text) { // is logging enabled? if (!prefs_get_log_commands()) return; unsigned int groups = 0; const char * cglist = prefs_get_log_command_groups(); // convert string groups from config to integer for (int i = 0; i < strlen(cglist); i++) { if (cglist[i] == '1') groups |= 1; else if (cglist[i] == '2') groups |= 2; else if (cglist[i] == '3') groups |= 4; else if (cglist[i] == '4') groups |= 8; else if (cglist[i] == '5') groups |= 16; else if (cglist[i] == '6') groups |= 32; else if (cglist[i] == '7') groups |= 64; else if (cglist[i] == '8') groups |= 128; } // log only commands for admins/operators and users in "groups" defined in config if (!account_is_operator_or_admin(account, NULL) && !(account_get_command_groups(account) & groups)) return; bool is_cmd_found = false; // if command list empty then log all commands if (userlog_commands.size() == 0) is_cmd_found = true; else { // get command name std::vector<std::string> args = split_command(text, 0); std::string cmd = args[0]; // find command in defined command list for (std::vector<std::string>::iterator it = userlog_commands.begin(); it != userlog_commands.end(); ++it) { if (*it == cmd) { is_cmd_found = true; break; } } } if (!is_cmd_found) return; // get time string char time_string[USEREVENT_TIME_MAXLEN]; struct std::tm * tmnow; std::time_t now; std::time(&now); if (!(tmnow = std::localtime(&now))) std::strcpy(time_string, "?"); else std::strftime(time_string, USEREVENT_TIME_MAXLEN, USEREVENT_TIME_FORMAT, tmnow); char * filename = userlog_filename(account_get_name(account), true); if (FILE *fp = fopen(filename, "a")) { // append date and text std::fprintf(fp, "[%s] %s\n", time_string, text); std::fclose(fp); } else { ERROR1("could not write into user log file \"%s\"", filename); } }
extern int handle_telnet_packet(t_connection * c, t_packet const * const packet) { t_packet * rpacket; if (!c) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] got NULL connection",conn_get_socket(c)); return -1; } if (!packet) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] got NULL packet",conn_get_socket(c)); return -1; } if (packet_get_class(packet)!=packet_class_raw) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] got bad packet (class %d)",conn_get_socket(c),(int)packet_get_class(packet)); return -1; } { char const * const linestr=packet_get_str_const(packet,0,MAX_MESSAGE_LEN); if (packet_get_size(packet)<2) /* empty line */ return 0; if (!linestr) { eventlog(eventlog_level_warn,__FUNCTION__,"[%d] line too long",conn_get_socket(c)); return 0; } switch (conn_get_state(c)) { case conn_state_connected: conn_add_flags(c,MF_PLUG); conn_set_clienttag(c,CLIENTTAG_BNCHATBOT_UINT); { char const * temp=linestr; if (temp[0]=='\004') /* FIXME: no echo, ignore for now (we always do no echo) */ temp = &temp[1]; if (temp[0]=='\0') /* empty line */ { conn_set_state(c,conn_state_bot_username); /* don't look for ^D or reset tag and flags */ break; } conn_set_state(c,conn_state_bot_password); if (conn_set_loggeduser(c,temp)<0) eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not set username to \"%s\"",conn_get_socket(c),temp); { char const * const msg="\r\nPassword: "******"[%d] could not create rpacket",conn_get_socket(c)); break; } #if 0 /* don't echo */ packet_append_ntstring(rpacket,conn_get_loggeduser(c)); #endif packet_append_ntstring(rpacket,msg); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } } break; case conn_state_bot_username: conn_set_state(c,conn_state_bot_password); if (conn_set_loggeduser(c,linestr)<0) eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not set username to \"%s\"",conn_get_socket(c),linestr); { char const * const temp="\r\nPassword: "******"[%d] could not create rpacket",conn_get_socket(c)); break; } #if 0 /* don't echo */ packet_append_ntstring(rpacket,linestr); #endif packet_append_ntstring(rpacket,temp); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } break; case conn_state_bot_password: { char const * const tempa="\r\nLogin failed.\r\n\r\nUsername: "******"\r\nAccount has no bot access.\r\n\r\nUsername: "******"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if (connlist_find_connection_by_accountname(loggeduser)) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (already logged in)",conn_get_socket(c),loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if (!(account = accountlist_find_account(loggeduser))) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (bad account)",conn_get_socket(c),loggeduser); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if ((oldstrhash1 = account_get_pass(account))) { if (hash_set_str(&oldpasshash1,oldstrhash1)<0) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (corrupted passhash1?)",conn_get_socket(c),account_get_name(account)); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } testpass = xstrdup(linestr); { unsigned int i; for (i=0; i<strlen(testpass); i++) if (isupper((int)testpass[i])) testpass[i] = tolower((int)testpass[i]); } if (bnet_hash(&trypasshash1,strlen(testpass),testpass)<0) /* FIXME: force to lowercase */ { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (unable to hash password)",conn_get_socket(c),account_get_name(account)); xfree(testpass); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } xfree(testpass); if (hash_eq(trypasshash1,oldpasshash1)!=1) { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (wrong password)",conn_get_socket(c),account_get_name(account)); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempa); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } if (account_get_auth_botlogin(account)!=1) /* default to false */ { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (no bot access)",conn_get_socket(c),account_get_name(account)); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempb); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } else if (account_get_auth_lock(account)==1) /* default to false */ { eventlog(eventlog_level_info,__FUNCTION__,"[%d] bot login for \"%s\" refused (this account is locked)",conn_get_socket(c),account_get_name(account)); conn_set_state(c,conn_state_bot_username); if (!(rpacket = packet_create(packet_class_raw))) { eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); break; } packet_append_ntstring(rpacket,tempb); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); break; } eventlog(eventlog_level_info,__FUNCTION__,"[%d] \"%s\" bot logged in (correct password)",conn_get_socket(c),account_get_name(account)); } else eventlog(eventlog_level_info,__FUNCTION__,"[%d] \"%s\" bot logged in (no password)",conn_get_socket(c),account_get_name(account)); if (!(rpacket = packet_create(packet_class_raw))) /* if we got this far, let them log in even if this fails */ eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not create rpacket",conn_get_socket(c)); else { packet_append_ntstring(rpacket,"\r\n"); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } message_send_text(c,message_type_uniqueid,c,account_get_name(account)); bnetd_log(loggeduser, addr_num_to_ip_str(conn_get_addr(c)), "TELNET", "LOGIN", NULL, 1, 0); conn_login(c,account,loggeduser); if (conn_set_channel(c,CHANNEL_NAME_CHAT)<0) conn_set_channel(c,CHANNEL_NAME_BANNED); /* should not fail */ } break; case conn_state_loggedin: { t_channel const * channel; conn_set_idletime(c); if ((channel = conn_get_channel(c))) channel_message_log(channel,c,1,linestr); /* we don't log game commands currently */ if (linestr[0]=='/') handle_command(c,linestr); else if (channel && !conn_quota_exceeded(c,linestr)) channel_message_send(channel,message_type_talk,c,linestr); /* else discard */ } break; default: eventlog(eventlog_level_error,__FUNCTION__,"[%d] unknown telnet connection state %d",conn_get_socket(c),(int)conn_get_state(c)); } } return 0; }