diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | src/accounthandler.cpp | 64 | ||||
-rw-r--r-- | src/client.cpp | 34 | ||||
-rw-r--r-- | src/connectionhandler.cpp | 2 | ||||
-rw-r--r-- | src/defines.h | 7 | ||||
-rw-r--r-- | src/main.cpp | 1 |
6 files changed, 101 insertions, 14 deletions
@@ -1,3 +1,10 @@ +2005-12-11 Yohann Ferreira <bertram@cegetel.net> + + * src/accounthandler.cpp, src/main.cpp, src/dalstorage.cpp, + src/client.cpp, src/connectionhandler.cpp, src/defines.h: + Added unregistering, checking on character's name and email + length support. Also made some little tweaks. + 2005-12-10 Yohann Ferreira <bertram@cegetel.net> * src/dalstorage.cpp: Fixed the buggy part of getAccount() diff --git a/src/accounthandler.cpp b/src/accounthandler.cpp index fbb5c803..c2e2df5e 100644 --- a/src/accounthandler.cpp +++ b/src/accounthandler.cpp @@ -65,6 +65,9 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) std::cout << username << " is trying to login." << std::endl; if (computer.getAccount() != NULL) { + std::cout << "Already logged in as " << computer.getAccount()->getName() + << "." << std::endl; + std::cout << "Please logout first." << std::endl; result.writeShort(SMSG_LOGIN_ERROR); result.writeShort(LOGIN_UNKNOWN); break; @@ -123,6 +126,13 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) bool emailValid = false; // Testing Email validity + if ( (email.length() < MIN_EMAIL_LENGTH) || (email.length() > MAX_EMAIL_LENGTH)) + { + result.writeShort(SMSG_REGISTER_RESPONSE); + result.writeByte(REGISTER_INVALID_EMAIL); + std::cout << email << ": Email too short or too long." << std::endl; + break; + } if (store.doesEmailAlreadyExists(email)) // Search if Email already exists { result.writeShort(SMSG_REGISTER_RESPONSE); @@ -156,11 +166,11 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) result.writeByte(REGISTER_INVALID_USERNAME); std::cout << username << ": Username too short or too long." << std::endl; } - else if (password.length() < MIN_PASSWORD_LENGTH) + else if ((password.length() < MIN_PASSWORD_LENGTH) || (password.length() > MAX_PASSWORD_LENGTH)) { result.writeShort(SMSG_REGISTER_RESPONSE); result.writeByte(REGISTER_INVALID_PASSWORD); - std::cout << email << ": Password too short." << std::endl; + std::cout << email << ": Password too short or too long." << std::endl; } else if (!emailValid) { @@ -182,6 +192,49 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) } break; + case CMSG_UNREGISTER: + { + std::string username = message.readString(); + std::string password = message.readString(); + std::cout << username << " wants to be deleted from our accounts." << std::endl; + + // see if the account exists + Account *acc = store.getAccount(username); + + if (!acc) { + // account doesn't exist -- send error to client + std::cout << username << ": Account doesn't exist anyway." << std::endl; + + result.writeShort(SMSG_UNREGISTER_RESPONSE); + result.writeByte(UNREGISTER_INVALID_USERNAME); + } else if (acc->getPassword() != password) { + // bad password -- send error to client + std::cout << "Won't delete it : Bad password for " << username << "." << std::endl; + + result.writeShort(SMSG_UNREGISTER_RESPONSE); + result.writeByte(UNREGISTER_INVALID_PASSWORD); + } else { + + // If the account to delete is the current account we're logged in. + // Get out of it in memory. + if (computer.getAccount() != NULL ) + { + if (computer.getAccount()->getName() == username ) + { + computer.setCharacter(NULL); + computer.setAccount(NULL); + } + } + // delete account and associated characters + std::cout << "Farewell " << username << " ..." << std::endl; + store.delAccount(username); + store.flush(); + result.writeShort(SMSG_UNREGISTER_RESPONSE); + result.writeByte(UNREGISTER_OK); + } + } + break; + case CMSG_CHAR_CREATE: { if (computer.getAccount() == NULL) { @@ -202,6 +255,13 @@ void AccountHandler::receiveMessage(NetComputer &computer, MessageIn &message) } std::string name = message.readString(); + if ((name.length() < MIN_CHARACTER_LENGTH) || (name.length() > MAX_CHARACTER_LENGTH)) + { + result.writeShort(SMSG_CHAR_CREATE_RESPONSE); + result.writeByte(CREATE_INVALID_NAME); + std::cout << name << ": Character's name too short or too long." << std::endl; + break; + } //char hairStyle = message.readByte(); //char hairColor = message.readByte(); Genders sex = (Genders)message.readByte(); diff --git a/src/client.cpp b/src/client.cpp index e6142552..c2115ce6 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -49,12 +49,13 @@ int main(int argc, char *argv[]) printf ("0) Quit\n"); printf ("1) Register\n"); - printf ("2) Login\n"); - printf ("3) Chat\n"); - printf ("4) Create character\n"); - printf ("5) Character selection\n"); - printf ("6) Move character\n"); - printf ("7) Equip item\n"); + printf ("2) Unregister\n"); + printf ("3) Login\n"); + printf ("4) Chat\n"); + printf ("5) Create character\n"); + printf ("6) Character selection\n"); + printf ("7) Move character\n"); + printf ("8) Equip item\n"); printf ("9) Ruby expression\n"); printf ("Choose your option: "); std::cin >> answer; @@ -75,6 +76,17 @@ int main(int argc, char *argv[]) break; case 2: + // Unregister (deleting an account) + msg.writeShort(CMSG_UNREGISTER); + printf("Account name: ", line); + std::cin >> line; + msg.writeString(line); + printf("Password: ", line); + std::cin >> line; + msg.writeString(line); + break; + + case 3: // Login msg.writeShort(CMSG_LOGIN); printf("Account name: ", line); @@ -85,7 +97,7 @@ int main(int argc, char *argv[]) msg.writeString(line); break; - case 3: + case 4: // Chat msg.writeShort(CMSG_SAY); printf("\nChat: ", line); @@ -95,7 +107,7 @@ int main(int argc, char *argv[]) responseRequired = false; break; - case 4: + case 5: { // Create character msg.writeShort(CMSG_CHAR_CREATE); @@ -105,7 +117,7 @@ int main(int argc, char *argv[]) msg.writeByte(0); } break; - case 5: + case 6: { // Select character msg.writeShort(CMSG_CHAR_SELECT); @@ -114,7 +126,7 @@ int main(int argc, char *argv[]) msg.writeByte(atoi(line)); } break; - case 6: + case 7: { // Move character long x, y; @@ -130,7 +142,7 @@ int main(int argc, char *argv[]) responseRequired = false; } break; - case 7: + case 8: { // Equip unsigned int itemId; diff --git a/src/connectionhandler.cpp b/src/connectionhandler.cpp index 9a58b882..9ff50619 100644 --- a/src/connectionhandler.cpp +++ b/src/connectionhandler.cpp @@ -138,7 +138,7 @@ ConnectionHandler::startListen(ListenThreadData *ltd) NetComputer *comp = new NetComputer(this, client); clients.push_back(comp); computerConnected(comp); - LOG_INFO(clients.size() << " clients connected") + LOG_INFO(clients.size() << " client(s) connected") } } } diff --git a/src/defines.h b/src/defines.h index 716ec65e..75991a63 100644 --- a/src/defines.h +++ b/src/defines.h @@ -59,8 +59,13 @@ enum { MIN_LOGIN_LENGTH = 4, MAX_LOGIN_LENGTH = 16, MIN_PASSWORD_LENGTH = 4, + MAX_PASSWORD_LENGTH = 25, + MIN_EMAIL_LENGTH = 7, + MAX_EMAIL_LENGTH = 50, // Character related + MIN_CHARACTER_LENGTH = 4, + MAX_CHARACTER_LENGTH = 25, MAX_OF_CHARACTERS = 3, /** Tells the max difference between the * less big stat and the biggest one. @@ -88,6 +93,8 @@ enum { CMSG_ENCRYPTED_LOGIN = 0x0011, SMSG_LOGIN_ERROR = 0x0012, SMSG_LOGIN_CONFIRM = 0x0013, + CMSG_LOGOUT = 0x0014, + SMSG_LOGOUT_CONFIRM = 0x0015, CMSG_CHAR_CREATE = 0x0020, SMSG_CHAR_CREATE_RESPONSE = 0x0021, CMSG_CHAR_DELETE = 0x0022, diff --git a/src/main.cpp b/src/main.cpp index f197b14c..b9cda372 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -228,6 +228,7 @@ int main(int argc, char *argv[]) // Register message handlers connectionHandler.registerHandler(CMSG_LOGIN, accountHandler); connectionHandler.registerHandler(CMSG_REGISTER, accountHandler); + connectionHandler.registerHandler(CMSG_UNREGISTER, accountHandler); connectionHandler.registerHandler(CMSG_CHAR_CREATE, accountHandler); connectionHandler.registerHandler(CMSG_CHAR_SELECT, accountHandler); |