Conversion of MailFileSystem object to MString.

This commit is contained in:
Brad Arant 2022-07-28 08:17:00 -07:00
parent 8e7834a320
commit 09c6163a74
8 changed files with 127 additions and 131 deletions

View File

@ -4,40 +4,38 @@
namespace mail { namespace mail {
MailFileSystem::MailFileSystem(std::string mailPath) : mailPath(mailPath) {} MailFileSystem::MailFileSystem(coreutils::ZString &mailPath) : mailPath(mailPath) {}
bool MailFileSystem::ifMailBoxExists(std::string mailbox) { bool MailFileSystem::ifMailBoxExists(coreutils::ZString &mailbox) {
std::cout << "{" << mailbox << "}" << std::endl; std::cout << "{" << mailbox << "}" << std::endl;
if(stat(getMailBoxPath(mailbox).c_str(), &statbuf) != -1)
if(stat(getMailBoxPath(mailbox).c_str(), &statbuf) != -1) if(S_ISDIR(statbuf.st_mode))
if(S_ISDIR(statbuf.st_mode)) return true;
return true;
return false; return false;
} }
bool MailFileSystem::ifAliasExists(std::string alias) { bool MailFileSystem::ifAliasExists(coreutils::ZString &alias) {
if(stat(getMailBoxPath(alias).c_str(), &statbuf) != -1) if(stat(getMailBoxPath(alias).c_str(), &statbuf) != -1)
if(S_ISREG(statbuf.st_mode)) if(S_ISREG(statbuf.st_mode))
return true; return true;
return false; return false;
} }
std::string MailFileSystem::getMailBoxPath(std::string mailbox) { coreutils::MString MailFileSystem::getMailBoxPath(coreutils::ZString &mailbox) {
coreutils::ZString email(mailbox); mailbox.split("@", 1);
email.split("@", 1); std::cout << mailbox[0] << "-" << mailbox[1] << std::endl;
std::cout << email[0] << "-" << email[1] << std::endl; coreutils::MString path(mailPath + "/" + mailbox[1] + "/" + mailbox[0]);
std::string path = mailPath + "/" + email[1].str() + "/" + email[0].str();
std::cout << "{" << path << "}" << std::endl; std::cout << "{" << path << "}" << std::endl;
return path; return path;
} }
std::vector<std::string> MailFileSystem::getAliasMailboxes(std::string alias) { std::vector<coreutils::MString> MailFileSystem::getAliasMailboxes(coreutils::ZString &alias) {
std::vector<std::string> returnValue; std::vector<coreutils::MString> returnValue;
return returnValue; return returnValue;
} }
std::string MailFileSystem::getMailPath() { coreutils::ZString& MailFileSystem::getMailPath() {
return mailPath; return mailPath;
} }
} }

View File

@ -1,29 +1,29 @@
#ifndef __MailFileSystem_h__ #ifndef __MailFileSystem_h__
# define __MailFileSystem_h__ # define __MailFileSystem_h__
# include "ZString.h" # include "MString.h"
# include <sys/types.h> # include <sys/types.h>
# include <sys/stat.h> # include <sys/stat.h>
# include <unistd.h> # include <unistd.h>
namespace mail { namespace mail {
class MailFileSystem { class MailFileSystem {
public: public:
MailFileSystem(std::string mailPath); MailFileSystem(coreutils::ZString &mailPath);
bool ifMailBoxExists(std::string mailbox); bool ifMailBoxExists(coreutils::ZString &mailbox);
bool ifAliasExists(std::string alias); bool ifAliasExists(coreutils::ZString &alias);
std::string getMailBoxPath(std::string mailbox); coreutils::MString getMailBoxPath(coreutils::ZString &mailbox);
std::vector<std::string> getAliasMailboxes(std::string alias); std::vector<coreutils::MString> getAliasMailboxes(coreutils::ZString &alias);
std::string getMailPath(); coreutils::ZString& getMailPath();
private: private:
std::string mailPath; coreutils::ZString &mailPath;
struct stat statbuf; struct stat statbuf;
}; };
} }
#endif #endif

View File

