This commit is contained in:
Wirlaburla committed 2024-10-17 16:49:05 -05:00
1 parent 184288ce24
commit cf6a611fae
16 files changed
+347 -119

No files matched your search

+22 -37
View File
@@ -10,6 +10,7 @@
#include <time.h>
#include <thread>
#include "main.h"
#include "server.h"
#include "filer.cpp"
#include "util.h"
@@ -30,7 +31,7 @@ public:
Client(int &_sock) {
control_sock = _sock;
submit(230, "Init");
submit(230, config->getValue("main", "server_name", "digFTP Server"));
};
int receive(std::string cmd, std::string argstr) {
@@ -44,29 +45,17 @@ public:
submit(257, "'"+filer->cwd.string()+"'");
} else if (cmd == "CWD") {
int rc = filer->traverse(argstr);
if (rc == 0) {
submit(250, "OK");
} else if (rc == -1) {
submit(500, "Not found!");
} else {
submit(500, std::to_string(rc));
}
if (rc == 0) submit(250, "OK");
else submit(431, "No such directory");
} else if (cmd == "CDUP") {
int rc = filer->traverse("..");
if (rc == 0) {
submit(250, "OK");
} else if (rc == -1) {
submit(500, "Not found!");
} else {
submit(500, std::to_string(rc));
}
if (rc == 0) submit(250, "OK");
else submit(431, "No such directory");
} else if (cmd == "MKD") {
int rc = filer->createDirectory(argstr);
if (rc == 0) {
submit(250, "OK");
} else {
submit(500, std::to_string(rc));
}
if (rc == 0) submit(257, "\""+filer->relPath(argstr).string()+"\" directory created");
else if (rc == -1) submit(521, "Directory already exists");
else submit(550, "Access Denied");
} else if (cmd == "TYPE") {
sscanf(argstr.c_str(), "%c", &(filer->type));
submit(226, "OK");
@@ -104,10 +93,7 @@ public:
}
if (getsockname(data_fd, (struct sockaddr *)&data_address, &datalen) == 0) {
//memcpy(&netaddr[0], &data_address.sin_addr, 4);
netaddr[0] = 127;
netaddr[1] = netaddr[2] = 0;
netaddr[3] = 1;
sscanf(config->getValue("net", "listen_address", "127.0.0.1").c_str(), "%d.%d.%d.%d", &netaddr[0], &netaddr[1], &netaddr[2], &netaddr[3]);
dataport = ntohs(data_address.sin_port);
memcpy(&netport[0], &dataport, 2);
printf("[i] D(%i) PASV initialized: %u.%u.%u.%u:%u\n", data_fd, netaddr[0], netaddr[1], netaddr[2], netaddr[3], dataport);
@@ -120,7 +106,7 @@ public:
char* pasvok;
asprintf(
&pasvok,
"Entering Passive Mode (%u,%u,%u,%u,%u,%u)",
"Entering Passive Mode (%u,%u,%u,%u,%u,%u).",
netaddr[0],
netaddr[1],
netaddr[2],
@@ -135,7 +121,6 @@ public:
if ((data_sock = accept(data_fd, NULL, NULL)) >= 0) {
printf("[i] D(%i) PASV accepted: %i\n", data_fd, data_sock);
state = 2;
//submit(200, "OK");
} else {
perror("accept() failed");
submit(425, "Unknown Error");
@@ -177,7 +162,7 @@ public:
} else if (cmd == "DELE" || cmd == "RMD") {
int ret = filer->deleteFile(argstr);
if (ret == 0) {
submit(226, "OK");
submit(250, "OK");
} else {
submit(550, "Access Denied "+std::to_string(ret));
}
@@ -197,13 +182,12 @@ public:
if (fd.ecode == 0) {
submit(150, "Transferring");
data_submit(fd.data, fd.size);
free(fd.data);
submit(226, "OK");
} else {
if (fd.ecode == -3) submit(550, "I refuse to transmit in ASCII mode!");
else submit(550, "Access Denied");
}
// Segfault on freeing ASCII data, memory leak on binary.
if (filer->type != 'A') free(fd.data);
submit(226, "OK");
} else if (cmd == "STOR") {
unsigned char inbuf[BUFFERSIZE] = {0};
submit(150, "Transferring");
@@ -232,20 +216,21 @@ public:
name = argstr;
submit(331, "Password required");
} else if (cmd == "PASS") {
if (argstr == "123") {
if (auth->check(name, argstr)) {
printf("[d] (%i) logged in as '%s'\n", control_sock, name.c_str());
// We can now set the root safely (I hope).
filer->setRoot("/data/ftp-test/"+name);
filer->setRoot(auth->getUserDirectory(name));
state = 1;
submit(230, "Login successful");
submit(230, "Login OK");
} else {
submit(530, "Authentication refused.");
return -1;
name = "";
submit(530, "Invalid Credentials.");
}
} else if (cmd == "AUTH") {
submit(502, "Command not implemented");
} else {
submit(332, "Login Required");
submit(332, "Not Logged In!");
return -1;
}
}
return 0;
@@ -291,4 +276,4 @@ private:
int data_fd;
int data_sock;
struct sockaddr_in data_address;
};
};