diff options
author | Nay <dnpd.dd@gmail.com> | 2013-08-25 14:12:32 +0100 |
---|---|---|
committer | Nay <dnpd.dd@gmail.com> | 2013-08-25 14:12:32 +0100 |
commit | a7527b3b48ba864e923e5200b55879b48e552681 (patch) | |
tree | 059602de88fae48ef5ef374e7159d11f09b249d1 /src/server/authserver/Server/AuthSocket.cpp | |
parent | 0d44191a834d65f68f367ec26001cc2823b41f51 (diff) | |
parent | ee3d3ab1ff5589036c41c236e4fc376f11854467 (diff) |
Merge remote-tracking branch 'origin/master' into 4.3.4
Conflicts:
src/server/game/Spells/SpellMgr.cpp
src/server/scripts/Commands/cs_debug.cpp
src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
src/tools/map_extractor/mpq_libmpq04.h
Diffstat (limited to 'src/server/authserver/Server/AuthSocket.cpp')
-rw-r--r-- | src/server/authserver/Server/AuthSocket.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp index c2131f5dbf7..93c03e26c88 100644 --- a/src/server/authserver/Server/AuthSocket.cpp +++ b/src/server/authserver/Server/AuthSocket.cpp @@ -27,6 +27,7 @@ #include "RealmList.h" #include "AuthSocket.h" #include "AuthCodes.h" +#include "TOTP.h" #include "SHA1.h" #include "openssl/crypto.h" @@ -492,6 +493,12 @@ bool AuthSocket::_HandleLogonChallenge() pkt.append(s.AsByteArray().get(), s.GetNumBytes()); // 32 bytes pkt.append(unk3.AsByteArray(16).get(), 16); uint8 securityFlags = 0; + + // Check if token is used + _tokenKey = fields[8].GetString(); + if (!_tokenKey.empty()) + securityFlags = 4; + pkt << uint8(securityFlags); // security flags (0x0...0x04) if (securityFlags & 0x01) // PIN input @@ -652,6 +659,25 @@ bool AuthSocket::_HandleLogonProof() sha.UpdateBigNumbers(&A, &M, &K, NULL); sha.Finalize(); + // Check auth token + if ((lp.securityFlags & 0x04) || !_tokenKey.empty()) + { + uint8 size; + socket().recv((char*)&size, 1); + char* token = new char[size + 1]; + token[size] = '\0'; + socket().recv(token, size); + unsigned int validToken = TOTP::GenerateToken(_tokenKey.c_str()); + unsigned int incomingToken = atoi(token); + delete[] token; + if (validToken != incomingToken) + { + char data[] = { AUTH_LOGON_PROOF, WOW_FAIL_UNKNOWN_ACCOUNT, 3, 0 }; + socket().send(data, sizeof(data)); + return false; + } + } + if (_expversion & POST_BC_EXP_FLAG) // 2.x and 3.x clients { sAuthLogonProof_S proof; |