Login fehler
This commit is contained in:
parent
1d9bf5d298
commit
e8f7d8e55d
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
maillist inbox = currentUser->getMails();
|
||||||
std::string response = std::to_string(std::count_if(inbox.begin(), inbox.end(), [](auto& mail) { return !mail->deleted; })) + "\n";
|
std::string response = std::to_string(std::count_if(inbox.begin(), inbox.end(), [](auto& mail) { return !mail->deleted; })) + "\n";
|
||||||
for ( auto mail : inbox ) {
|
for (auto& mail : inbox) {
|
||||||
if (mail->deleted)
|
if (!mail->deleted) {
|
||||||
continue;
|
response.append(std::to_string(mail->id)).append(": ").append(mail->subject).append("\n");
|
||||||
response.append(std::to_string(mail->id)).append(": ").append(mail->subject).append("\n");
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return response;
|
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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user