Permalink
Browse files

Move dcc file transfers to their own module

  • Loading branch information...
1 parent 8f508cb commit 16047eaf8156f8636e8bb8f0319367829292e0f9 @kylef kylef committed May 30, 2011
Showing with 479 additions and 559 deletions.
  1. +0 −12 Client.cpp
  2. +0 −103 ClientCommand.cpp
  3. +0 −249 DCCSock.cpp
  4. +0 −72 DCCSock.h
  5. +1 −1 Makefile.in
  6. +0 −74 User.cpp
  7. +0 −5 User.h
  8. +478 −0 modules/extra/dcc.cpp
  9. +0 −43 modules/extra/shell.cpp
View
@@ -369,18 +369,6 @@ void CClient::ReadLine(const CString& sData) {
sCTCP.RightChomp();
if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) {
- if (sCTCP.Equals("DCC RESUME ", false, 11)) {
- CString sFile = sCTCP.Token(2);
- unsigned short uResumePort = sCTCP.Token(3).ToUShort();
- unsigned long uResumeSize = sCTCP.Token(4).ToULong();
-
- if (m_pUser->ResumeFile(uResumePort, uResumeSize)) {
- PutClient(":" + sTarget + "!znc@znc.in PRIVMSG " + GetNick() + " :\001DCC ACCEPT " + sFile + " " + CString(uResumePort) + " " + CString(uResumeSize) + "\001");
- } else {
- PutStatus("DCC -> [" + GetNick() + "][" + sFile + "] Unable to find send to initiate resume.");
- }
- }
-
if (sTarget.Equals("status")) {
StatusCTCP(sCTCP);
} else {
View
@@ -8,7 +8,6 @@
#include "Client.h"
#include "Chan.h"
-#include "DCCSock.h"
#include "FileUtils.h"
#include "IRCSock.h"
#include "Listener.h"
@@ -469,94 +468,6 @@ void CClient::UserCommand(CString& sLine) {
}
PutStatus(Table);
- } else if (sCommand.Equals("SEND")) {
- CString sToNick = sLine.Token(1);
- CString sFile = sLine.Token(2);
- CString sAllowedPath = m_pUser->GetDLPath();
- CString sAbsolutePath;
-
- if ((sToNick.empty()) || (sFile.empty())) {
- PutStatus("Usage: Send <nick> <file>");
- return;
- }
-
- sAbsolutePath = CDir::CheckPathPrefix(sAllowedPath, sFile);
-
- if (sAbsolutePath.empty()) {
- PutStatus("Illegal path.");
- return;
- }
-
- m_pUser->SendFile(sToNick, sFile);
- } else if (sCommand.Equals("GET")) {
- CString sFile = sLine.Token(1);
- CString sAllowedPath = m_pUser->GetDLPath();
- CString sAbsolutePath;
-
- if (sFile.empty()) {
- PutStatus("Usage: Get <file>");
- return;
- }
-
- sAbsolutePath = CDir::CheckPathPrefix(sAllowedPath, sFile);
-
- if (sAbsolutePath.empty()) {
- PutStatus("Illegal path.");
- return;
- }
-
- m_pUser->SendFile(GetNick(), sFile);
- } else if (sCommand.Equals("LISTDCCS")) {
- CSockManager& Manager = CZNC::Get().GetManager();
-
- CTable Table;
- Table.AddColumn("Type");
- Table.AddColumn("State");
- Table.AddColumn("Speed");
- Table.AddColumn("Nick");
- Table.AddColumn("IP");
- Table.AddColumn("File");
-
- for (unsigned int a = 0; a < Manager.size(); a++) {
- CString sSockName = Manager[a]->GetSockName();
-
- if (sSockName.TrimPrefix("DCC::")) {
- if (sSockName.Equals("SEND", false, 4)) {
- CDCCSock* pSock = (CDCCSock*) Manager[a];
-
- Table.AddRow();
- Table.SetCell("Type", "Sending");
- Table.SetCell("State", CString::ToPercent(pSock->GetProgress()));
- Table.SetCell("Speed", CString((int)(pSock->GetAvgWrite() / 1024.0)) + " KiB/s");
- Table.SetCell("Nick", pSock->GetRemoteNick());
- Table.SetCell("IP", pSock->GetRemoteIP());
- Table.SetCell("File", pSock->GetFileName());
- } else if (sSockName.Equals("GET", false, 3)) {
- CDCCSock* pSock = (CDCCSock*) Manager[a];
-
- Table.AddRow();
- Table.SetCell("Type", "Getting");
- Table.SetCell("State", CString::ToPercent(pSock->GetProgress()));
- Table.SetCell("Speed", CString((int)(pSock->GetAvgRead() / 1024.0)) + " KiB/s");
- Table.SetCell("Nick", pSock->GetRemoteNick());
- Table.SetCell("IP", pSock->GetRemoteIP());
- Table.SetCell("File", pSock->GetFileName());
- } else if (sSockName.Equals("LISTEN", false, 6)) {
- CDCCSock* pSock = (CDCCSock*) Manager[a];
-
- Table.AddRow();
- Table.SetCell("Type", "Sending");
- Table.SetCell("State", "Waiting");
- Table.SetCell("Nick", pSock->GetRemoteNick());
- Table.SetCell("IP", pSock->GetRemoteIP());
- Table.SetCell("File", pSock->GetFileName());
- }
- }
- }
-
- if (PutStatus(Table) == 0) {
- PutStatus("You have no active DCCs.");
- }
} else if (sCommand.Equals("LISTMODS") || sCommand.Equals("LISTMODULES")) {
if (m_pUser->IsAdmin()) {
CModules& GModules = CZNC::Get().GetModules();
@@ -1108,10 +1019,6 @@ void CClient::HelpUser() {
Table.SetCell("Description", "Print which version of ZNC this is");
Table.AddRow();
- Table.SetCell("Command", "ListDCCs");
- Table.SetCell("Description", "List all active DCCs");
-
- Table.AddRow();
Table.SetCell("Command", "ListMods");
Table.SetCell("Description", "List all loaded modules");
@@ -1224,16 +1131,6 @@ void CClient::HelpUser() {
Table.SetCell("Description", "Reconnect to IRC");
Table.AddRow();
- Table.SetCell("Command", "Send");
- Table.SetCell("Arguments", "<nick> <file>");
- Table.SetCell("Description", "Send a shell file to a nick on IRC");
-
- Table.AddRow();
- Table.SetCell("Command", "Get");
- Table.SetCell("Arguments", "<file>");
- Table.SetCell("Description", "Send a shell file to yourself");
-
- Table.AddRow();
Table.SetCell("Command", "Uptime");
Table.SetCell("Description", "Show for how long ZNC has been running");
View
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2004-2011 See the AUTHORS file for details.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- */
-
-#include "DCCSock.h"
-#include "FileUtils.h"
-#include "User.h"
-#include "Utils.h"
-
-CDCCSock::CDCCSock(CUser* pUser, const CString& sRemoteNick, const CString& sLocalFile, const CString& sModuleName,
- unsigned long uFileSize, CFile* pFile) : CZNCSock() {
- m_sRemoteNick = sRemoteNick;
- m_uFileSize = uFileSize;
- m_uRemotePort = 0;
- m_uBytesSoFar = 0;
- m_pUser = pUser;
- m_pFile = pFile;
- m_sLocalFile = sLocalFile;
- m_sModuleName = sModuleName;
- m_bSend = true;
- m_bNoDelFile = false;
-
- m_pUser->AddDCCSock(this);
-}
-
-CDCCSock::CDCCSock(CUser* pUser, const CString& sRemoteNick, const CString& sRemoteIP, unsigned short uRemotePort,
- const CString& sLocalFile, unsigned long uFileSize, const CString& sModuleName) : CZNCSock() {
- m_sRemoteNick = sRemoteNick;
- m_sRemoteIP = sRemoteIP;
- m_uRemotePort = uRemotePort;
- m_uFileSize = uFileSize;
- m_uBytesSoFar = 0;
- m_pUser = pUser;
- m_pFile = NULL;
- m_sLocalFile = sLocalFile;
- m_sModuleName = sModuleName;
- m_bSend = false;
- m_bNoDelFile = false;
-
- m_pUser->AddDCCSock(this);
-}
-
-CDCCSock::~CDCCSock() {
- if ((m_pFile) && (!m_bNoDelFile)) {
- m_pFile->Close();
- delete m_pFile;
- }
-
- m_pUser->AddBytesRead(GetBytesRead());
- m_pUser->AddBytesWritten(GetBytesWritten());
-
- m_pUser->DelDCCSock(this);
-}
-
-void CDCCSock::ReadData(const char* data, size_t len) {
- if (!m_pFile) {
- DEBUG("File not open! closing get.");
- m_pUser->PutModule(m_sModuleName, ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - File not open!");
- Close();
- }
-
- // DCC specs says the receiving end sends the number of bytes it
- // received so far as a 4 byte integer in network byte order, so we need
- // uint32_t to do the job portably. This also means that the maximum
- // file that we can transfer is 4 GiB big (see OpenFile()).
- if (m_bSend) {
- m_sSendBuf.append(data, len);
-
- while (m_sSendBuf.size() >= 4) {
- uint32_t iRemoteSoFar;
- memcpy(&iRemoteSoFar, m_sSendBuf.data(), sizeof(iRemoteSoFar));
- iRemoteSoFar = ntohl(iRemoteSoFar);
-
- if ((iRemoteSoFar + 65536) >= m_uBytesSoFar) {
- SendPacket();
- }
-
- m_sSendBuf.erase(0, 4);
- }
- } else {
- m_pFile->Write(data, len);
- m_uBytesSoFar += len;
- uint32_t uSoFar = htonl(m_uBytesSoFar);
- Write((char*) &uSoFar, sizeof(uSoFar));
-
- if (m_uBytesSoFar >= m_uFileSize) {
- Close();
- }
- }
-}
-
-void CDCCSock::ConnectionRefused() {
- DEBUG(GetSockName() << " == ConnectionRefused()");
- m_pUser->PutModule(m_sModuleName, ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - Connection Refused.");
-}
-
-void CDCCSock::Timeout() {
- DEBUG(GetSockName() << " == Timeout()");
- m_pUser->PutModule(m_sModuleName, ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - Timed Out.");
-}
-
-void CDCCSock::SockError(int iErrno) {
- DEBUG(GetSockName() << " == SockError(" << iErrno << ")");
- m_pUser->PutModule(m_sModuleName, ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - Socket Error [" + CString(iErrno) + "]");
-}
-
-void CDCCSock::Connected() {
- DEBUG(GetSockName() << " == Connected(" << GetRemoteIP() << ")");
- m_pUser->PutModule(m_sModuleName, ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - Transfer Started.");
-
- if (m_bSend) {
- SendPacket();
- }
-
- SetTimeout(120);
-}
-
-void CDCCSock::Disconnected() {
- const CString sStart = ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - ";
-
- DEBUG(GetSockName() << " == Disconnected()");
-
- if (m_uBytesSoFar > m_uFileSize) {
- m_pUser->PutModule(m_sModuleName, sStart + "TooMuchData!");
- } else if (m_uBytesSoFar == m_uFileSize) {
- if (m_bSend) {
- m_pUser->PutModule(m_sModuleName, sStart + "Completed! - Sent [" + m_sLocalFile +
- "] at [" + CString((int) (GetAvgWrite() / 1024.0)) + " KiB/s ]");
- } else {
- m_pUser->PutModule(m_sModuleName, sStart + "Completed! - Saved to [" + m_sLocalFile +
- "] at [" + CString((int) (GetAvgRead() / 1024.0)) + " KiB/s ]");
- }
- } else {
- m_pUser->PutModule(m_sModuleName, sStart + "Incomplete!");
- }
-}
-
-void CDCCSock::SendPacket() {
- if (!m_pFile) {
- m_pUser->PutModule(m_sModuleName, ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - File closed prematurely.");
- Close();
- return;
- }
-
- if (GetInternalWriteBuffer().size() > 1024 * 1024) {
- // There is still enough data to be written, don't add more
- // stuff to that buffer.
- DEBUG("SendPacket(): Skipping send, buffer still full enough [" << GetInternalWriteBuffer().size() << "]["
- << m_sRemoteNick << "][" << m_sFileName << "]");
- return;
- }
-
- char szBuf[4096];
- int iLen = m_pFile->Read(szBuf, 4096);
-
- if (iLen < 0) {
- m_pUser->PutModule(m_sModuleName, ((m_bSend) ? "DCC -> [" : "DCC <- [") + m_sRemoteNick + "][" + m_sFileName + "] - Error reading from file.");
- Close();
- return;
- }
-
- if (iLen > 0) {
- Write(szBuf, iLen);
- m_uBytesSoFar += iLen;
- }
-}
-
-Csock* CDCCSock::GetSockObj(const CString& sHost, unsigned short uPort) {
- Close();
-
- CDCCSock* pSock = new CDCCSock(m_pUser, m_sRemoteNick, m_sLocalFile, m_sModuleName, m_uFileSize, m_pFile);
- pSock->SetSockName("DCC::SEND::" + m_sRemoteNick);
- pSock->SetTimeout(120);
- pSock->SetFileName(m_sFileName);
- pSock->SetFileOffset(m_uBytesSoFar);
- m_bNoDelFile = true;
-
- return pSock;
-}
-
-CFile* CDCCSock::OpenFile(bool bWrite) {
- if ((m_pFile) || (m_sLocalFile.empty())) {
- m_pUser->PutModule(m_sModuleName, ((bWrite) ? "DCC <- [" : "DCC -> [") + m_sRemoteNick + "][" + m_sLocalFile + "] - Unable to open file.");
- return NULL;
- }
-
- m_pFile = new CFile(m_sLocalFile);
-
- if (bWrite) {
- if (m_pFile->Exists()) {
- delete m_pFile;
- m_pFile = NULL;
- m_pUser->PutModule(m_sModuleName, "DCC <- [" + m_sRemoteNick + "] - File already exists [" + m_sLocalFile + "]");
- return NULL;
- }
-
- if (!m_pFile->Open(O_WRONLY | O_TRUNC | O_CREAT)) {
- delete m_pFile;
- m_pFile = NULL;
- m_pUser->PutModule(m_sModuleName, "DCC <- [" + m_sRemoteNick + "] - Could not open file [" + m_sLocalFile + "]");
- return NULL;
- }
- } else {
- if (!m_pFile->IsReg()) {
- delete m_pFile;
- m_pFile = NULL;
- m_pUser->PutModule(m_sModuleName, "DCC -> [" + m_sRemoteNick + "] - Not a file [" + m_sLocalFile + "]");
- return NULL;
- }
-
- if (!m_pFile->Open()) {
- delete m_pFile;
- m_pFile = NULL;
- m_pUser->PutModule(m_sModuleName, "DCC -> [" + m_sRemoteNick + "] - Could not open file [" + m_sLocalFile + "]");
- return NULL;
- }
-
- // The DCC specs only allow file transfers with files smaller
- // than 4GiB (see ReadData()).
- unsigned long long uFileSize = m_pFile->GetSize();
- if (uFileSize > (unsigned long long) 0xffffffff) {
- delete m_pFile;
- m_pFile = NULL;
- m_pUser->PutModule(m_sModuleName, "DCC -> [" + m_sRemoteNick + "] - File too large (>4 GiB) [" + m_sLocalFile + "]");
- return NULL;
- }
-
- m_uFileSize = (unsigned long) uFileSize;
- }
-
- m_sFileName = m_pFile->GetShortName();
-
- return m_pFile;
-}
-
-bool CDCCSock::Seek(unsigned int uPos) {
- if (m_pFile) {
- if (m_pFile->Seek(uPos)) {
- m_uBytesSoFar = uPos;
- return true;
- }
- }
-
- return false;
-}
Oops, something went wrong.

0 comments on commit 16047ea

Please sign in to comment.