diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index e42450d7e5f..cb7e0e0b4cf 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -1013,45 +1013,6 @@ public: enum { Size = 8 }; }; -class QNtlmPhase1BlockBase -{ -public: - char magic[8]; - quint32 type; - quint32 flags; - QNtlmBuffer domain; - QNtlmBuffer workstation; - enum { Size = 32 }; -}; - -// ################# check paddings -class QNtlmPhase2BlockBase -{ -public: - char magic[8]; - quint32 type; - QNtlmBuffer targetName; - quint32 flags; - unsigned char challenge[8]; - quint32 context[2]; - QNtlmBuffer targetInfo; - enum { Size = 48 }; -}; - -class QNtlmPhase3BlockBase { -public: - char magic[8]; - quint32 type; - QNtlmBuffer lmResponse; - QNtlmBuffer ntlmResponse; - QNtlmBuffer domain; - QNtlmBuffer user; - QNtlmBuffer workstation; - QNtlmBuffer sessionKey; - quint32 flags; - enum { Size = 64 }; -}; - static void qStreamNtlmBuffer(QDataStream& ds, const QByteArray& s) { ds.writeRawData(s.constData(), s.size()); @@ -1104,9 +1065,15 @@ static QDataStream& operator>>(QDataStream& s, QNtlmBuffer& b) } -class QNtlmPhase1Block : public QNtlmPhase1BlockBase +class QNtlmPhase1Block { // request public: + char magic[8]; + quint32 type; + quint32 flags; + QNtlmBuffer domain; + QNtlmBuffer workstation; + QNtlmPhase1Block() { qstrncpy(magic, "NTLMSSP", 8); type = 1; @@ -1118,9 +1085,18 @@ public: }; -class QNtlmPhase2Block : public QNtlmPhase2BlockBase +class QNtlmPhase2Block { // challenge public: + char magic[8]; + quint32 type; + QNtlmBuffer targetName; + quint32 flags = 0; + unsigned char challenge[8] = {'\0'}; + quint32 context[2] = {0, 0}; + QNtlmBuffer targetInfo; + enum { Size = 48 }; + QNtlmPhase2Block() { magic[0] = 0; type = 0xffffffff; @@ -1133,8 +1109,20 @@ public: -class QNtlmPhase3Block : public QNtlmPhase3BlockBase { // response +class QNtlmPhase3Block +{ // response public: + char magic[8]; + quint32 type; + QNtlmBuffer lmResponse; + QNtlmBuffer ntlmResponse; + QNtlmBuffer domain; + QNtlmBuffer user; + QNtlmBuffer workstation; + QNtlmBuffer sessionKey; + quint32 flags; + enum { Size = 64 }; + QNtlmPhase3Block() { qstrncpy(magic, "NTLMSSP", 8); type = 3; @@ -1451,8 +1439,7 @@ static QByteArray qEncodeLmv2Response(const QAuthenticatorPrivate *ctx, static bool qNtlmDecodePhase2(const QByteArray& data, QNtlmPhase2Block& ch) { - Q_ASSERT(QNtlmPhase2BlockBase::Size == sizeof(QNtlmPhase2BlockBase)); - if (data.size() < QNtlmPhase2BlockBase::Size) + if (data.size() < QNtlmPhase2Block::Size) return false; @@ -1519,8 +1506,7 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas pb.flags |= NTLMSSP_NEGOTIATE_OEM; - int offset = QNtlmPhase3BlockBase::Size; - Q_ASSERT(QNtlmPhase3BlockBase::Size == sizeof(QNtlmPhase3BlockBase)); + int offset = QNtlmPhase3Block::Size; // for kerberos style user@domain logins, NTLM domain string should be left empty if (ctx->userDomain.isEmpty() && !ctx->extractedUser.contains(u'@')) {