Login fehler

This commit is contained in:
Patrik Karasek 2023-11-18 19:26:59 +01:00
parent 1d9bf5d298
commit e8f7d8e55d
2 changed files with 154 additions and 122 deletions

View File

@ -108,6 +108,10 @@ int main(int argc, char **argv)
} }
*/ */
bool isLoggedIn = false;
std::string loggedInUsername;
std::string loggedInPassword;
do { do {
printf("Please specify a command (SEND, LIST, READ, DEL, QUIT, LOGIN): "); printf("Please specify a command (SEND, LIST, READ, DEL, QUIT, LOGIN): ");
if (fgets(buffer, BUF - 1, stdin) != NULL) if (fgets(buffer, BUF - 1, stdin) != NULL)
@ -136,56 +140,72 @@ int main(int argc, char **argv)
switch (cmd) { switch (cmd) {
case LOGIN: case LOGIN:
char ldapUsername[BUF], ldapPassword[BUF]; if (!isLoggedIn) {
printf("LDAP Username: "); printf("LDAP Username: ");
fgets(ldapUsername, BUF - 1, stdin); fgets(buffer, BUF - 1, stdin);
printf("Password: "); loggedInUsername = buffer;
fgets(ldapPassword, BUF - 1, stdin); loggedInUsername.pop_back();
snprintf(buffer, sizeof(buffer), "LOGIN\n%s%s", ldapUsername, ldapPassword);
break; printf("Password: ");
fgets(buffer, BUF - 1, stdin);
loggedInPassword = buffer;
loggedInPassword.pop_back();
snprintf(buffer, sizeof(buffer), "LOGIN\n%s\n%s\n", loggedInUsername.c_str(), loggedInPassword.c_str());
isLoggedIn = true;
} else {
printf("Already logged in as %s\n", loggedInUsername.c_str());
}
break;
case SEND: case SEND:
char sender[BUF], receiver[BUF], subject[81], message[BUF * 10]; if (isLoggedIn) {
printf("Sender: "); char receiver[BUF], subject[81], message[BUF * 10];
fgets(sender, BUF - 1, stdin); printf("Receiver: ");
printf("Receiver: "); fgets(receiver, BUF - 1, stdin);
fgets(receiver, BUF - 1, stdin); printf("Subject: ");
printf("Subject: "); fgets(subject, 80, stdin);
fgets(subject, 80, stdin); printf("Message (send by typing \".\" in a seperate line): ");
printf("Message (send by typing \".\" in a seperate line): "); char line[BUF];
char line[BUF]; message[0] = '\0';
message[0] = '\0'; while (true) {
while (true) fgets(line, BUF - 1, stdin);
{ if (strcmp(line, ".\n") == 0)
fgets(line, BUF - 1, stdin); break;
if (strcmp(line, ".\n") == 0) strcat(message, line);
break; }
strcat(message, line); snprintf(buffer, sizeof(buffer), "SEND\n%s\n%s\n%s\n%s.\n", loggedInUsername.c_str(), receiver, subject, message);
} } else {
snprintf(buffer, sizeof(buffer), "SEND\n%s%s%s%s.\n", sender, receiver, subject, message); printf("Please login first.\n");
break; }
break;
case LIST: case LIST:
char username[BUF]; if (isLoggedIn) {
printf("Username: "); snprintf(buffer, sizeof(buffer), "LIST\n%s", loggedInUsername.c_str());
fgets(username, BUF - 1, stdin); } else {
snprintf(buffer, sizeof(buffer), "LIST\n%s", username); printf("Please login first.\n");
break; }
break;
case READ: case READ:
printf("Username: "); if (isLoggedIn) {
fgets(username, BUF - 1, stdin); printf("Message Number: ");
printf("Message Number: "); fgets(msgNum, 9, stdin);
fgets(msgNum, 9, stdin); snprintf(buffer, sizeof(buffer), "READ\n%s\n%s", loggedInUsername.c_str(), msgNum);
snprintf(buffer, sizeof(buffer), "READ\n%s%s", username, msgNum); } else {
break; printf("Please login first.\n");
}
break;
case DEL: case DEL:
printf("Username: "); if (isLoggedIn) {
fgets(username, BUF - 1, stdin); printf("Message Number: ");
printf("Message Number: "); fgets(msgNum, 9, stdin);
fgets(msgNum, 9, stdin); snprintf(buffer, sizeof(buffer), "DEL\n%s\n%s", loggedInUsername.c_str(), msgNum);
snprintf(buffer, sizeof(buffer), "DEL\n%s%s", username, msgNum); } else {
break; printf("Please login first.\n");
}
break;
case QUIT: case QUIT:
// will break out of loop before quit
break; break;
} }

View File

@ -72,10 +72,11 @@ void *clientCommunication(void *data);
void signalHandler(int sig); void signalHandler(int sig);
std::string cmdLOGIN(std::vector<std::string>& received); std::string cmdLOGIN(std::vector<std::string>& received);
std::string cmdSEND(std::vector<std::string>& received); std::string cmdSEND(std::vector<std::string>& received, const std::string& loggedInUsername);
std::string cmdLIST(std::vector<std::string>& received); std::string cmdLIST(std::vector<std::string>& received, const std::string& loggedInUsername);
std::string cmdREAD(std::vector<std::string>& received); std::string cmdREAD(std::vector<std::string>& received, const std::string& loggedInUsername);
std::string cmdDEL(std::vector<std::string>& received); std::string cmdDEL(std::vector<std::string>& received, const std::string& loggedInUsername);
inline void exiting(); inline void exiting();
inline std::string read_file(std::string_view path); inline std::string read_file(std::string_view path);
@ -259,6 +260,11 @@ void *clientCommunication(void *data)
lines.push_back(line); lines.push_back(line);
} }
std::vector<std::string> received;
while (std::getline(ss, line, '\n')) {
received.push_back(line);
}
enum commands cmd; enum commands cmd;
@ -271,26 +277,27 @@ void *clientCommunication(void *data)
else if (iequals(lines.at(0), "QUIT")) break; else if (iequals(lines.at(0), "QUIT")) break;
else continue; // TODO: error message else continue; // TODO: error message
std::string loggedInUsername;
switch (cmd) { switch (cmd) {
case LOGIN: case LOGIN:
response = cmdLOGIN(lines); loggedInUsername = cmdLOGIN(received);
break; break;
case SEND: case SEND:
if (lines.size() < 5 || lines.back().compare(".") != 0) { if (received.size() < 5 || received.back().compare(".") != 0) {
incomplete_message = buffer; incomplete_message = buffer;
continue; // issues if command end is never received continue;
} }
response = cmdSEND(received, loggedInUsername);
response = cmdSEND(lines); break;
break;
case LIST: case LIST:
response = cmdLIST(lines); response = cmdLIST(received, loggedInUsername);
break; break;
case READ: case READ:
response = cmdREAD(lines); response = cmdREAD(received, loggedInUsername);
break; break;
case DEL: case DEL:
response = cmdDEL(lines); response = cmdDEL(received, loggedInUsername);
break; break;
case QUIT: case QUIT:
break; break;
@ -434,88 +441,93 @@ std::string cmdLOGIN(std::vector<std::string>& received)
return "OK\n"; return "OK\n";
} }
std::string cmdSEND(std::vector<std::string>& received)
{
// TODO: change sender to be implicit from currently logged in; replace received.at(1) and move all other received one forward
if (received.at(3).length() > 80)
return "ERR\n";
if (received.size() > 5) { std::string cmdSEND(std::vector<std::string>& received, const std::string& loggedInUsername) {
for (std::vector<std::string>::iterator it = received.begin() + 5; it != received.end() && *it != "."; it++) {
received.at(4).append("\n").append(*it);
}
}
user_handler::getInstance().getOrCreateUser(received.at(2))->addMail( if (loggedInUsername.empty() || received.size() < 4) {
new struct mail(saveToFile(user_handler::getInstance().getSpoolDir()/"messages", received.at(4)), received.at(3), received.at(1)) return "ERR\n";
); }
std::string receiver = received.at(1);
std::string subject = received.at(2);
std::string message = received.at(3);
if (subject.length() > 80) {
return "ERR\n";
}
user_handler::getInstance().getOrCreateUser(receiver)->addMail(
new struct mail(saveToFile(user_handler::getInstance().getSpoolDir()/"messages", message), subject, loggedInUsername)
);
return "OK\n"; // TODO: error handling return "OK\n"; // TODO: error handling
} }
std::string cmdLIST(std::vector<std::string>& received) std::string cmdLIST(std::vector<std::string>& received, const std::string& loggedInUsername) {
{ if (loggedInUsername.empty()) {
// TODO: change user to be implicit from currently logged in; replace received.at(1) return "ERR\n";
maillist inbox; }
user* user;
if (received.size() < 2 || (user = user_handler::getInstance().getUser(received.at(1))) == nullptr) user* currentUser = user_handler::getInstance().getUser(loggedInUsername);
return "0\n"; if (currentUser == nullptr) {
return "ERR\n";
inbox = user->getMails(); }
std::string response = std::to_string(std::count_if(inbox.begin(), inbox.end(), [](auto& mail) { return !mail->deleted; })) + "\n";
for ( auto mail : inbox ) {
if (mail->deleted)
continue;
response.append(std::to_string(mail->id)).append(": ").append(mail->subject).append("\n");
}
return response; maillist inbox = currentUser->getMails();
std::string response = std::to_string(std::count_if(inbox.begin(), inbox.end(), [](auto& mail) { return !mail->deleted; })) + "\n";
for (auto& mail : inbox) {
if (!mail->deleted) {
response.append(std::to_string(mail->id)).append(": ").append(mail->subject).append("\n");
}
}
return response;
} }
std::string cmdREAD(std::vector<std::string>& received) std::string cmdREAD(std::vector<std::string>& received, const std::string& loggedInUsername) {
{ if (loggedInUsername.empty() || received.size() < 2) {
// TODO: change user to be implicit from currently logged in; replace received.at(1) and move received.at(2) one forward return "ERR\n";
std::string response = "OK\n"; }
user* user; char* p;
mail* mail; long mailId = strtol(received.at(1).c_str(), &p, 10);
if (*p != 0) {
return "ERR\n";
}
char* p; user* currentUser = user_handler::getInstance().getUser(loggedInUsername);
if (currentUser == nullptr) {
return "ERR\n";
}
if(received.size() < 3 || mail* selectedMail = currentUser->getMail(mailId);
!isInteger(received.at(2)) || if (selectedMail == nullptr || selectedMail->deleted) {
(user = user_handler::getInstance().getUser(received.at(1))) == nullptr || return "ERR\n";
(mail = user->getMail(strtoul(received.at(2).c_str(), &p, 10))) == nullptr || }
mail->deleted)
return "ERR\n";
try { std::string mailContent = read_file((user_handler::getInstance().getSpoolDir() / "messages" / selectedMail->filename).string());
std::string path_str = user_handler::getInstance().getSpoolDir()/"messages"/mail->filename; return "OK\n" + mailContent;
std::unique_lock<std::mutex> lock(mail->m_file);
response.append(read_file(path_str)).append("\n");
}
catch (...) { // TODO: more specific error handling - then again, it will respond with ERR either way
return "ERR\n";
}
return response;
} }
std::string cmdDEL(std::vector<std::string>& received) std::string cmdDEL(std::vector<std::string>& received, const std::string& loggedInUsername) {
{ if (loggedInUsername.empty() || received.size() < 2) {
// TODO: change user to be implicit from currently logged in; replace received.at(1) and move received.at(2) one forward return "ERR\n";
user* user; }
char* p; char* p;
long mailId = strtol(received.at(1).c_str(), &p, 10);
if (*p != 0) {
return "ERR\n";
}
if(received.size() < 3 || user* currentUser = user_handler::getInstance().getUser(loggedInUsername);
!isInteger(received.at(2)) || if (currentUser == nullptr) {
(user = user_handler::getInstance().getUser(received.at(1))) == nullptr || return "ERR\n";
(user->delMail(strtoul(received.at(2).c_str(), &p, 10))) == false) }
return "ERR\n";
return "OK\n"; bool deleteResult = currentUser->delMail(mailId);
return deleteResult ? "OK\n" : "ERR\n";
} }
// https://stackoverflow.com/a/116220 // https://stackoverflow.com/a/116220