@ -1,56 +1,56 @@
#include "__SMTP_AUTH.h" #include "__SMTP_AUTH.h"
#include "Base64.h" #include "Base64.h"
#include "SMTPServer.h"
namespace mail { namespace mail {
int __SMTP_AUTH::processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) { int __SMTP_AUTH::processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) {
switch(session.authState) { switch(session.authState) {
case USER_UNKNOWN: case USER_UNKNOWN:
if(request[1].equals("LOGIN")) { if(request[1].equals("LOGIN")) {
session.out << "334 VXNlcm5hbWU6" << CRLF; session.out << "334 VXNlcm5hbWU6" << CRLF;
// setTimer(10.0f); // setTimer(10.0f);
session.authState = USER_QUERY; session.authState = USER_QUERY;
grabInput(session); grabInput(session);
} }
else { else {
session.out << "504 AUTH method not supported." << CRLF; session.out << "504 AUTH method not supported." << CRLF;
} }
return 1; return 1;
case USER_QUERY: case USER_QUERY:
session.userName = request[0].str(); session.userName = request[0];
// setTimer(0.0f); // setTimer(0.0f);
session.out << "334 UGFzc3dvcmQ6" << CRLF; session.out << "334 UGFzc3dvcmQ6" << CRLF;
// setTimer(10.0f); // setTimer(10.0f);
session.authState = USER_SECRET_QUERY; session.authState = USER_SECRET_QUERY;
return 1; return 1;
case USER_SECRET_QUERY: case USER_SECRET_QUERY:
session.password = request[0].str(); session.password = request[0];
// setTimer(0.0f); // setTimer(0.0f);
coreutils::Base64 base64; coreutils::Base64 base64;
if(authLogin(session.userName, session.password)) { if(authLogin(session.userName, session.password, server)) {
session.out << "235 2.7.0 Authentication successful" << CRLF; session.out << "235 2.7.0 Authentication successful" << CRLF;
session.relay = true; session.relay = true;
session.authState = USER_KNOWN; session.authState = USER_KNOWN;
clearGrab(session); clearGrab(session);
} }
else { else {
session.out << "530 Login was unsuccessful." << CRLF; session.out << "530 Login was unsuccessful." << CRLF;
} }
return 1; return 1;
} }
return 0; return 0;
} }
bool __SMTP_AUTH::authLogin(coreutils::ZString userName, coreutils::ZString password) { bool __SMTP_AUTH::authLogin(coreutils::ZString &userName, coreutils::ZString &password, SMTPServer &server) {
// std::string secretPath = server.mailFileSystem.getMailBoxPath(userName) + "/.password"; std::string secretPath = server.mailFileSystem.getMailBoxPath(userName) + "/.password";
// coreutils::File secret(secretPath); coreutils::File secret(secretPath);
// secret.read(); secret.read();
// return secret.asString() == password; return password == secret.asString();
return true;
} }
} }

View File

@ -9,8 +9,8 @@ namespace mail {
public: public:
int processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) override; int processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) override;
bool authLogin(coreutils::ZString userName, coreutils::ZString password); bool authLogin(coreutils::ZString &userName, coreutils::ZString &password, SMTPServer &server);
}; };
} }

View File

