📄 baseclient.cpp
字号:
}
else
{
if (thePrefs.GetLogSecureIdent())
AddDebugLogLine(false, _T("'%s' has failed the secure identification, V2 State: %i"), GetUserName(), byChaIPKind);
}
m_dwLastSignatureIP = GetIP();
}
void CUpDownClient::SendSecIdentStatePacket(){
// check if we need public key and signature
uint8 nValue = 0;
if (credits){
if (theApp.clientcredits->CryptoAvailable()){
if (credits->GetSecIDKeyLen() == 0)
nValue = IS_KEYANDSIGNEEDED;
else if (m_dwLastSignatureIP != GetIP())
nValue = IS_SIGNATURENEEDED;
}
if (nValue == 0){
//if (thePrefs.GetLogSecureIdent())
// DEBUG_ONLY(AddDebugLogLine(false, "Not sending SecIdentState Packet, because State is Zero"));
return;
}
// crypt: send random data to sign
uint32 dwRandom = rand()+1;
credits->m_dwCryptRndChallengeFor = dwRandom;
Packet* packet = new Packet(OP_SECIDENTSTATE,5,OP_EMULEPROT);
theStats.AddUpDataOverheadOther(packet->size);
packet->pBuffer[0] = nValue;
PokeUInt32(packet->pBuffer+1, dwRandom);
if (thePrefs.GetDebugClientTCPLevel() > 0)
DebugSend("OP__SecIdentState", this);
socket->SendPacket(packet,true,true);
}
else
ASSERT ( false );
}
void CUpDownClient::ProcessSecIdentStatePacket(uchar* pachPacket, uint32 nSize){
if (nSize != 5)
return;
if (!credits){
ASSERT ( false );
return;
}
switch(pachPacket[0]){
case 0:
m_SecureIdentState = IS_UNAVAILABLE;
break;
case 1:
m_SecureIdentState = IS_SIGNATURENEEDED;
break;
case 2:
m_SecureIdentState = IS_KEYANDSIGNEEDED;
break;
}
credits->m_dwCryptRndChallengeFrom = PeekUInt32(pachPacket+1);
}
void CUpDownClient::InfoPacketsReceived(){
// indicates that both Information Packets has been received
// needed for actions, which process data from both packets
ASSERT ( m_byInfopacketsReceived == IP_BOTH );
m_byInfopacketsReceived = IP_NONE;
if (m_bySupportSecIdent){
SendSecIdentStatePacket();
}
}
void CUpDownClient::ResetFileStatusInfo()
{
if (m_abyPartStatus){
delete[] m_abyPartStatus;
m_abyPartStatus = NULL;
}
m_nPartCount = 0;
m_strClientFilename.Empty();
m_bCompleteSource = false;
m_dwLastAskedTime = 0; // ZZ:DownloadManager
m_iRate = 0;
m_strComment.Empty();
}
bool CUpDownClient::IsBanned() const
{
return theApp.clientlist->IsBannedClient(GetIP());
}
void CUpDownClient::SendPreviewRequest(const CAbstractFile* pForFile)
{
if (m_fPreviewReqPending == 0){
m_fPreviewReqPending = 1;
Packet* packet = new Packet(OP_REQUESTPREVIEW,16,OP_EMULEPROT);
md4cpy(packet->pBuffer,pForFile->GetFileHash());
theStats.AddUpDataOverheadOther(packet->size);
SafeSendPacket(packet);
}
else{
//to res table - later
AddLogLine(true, GetResString(IDS_ERR_PREVIEWALREADY));
}
}
void CUpDownClient::SendPreviewAnswer(const CKnownFile* pForFile, CxImage** imgFrames, uint8 nCount)
{
m_fPreviewAnsPending = 0;
CSafeMemFile data(1024);
if (pForFile){
data.WriteHash16(pForFile->GetFileHash());
}
else{
static const uchar _aucZeroHash[16] = {0};
data.WriteHash16(_aucZeroHash);
}
data.WriteUInt8(nCount);
for (int i = 0; i != nCount; i++){
if (imgFrames == NULL){
ASSERT ( false );
return;
}
CxImage* cur_frame = imgFrames[i];
if (cur_frame == NULL){
ASSERT ( false );
return;
}
BYTE* abyResultBuffer = NULL;
long nResultSize = 0;
if (!cur_frame->Encode(abyResultBuffer, nResultSize, CXIMAGE_FORMAT_PNG)){
ASSERT ( false );
return;
}
data.WriteUInt32(nResultSize);
data.Write(abyResultBuffer, nResultSize);
free(abyResultBuffer);
}
Packet* packet = new Packet(&data, OP_EMULEPROT);
packet->opcode = OP_PREVIEWANSWER;
theStats.AddUpDataOverheadOther(packet->size);
SafeSendPacket(packet);
}
void CUpDownClient::ProcessPreviewReq(char* pachPacket, uint32 nSize){
if (nSize < 16)
throw GetResString(IDS_ERR_WRONGPACKAGESIZE);
if (m_fPreviewAnsPending || thePrefs.CanSeeShares()==vsfaNobody || (thePrefs.CanSeeShares()==vsfaFriends && !IsFriend()))
return;
m_fPreviewAnsPending = 1;
CKnownFile* previewFile = theApp.sharedfiles->GetFileByID((uchar*)pachPacket);
if (previewFile == NULL){
SendPreviewAnswer(NULL, NULL, 0);
}
else{
previewFile->GrabImage(4,0,true,450,this);
}
}
void CUpDownClient::ProcessPreviewAnswer(char* pachPacket, uint32 nSize){
if (m_fPreviewReqPending == 0)
return;
m_fPreviewReqPending = 0;
CSafeMemFile data((BYTE*)pachPacket,nSize);
uchar Hash[16];
data.ReadHash16(Hash);
uint8 nCount = data.ReadUInt8();
if (nCount == 0){
// to res table -later
AddLogLine(true, GetResString(IDS_ERR_PREVIEWFAILED),GetUserName());
return;
}
CSearchFile* sfile = theApp.searchlist->GetSearchFileByHash(Hash);
if (sfile == NULL){
//already deleted
return;
}
BYTE* pBuffer = NULL;
try{
for (int i = 0; i != nCount; i++){
uint32 nImgSize = data.ReadUInt32();
if (nImgSize > nSize)
throw CString(_T("CUpDownClient::ProcessPreviewAnswer - Provided image size exceeds limit"));
pBuffer = new BYTE[nImgSize];
data.Read(pBuffer, nImgSize);
CxImage* image = new CxImage(pBuffer, nImgSize, CXIMAGE_FORMAT_PNG);
delete[] pBuffer;
pBuffer = NULL;
if (image->IsValid()){
sfile->AddPreviewImg(image);
}
}
}
catch(...){
if (pBuffer != NULL)
delete[] pBuffer;
throw;
}
(new PreviewDlg())->SetFile(sfile);
}
// sends a packet, if needed it will establish a connection before
// options used: ignore max connections, control packet, delete packet
// !if the functions returns false that client object was deleted because the connection try failed and the object wasn't needed anymore.
bool CUpDownClient::SafeSendPacket(Packet* packet){
if (socket && socket->IsConnected()){
socket->SendPacket(packet);
return true;
}
else{
m_WaitingPackets_list.AddTail(packet);
return TryToConnect(true);
}
}
bool CUpDownClient::HasLowID() const
{
return IsLowID(m_nUserIDHybrid);
}
#ifdef _DEBUG
void CUpDownClient::AssertValid() const
{
CObject::AssertValid();
CHECK_OBJ(socket);
CHECK_PTR(credits);
CHECK_PTR(m_Friend);
CHECK_OBJ(reqfile);
(void)m_abyUpPartStatus;
m_OtherRequests_list.AssertValid();
m_OtherNoNeeded_list.AssertValid();
(void)m_lastPartAsked;
CHECK_BOOL(m_bAddNextConnect);
(void)m_cMessagesReceived;
(void)m_cMessagesSent;
(void)m_dwUserIP;
(void)m_dwServerIP;
(void)m_nUserIDHybrid;
(void)m_nUserPort;
(void)m_nServerPort;
(void)m_nClientVersion;
(void)m_nUpDatarate;
(void)dataratems;
(void)m_byEmuleVersion;
(void)m_byDataCompVer;
CHECK_BOOL(m_bEmuleProtocol);
CHECK_BOOL(m_bIsHybrid);
(void)m_pszUsername;
(void)m_achUserHash;
(void)m_nUDPPort;
(void)m_nKadPort;
(void)m_byUDPVer;
(void)m_bySourceExchangeVer;
(void)m_byAcceptCommentVer;
(void)m_byExtendedRequestsVer;
CHECK_BOOL(m_bFriendSlot);
CHECK_BOOL(m_bCommentDirty);
CHECK_BOOL(m_bIsML);
//ASSERT( m_clientSoft >= SO_EMULE && m_clientSoft <= SO_SHAREAZA || m_clientSoft == SO_MLDONKEY || m_clientSoft >= SO_EDONKEYHYBRID && m_clientSoft <= SO_UNKNOWN );
(void)m_strClientSoftware;
(void)m_dwLastSourceRequest;
(void)m_dwLastSourceAnswer;
(void)m_dwLastAskedForSources;
(void)m_iFileListRequested;
(void)m_byCompatibleClient;
m_WaitingPackets_list.AssertValid();
m_DontSwap_list.AssertValid();
(void)m_lastRefreshedDLDisplay;
ASSERT( m_SecureIdentState >= IS_UNAVAILABLE && m_SecureIdentState <= IS_KEYANDSIGNEEDED );
(void)m_dwLastSignatureIP;
ASSERT( (m_byInfopacketsReceived & ~IP_BOTH) == 0 );
(void)m_bySupportSecIdent;
(void)m_nTransferedUp;
ASSERT( m_nUploadState >= US_UPLOADING && m_nUploadState <= US_NONE );
(void)m_dwUploadTime;
(void)m_cAsked;
(void)m_dwLastUpRequest;
(void)m_nCurSessionUp;
(void)m_nCurQueueSessionPayloadUp;
(void)m_addedPayloadQueueSession;
(void)m_nUpPartCount;
(void)m_nUpCompleteSourcesCount;
(void)s_UpStatusBar;
(void)requpfileid;
(void)m_lastRefreshedULDisplay;
m_AvarageUDR_list.AssertValid();
m_BlockRequests_queue.AssertValid();
m_DoneBlocks_list.AssertValid();
m_RequestedFiles_list.AssertValid();
ASSERT( m_nDownloadState >= DS_DOWNLOADING && m_nDownloadState <= DS_NONE );
(void)m_cDownAsked;
(void)m_abyPartStatus;
(void)m_dwLastAskedTime;
(void)m_strClientFilename;
(void)m_nTransferedDown;
(void)m_dwDownStartTime;
(void)m_nLastBlockOffset;
(void)m_nDownDatarate;
(void)m_nDownDataRateMS;
(void)m_nSumForAvgDownDataRate;
(void)m_cShowDR;
(void)m_nRemoteQueueRank;
(void)m_dwLastBlockReceived;
(void)m_nPartCount;
ASSERT( m_nSourceFrom >= SF_SERVER && m_nSourceFrom <= SF_LINK );
CHECK_BOOL(m_bRemoteQueueFull);
CHECK_BOOL(m_bCompleteSource);
CHECK_BOOL(m_bReaskPending);
CHECK_BOOL(m_bUDPPending);
CHECK_BOOL(m_bTransferredDownMini);
ASSERT( m_nKadState >= KS_NONE && m_nKadState <= KS_CONNECTED_BUDDY );
m_AvarageDDR_list.AssertValid();
(void)sumavgUDR;
m_PendingBlocks_list.AssertValid();
m_DownloadBlocks_list.AssertValid();
(void)s_StatusBar;
ASSERT( m_nChatstate >= MS_NONE && m_nChatstate <= MS_UNABLETOCONNECT );
(void)m_strComment;
(void)m_iRate;
#undef CHECK_PTR
#undef CHECK_BOOL
}
#endif
#ifdef _DEBUG
void CUpDownClient::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
}
#endif
LPCTSTR CUpDownClient::DbgGetDownloadState() const
{
const static LPCTSTR apszState[] =
{
_T("Downloading"),
_T("OnQueue"),
_T("Connected"),
_T("Connecting"),
_T("WaitCallback"),
_T("ReqHashSet"),
_T("NoNeededParts"),
_T("TooManyConns"),
_T("LowToLowIp"),
_T("Banned"),
_T("Error"),
_T("None")
};
if (GetDownloadState() >= ARRSIZE(apszState))
return _T("*Unknown*");
return apszState[GetDownloadState()];
}
LPCTSTR CUpDownClient::DbgGetUploadState() const
{
const static LPCTSTR apszState[] =
{
_T("Uploading"),
_T("OnUploadQueue"),
_T("WaitCallback"),
_T("Connecting"),
_T("Pending"),
_T("LowToLowIp"),
_T("Banned"),
_T("Error"),
_T("None")
};
if (GetUploadState() >= ARRSIZE(apszState))
return _T("*Unknown*");
return apszState[GetUploadState()];
}
CString CUpDownClient::DbgGetFullClientSoftVer() const
{
if (GetClientModVer().IsEmpty())
return GetClientSoftVer();
return GetClientSoftVer() + _T(" [") + GetClientModVer() + _T(']');
}
CString CUpDownClient::DbgGetClientInfo(bool bFormatIP) const
{
CString str;
if (this != NULL)
{
try{
str.Format(
bFormatIP
? _T("%-15s '%s' (%s,%s/%s)")
: _T("%s '%s' (%s,%s/%s)"),
ipstr(GetConnectIP()),
GetUserName(),
DbgGetFullClientSoftVer(),
DbgGetDownloadState(),
DbgGetUploadState());
}
catch(...){
str.Format(_T("%08x - Invalid client instance"), this);
}
}
return str;
}
bool CUpDownClient::CheckHandshakeFinished(UINT protocol, UINT opcode) const
{
if (m_bHelloAnswerPending){
//throw CString(_T("Handshake not finished")); // -> disconnect client
// this triggers way too often.. need more time to look at this -> only create a warning
if (thePrefs.GetVerbose())
AddDebugLogLine(DLP_VERYLOW,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -