Inheritance: ISL.Server.Network.NetComputer
Exemple #1
0
        void handleLoginRandTriggerMessage(AccountClient client, MessageIn msg)
        {
            string salt=getRandomString(4);
            string username=msg.readString();

            ISL.Server.Account.Account acc=Program.storage.getAccount(username);

            if(acc!=null)
            {
                acc.setRandomSalt(salt);
                mPendingAccounts.Add(acc);
            }

            MessageOut reply=new MessageOut(Protocol.APMSG_LOGIN_RNDTRGR_RESPONSE);
            reply.writeString(salt);
            client.send(reply);
        }
Exemple #2
0
        void handleEmailChangeMessage(AccountClient client, MessageIn msg)
        {
            MessageOut reply=new MessageOut(Protocol.APMSG_EMAIL_CHANGE_RESPONSE);

            //Account acc = client.getAccount();
            //if (!acc)
            //{
            //    reply.writeInt8(ERRMSG_NO_LOGIN);
            //    client.send(reply);
            //    return;
            //}

            //const std::string email = msg.readString();
            //const std::string emailHash = sha256(email);

            //if (!stringFilter.isEmailValid(email))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //}
            //else if (stringFilter.findDoubleQuotes(email))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //}
            //else if (storage.doesEmailAddressExist(emailHash))
            //{
            //    reply.writeInt8(ERRMSG_EMAIL_ALREADY_EXISTS);
            //}
            //else
            //{
            //    acc.setEmail(emailHash);
            //    // Keep the database up to date otherwise we will go out of sync
            //    storage.flush(acc);
            //    reply.writeInt8(ERRMSG_OK);
            //}
            //client.send(reply);
        }
Exemple #3
0
        void handleLoginMessage(AccountClient client, MessageIn msg)
        {
            MessageOut reply=new MessageOut(Protocol.APMSG_LOGIN_RESPONSE);

            //Überprüfung ob es sich um einen Login Request handelt
            if(client.status!=AccountClientStatus.CLIENT_LOGIN)
            {
                reply.writeInt8((int)ErrorMessage.ERRMSG_FAILURE);
                client.send(reply);
                return;
            }

            int clientVersion=msg.readInt32();

            if(clientVersion<ManaServ.PROTOCOL_VERSION)
            {
                reply.writeInt8((int)Login.LOGIN_INVALID_VERSION);
                client.send(reply);
                return;
            }

            // Check whether the last login attempt for this IP is still too fresh
            IPAddress address=client.getIP();
            DateTime now=DateTime.Now;

            if(mLastLoginAttemptForIP.ContainsKey(address)) //TODO Schauen ob der Vergleich gegen das IPAdress Objekt funktioniert
            {
                DateTime lastAttempt=mLastLoginAttemptForIP[address];
                lastAttempt.AddSeconds(1); //TODO schauen ob hier im Original wirklich Sekunden gemeint sind

                if(now<lastAttempt)
                {
                    reply.writeInt8((int)Login.LOGIN_INVALID_TIME);
                    client.send(reply);
                    return;
                }
            }

            mLastLoginAttemptForIP[address]=now;

            string username=msg.readString();
            string password=msg.readString();

            if(Program.stringFilter.findDoubleQuotes(username))
            {
                reply.writeInt8((int)ErrorMessage.ERRMSG_INVALID_ARGUMENT);
                client.send(reply);
                return;
            }

            uint maxClients=(uint)Configuration.getValue("net_maxClients", 1000);

            if(getClientCount()>=maxClients)
            {
                reply.writeInt8((int)ErrorMessage.ERRMSG_SERVER_FULL);
                client.send(reply);
                return;
            }

            // Check if the account exists
            ISL.Server.Account.Account acc=null;

            foreach(ISL.Server.Account.Account tmp in mPendingAccounts)
            {
                if(tmp.getName()==username)
                {
                    acc=tmp;
                    break;
                }
            }

            mPendingAccounts.Remove(acc);

            //TODO Überprüfen ob SHA256 das gewünschte Ergebniss liefert
            if(acc!=null)
            {
                if(SHA256.HashString(acc.getPassword()+acc.getRandomSalt())!=password)
                {
                    reply.writeInt8((int)ErrorMessage.ERRMSG_INVALID_ARGUMENT);
                    client.send(reply);
                    //delete acc;
                    return;
                }
            }

            if(acc.getLevel()==(int)AccessLevel.AL_BANNED)
            {
                reply.writeInt8((int)Login.LOGIN_BANNED);
                client.send(reply);
                //delete acc;
                return;
            }

            // The client successfully logged in...

            // Set lastLogin date of the account.
            DateTime login=DateTime.Now;
            acc.setLastLogin(login);
            Program.storage.updateLastLogin(acc);

            // Associate account with connection.
            client.setAccount(acc);
            client.status=AccountClientStatus.CLIENT_CONNECTED;

            reply.writeInt8((int)ErrorMessage.ERRMSG_OK);
            addServerInfo(reply);
            client.send(reply); // Acknowledge login

            // Return information about available characters
            Dictionary<uint, Character> chars=acc.getCharacters();

            // Send characters list
            foreach(ISL.Server.Account.Character character in chars.Values)
            {
                sendCharacterData(client, character);
            }
        }
Exemple #4
0
        void handleCharacterSelectMessage(AccountClient client, MessageIn msg)
        {
            //MessageOut reply(APMSG_CHAR_SELECT_RESPONSE);

            //Account *acc = client.getAccount();
            //if (!acc)
            //{
            //    reply.writeInt8(ERRMSG_NO_LOGIN);
            //    client.send(reply);
            //    return; // not logged in
            //}

            //int slot = msg.readInt8();
            //Characters &chars = acc.getCharacters();

            //if (chars.find(slot) == chars.end())
            //{
            //    // Invalid char selection
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //    client.send(reply);
            //    return;
            //}

            //Character *selectedChar = chars[slot];

            //std::string address;
            //int port;
            //if (!GameServerHandler::getGameServerFromMap
            //        (selectedChar.getMapId(), address, port))
            //{
            //    LOG_ERROR("Character Selection: No game server for map #"<<selectedChar.getMapId());
            //    reply.writeInt8(ERRMSG_FAILURE);
            //    client.send(reply);
            //    return;
            //}

            //reply.writeInt8(ERRMSG_OK);

            //LOG_DEBUG(selectedChar.getName() << " is trying to enter the servers.");

            //std::string magic_token(utils::getMagicToken());
            //reply.writeString(magic_token, MAGIC_TOKEN_LENGTH);
            //reply.writeString(address);
            //reply.writeInt16(port);

            //// Give address and port for the chat server
            //reply.writeString(Configuration::getValue("net_chatHost",
            //                                          "localhost"));

            //// When the chatListenToClientPort is set, we use it.
            //// Otherwise, we use the accountListenToClientPort + 2 if the option is set.
            //// If neither, the DEFAULT_SERVER_PORT + 2 is used.
            //const int alternativePort =
            //    Configuration::getValue("net_accountListenToClientPort",
            //                            DEFAULT_SERVER_PORT) + 2;
            //reply.writeInt16(Configuration::getValue("net_chatListenToClientPort",
            //                                         alternativePort));

            //GameServerHandler::registerClient(magic_token, selectedChar);
            //registerChatClient(magic_token, selectedChar.getName(), acc.getLevel());

            //client.send(reply);

            //// log transaction
            //Transaction trans;
            //trans.mCharacterId = selectedChar.getDatabaseID();
            //trans.mAction = TRANS_CHAR_SELECTED;
            //storage.addTransaction(trans);
        }
Exemple #5
0
        void handleCharacterSelectMessage(AccountClient client, MessageIn msg)
        {
            MessageOut reply=new MessageOut(Protocol.APMSG_CHAR_SELECT_RESPONSE);

            ISL.Server.Account.Account acc=client.getAccount();

            if(acc==null)
            {
                reply.writeInt8((int)ErrorMessage.ERRMSG_NO_LOGIN);
                client.send(reply);
                return; // not logged in
            }

            int slot=msg.readInt8();
            Dictionary<uint, Character> chars=acc.getCharacters();

            if(chars.ContainsKey((uint)slot)==false)
            {
                // Invalid char selection
                reply.writeInt8((int)ErrorMessage.ERRMSG_INVALID_ARGUMENT);
                client.send(reply);
                return;
            }

            Character selectedChar=chars[(uint)slot];

            string address;
            int port;

            int charMapId=selectedChar.getMapId();
            bool gameServerHasMap=GameServerHandler.getGameServerFromMap(charMapId, out address, out port);

            if(!gameServerHasMap)
            {
                Logger.Write(LogLevel.Error, "Character Selection: No game server for map #{0}", selectedChar.getMapId());
                reply.writeInt8((int)ErrorMessage.ERRMSG_FAILURE);
                client.send(reply);
                return;
            }

            reply.writeInt8((int)ErrorMessage.ERRMSG_OK);

            Logger.Write(LogLevel.Debug, "{0} is trying to enter the servers.", selectedChar.getName());

            string magic_token=Various.GetUniqueID();
            reply.writeString(magic_token);
            reply.writeString(address);
            reply.writeInt16(port);

            // Give address and port for the chat server
            reply.writeString(Configuration.getValue("net_chatHost", "localhost"));

            // When the chatListenToClientPort is set, we use it.
            // Otherwise, we use the accountListenToClientPort + 2 if the option is set.
            // If neither, the DEFAULT_SERVER_PORT + 2 is used.
            int alternativePort=Configuration.getValue("net_accountListenToClientPort", Configuration.DEFAULT_SERVER_PORT)+2;
            reply.writeInt16(Configuration.getValue("net_chatListenToClientPort", alternativePort));

            GameServerHandler.registerClient(magic_token, selectedChar); //TODO Überprüfen ob diese beiden Funktionen funktionieren
            ChatHandler.registerChatClient(magic_token, selectedChar.getName(), acc.getLevel());

            client.send(reply);

            // log transaction
            Transaction trans=new Transaction();
            trans.mCharacterId=(uint)selectedChar.getDatabaseID();
            trans.mAction=(uint)TransactionMembers.TRANS_CHAR_SELECTED;

            Program.storage.addTransaction(trans);
        }
