]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/clientiface.cpp
Translated using Weblate (Korean)
[dragonfireclient.git] / src / clientiface.cpp
index 6180cf5da032a4f1280b21bef3a753b9cbe23d78..6944e56db756c63e754795d2cf391cdc5d9dbb9d 100644 (file)
@@ -30,8 +30,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "map.h"
 #include "emerge.h"
 #include "serverobject.h"              // TODO this is used for cleanup of only
-#include "main.h"                      // for g_settings
 #include "log.h"
+#include "util/srp.h"
 
 const char *ClientInterface::statenames[] = {
        "Invalid",
@@ -428,10 +428,12 @@ void RemoteClient::notifyEvent(ClientStateEvent event)
                //intentionally do nothing
                break;
        case CS_Created:
-               switch(event)
-               {
-               case CSE_Init:
-                       m_state = CS_InitSent;
+               switch (event) {
+               case CSE_Hello:
+                       m_state = CS_HelloSent;
+                       break;
+               case CSE_InitLegacy:
+                       m_state = CS_AwaitingInit2;
                        break;
                case CSE_Disconnect:
                        m_state = CS_Disconnecting;
@@ -448,7 +450,32 @@ void RemoteClient::notifyEvent(ClientStateEvent event)
        case CS_Denied:
                /* don't do anything if in denied state */
                break;
-       case CS_InitSent:
+       case CS_HelloSent:
+               switch(event)
+               {
+               case CSE_AuthAccept:
+                       m_state = CS_AwaitingInit2;
+                       if ((chosen_mech == AUTH_MECHANISM_SRP)
+                                       || (chosen_mech == AUTH_MECHANISM_LEGACY_PASSWORD))
+                               srp_verifier_delete((SRPVerifier *) auth_data);
+                       chosen_mech = AUTH_MECHANISM_NONE;
+                       break;
+               case CSE_Disconnect:
+                       m_state = CS_Disconnecting;
+                       break;
+               case CSE_SetDenied:
+                       m_state = CS_Denied;
+                       if ((chosen_mech == AUTH_MECHANISM_SRP)
+                                       || (chosen_mech == AUTH_MECHANISM_LEGACY_PASSWORD))
+                               srp_verifier_delete((SRPVerifier *) auth_data);
+                       chosen_mech = AUTH_MECHANISM_NONE;
+                       break;
+               default:
+                       myerror << "HelloSent: Invalid client state transition! " << event;
+                       throw ClientStateError(myerror.str());
+               }
+               break;
+       case CS_AwaitingInit2:
                switch(event)
                {
                case CSE_GotInit2:
@@ -515,6 +542,13 @@ void RemoteClient::notifyEvent(ClientStateEvent event)
                case CSE_Disconnect:
                        m_state = CS_Disconnecting;
                        break;
+               case CSE_SudoSuccess:
+                       m_state = CS_SudoMode;
+                       if ((chosen_mech == AUTH_MECHANISM_SRP)
+                                       || (chosen_mech == AUTH_MECHANISM_LEGACY_PASSWORD))
+                               srp_verifier_delete((SRPVerifier *) auth_data);
+                       chosen_mech = AUTH_MECHANISM_NONE;
+                       break;
                /* Init GotInit2 SetDefinitionsSent SetMediaSent SetDenied */
                default:
                        myerror << "Active: Invalid client state transition! " << event;
@@ -522,6 +556,24 @@ void RemoteClient::notifyEvent(ClientStateEvent event)
                        break;
                }
                break;
+       case CS_SudoMode:
+               switch(event)
+               {
+               case CSE_SetDenied:
+                       m_state = CS_Denied;
+                       break;
+               case CSE_Disconnect:
+                       m_state = CS_Disconnecting;
+                       break;
+               case CSE_SudoLeave:
+                       m_state = CS_Active;
+                       break;
+               default:
+                       myerror << "Active: Invalid client state transition! " << event;
+                       throw ClientStateError(myerror.str());
+                       break;
+               }
+               break;
        case CS_Disconnecting:
                /* we are already disconnecting */
                break;
@@ -560,9 +612,9 @@ ClientInterface::~ClientInterface()
        }
 }
 
-std::list<u16> ClientInterface::getClientIDs(ClientState min_state)
+std::vector<u16> ClientInterface::getClientIDs(ClientState min_state)
 {
-       std::list<u16> reply;
+       std::vector<u16> reply;
        JMutexAutoLock clientslock(m_clients_mutex);
 
        for(std::map<u16, RemoteClient*>::iterator
@@ -596,20 +648,22 @@ void ClientInterface::UpdatePlayerList()
 {
        if (m_env != NULL)
                {
-               std::list<u16> clients = getClientIDs();
+               std::vector<u16> clients = getClientIDs();
                m_clients_names.clear();
 
 
                if(!clients.empty())
                        infostream<<"Players:"<<std::endl;
-               for(std::list<u16>::iterator
+
+               for(std::vector<u16>::iterator
                        i = clients.begin();
-                       i != clients.end(); ++i)
-               {
+                       i != clients.end(); ++i) {
                        Player *player = m_env->getPlayer(*i);
-                       if(player==NULL)
+
+                       if (player == NULL)
                                continue;
-                       infostream<<"* "<<player->getName()<<"\t";
+
+                       infostream << "* " << player->getName() << "\t";
 
                        {
                                JMutexAutoLock clientslock(m_clients_mutex);
@@ -617,18 +671,16 @@ void ClientInterface::UpdatePlayerList()
                                if(client != NULL)
                                        client->PrintInfo(infostream);
                        }
+
                        m_clients_names.push_back(player->getName());
                }
        }
 }
 
 void ClientInterface::send(u16 peer_id, u8 channelnum,
-               NetworkPacket* pkt, bool reliable, bool deletepkt)
+               NetworkPacket* pkt, bool reliable)
 {
        m_con->Send(peer_id, channelnum, pkt, reliable);
-
-       if (deletepkt)
-               delete pkt;
 }
 
 void ClientInterface::sendToAll(u16 channelnum,
@@ -644,8 +696,6 @@ void ClientInterface::sendToAll(u16 channelnum,
                        m_con->Send(client->peer_id, channelnum, pkt, reliable);
                }
        }
-
-       delete pkt;
 }
 
 RemoteClient* ClientInterface::getClientNoEx(u16 peer_id, ClientState state_min)