www.pudn.com > FTPDServer.rar > CFtpd.cpp
#include "stdafx.h"
#include "CFtpd.h"
//#include "Iphlpapi.h"
#define CRLF "\r\n"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
SOCKADDR_IN lpsockftpd;
UINT thAcceptCmd( LPVOID pParam )
{
CFtpd* pFtpd = (CFtpd*)pParam;
CFtpdPi* ftpdbindsock = pFtpd->ftpdbindsock;
try
{
pFtpd->absCrit.Lock();
char tmp[32] = "";
wsprintf(tmp,"%d.%d.%d.%d",lpsockftpd.sin_addr.S_un.S_un_b.s_b1,lpsockftpd.sin_addr.S_un.S_un_b.s_b2,lpsockftpd.sin_addr.S_un.S_un_b.s_b3,lpsockftpd.sin_addr.S_un.S_un_b.s_b4);
ftpdbindsock->b_auto_choose_ip = pFtpd->b_auto_choose_ip;
ftpdbindsock->b_switch_pasv_ip = pFtpd->b_switch_pasv_ip;
ftpdbindsock->b_ipchk_pasv = pFtpd->b_ipchk_pasv;
ftpdbindsock->m_specify_data_port = pFtpd->m_specify_data_port;
ftpdbindsock->m_port_from = pFtpd->m_port_from;
ftpdbindsock->m_port_from_preset = pFtpd->m_port_from;
ftpdbindsock->m_port_to = pFtpd->m_port_to;
ftpdbindsock->bUSER=FALSE;
ftpdbindsock->bPASS=FALSE;
ftpdbindsock->bconnected = TRUE;
ftpdbindsock->decided = FALSE;
strcpy(ftpdbindsock->userfile,pFtpd->userfile);
strcpy(ftpdbindsock->ipfile,pFtpd->ipfile);
strcpy(ftpdbindsock->vRealRoot,pFtpd->m_root_dir);
strcpy(ftpdbindsock->client_ip,tmp);
ftpdbindsock->pFtpd = (LPVOID)pFtpd;
pFtpd->AddClient(ftpdbindsock);
pFtpd->absCrit.Unlock();
bool allow = FALSE;
if(!FileExists(pFtpd->ipfile) || pFtpd->b_ipchk == FALSE)
allow = TRUE;
else
{
POSITION pos;
CStringList CSLIpList;
FileToCsl(pFtpd->ipfile,&CSLIpList);
CString CSIP = tmp;
CString Citem;
for( pos = CSLIpList.GetHeadPosition(); pos != NULL; )
{
Citem = CSLIpList.GetNext(pos);
if(CSIP.Find((LPCSTR)Citem)!=-1)
allow = TRUE;
if(allow == TRUE)
break;
}
}
if(allow==TRUE)
{
int i = 0;
unsigned long IP=-1;
for (i=0; IP!=0;i++)
{
IP=pFtpd->GetLocalNumericIP(i);
if (IP !=0)
{
wsprintf(tmp,"%d.%d.%d.%d",(IP&0xFF),((IP>>8 ) & 0xFF),((IP>>16) & 0xFF),((IP>>24) & 0xFF));
ftpdbindsock->ipList.AddTail(tmp);
}
}
wsprintf(pFtpd->buf,"220 %s FtpD for %s%s",(LPCSTR)pFtpd->m_servername,"free",CRLF);
ftpdbindsock->Send(pFtpd->buf,strlen(pFtpd->buf),0);
}else
{
wsprintf(pFtpd->buf,"no one is allowed to login from your ip address\n\r");
ftpdbindsock->Send(pFtpd->buf,sizeof(pFtpd->buf),0);
wsprintf(pFtpd->buf,"unsuccessful login attemp from %s (ip not allowed)",tmp);
ftpdbindsock->Close();
}
}
catch(...)
{
pFtpd->absCrit.Unlock();
}
return 1;
}
CFtpd::CFtpd()
{
AfxSocketInit(NULL);
b_speed_limit_in = false;
b_speed_limit_out = false;
b_ipchk = false;
b_ipchk_pasv = false;
b_switch_pasv_ip = false;
b_auto_choose_ip = true;
// m_kbs = 150;
m_specify_data_port = false;
m_port_from = 32000;
m_port_to = 65536;
m_servername = "Ftp Station(tm)";
sl = sizeof(SOCKADDR_IN);
GetCurrentDirectory(256,m_root_dir);
}
CFtpd::~CFtpd()
{
CFtpdPi* Fitem;
for(pos = ClientList.GetHeadPosition(); pos != NULL; )
{
Fitem = ClientList.GetNext( pos );
delete Fitem;
}
Close();
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CFtpd, CSocket)
//{{AFX_MSG_MAP(CFtpd)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
void CFtpd::OnAccept(int nErrorCode)
{
try
{
pos = NULL;
allow = FALSE;
ftpdbindsock = new CFtpdPi();
Accept(*ftpdbindsock,(SOCKADDR*)&lpsockftpd,&sl);
AfxBeginThread(&thAcceptCmd,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
}
catch (...)
{
}
CSocket::OnAccept(nErrorCode);
}
void CFtpd::OnClose(int nErrorCode)
{
CSocket::OnClose(nErrorCode);
}
DWORD CFtpd::GetLocalNumericIP(int Index)
{
if (0==gethostname (HostName,100))
{
if (!(lpHostEnt = gethostbyname(HostName)))
{
return(-1);
} else
{
lpDW=((DWORD*)(*lpHostEnt).h_addr_list);
lpDW+=Index;
lpDW2=(DWORD *) *lpDW;
if (lpDW2==0)
return 0;
else
return (*lpDW2);
}
} else
return (-1);
}
void CFtpd::AddClient(CFtpdPi *pBind)
{
try
{
ClientList.AddTail(pBind);
return;
}
catch(...)
{
return;
}
}
void CFtpd::RemoveClient(CFtpdPi *pBind)
{
try
{
POSITION pos = NULL;
if( ( pos = ClientList.Find(pBind, NULL ) )!= NULL )
ClientList.RemoveAt(pos);
if(pBind != NULL)
delete pBind;
return;
}
catch(...)
{
return;
}
}
bool FileExists(char *fname)
{
WIN32_FIND_DATA MyFoundFile;
HANDLE Hfound=FindFirstFile(fname,&MyFoundFile);
if(Hfound == INVALID_HANDLE_VALUE)
{
FindClose(Hfound);
return false;
}else
{
if(MyFoundFile.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
FindClose(Hfound);
return false;
}else
FindClose(Hfound);
return true;
}
}
void FileToCsl(char* finame,CStringList* CSL)
{
if(FileExists(finame))
{
char buf[512] = "";
CStdioFile ifs((LPCTSTR) finame , CFile::modeRead);
if(ifs.ReadString(buf,512) != NULL)
{
do
{
int l = strlen(buf) - 1;
if(l >= 0)
{
if(*(buf+l) == '\n')
*(buf+l) = NULL;
}
CString newitm = buf;
if(newitm=="");
else
{
POSITION pos1,pos2;
if( ( pos1 = CSL->Find(newitm, NULL ) )!= NULL );
else if( ( pos1 = CSL->GetHeadPosition() ) != NULL )
pos2 = CSL->InsertAfter( pos1, newitm );
else
CSL->AddHead(newitm);
}
}while(ifs.ReadString(buf,512) != NULL);
}
ifs.Close();
}
}
bool GetItemFromCString(int index,CString* CSTARGET,CString* CSITEM,char sep)
{
int length = CSTARGET->GetLength();
int poz[256];
int ind = 0;
for(int i=0 ; iMid(0,poz[0]);
return TRUE;
}else if(index > 0 && index Mid(poz[index-1]+1,poz[index]-poz[index-1]-1);
return TRUE;
}else if(index == ind)
{
*CSITEM = CSTARGET->Mid(poz[index-1]+1,length-poz[index-1]-1);
return TRUE;
}
return FALSE;
}