Exemple #6
0
        void handleReconnectMessage(AccountClient client, MessageIn msg)
        {
            //if (client.status != CLIENT_LOGIN)
            //{
            //    LOG_DEBUG("Account tried to reconnect, but was already logged in "
            //              "or queued.");
            //    return;
            //}

            //std::string magic_token = msg.readString(MAGIC_TOKEN_LENGTH);
            //client.status = CLIENT_QUEUED; // Before the addPendingClient
            //mTokenCollector.addPendingClient(magic_token, &client);
        }
Exemple #7
0
 void handleRequestRegisterInfoMessage(AccountClient client, MessageIn msg)
 {
     //LOG_INFO("AccountHandler::handleRequestRegisterInfoMessage");
     //MessageOut reply(APMSG_REGISTER_INFO_RESPONSE);
     //if (!Configuration::getBoolValue("account_allowRegister", true))
     //{
     //    reply.writeInt8(false);
     //    reply.writeString(Configuration::getValue(
     //                          "account_denyRegisterReason", std::string()));
     //}
     //else
     //{
     //    reply.writeInt8(true);
     //    reply.writeInt8(mMinNameLength);
     //    reply.writeInt8(mMaxNameLength);
     //    reply.writeString("http://www.server.example/captcha.png");
     //    reply.writeString("<instructions for solving captcha>");
     //}
     //client.send(reply);
 }
Exemple #8
0
        void tokenMatched(AccountClient client, int accountID)
        {
            MessageOut reply=new MessageOut(Protocol.APMSG_RECONNECT_RESPONSE);

            //Associate account with connection.
            ISL.Server.Account.Account acc=Program.storage.getAccount(accountID);
            client.setAccount(acc);
            client.status=AccountClientStatus.CLIENT_CONNECTED;

            reply.writeInt8((int)ErrorMessage.ERRMSG_OK);
            client.send(reply);

            // Return information about available characters
            Dictionary<uint, Character> chars=acc.getCharacters();

            // Send characters list
            foreach(Character character in chars.Values)
            {
                sendCharacterData(client, character);
            }
        }
Exemple #9
0
 //TODO Captcha Unterstüzung evt ganz raus?
 static bool checkCaptcha(AccountClient client, string captcha)
 {
     // TODO
     return true;
 }
Exemple #10
0
        void sendCharacterData(AccountClient client, Character ch)
        {
            MessageOut charInfo=new MessageOut(Protocol.APMSG_CHAR_INFO);

            //charInfo.writeInt8(ch.getCharacterSlot());
            //charInfo.writeString(ch.getName());
            //charInfo.writeInt8(ch.getGender());
            //charInfo.writeInt8(ch.getHairStyle());
            //charInfo.writeInt8(ch.getHairColor());
            //charInfo.writeInt16(ch.getLevel());
            //charInfo.writeInt16(ch.getCharacterPoints());
            //charInfo.writeInt16(ch.getCorrectionPoints());

            //for (AttributeMap::const_iterator it = ch.mAttributes.begin(),
            //                                  it_end = ch.mAttributes.end();
            //    it != it_end;
            //    ++it)
            //{
            //    // {id, base value in 256ths, modified value in 256ths }*
            //    charInfo.writeInt32(it.first);
            //    charInfo.writeInt32((int) (it.second.base * 256));
            //    charInfo.writeInt32((int) (it.second.modified * 256));
            //}

            //client.send(charInfo);
        }
Exemple #11
0
        void sendCharacterData(AccountClient client, Character ch)
        {
            MessageOut charInfo=new MessageOut(Protocol.APMSG_CHAR_INFO);

            charInfo.writeInt8((int)ch.getCharacterSlot());
            charInfo.writeString(ch.getName());
            charInfo.writeInt8(ch.getGender());
            charInfo.writeInt8(ch.getHairStyle());
            charInfo.writeInt8(ch.getHairColor());
            charInfo.writeInt16(ch.getLevel());
            charInfo.writeInt16(ch.getCharacterPoints());
            charInfo.writeInt16(ch.getCorrectionPoints());

            foreach(KeyValuePair<uint, AttributeValue> at in ch.mAttributes)
            {
                charInfo.writeInt32((int)at.Key);
                charInfo.writeInt32((int)(at.Value.@base*256));
                charInfo.writeInt32((int)(at.Value.modified*256));
            }

            client.send(charInfo);
        }
