Network: Fix logging into older worlds with base64 hashes
authorSmallJoker <mk939@ymail.com>
Tue, 12 Sep 2017 18:26:03 +0000 (20:26 +0200)
committerSmallJoker <mk939@ymail.com>
Tue, 12 Sep 2017 18:26:03 +0000 (20:26 +0200)
src/client.cpp
src/clientiface.cpp
src/network/clientpackethandler.cpp
src/network/serverpackethandler.cpp

index dba7ffcc08bd74d41e2aea1dbc57c73d56a94220..a56e3c97458b0391c0365b5db3a4bc2b19b80efc 100644 (file)
@@ -920,10 +920,10 @@ void Client::deleteAuthData()
                case AUTH_MECHANISM_FIRST_SRP:
                        break;
                case AUTH_MECHANISM_SRP:
+               case AUTH_MECHANISM_LEGACY_PASSWORD:
                        srp_user_delete((SRPUser *) m_auth_data);
                        m_auth_data = NULL;
                        break;
-               case AUTH_MECHANISM_LEGACY_PASSWORD:
                case AUTH_MECHANISM_NONE:
                        break;
        }
@@ -939,6 +939,9 @@ AuthMechanism Client::choseAuthMech(const u32 mechs)
        if (mechs & AUTH_MECHANISM_FIRST_SRP)
                return AUTH_MECHANISM_FIRST_SRP;
 
+       if (mechs & AUTH_MECHANISM_LEGACY_PASSWORD)
+               return AUTH_MECHANISM_LEGACY_PASSWORD;
+
        return AUTH_MECHANISM_NONE;
 }
 
@@ -974,8 +977,14 @@ void Client::startAuth(AuthMechanism chosen_auth_mechanism)
                        Send(&resp_pkt);
                        break;
                }
-               case AUTH_MECHANISM_SRP: {
-                       u8 legacy_based_on = 1;
+               case AUTH_MECHANISM_SRP:
+               case AUTH_MECHANISM_LEGACY_PASSWORD: {
+                       u8 based_on = 1;
+
+                       if (chosen_auth_mechanism == AUTH_MECHANISM_LEGACY_PASSWORD) {
+                               m_password = translate_password(getPlayerName(), m_password);
+                               based_on = 0;
+                       }
 
                        std::string playername_u = lowercase(getPlayerName());
                        m_auth_data = srp_user_new(SRP_SHA256, SRP_NG_2048,
@@ -990,11 +999,10 @@ void Client::startAuth(AuthMechanism chosen_auth_mechanism)
                        FATAL_ERROR_IF(res != SRP_OK, "Creating local SRP user failed.");
 
                        NetworkPacket resp_pkt(TOSERVER_SRP_BYTES_A, 0);
-                       resp_pkt << std::string(bytes_A, len_A) << legacy_based_on;
+                       resp_pkt << std::string(bytes_A, len_A) << based_on;
                        Send(&resp_pkt);
                        break;
                }
-               case AUTH_MECHANISM_LEGACY_PASSWORD:
                case AUTH_MECHANISM_NONE:
                        break; // not handled in this method
        }
index bb740d9f35469a0e6de7d2bfa8028e7799f94186..5dadcb7887babf8ce101fb5abc486df021affce6 100644 (file)
@@ -454,7 +454,8 @@ void RemoteClient::notifyEvent(ClientStateEvent event)
                {
                case CSE_AuthAccept:
                        m_state = CS_AwaitingInit2;
-                       if (chosen_mech == AUTH_MECHANISM_SRP)
+                       if (chosen_mech == AUTH_MECHANISM_SRP ||
+                                       chosen_mech == AUTH_MECHANISM_LEGACY_PASSWORD)
                                srp_verifier_delete((SRPVerifier *) auth_data);
                        chosen_mech = AUTH_MECHANISM_NONE;
                        break;
@@ -463,7 +464,8 @@ void RemoteClient::notifyEvent(ClientStateEvent event)
                        break;
                case CSE_SetDenied:
                        m_state = CS_Denied;
-                       if (chosen_mech == AUTH_MECHANISM_SRP)
+                       if (chosen_mech == AUTH_MECHANISM_SRP ||
+                                       chosen_mech == AUTH_MECHANISM_LEGACY_PASSWORD)
                                srp_verifier_delete((SRPVerifier *) auth_data);
                        chosen_mech = AUTH_MECHANISM_NONE;
                        break;
index 6683af4714e21c5b90b7d34588c9080c8ac8d833..3ff23453d9cd89a9c5c312751a390d3f8ca72bd1 100644 (file)
@@ -86,7 +86,8 @@ void Client::handleCommand_Hello(NetworkPacket* pkt)
                // we recieved a TOCLIENT_HELLO while auth was already going on
                errorstream << "Client: TOCLIENT_HELLO while auth was already going on"
                        << "(chosen_mech=" << m_chosen_auth_mech << ")." << std::endl;
-               if (m_chosen_auth_mech == AUTH_MECHANISM_SRP) {
+               if (m_chosen_auth_mech == AUTH_MECHANISM_SRP ||
+                               m_chosen_auth_mech == AUTH_MECHANISM_LEGACY_PASSWORD) {
                        srp_user_delete((SRPUser *) m_auth_data);
                        m_auth_data = 0;
                }
@@ -1294,7 +1295,8 @@ void Client::handleCommand_UpdatePlayerList(NetworkPacket* pkt)
 
 void Client::handleCommand_SrpBytesSandB(NetworkPacket* pkt)
 {
-       if (m_chosen_auth_mech != AUTH_MECHANISM_SRP) {
+       if (m_chosen_auth_mech != AUTH_MECHANISM_SRP &&
+                       m_chosen_auth_mech != AUTH_MECHANISM_LEGACY_PASSWORD) {
                errorstream << "Client: Received SRP S_B login message,"
                        << " but wasn't supposed to (chosen_mech="
                        << m_chosen_auth_mech << ")." << std::endl;
index 0fd31f35e8aa18115b72c15d2edfe2db9703a75c..07de20d60113e59519171e3ce10a03f1485340f7 100644 (file)
@@ -232,6 +232,9 @@ void Server::handleCommand_Init(NetworkPacket* pkt)
                                DenyAccess(pkt->getPeerId(), SERVER_ACCESSDENIED_SERVER_FAIL);
                                return;
                        }
+               } else if (base64_is_valid(encpwd)) {
+                       auth_mechs |= AUTH_MECHANISM_LEGACY_PASSWORD;
+                       client->enc_pwd = encpwd;
                } else {
                        actionstream << "User " << playername
                                << " tried to log in, but password field"
@@ -1578,7 +1581,8 @@ void Server::handleCommand_SrpBytesA(NetworkPacket* pkt)
                << "based_on=" << int(based_on) << " and len_A="
                << bytes_A.length() << "." << std::endl;
 
-       AuthMechanism chosen = AUTH_MECHANISM_SRP;
+       AuthMechanism chosen = (based_on == 0) ?
+               AUTH_MECHANISM_LEGACY_PASSWORD : AUTH_MECHANISM_SRP;
 
        if (wantSudo) {
                if (!client->isSudoMechAllowed(chosen)) {
@@ -1663,7 +1667,8 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt)
                return;
        }
 
-       if (client->chosen_mech != AUTH_MECHANISM_SRP) {
+       if (client->chosen_mech != AUTH_MECHANISM_SRP &&
+                       client->chosen_mech != AUTH_MECHANISM_LEGACY_PASSWORD) {
                actionstream << "Server: got SRP _M packet, while auth"
                        << "is going on with mech " << client->chosen_mech
                        << " from " << getPeerAddress(pkt->getPeerId()).serializeString()