# HG changeset patch # User unc0rr # Date 1237632598 0 # Node ID b1ec8db513f2c77b2a2e46dffd837e484d29416a # Parent 20348675b01553dfe5c12e82cee5a2c7d916d423 - Use QCryptographicHash for md5 - Improve stub for admin page - Make protocol commands for room creation and joining incompatible with previous versions diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/hwform.cpp Sat Mar 21 10:49:58 2009 +0000 @@ -120,6 +120,7 @@ connect(ui.pageNetGame->pGameCFG, SIGNAL(goToSchemes()), this, SLOT(GoToSchemes())); connect(ui.pageRoomsList->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); + connect(ui.pageRoomsList->BtnAdmin, SIGNAL(clicked()), this, SLOT(GoToAdmin())); connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); @@ -148,6 +149,8 @@ connect(ui.pageScheme->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); + connect(ui.pageAdmin->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); + ammoSchemeModel = new AmmoSchemeModel(this, cfgdir->absolutePath() + "/schemes.ini"); ui.pageScheme->setModel(ammoSchemeModel); @@ -293,6 +296,11 @@ GoToPage(ID_PAGE_SCHEME); } +void HWForm::GoToAdmin() +{ + GoToPage(ID_PAGE_ADMIN); +} + void HWForm::OnPageShown(quint8 id, quint8 lastid) { if (id == ID_PAGE_MULTIPLAYER || id == ID_PAGE_NETGAME) { diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/hwform.h --- a/QTfrontend/hwform.h Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/hwform.h Sat Mar 21 10:49:58 2009 +0000 @@ -58,6 +58,7 @@ void GoToSelectNewWeapon(); void GoToNetServer(); void GoToSchemes(); + void GoToAdmin(); void GoToPage(quint8 id); void GoBack(); void btnExitPressed(); @@ -119,7 +120,8 @@ ID_PAGE_INGAME = 13, ID_PAGE_ROOMSLIST = 14, ID_PAGE_CONNECTING = 15, - ID_PAGE_SCHEME = 16 + ID_PAGE_SCHEME = 16, + ID_PAGE_ADMIN = 17 }; HWGame * game; HWNetServer* pnetserver; diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/misc.cpp --- a/QTfrontend/misc.cpp Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/misc.cpp Sat Mar 21 10:49:58 2009 +0000 @@ -16,145 +16,3 @@ */ #include "misc.h" - -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -#define MD5STEP(f, w, x, y, z, in, s) \ - (w += f(x, y, z) + in, w = (w<>(32-s)) + x) - -Hash::Hash() -{ - -} - -QString Hash::md5(QByteArray buf) -{ -// prepare - quint32 size = buf.size(); - - if (size > 55) - return QString("md5 hash value :D"); - - buf += '\x80'; - buf += QByteArray(55 - size, '\x00'); - - size *= 8; - - quint8 tb1 = size & 0xff; - quint8 tb2 = (size >> 8) & 0xff; - - buf += QByteArray::fromRawData((char *)&tb1, 1); - buf += QByteArray::fromRawData((char *)&tb2, 1); - buf += QByteArray(6, '\x00'); - - const char * message = buf.data(); - -// start hashing - - quint32 w[16], i, a, b, c, d; - - quint32 h0 = 0x67452301; - quint32 h1 = 0xEFCDAB89; - quint32 h2 = 0x98BADCFE; - quint32 h3 = 0x10325476; - int j; - - for(i = 0; i < 16; i++) - { - w[i] = 0; - - for(j = 3; j >= 0; j--) - { - w[i] <<= 8; - w[i] += message[(i << 2) + j] & 0xFF; - } - } - a = h0; b = h1; c = h2; d = h3; - - MD5STEP(F1, a, b, c, d, w[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, w[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, w[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, w[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, w[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, w[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, w[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, w[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, w[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, w[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, w[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, w[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, w[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, w[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, w[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, w[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, w[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, w[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, w[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, w[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, w[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, w[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, w[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, w[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, w[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, w[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, w[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, w[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, w[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, w[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, w[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, w[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, w[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, w[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, w[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, w[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, w[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, w[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, w[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, w[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, w[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, w[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, w[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, w[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, w[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, w[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, w[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, w[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, w[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, w[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, w[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, w[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, w[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, w[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, w[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, w[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, w[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, w[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, w[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, w[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, w[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, w[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, w[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, w[9] + 0xeb86d391, 21); - - h0 = h0 + a; - h1 = h1 + b; - h2 = h2 + c; - h3 = h3 + d; - - QString result; - - result.sprintf("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >> 24 & 0xFF, - h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >> 24 & 0xFF, - h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >> 24 & 0xFF, - h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >> 24 & 0xFF - ); - - return result; -} diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/misc.h --- a/QTfrontend/misc.h Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/misc.h Sat Mar 21 10:49:58 2009 +0000 @@ -20,19 +20,8 @@ #include -#include -#include #include -class Hash : public QObject -{ - Q_OBJECT - -public: - Hash(); - static QString md5(QByteArray buf); -}; - class FreqSpinBox : public QSpinBox { Q_OBJECT @@ -43,7 +32,7 @@ } - QString textFromValue ( int value ) const + QString textFromValue(int value) const { switch (value) { diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/newnetclient.cpp --- a/QTfrontend/newnetclient.cpp Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/newnetclient.cpp Sat Mar 21 10:49:58 2009 +0000 @@ -19,6 +19,7 @@ #include #include +#include #include "hwconsts.h" #include "newnetclient.h" @@ -86,7 +87,7 @@ return; } - RawSendNet(QString("CREATE%1%2").arg(delimeter).arg(room)); + RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room)); m_pGameCFGWidget->setEnabled(true); m_pTeamSelWidget->setInteractivity(true); isChief = true; @@ -102,7 +103,7 @@ loginStep++; - RawSendNet(QString("JOIN%1%2").arg(delimeter).arg(room)); + RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room)); m_pGameCFGWidget->setEnabled(false); m_pTeamSelWidget->setInteractivity(false); isChief = false; @@ -447,7 +448,7 @@ if (lst[0] == "ASKPASSWORD") { QString password = QInputDialog::getText(0, tr("Password"), tr("Enter your password:"), QLineEdit::Password); - QString hash = Hash::md5(password.toLatin1()); + QString hash = QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex(); RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash)); return; diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/pages.cpp --- a/QTfrontend/pages.cpp Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/pages.cpp Sat Mar 21 10:49:58 2009 +0000 @@ -973,3 +973,13 @@ QAbstractItemModel * model = mapper->model(); model->removeRow(selectScheme->currentIndex()); } + +///////////////////////////////////////////////// + +PageAdmin::PageAdmin(QWidget* parent) : + AbstractPage(parent) +{ + QGridLayout * pageLayout = new QGridLayout(this); + + BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true); +} diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/pages.h --- a/QTfrontend/pages.h Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/pages.h Sat Mar 21 10:49:58 2009 +0000 @@ -438,4 +438,14 @@ void deleteRow(); }; +class PageAdmin : public AbstractPage +{ + Q_OBJECT + +public: + PageAdmin(QWidget* parent = 0); + + QPushButton * BtnBack; +}; + #endif // PAGES_H diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/ui_hwform.cpp --- a/QTfrontend/ui_hwform.cpp Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/ui_hwform.cpp Sat Mar 21 10:49:58 2009 +0000 @@ -106,4 +106,7 @@ pageScheme = new PageScheme(); Pages->addWidget(pageScheme); + + pageAdmin = new PageAdmin(); + Pages->addWidget(pageAdmin); } diff -r 20348675b015 -r b1ec8db513f2 QTfrontend/ui_hwform.h --- a/QTfrontend/ui_hwform.h Wed Mar 18 22:02:55 2009 +0000 +++ b/QTfrontend/ui_hwform.h Sat Mar 21 10:49:58 2009 +0000 @@ -37,6 +37,7 @@ class PageRoomsList; class PageConnecting; class PageScheme; +class PageAdmin; class QStackedLayout; class QFont; class QWidget; @@ -65,6 +66,7 @@ PageRoomsList *pageRoomsList; PageConnecting *pageConnecting; PageScheme *pageScheme; + PageAdmin *pageAdmin; QStackedLayout *Pages; QFont *font14; diff -r 20348675b015 -r b1ec8db513f2 gameServer/HWProtoLobbyState.hs --- a/gameServer/HWProtoLobbyState.hs Wed Mar 18 22:02:55 2009 +0000 +++ b/gameServer/HWProtoLobbyState.hs Sat Mar 21 10:49:58 2009 +0000 @@ -41,7 +41,7 @@ clientNick = nick $ clients IntMap.! clID -handleCmd_lobby clID clients rooms ["CREATE", newRoom, roomPassword] = +handleCmd_lobby clID clients rooms ["CREATE_ROOM", newRoom, roomPassword] = if haveSameRoom then [Warning "Room exists"] else @@ -54,11 +54,11 @@ haveSameRoom = isJust $ find (\room -> newRoom == name room) $ IntMap.elems rooms -handleCmd_lobby clID clients rooms ["CREATE", newRoom] = - handleCmd_lobby clID clients rooms ["CREATE", newRoom, ""] +handleCmd_lobby clID clients rooms ["CREATE_ROOM", newRoom] = + handleCmd_lobby clID clients rooms ["CREATE_ROOM", newRoom, ""] -handleCmd_lobby clID clients rooms ["JOIN", roomName, roomPassword] = +handleCmd_lobby clID clients rooms ["JOIN_ROOM", roomName, roomPassword] = if noSuchRoom then [Warning "No such room"] else if isRestrictedJoins jRoom then @@ -106,8 +106,8 @@ answerAllTeams (teams jRoom) -handleCmd_lobby clID clients rooms ["JOIN", roomName] = - handleCmd_lobby clID clients rooms ["JOIN", roomName, ""] +handleCmd_lobby clID clients rooms ["JOIN_ROOM", roomName] = + handleCmd_lobby clID clients rooms ["JOIN_ROOM", roomName, ""] handleCmd_lobby clID clients rooms ["KICK", kickNick] =