Exemple #12
0
        void handleRegisterMessage(AccountClient client, MessageIn msg)
        {
            //int clientVersion = msg.readInt32();
            //std::string username = msg.readString();
            //std::string password = msg.readString();
            //std::string email = msg.readString();
            //std::string captcha = msg.readString();

            //MessageOut reply(APMSG_REGISTER_RESPONSE);

            //if (client.status != CLIENT_LOGIN)
            //{
            //    reply.writeInt8(ERRMSG_FAILURE);
            //}
            //else if (!mRegistrationAllowed)
            //{
            //    reply.writeInt8(ERRMSG_FAILURE);
            //}
            //else if (clientVersion < PROTOCOL_VERSION)
            //{
            //    reply.writeInt8(REGISTER_INVALID_VERSION);
            //}
            //else if (stringFilter.findDoubleQuotes(username)
            //         || stringFilter.findDoubleQuotes(email)
            //         || username.length() < mMinNameLength
            //         || username.length() > mMaxNameLength
            //         || !stringFilter.isEmailValid(email)
            //         || !stringFilter.filterContent(username))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //}
            //else if (storage.doesUserNameExist(username))
            //{
            //    reply.writeInt8(REGISTER_EXISTS_USERNAME);
            //}
            //else if (storage.doesEmailAddressExist(sha256(email)))
            //{
            //    reply.writeInt8(REGISTER_EXISTS_EMAIL);
            //}
            //else if (!checkCaptcha(client, captcha))
            //{
            //    reply.writeInt8(REGISTER_CAPTCHA_WRONG);
            //}
            //else
            //{
            //    Account *acc = new Account;
            //    acc.setName(username);
            //    acc.setPassword(sha256(password));
            //    // We hash email server-side for additional privacy
            //    // we ask for it again when we need it and verify it
            //    // through comparing it with the hash.
            //    acc.setEmail(sha256(email));
            //    acc.setLevel(AL_PLAYER);

            //    // Set the date and time of the account registration, and the last login
            //    time_t regdate;
            //    time(&regdate);
            //    acc.setRegistrationDate(regdate);
            //    acc.setLastLogin(regdate);

            //    storage.addAccount(acc);
            //    reply.writeInt8(ERRMSG_OK);
            //    addServerInfo(&reply);

            //    // Associate account with connection
            //    client.setAccount(acc);
            //    client.status = CLIENT_CONNECTED;
            //}

            //client.send(reply);
        }
Exemple #13
0
        void handleLoginRandTriggerMessage(AccountClient client, MessageIn msg)
        {
            //std::string salt = getRandomString(4);
            //std::string username = msg.readString();

            //if (Account *acc = storage.getAccount(username))
            //{
            //    acc.setRandomSalt(salt);
            //    mPendingAccounts.push_back(acc);
            //}
            //MessageOut reply(APMSG_LOGIN_RNDTRGR_RESPONSE);
            //reply.writeString(salt);
            //client.send(reply);
        }
Exemple #14
0
        void handleLoginMessage(AccountClient client, MessageIn msg)
        {
            //MessageOut reply(APMSG_LOGIN_RESPONSE);

            //if (client.status != CLIENT_LOGIN)
            //{
            //    reply.writeInt8(ERRMSG_FAILURE);
            //    client.send(reply);
            //    return;
            //}

            //const int clientVersion = msg.readInt32();

            //if (clientVersion < PROTOCOL_VERSION)
            //{
            //    reply.writeInt8(LOGIN_INVALID_VERSION);
            //    client.send(reply);
            //    return;
            //}

            //// Check whether the last login attempt for this IP is still too fresh
            //const int address = client.getIP();
            //const time_t now = time(NULL);
            //IPsToTime::const_iterator it = mLastLoginAttemptForIP.find(address);
            //if (it != mLastLoginAttemptForIP.end())
            //{
            //    const time_t lastAttempt = it.second;
            //    if (now < lastAttempt + 1)
            //    {
            //        reply.writeInt8(LOGIN_INVALID_TIME);
            //        client.send(reply);
            //        return;
            //    }
            //}
            //mLastLoginAttemptForIP[address] = now;

            //const std::string username = msg.readString();
            //const std::string password = msg.readString();

            //if (stringFilter.findDoubleQuotes(username))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //    client.send(reply);
            //    return;
            //}

            //const unsigned maxClients =
            //        (unsigned) Configuration::getValue("net_maxClients", 1000);

            //if (getClientCount() >= maxClients)
            //{
            //    reply.writeInt8(ERRMSG_SERVER_FULL);
            //    client.send(reply);
            //    return;
            //}

            //// Check if the account exists
            //Account *acc = 0;
            //std::list<Account*>::iterator ita;
            //for ( ita = mPendingAccounts.begin() ; ita != mPendingAccounts.end(); ita++ )
            //    if ((*ita).getName() == username)
            //        acc = *ita;
            //mPendingAccounts.remove(acc);

            //if (!acc || sha256(acc.getPassword() + acc.getRandomSalt()) != password)
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //    client.send(reply);
            //    delete acc;
            //    return;
            //}

            //if (acc.getLevel() == AL_BANNED)
            //{
            //    reply.writeInt8(LOGIN_BANNED);
            //    client.send(reply);
            //    delete acc;
            //    return;
            //}

            //// The client successfully logged in...

            //// Set lastLogin date of the account.
            //time_t login;
            //time(&login);
            //acc.setLastLogin(login);
            //storage.updateLastLogin(acc);

            //// Associate account with connection.
            //client.setAccount(acc);
            //client.status = CLIENT_CONNECTED;

            //reply.writeInt8(ERRMSG_OK);
            //addServerInfo(&reply);
            //client.send(reply); // Acknowledge login

            //// Return information about available characters
            //Characters &chars = acc.getCharacters();

            //// Send characters list
            //for (Characters::const_iterator i = chars.begin(), i_end = chars.end();
            //     i != i_end; ++i)
            //    sendCharacterData(client, *(*i).second);
        }
Exemple #15
0
        void handleLogoutMessage(AccountClient client)
        {
            MessageOut reply=new MessageOut(Protocol.APMSG_LOGOUT_RESPONSE);

            //if (client.status == CLIENT_LOGIN)
            //{
            //    reply.writeInt8(ERRMSG_NO_LOGIN);
            //}
            //else if (client.status == CLIENT_CONNECTED)
            //{
            //    client.unsetAccount();
            //    client.status = CLIENT_LOGIN;
            //    reply.writeInt8(ERRMSG_OK);
            //}
            //else if (client.status == CLIENT_QUEUED)
            //{
            //    // Delete it from the pendingClient list
            //    mTokenCollector.deletePendingClient(&client);
            //    client.status = CLIENT_LOGIN;
            //    reply.writeInt8(ERRMSG_OK);
            //}
            //client.send(reply);
        }
Exemple #16
0
 void deletePendingClient(AccountClient client)
 {
     MessageOut msg=new MessageOut(Protocol.APMSG_RECONNECT_RESPONSE);
     msg.writeInt8((int)ErrorMessage.ERRMSG_TIME_OUT);
     client.disconnect(msg);
     // The client will be deleted when the disconnect event is processed
 }
Exemple #17
0
        void handlePasswordChangeMessage(AccountClient client, MessageIn msg)
        {
            //std::string oldPassword = sha256(msg.readString());
            //std::string newPassword = sha256(msg.readString());

            //MessageOut reply(APMSG_PASSWORD_CHANGE_RESPONSE);

            //Account *acc = client.getAccount();
            //if (!acc)
            //{
            //    reply.writeInt8(ERRMSG_NO_LOGIN);
            //}
            //else if (stringFilter.findDoubleQuotes(newPassword))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //}
            //else if (oldPassword != acc.getPassword())
            //{
            //    reply.writeInt8(ERRMSG_FAILURE);
            //}
            //else
            //{
            //    acc.setPassword(newPassword);
            //    // Keep the database up to date otherwise we will go out of sync
            //    storage.flush(acc);
            //    reply.writeInt8(ERRMSG_OK);
            //}

            //client.send(reply);
        }
Exemple #18
0
        void handleCharacterCreateMessage(AccountClient client, MessageIn msg)
        {
            string name=msg.readString();
            int hairStyle=msg.readInt8();
            int hairColor=msg.readInt8();
            int gender=msg.readInt8();

            // Avoid creation of character from old clients.
            //            int slot=-1;
            //            if(msg.getUnreadLength()>7)
            //            {
            int slot=msg.readInt8();
            //            }

            MessageOut reply=new MessageOut(Protocol.APMSG_CHAR_CREATE_RESPONSE);

            ISL.Server.Account.Account acc=client.getAccount();

            if(acc==null)
            {
                reply.writeInt8((byte)ErrorMessage.ERRMSG_NO_LOGIN);
            }
            else if(!Program.stringFilter.filterContent(name))
            {
                reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT);
            }
            else if(Program.stringFilter.findDoubleQuotes(name))
            {
                reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT);
            }
            else if(hairStyle>mNumHairStyles)
            {
                reply.writeInt8((byte)Create.CREATE_INVALID_HAIRSTYLE);
            }
            else if(hairColor>mNumHairColors)
            {
                reply.writeInt8((byte)Create.CREATE_INVALID_HAIRCOLOR);
            }
            else if(gender>mNumGenders)
            {
                reply.writeInt8((byte)Create.CREATE_INVALID_GENDER);
            }
            else if((name.Length<mMinNameLength)||
                (name.Length>mMaxNameLength))
            {
                reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT);
            }
            else
            {
                if(Program.storage.doesCharacterNameExist(name))
                {
                    reply.writeInt8((byte)Create.CREATE_EXISTS_NAME);
                    client.send(reply);
                    return;
                }

                // An account shouldn't have more
                // than <account_maxCharacters> characters.
                Dictionary<uint, ISL.Server.Account.Character> chars=acc.getCharacters();

                if(slot<1||slot>mMaxCharacters||!acc.isSlotEmpty((uint)slot))
                {
                    reply.writeInt8((byte)Create.CREATE_INVALID_SLOT);
                    client.send(reply);
                    return;
                }

                if((int)chars.Count>=mMaxCharacters)
                {
                    reply.writeInt8((byte)Create.CREATE_TOO_MUCH_CHARACTERS);
                    client.send(reply);
                    return;
                }

                // TODO: Add race, face and maybe special attributes.

                // Customization of character's attributes...
                List<int> attributes=new List<int>();
                //std::vector<int>(mModifiableAttributes.size(), 0);
                for(uint i = 0;i < mModifiableAttributes.Count;++i)
                {
                    attributes.Add(msg.readInt16());
                }

                int totalAttributes=0;
                for(uint i = 0;i < mModifiableAttributes.Count;++i)
                {
                    // For good total attributes check.
                    totalAttributes+=attributes[(int)i];

                    // For checking if all stats are >= min and <= max.
                    if(attributes[(int)i]<mAttributeMinimum
                        ||attributes[(int)i]>mAttributeMaximum)
                    {
                        reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_OUT_OF_RANGE);
                        client.send(reply);
                        return;
                    }
                }

                if(totalAttributes>mStartingPoints)
                {
                    reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_TOO_HIGH);
                }
                else if(totalAttributes<mStartingPoints)
                {
                    reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_TOO_LOW);
                }
                else
                {
                    Character newCharacter=new Character(name);

                    // Set the initial attributes provided by the client
                    for(uint i = 0;i < mModifiableAttributes.Count;++i)
                    {
                        //TODO schauen was hier genau passieren muss
                        //newCharacter.mAttributes.Add((uint)(mModifiableAttributes[(int)i]), mModifiableAttributes[i]);
                        //newCharacter.mAttributes.Add((uint)mModifiableAttributes[(int)i], attributes[(int)i]);
                    }

                    foreach(KeyValuePair<uint, Attribute> defaultAttributePair in mDefaultAttributes)
                    {
                        //TODO schauen was hier genau passieren muss
                        // newCharacter.mAttributes.Add(defaultAttributePair.Key, defaultAttributePair.Value);
                    }

                    newCharacter.setAccount(acc);
                    newCharacter.setCharacterSlot((uint)slot);
                    newCharacter.setGender(gender);
                    newCharacter.setHairStyle(hairStyle);
                    newCharacter.setHairColor(hairColor);
                    newCharacter.setMapId(Configuration.getValue("char_startMap", 1));
                    Point startingPos=new Point(Configuration.getValue("char_startX", 1024),
                                      Configuration.getValue("char_startY", 1024));
                    newCharacter.setPosition(startingPos);
                    acc.addCharacter(newCharacter);

                    Logger.Write(LogLevel.Information, "Character {0} was created for {1}'s account.", name, acc.getName());

                    Program.storage.flush(acc); // flush changes

                    // log transaction
                    Transaction trans=new Transaction();
                    trans.mCharacterId=(uint)newCharacter.getDatabaseID();
                    trans.mAction=(uint)TransactionMembers.TRANS_CHAR_CREATE;
                    trans.mMessage=acc.getName()+" created character ";
                    trans.mMessage+="called "+name;
                    Program.storage.addTransaction(trans);

                    reply.writeInt8((byte)ErrorMessage.ERRMSG_OK);
                    client.send(reply);

                    // Send new characters infos back to client
                    sendCharacterData(client, chars[(uint)slot]);
                    return;
                }
            }

            client.send(reply);
        }
Exemple #19
0
        void handleRegisterMessage(AccountClient client, MessageIn msg)
        {
            int clientVersion=msg.readInt32();
            string username=msg.readString();
            string password=msg.readString();
            string email=msg.readString();
            string captcha=msg.readString();

            MessageOut reply=new MessageOut(Protocol.APMSG_REGISTER_RESPONSE);

            if(client.status!=AccountClientStatus.CLIENT_LOGIN)
            {
                reply.writeInt8((int)ErrorMessage.ERRMSG_FAILURE);
            }
            else if(!mRegistrationAllowed)
            {
                reply.writeInt8((int)ErrorMessage.ERRMSG_FAILURE);
            }
            else if(clientVersion<ManaServ.PROTOCOL_VERSION)
            {
                reply.writeInt8((int)Register.REGISTER_INVALID_VERSION);
            }
            else if(Program.stringFilter.findDoubleQuotes(username)
                ||Program.stringFilter.findDoubleQuotes(email)
                ||username.Length<mMinNameLength
                ||username.Length>mMaxNameLength
                ||!Program.stringFilter.isEmailValid(email)
                ||!Program.stringFilter.filterContent(username))
            {
                reply.writeInt8((int)ErrorMessage.ERRMSG_INVALID_ARGUMENT);
            }
            else if(Program.storage.doesUserNameExist(username))
            {
                reply.writeInt8((int)Register.REGISTER_EXISTS_USERNAME);
            }
            else if(Program.storage.doesEmailAddressExist(SHA256.HashString(email)))
            {
                reply.writeInt8((int)Register.REGISTER_EXISTS_EMAIL);
            }
            else if(!checkCaptcha(client, captcha))
            {
                reply.writeInt8((int)Register.REGISTER_CAPTCHA_WRONG);
            }
            else
            {
                ISL.Server.Account.Account acc=new ISL.Server.Account.Account();
                acc.setName(username);
                acc.setPassword(SHA256.HashString(password));

                // We hash email server-side for additional privacy
                // we ask for it again when we need it and verify it
                // through comparing it with the hash.
                acc.setEmail(SHA256.HashString(email));
                acc.setLevel((int)AccessLevel.AL_PLAYER);

                // Set the date and time of the account registration, and the last login
                DateTime regdate=DateTime.Now;
                acc.setRegistrationDate(regdate);
                acc.setLastLogin(regdate);

                Program.storage.addAccount(acc);
                reply.writeInt8((int)ErrorMessage.ERRMSG_OK);
                addServerInfo(reply);

                // Associate account with connection
                client.setAccount(acc);
                client.status=AccountClientStatus.CLIENT_CONNECTED;
            }

            client.send(reply);
        }
Exemple #20
0
        void handleCharacterDeleteMessage(AccountClient client, MessageIn msg)
        {
            //MessageOut reply(APMSG_CHAR_DELETE_RESPONSE);

            //Account *acc = client.getAccount();
            //if (!acc)
            //{
            //    reply.writeInt8(ERRMSG_NO_LOGIN);
            //    client.send(reply);
            //    return; // not logged in
            //}

            //int slot = msg.readInt8();
            //Characters &chars = acc.getCharacters();

            //if (slot < 1 || acc.isSlotEmpty(slot))
            //{
            //    // Invalid char selection
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //    client.send(reply);
            //    return;
            //}

            //std::string characterName = chars[slot].getName();
            //LOG_INFO("Character deleted:" << characterName);

            //// Log transaction
            //Transaction trans;
            //trans.mCharacterId = chars[slot].getDatabaseID();
            //trans.mAction = TRANS_CHAR_DELETED;
            //trans.mMessage = chars[slot].getName() + " deleted by ";
            //trans.mMessage.append(acc.getName());
            //storage.addTransaction(trans);

            //acc.delCharacter(slot);
            //storage.flush(acc);

            //reply.writeInt8(ERRMSG_OK);
            //client.send(reply);
        }
Exemple #21
0
        void handleUnregisterMessage(AccountClient client, MessageIn msg)
        {
            //LOG_DEBUG("AccountHandler::handleUnregisterMessage");

            //MessageOut reply(APMSG_UNREGISTER_RESPONSE);

            //if (client.status != CLIENT_CONNECTED)
            //{
            //    reply.writeInt8(ERRMSG_FAILURE);
            //    client.send(reply);
            //    return;
            //}

            //std::string username = msg.readString();
            //std::string password = msg.readString();

            //if (stringFilter.findDoubleQuotes(username))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //    client.send(reply);
            //    return;
            //}

            //// See whether the account exists
            //Account *acc = storage.getAccount(username);

            //if (!acc || acc.getPassword() != sha256(password))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //    client.send(reply);
            //    delete acc;
            //    return;
            //}

            //// Delete account and associated characters
            //LOG_INFO("Unregistered \"" << username
            //         << "\", AccountID: " << acc.getID());
            //storage.delAccount(acc);
            //reply.writeInt8(ERRMSG_OK);

            //client.send(reply);
        }