@ -5,85 +5,85 @@
#include <iomanip> #include <iomanip>
namespace mail { namespace mail {
int __SMTP_DATA::processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) { int __SMTP_DATA::processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) {
switch(session.mode) { switch(session.mode) {
case WAIT_FOR_DATA: case WAIT_FOR_DATA:
switch(session.state) { switch(session.state) {
case RCPT: case RCPT:
session.out << "354 Enter the mail message terminated by <CRLF>.<CRLF>" << CRLF; session.out << "354 Enter the mail message terminated by <CRLF>.<CRLF>" << CRLF;
session.mailData.str(""); session.mailData.str("");
session.mode = RECEIVE_DATA; session.mode = RECEIVE_DATA;
grabInput(session); grabInput(session);
// session.setTimer(120.0f); // session.setTimer(120.0f);
break; break;
case MAIL: case MAIL:
session.out << "503 Please use RCPT first" << CRLF; session.out << "503 Please use RCPT first" << CRLF;
break; break;
default: default:
session.out << "503 Please use MAIL first" << CRLF; session.out << "503 Please use MAIL first" << CRLF;
break; break;
} }
break; break;
case RECEIVE_DATA: case RECEIVE_DATA:
if(request != ".") if(request != ".")
session.mailData << request << CRLF; session.mailData << request << CRLF;
else { else {
session.mode = WAIT_FOR_DATA; session.mode = WAIT_FOR_DATA;
session.state = READY; session.state = READY;
clearGrab(session); clearGrab(session);
// if(filterMessage(session.mailData)) { // if(filterMessage(session.mailData)) {
if(session.recipientList.size() > 0) { if(session.recipientList.size() > 0) {
if(session.mailData.str().size() > 0) { if(session.mailData.str().size() > 0) {
coreutils::MString ID = queueMail(server, session.sender, session.recipientList, session.mailData); coreutils::MString ID = queueMail(server, session.sender, session.recipientList, session.mailData);
if(ID != "") { if(ID != "") {
coreutils::Log(coreutils::LOG_INFO) << "Queued message " << ID << "."; coreutils::Log(coreutils::LOG_INFO) << "Queued message " << ID << ".";
session.out << "250 OK Queued message " << ID << CRLF; session.out << "250 OK Queued message " << ID << CRLF;
} }
else else
session.out << "550 Mail message too big" << CRLF; session.out << "550 Mail message too big" << CRLF;
} else } else
session.out << "550 Mail message was empty" << CRLF; session.out << "550 Mail message was empty" << CRLF;
} else } else
session.out << "250 OK Queued message " << CRLF; session.out << "250 OK Queued message " << CRLF;
// } else // } else
// data << "550 Message is probably spam" << CRLF; // data << "550 Message is probably spam" << CRLF;
} }
break; break;
} }
return 1; return 1;
} }
coreutils::MString __SMTP_DATA::generateMailFileName() { coreutils::MString __SMTP_DATA::generateMailFileName() {
struct timespec timex; struct timespec timex;
clock_gettime(CLOCK_REALTIME, &timex); clock_gettime(CLOCK_REALTIME, &timex);
std::stringstream temp; std::stringstream temp;
temp << timex.tv_sec << "." << std::setfill('0') << std::setw(9) << timex.tv_nsec; temp << timex.tv_sec << "." << std::setfill('0') << std::setw(9) << timex.tv_nsec;
return coreutils::MString(temp.str()); return coreutils::MString(temp.str());
} }
coreutils::MString __SMTP_DATA::queueMail(SMTPServer &server, coreutils::MString &sender, std::vector<coreutils::MString> &recipientList, std::stringstream &mailData) { coreutils::MString __SMTP_DATA::queueMail(SMTPServer &server, coreutils::MString &sender, std::vector<coreutils::MString> &recipientList, std::stringstream &mailData) {
coreutils::MString fileName(server.mailFileSystem.getMailPath() + "/.queue/" + generateMailFileName().str()); coreutils::MString fileName(server.mailFileSystem.getMailPath() + "/.queue/" + generateMailFileName().str());
coreutils::File mailFile(fileName, O_CREAT | O_WRONLY, 0660); coreutils::File mailFile(fileName, O_CREAT | O_WRONLY, 0660);
mailFile.write(mailData.str()); mailFile.write(mailData.str());
for(coreutils::MString recipient: recipientList) { for(coreutils::MString recipient: recipientList) {
coreutils::MString newName(fileName.write(recipient)); coreutils::MString newName(fileName.write(recipient));
link(fileName.c_str(), newName.c_str()); link(fileName.c_str(), newName.c_str());
} }
unlink(fileName.c_str()); unlink(fileName.c_str());
return fileName; return fileName;
} }
} }

View File

@ -9,7 +9,7 @@ namespace mail {
class __SMTP_DATA : public SMTPCommand { class __SMTP_DATA : public SMTPCommand {
public: public:
int processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) override; int processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) override;
coreutils::MString generateMailFileName(); coreutils::MString generateMailFileName();

View File

@ -1,30 +1,30 @@
#include "__SMTP_MAIL.h" #include "__SMTP_MAIL.h"
namespace mail { namespace mail {
int __SMTP_MAIL::processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) { int __SMTP_MAIL::processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) {
if(request[1].ifNext("FROM:")) { if(request[1].ifNext("FROM:")) {
request[1].skipWhitespace(); request[1].skipWhitespace();
if(request[1].ifNext("<")) { if(request[1].ifNext("<")) {
session.sender = request[1].getTokenExclude(">"); session.sender = request[1].getTokenExclude(">");
if(session.authState = USER_KNOWN) { if(session.authState = USER_KNOWN) {
session.out << "250 OK" << CRLF; session.out << "250 OK" << CRLF;
session.recipientList.clear(); session.recipientList.clear();
session.state = MAIL; session.state = MAIL;
} }
} else } else
session.out << "550 Usage: MAIL FROM:<email-address>" << CRLF; session.out << "550 Usage: MAIL FROM:<email-address>" << CRLF;
} else } else
session.out << "550 Usage: MAIL FROM:<email-address>" << CRLF; session.out << "550 Usage: MAIL FROM:<email-address>" << CRLF;
return 1; return 1;
} }
std::string domainOnly(std::string email) { std::string domainOnly(std::string email) {
coreutils::ZString split(email); coreutils::ZString split(email);
split.split("@"); split.split("@");
return split[1].str(); return split[1].str();
} }
} }

View File

@ -4,15 +4,13 @@
# include "SMTPCommand.h" # include "SMTPCommand.h"
namespace mail { namespace mail {
// class SMTPServer;
class __SMTP_MAIL : public SMTPCommand { class __SMTP_MAIL : public SMTPCommand {
public: public:
int processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) override; int processCommand(coreutils::ZString &request, SMTPSession &session, SMTPServer &server) override;
}; };
} }
#endif #endif