Exemple #22
0
        void handleCharacterCreateMessage(AccountClient client, MessageIn msg)
        {
            //std::string name = msg.readString();
            //int hairStyle = msg.readInt8();
            //int hairColor = msg.readInt8();
            //int gender = msg.readInt8();

            //// Avoid creation of character from old clients.
            //int slot = -1;
            //if (msg.getUnreadLength() > 7)
            //    slot = msg.readInt8();

            //MessageOut reply(APMSG_CHAR_CREATE_RESPONSE);

            //Account *acc = client.getAccount();
            //if (!acc)
            //{
            //    reply.writeInt8(ERRMSG_NO_LOGIN);
            //}
            //else if (!stringFilter.filterContent(name))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //}
            //else if (stringFilter.findDoubleQuotes(name))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //}
            //else if (hairStyle > mNumHairStyles)
            //{
            //    reply.writeInt8(CREATE_INVALID_HAIRSTYLE);
            //}
            //else if (hairColor > mNumHairColors)
            //{
            //    reply.writeInt8(CREATE_INVALID_HAIRCOLOR);
            //}
            //else if (gender > mNumGenders)
            //{
            //    reply.writeInt8(CREATE_INVALID_GENDER);
            //}
            //else if ((name.length() < mMinNameLength) ||
            //         (name.length() > mMaxNameLength))
            //{
            //    reply.writeInt8(ERRMSG_INVALID_ARGUMENT);
            //}
            //else
            //{
            //    if (storage.doesCharacterNameExist(name))
            //    {
            //        reply.writeInt8(CREATE_EXISTS_NAME);
            //        client.send(reply);
            //        return;
            //    }

            //    // An account shouldn't have more
            //    // than <account_maxCharacters> characters.
            //    Characters &chars = acc.getCharacters();
            //    if (slot < 1 || slot > mMaxCharacters
            //        || !acc.isSlotEmpty((unsigned int) slot))
            //    {
            //        reply.writeInt8(CREATE_INVALID_SLOT);
            //        client.send(reply);
            //        return;
            //    }

            //    if ((int)chars.size() >= mMaxCharacters)
            //    {
            //        reply.writeInt8(CREATE_TOO_MUCH_CHARACTERS);
            //        client.send(reply);
            //        return;
            //    }

            //    // TODO: Add race, face and maybe special attributes.

            //    // Customization of character's attributes...
            //    std::vector<int> attributes = std::vector<int>(mModifiableAttributes.size(), 0);
            //    for (unsigned int i = 0; i < mModifiableAttributes.size(); ++i)
            //        attributes[i] = msg.readInt16();

            //    int totalAttributes = 0;
            //    for (unsigned int i = 0; i < mModifiableAttributes.size(); ++i)
            //    {
            //        // For good total attributes check.
            //        totalAttributes += attributes.at(i);

            //        // For checking if all stats are >= min and <= max.
            //        if (attributes.at(i) < mAttributeMinimum
            //            || attributes.at(i) > mAttributeMaximum)
            //        {
            //            reply.writeInt8(CREATE_ATTRIBUTES_OUT_OF_RANGE);
            //            client.send(reply);
            //            return;
            //        }
            //    }

            //    if (totalAttributes > mStartingPoints)
            //    {
            //        reply.writeInt8(CREATE_ATTRIBUTES_TOO_HIGH);
            //    }
            //    else if (totalAttributes < mStartingPoints)
            //    {
            //        reply.writeInt8(CREATE_ATTRIBUTES_TOO_LOW);
            //    }
            //    else
            //    {
            //        Character *newCharacter = new Character(name);

            //        // Set the initial attributes provided by the client
            //        for (unsigned int i = 0; i < mModifiableAttributes.size(); ++i)
            //        {
            //            newCharacter.mAttributes.insert(
            //                        std::make_pair(mModifiableAttributes.at(i), attributes[i]));
            //        }

            //        newCharacter.mAttributes.insert(mDefaultAttributes.begin(),
            //                                         mDefaultAttributes.end());
            //        newCharacter.setAccount(acc);
            //        newCharacter.setCharacterSlot(slot);
            //        newCharacter.setGender(gender);
            //        newCharacter.setHairStyle(hairStyle);
            //        newCharacter.setHairColor(hairColor);
            //        newCharacter.setMapId(Configuration::getValue("char_startMap", 1));
            //        Point startingPos(Configuration::getValue("char_startX", 1024),
            //                          Configuration::getValue("char_startY", 1024));
            //        newCharacter.setPosition(startingPos);
            //        acc.addCharacter(newCharacter);

            //        LOG_INFO("Character " << name << " was created for "
            //                 << acc.getName() << "'s account.");

            //        storage.flush(acc); // flush changes

            //        // log transaction
            //        Transaction trans;
            //        trans.mCharacterId = newCharacter.getDatabaseID();
            //        trans.mAction = TRANS_CHAR_CREATE;
            //        trans.mMessage = acc.getName() + " created character ";
            //        trans.mMessage.append("called " + name);
            //        storage.addTransaction(trans);

            //        reply.writeInt8(ERRMSG_OK);
            //        client.send(reply);

            //        // Send new characters infos back to client
            //        sendCharacterData(client, *chars[slot]);
            //        return;
            //    }
            //}

            //client.send(reply);
        }