/*
* PtokaX - hub server for Direct Connect peer to peer network.
* Copyright (C) 2004-2017 Petr Kozelka, PPK at PtokaX dot org
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3
* as published by the Free Software Foundation.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//---------------------------------------------------------------------------
#include "../core/stdinc.h"
//---------------------------------------------------------------------------
#include "BanDialog.h"
//---------------------------------------------------------------------------
#include "../core/hashBanManager.h"
#include "../core/LanguageManager.h"
#include "../core/ServerManager.h"
#include "../core/utility.h"
//---------------------------------------------------------------------------
#include "GuiSettingManager.h"
#include "GuiUtil.h"
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#include "BansDialog.h"
//---------------------------------------------------------------------------
static ATOM atomBanDialog = 0;
//---------------------------------------------------------------------------
BanDialog::BanDialog() : m_pBanToChange(nullptr) {
memset(&m_hWndWindowItems, 0, sizeof(m_hWndWindowItems));
}
//---------------------------------------------------------------------------
BanDialog::~BanDialog() {
}
//---------------------------------------------------------------------------
LRESULT CALLBACK BanDialog::StaticBanDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
BanDialog * pBanDialog = (BanDialog *)::GetWindowLongPtr(hWnd, GWLP_USERDATA);
if(pBanDialog == nullptr) {
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return pBanDialog->BanDialogProc(uMsg, wParam, lParam);
}
//------------------------------------------------------------------------------
LRESULT BanDialog::BanDialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch(uMsg) {
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
if(OnAccept() == false) {
return 0;
}
case IDCANCEL:
::PostMessage(m_hWndWindowItems[WINDOW_HANDLE], WM_CLOSE, 0, 0);
return 0;
case (EDT_NICK+100):
if(HIWORD(wParam) == EN_CHANGE) {
char buf[65];
::GetWindowText((HWND)lParam, buf, 65);
bool bChanged = false;
for(uint16_t ui16i = 0; buf[ui16i] != '\0'; ui16i++) {
if(buf[ui16i] == '|' || buf[ui16i] == '$' || buf[ui16i] == ' ') {
strcpy(buf+ui16i, buf+ui16i+1);
bChanged = true;
ui16i--;
}
}
if(bChanged == true) {
int iStart, iEnd;
::SendMessage((HWND)lParam, EM_GETSEL, (WPARAM)&iStart, (LPARAM)&iEnd);
::SetWindowText((HWND)lParam, buf);
::SendMessage((HWND)lParam, EM_SETSEL, iStart, iEnd);
}
return 0;
}
break;
case BTN_IP_BAN:
if(HIWORD(wParam) == BN_CLICKED) {
bool bChecked = ::SendMessage(m_hWndWindowItems[BTN_IP_BAN], BM_GETCHECK, 0, 0) == BST_CHECKED ? true : false;
::EnableWindow(m_hWndWindowItems[BTN_FULL_BAN], bChecked == true ? TRUE : FALSE);
return 0;
}
break;
case RB_PERM_BAN:
if(HIWORD(wParam) == BN_CLICKED) {
::EnableWindow(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_DATE], FALSE);
::EnableWindow(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_TIME], FALSE);
}
break;
case RB_TEMP_BAN:
if(HIWORD(wParam) == BN_CLICKED) {
::EnableWindow(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_DATE], TRUE);
::EnableWindow(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_TIME], TRUE);
}
break;
}
break;
case WM_CLOSE:
::EnableWindow(::GetParent(m_hWndWindowItems[WINDOW_HANDLE]), TRUE);
ServerManager::m_hWndActiveDialog = nullptr;
break;
case WM_NCDESTROY: {
HWND hWnd = m_hWndWindowItems[WINDOW_HANDLE];
delete this;
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
case WM_SETFOCUS:
::SetFocus(m_hWndWindowItems[EDT_NICK]);
return 0;
}
return ::DefWindowProc(m_hWndWindowItems[WINDOW_HANDLE], uMsg, wParam, lParam);
}
//------------------------------------------------------------------------------
void BanDialog::DoModal(HWND hWndParent, BanItem * pBan/* = nullptr*/) {
m_pBanToChange = pBan;
if(atomBanDialog == 0) {
WNDCLASSEX m_wc;
memset(&m_wc, 0, sizeof(WNDCLASSEX));
m_wc.cbSize = sizeof(WNDCLASSEX);
m_wc.lpfnWndProc = ::DefWindowProc;
m_wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
m_wc.lpszClassName = "PtokaX_BanDialog";
m_wc.hInstance = ServerManager::m_hInstance;
m_wc.hCursor = ::LoadCursor(m_wc.hInstance, IDC_ARROW);
m_wc.style = CS_HREDRAW | CS_VREDRAW;
atomBanDialog = ::RegisterClassEx(&m_wc);
}
RECT rcParent;
::GetWindowRect(hWndParent, &rcParent);
int iX = (rcParent.left + (((rcParent.right-rcParent.left))/2)) - (ScaleGui(300) / 2);
int iY = (rcParent.top + ((rcParent.bottom-rcParent.top)/2)) - (ScaleGui(394) / 2);
m_hWndWindowItems[WINDOW_HANDLE] = ::CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE, MAKEINTATOM(atomBanDialog), LanguageManager::m_Ptr->m_sTexts[LAN_BAN],
WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, iX >= 5 ? iX : 5, iY >= 5 ? iY : 5, ScaleGui(300), ScaleGui(394),
hWndParent, nullptr, ServerManager::m_hInstance, nullptr);
if(m_hWndWindowItems[WINDOW_HANDLE] == nullptr) {
return;
}
ServerManager::m_hWndActiveDialog = m_hWndWindowItems[WINDOW_HANDLE];
::SetWindowLongPtr(m_hWndWindowItems[WINDOW_HANDLE], GWLP_USERDATA, (LONG_PTR)this);
::SetWindowLongPtr(m_hWndWindowItems[WINDOW_HANDLE], GWLP_WNDPROC, (LONG_PTR)StaticBanDialogProc);
::GetClientRect(m_hWndWindowItems[WINDOW_HANDLE], &rcParent);
{
int iHeight = GuiSettingManager::m_iOneLineOneChecksGB + GuiSettingManager::m_iOneLineTwoChecksGB + (2 * GuiSettingManager::m_iOneLineGB) + (GuiSettingManager::m_iGroupBoxMargin + GuiSettingManager::m_iCheckHeight + GuiSettingManager::m_iOneLineGB + 5) + GuiSettingManager::m_iEditHeight + 6;
int iDiff = rcParent.bottom - iHeight;
if(iDiff != 0) {
::GetWindowRect(hWndParent, &rcParent);
iY = (rcParent.top + ((rcParent.bottom-rcParent.top)/2)) - ((ScaleGui(307) - iDiff) / 2);
::GetWindowRect(m_hWndWindowItems[WINDOW_HANDLE], &rcParent);
::SetWindowPos(m_hWndWindowItems[WINDOW_HANDLE], nullptr, iX, iY, (rcParent.right-rcParent.left), (rcParent.bottom-rcParent.top) - iDiff, SWP_NOZORDER);
}
}
::GetClientRect(m_hWndWindowItems[WINDOW_HANDLE], &rcParent);
m_hWndWindowItems[GB_NICK] = ::CreateWindowEx(WS_EX_TRANSPARENT, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_NICK], WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
3, 0, rcParent.right - 6, GuiSettingManager::m_iOneLineOneChecksGB, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[EDT_NICK] = ::CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, nullptr, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
11, GuiSettingManager::m_iGroupBoxMargin, rcParent.right - 22, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)(EDT_NICK+100), ServerManager::m_hInstance, nullptr);
::SendMessage(m_hWndWindowItems[EDT_NICK], EM_SETLIMITTEXT, 64, 0);
m_hWndWindowItems[BTN_NICK_BAN] = ::CreateWindowEx(0, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_NICK_BAN], WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX,
11, GuiSettingManager::m_iGroupBoxMargin + GuiSettingManager::m_iEditHeight + 4, rcParent.right - 22, GuiSettingManager::m_iCheckHeight, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
int iPosY = GuiSettingManager::m_iOneLineOneChecksGB;
m_hWndWindowItems[GB_IP] = ::CreateWindowEx(WS_EX_TRANSPARENT, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_IP], WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
3, iPosY, rcParent.right - 6, GuiSettingManager::m_iOneLineTwoChecksGB, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[EDT_IP] = ::CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, nullptr, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
11, iPosY + GuiSettingManager::m_iGroupBoxMargin, rcParent.right - 22, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
::SendMessage(m_hWndWindowItems[EDT_IP], EM_SETLIMITTEXT, 39, 0);
m_hWndWindowItems[BTN_IP_BAN] = ::CreateWindowEx(0, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_IP_BAN], WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX,
11, iPosY + GuiSettingManager::m_iGroupBoxMargin + GuiSettingManager::m_iEditHeight + 4, rcParent.right - 22, GuiSettingManager::m_iCheckHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)BTN_IP_BAN, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[BTN_FULL_BAN] = ::CreateWindowEx(0, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_FULL_BAN], WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | BS_AUTOCHECKBOX,
11, iPosY + GuiSettingManager::m_iGroupBoxMargin + GuiSettingManager::m_iEditHeight + GuiSettingManager::m_iCheckHeight + 7, rcParent.right - 22, GuiSettingManager::m_iCheckHeight, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
iPosY += GuiSettingManager::m_iOneLineTwoChecksGB;
m_hWndWindowItems[GB_REASON] = ::CreateWindowEx(WS_EX_TRANSPARENT, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_REASON], WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
3, iPosY, rcParent.right - 6, GuiSettingManager::m_iOneLineGB, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[EDT_REASON] = ::CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, nullptr, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
11, iPosY + GuiSettingManager::m_iGroupBoxMargin, rcParent.right - 22, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)EDT_REASON, ServerManager::m_hInstance, nullptr);
::SendMessage(m_hWndWindowItems[EDT_REASON], EM_SETLIMITTEXT, 511, 0);
iPosY += GuiSettingManager::m_iOneLineGB;
m_hWndWindowItems[GB_BY] = ::CreateWindowEx(WS_EX_TRANSPARENT, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_CREATED_BY], WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
3, iPosY, rcParent.right - 6, GuiSettingManager::m_iOneLineGB, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[EDT_BY] = ::CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, nullptr, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
11, iPosY + GuiSettingManager::m_iGroupBoxMargin, rcParent.right - 22, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)EDT_BY, ServerManager::m_hInstance, nullptr);
::SendMessage(m_hWndWindowItems[EDT_BY], EM_SETLIMITTEXT, 64, 0);
iPosY += GuiSettingManager::m_iOneLineGB;
m_hWndWindowItems[GB_BAN_TYPE] = ::CreateWindowEx(WS_EX_TRANSPARENT, WC_BUTTON, nullptr, WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
3, iPosY, rcParent.right - 6, GuiSettingManager::m_iGroupBoxMargin + GuiSettingManager::m_iCheckHeight + GuiSettingManager::m_iOneLineGB + 5, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[GB_TEMP_BAN] = ::CreateWindowEx(WS_EX_TRANSPARENT, WC_BUTTON, nullptr, WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
8, iPosY + GuiSettingManager::m_iGroupBoxMargin + GuiSettingManager::m_iCheckHeight, rcParent.right - 16, GuiSettingManager::m_iOneLineGB, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[RB_PERM_BAN] = ::CreateWindowEx(0, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_PERMANENT], WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTORADIOBUTTON,
16, iPosY + GuiSettingManager::m_iGroupBoxMargin, rcParent.right - 32, GuiSettingManager::m_iCheckHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)RB_PERM_BAN, ServerManager::m_hInstance, nullptr);
::SendMessage(m_hWndWindowItems[RB_PERM_BAN], BM_SETCHECK, BST_CHECKED, 0);
int iThird = (rcParent.right - 32) / 3;
m_hWndWindowItems[RB_TEMP_BAN] = ::CreateWindowEx(0, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_TEMPORARY], WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTORADIOBUTTON,
16, iPosY + (2 * GuiSettingManager::m_iGroupBoxMargin) + GuiSettingManager::m_iCheckHeight + ((GuiSettingManager::m_iEditHeight - GuiSettingManager::m_iCheckHeight) / 2), iThird - 2, GuiSettingManager::m_iCheckHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)RB_TEMP_BAN, ServerManager::m_hInstance, nullptr);
::SendMessage(m_hWndWindowItems[RB_TEMP_BAN], BM_SETCHECK, BST_UNCHECKED, 0);
m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_DATE] = ::CreateWindowEx(0, DATETIMEPICK_CLASS, nullptr, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | DTS_SHORTDATECENTURYFORMAT,
iThird + 16, iPosY + (2 * GuiSettingManager::m_iGroupBoxMargin) + GuiSettingManager::m_iCheckHeight, iThird - 2, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_TIME] = ::CreateWindowEx(0, DATETIMEPICK_CLASS, nullptr, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | DTS_TIMEFORMAT | DTS_UPDOWN,
(iThird * 2) + 19, iPosY + (2 * GuiSettingManager::m_iGroupBoxMargin) + GuiSettingManager::m_iCheckHeight, iThird - 2, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], nullptr, ServerManager::m_hInstance, nullptr);
iPosY += GuiSettingManager::m_iGroupBoxMargin + GuiSettingManager::m_iCheckHeight + GuiSettingManager::m_iOneLineGB + 9;
m_hWndWindowItems[BTN_ACCEPT] = ::CreateWindowEx(0, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_ACCEPT], WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
2, iPosY, (rcParent.right / 2) - 3, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)IDOK, ServerManager::m_hInstance, nullptr);
m_hWndWindowItems[BTN_DISCARD] = ::CreateWindowEx(0, WC_BUTTON, LanguageManager::m_Ptr->m_sTexts[LAN_DISCARD], WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
(rcParent.right / 2) + 2, iPosY, (rcParent.right / 2) - 4, GuiSettingManager::m_iEditHeight, m_hWndWindowItems[WINDOW_HANDLE], (HMENU)IDCANCEL, ServerManager::m_hInstance, nullptr);
for(uint8_t ui8i = 0; ui8i < (sizeof(m_hWndWindowItems) / sizeof(m_hWndWindowItems[0])); ui8i++) {
if(m_hWndWindowItems[ui8i] == nullptr) {
return;
}
::SendMessage(m_hWndWindowItems[ui8i], WM_SETFONT, (WPARAM)GuiSettingManager::m_hFont, MAKELPARAM(TRUE, 0));
}
if(m_pBanToChange != nullptr) {
if(m_pBanToChange->m_sNick != nullptr) {
::SetWindowText(m_hWndWindowItems[EDT_NICK], m_pBanToChange->m_sNick);
if(((m_pBanToChange->m_ui8Bits & BanManager::NICK) == BanManager::NICK) == true) {
::SendMessage(m_hWndWindowItems[BTN_NICK_BAN], BM_SETCHECK, BST_CHECKED, 0);
}
}
::SetWindowText(m_hWndWindowItems[EDT_IP], m_pBanToChange->m_sIp);
if(((m_pBanToChange->m_ui8Bits & BanManager::IP) == BanManager::IP) == true) {
::SendMessage(m_hWndWindowItems[BTN_IP_BAN], BM_SETCHECK, BST_CHECKED, 0);
::EnableWindow(m_hWndWindowItems[BTN_FULL_BAN], TRUE);
if(((m_pBanToChange->m_ui8Bits & BanManager::FULL) == BanManager::FULL) == true) {
::SendMessage(m_hWndWindowItems[BTN_FULL_BAN], BM_SETCHECK, BST_CHECKED, 0);
}
}
if(m_pBanToChange->m_sReason != nullptr) {
::SetWindowText(m_hWndWindowItems[EDT_REASON], m_pBanToChange->m_sReason);
}
if(m_pBanToChange->m_sBy != nullptr) {
::SetWindowText(m_hWndWindowItems[EDT_BY], m_pBanToChange->m_sBy);
}
if(((m_pBanToChange->m_ui8Bits & BanManager::TEMP) == BanManager::TEMP) == true) {
::SendMessage(m_hWndWindowItems[RB_PERM_BAN], BM_SETCHECK, BST_UNCHECKED, 0);
::SendMessage(m_hWndWindowItems[RB_TEMP_BAN], BM_SETCHECK, BST_CHECKED, 0);
::EnableWindow(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_DATE], TRUE);
::EnableWindow(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_TIME], TRUE);
SYSTEMTIME stDateTime = { 0 };
struct tm *tm = localtime(&m_pBanToChange->m_tTempBanExpire);
stDateTime.wDay = (WORD)tm->tm_mday;
stDateTime.wMonth = (WORD)(tm->tm_mon+1);
stDateTime.wYear = (WORD)(tm->tm_year+1900);
stDateTime.wHour = (WORD)tm->tm_hour;
stDateTime.wMinute = (WORD)tm->tm_min;
stDateTime.wSecond = (WORD)tm->tm_sec;
::SendMessage(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_DATE], DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&stDateTime);
::SendMessage(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_TIME], DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&stDateTime);
}
}
::EnableWindow(hWndParent, FALSE);
::ShowWindow(m_hWndWindowItems[WINDOW_HANDLE], SW_SHOW);
}
//------------------------------------------------------------------------------
bool BanDialog::OnAccept() {
bool bNickBan = ::SendMessage(m_hWndWindowItems[BTN_NICK_BAN], BM_GETCHECK, 0, 0) == BST_CHECKED ? true : false;
bool bIpBan = ::SendMessage(m_hWndWindowItems[BTN_IP_BAN], BM_GETCHECK, 0, 0) == BST_CHECKED ? true : false;
if(bNickBan == false && bIpBan == false) {
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_YOU_CANT_CREATE_BAN_WITHOUT_NICK_OR_IP], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
}
int iNickLen = ::GetWindowTextLength(m_hWndWindowItems[EDT_NICK]);
if(bNickBan == true && iNickLen == 0) {
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_FOR_NICK_BAN_SPECIFY_NICK], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
}
int iIpLen = ::GetWindowTextLength(m_hWndWindowItems[EDT_IP]);
char sIP[40];
::GetWindowText(m_hWndWindowItems[EDT_IP], sIP, 40);
uint8_t ui128IpHash[16];
memset(ui128IpHash, 0, 16);
if(bIpBan == true) {
if(iIpLen == 0) {
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_FOR_IP_BAN_SPECIFY_IP], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
} else if(HashIP(sIP, ui128IpHash) == false) {
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], (string(sIP) + " " + LanguageManager::m_Ptr->m_sTexts[LAN_IS_NOT_VALID_IP_ADDRESS]).c_str(), g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
}
}
time_t acc_time;
time(&acc_time);
time_t ban_time = 0;
bool bTempBan = ::SendMessage(m_hWndWindowItems[RB_TEMP_BAN], BM_GETCHECK, 0, 0) == BST_CHECKED ? true : false;
if(bTempBan == true) {
SYSTEMTIME stDate = { 0 };
SYSTEMTIME stTime = { 0 };
if(::SendMessage(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_DATE], DTM_GETSYSTEMTIME, 0, (LPARAM)&stDate) != GDT_VALID || ::SendMessage(m_hWndWindowItems[DT_TEMP_BAN_EXPIRE_TIME], DTM_GETSYSTEMTIME, 0, (LPARAM)&stTime) != GDT_VALID) {
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_BAD_TIME_SPECIFIED], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
}
struct tm *tm = localtime(&acc_time);
tm->tm_mday = stDate.wDay;
tm->tm_mon = (stDate.wMonth-1);
tm->tm_year = (stDate.wYear-1900);
tm->tm_hour = stTime.wHour;
tm->tm_min = stTime.wMinute;
tm->tm_sec = stTime.wSecond;
tm->tm_isdst = -1;
ban_time = mktime(tm);
if(ban_time == (time_t)-1 || ban_time <= acc_time) {
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_BAD_TIME_SPECIFIED_BAN_EXPIRED], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
}
}
if(m_pBanToChange == nullptr) {
BanItem * pBan = new (std::nothrow) BanItem();
if(pBan == nullptr) {
AppendDebugLog("%s - [MEM] Cannot allocate Ban in BanDialog::OnAccept\n");
return false;
}
if(iIpLen != 0) {
strcpy(pBan->m_sIp, sIP);
memcpy(pBan->m_ui128IpHash, ui128IpHash, 16);
if(bIpBan == true) {
pBan->m_ui8Bits |= BanManager::IP;
if(::SendMessage(m_hWndWindowItems[BTN_FULL_BAN], BM_GETCHECK, 0, 0) == BST_CHECKED) {
pBan->m_ui8Bits |= BanManager::FULL;
}
}
}
if(bTempBan == true) {
pBan->m_ui8Bits |= BanManager::TEMP;
pBan->m_tTempBanExpire = ban_time;
} else {
pBan->m_ui8Bits |= BanManager::PERM;
}
if(iNickLen != 0) {
pBan->m_sNick = (char *)HeapAlloc(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, iNickLen+1);
if(pBan->m_sNick == nullptr) {
AppendDebugLogFormat("[MEM] Cannot allocate %d bytes for sNick in BanDialog::OnAccept\n", iNickLen+1);
delete pBan;
return false;
}
::GetWindowText(m_hWndWindowItems[EDT_NICK], pBan->m_sNick, iNickLen+1);
pBan->m_ui32NickHash = HashNick(pBan->m_sNick, iNickLen);
if(bNickBan == true) {
pBan->m_ui8Bits |= BanManager::NICK;
// PPK ... not allow same nickbans !
BanItem *nxtBan = BanManager::m_Ptr->FindNick(pBan->m_ui32NickHash, acc_time, pBan->m_sNick);
if(nxtBan != nullptr) {
// PPK ... same ban exist, delete new
delete pBan;
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_SIMILAR_BAN_EXIST], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
}
}
}
if(bIpBan == true) {
BanItem *nxtBan = BanManager::m_Ptr->FindIP(pBan->m_ui128IpHash, acc_time);
if(nxtBan != nullptr) {
// PPK ... same ban exist, delete new
delete pBan;
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_SIMILAR_BAN_EXIST], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
return false;
}
}
int iReasonLen = ::GetWindowTextLength(m_hWndWindowItems[EDT_REASON]);
if(iReasonLen != 0) {
pBan->m_sReason = (char *)HeapAlloc(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, iReasonLen+1);
if(pBan->m_sReason == nullptr) {
AppendDebugLogFormat("[MEM] Cannot allocate %d bytes for sReason in BanDialog::OnAccept\n", iReasonLen+1);
delete pBan;
return false;
}
::GetWindowText(m_hWndWindowItems[EDT_REASON], pBan->m_sReason, iReasonLen+1);
}
int iByLen = ::GetWindowTextLength(m_hWndWindowItems[EDT_BY]);
if(iByLen != 0) {
pBan->m_sBy = (char *)HeapAlloc(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, iByLen+1);
if(pBan->m_sBy == nullptr) {
AppendDebugLogFormat("[MEM] Cannot allocate %d bytes for sBy in BanDialog::OnAccept\n", iByLen+1);
delete pBan;
return false;
}
::GetWindowText(m_hWndWindowItems[EDT_BY], pBan->m_sBy, iByLen+1);
}
if(BanManager::m_Ptr->Add(pBan) == false) {
delete pBan;
return false;
}
return true;
} else {
if(m_pBanToChange->m_sIp[0] != '\0' && iIpLen == 0) {
if(((m_pBanToChange->m_ui8Bits & BanManager::IP) == BanManager::IP) == true) {
BanManager::m_Ptr->RemFromIpTable(m_pBanToChange);
}
m_pBanToChange->m_sIp[0] = '\0';
memset(m_pBanToChange->m_ui128IpHash, 0, 16);
m_pBanToChange->m_ui8Bits &= ~BanManager::IP;
m_pBanToChange->m_ui8Bits &= ~BanManager::FULL;
} else if((m_pBanToChange->m_sIp[0] == '\0' && iIpLen != 0) ||
(m_pBanToChange->m_sIp[0] != '\0' && iIpLen != 0 && strcmp(m_pBanToChange->m_sIp, sIP) != 0)) {
if(((m_pBanToChange->m_ui8Bits & BanManager::IP) == BanManager::IP) == true) {
BanManager::m_Ptr->RemFromIpTable(m_pBanToChange);
}
strcpy(m_pBanToChange->m_sIp, sIP);
memcpy(m_pBanToChange->m_ui128IpHash, ui128IpHash, 16);
if(bIpBan == true) {
m_pBanToChange->m_ui8Bits |= BanManager::IP;
if(::SendMessage(m_hWndWindowItems[BTN_FULL_BAN], BM_GETCHECK, 0, 0) == BST_CHECKED) {
m_pBanToChange->m_ui8Bits |= BanManager::FULL;
} else {
m_pBanToChange->m_ui8Bits &= ~BanManager::FULL;
}
if(BanManager::m_Ptr->Add2IpTable(m_pBanToChange) == false) {
BanManager::m_Ptr->Rem(m_pBanToChange);
delete m_pBanToChange;
m_pBanToChange = nullptr;
return false;
}
} else {
m_pBanToChange->m_ui8Bits &= ~BanManager::IP;
m_pBanToChange->m_ui8Bits &= ~BanManager::FULL;
}
}
if(iIpLen != 0) {
if(bIpBan == true) {
if(((m_pBanToChange->m_ui8Bits & BanManager::IP) == BanManager::IP) == false) {
if(BanManager::m_Ptr->Add2IpTable(m_pBanToChange) == false) {
BanManager::m_Ptr->Rem(m_pBanToChange);
delete m_pBanToChange;
m_pBanToChange = nullptr;
return false;
}
}
m_pBanToChange->m_ui8Bits |= BanManager::IP;
if(::SendMessage(m_hWndWindowItems[BTN_FULL_BAN], BM_GETCHECK, 0, 0) == BST_CHECKED) {
m_pBanToChange->m_ui8Bits |= BanManager::FULL;
} else {
m_pBanToChange->m_ui8Bits &= ~BanManager::FULL;
}
} else {
if(((m_pBanToChange->m_ui8Bits & BanManager::IP) == BanManager::IP) == true) {
BanManager::m_Ptr->RemFromIpTable(m_pBanToChange);
}
m_pBanToChange->m_ui8Bits &= ~BanManager::IP;
m_pBanToChange->m_ui8Bits &= ~BanManager::FULL;
}
}
if(bTempBan == true) {
if(((m_pBanToChange->m_ui8Bits & BanManager::PERM) == BanManager::PERM) == true) {
m_pBanToChange->m_ui8Bits &= ~BanManager::PERM;
// remove from perm
if(m_pBanToChange->m_pPrev == nullptr) {
if(m_pBanToChange->m_pNext == nullptr) {
BanManager::m_Ptr->m_pPermBanListS = nullptr;
BanManager::m_Ptr->m_pPermBanListE = nullptr;
} else {
m_pBanToChange->m_pNext->m_pPrev = nullptr;
BanManager::m_Ptr->m_pPermBanListS = m_pBanToChange->m_pNext;
}
} else if(m_pBanToChange->m_pNext == nullptr) {
m_pBanToChange->m_pPrev->m_pNext = nullptr;
BanManager::m_Ptr->m_pPermBanListE = m_pBanToChange->m_pPrev;
} else {
m_pBanToChange->m_pPrev->m_pNext = m_pBanToChange->m_pNext;
m_pBanToChange->m_pNext->m_pPrev = m_pBanToChange->m_pPrev;
}
m_pBanToChange->m_pPrev = nullptr;
m_pBanToChange->m_pNext = nullptr;
// add to temp
if(BanManager::m_Ptr->m_pTempBanListE == nullptr) {
BanManager::m_Ptr->m_pTempBanListS = m_pBanToChange;
BanManager::m_Ptr->m_pTempBanListE = m_pBanToChange;
} else {
BanManager::m_Ptr->m_pTempBanListE->m_pNext = m_pBanToChange;
m_pBanToChange->m_pPrev = BanManager::m_Ptr->m_pTempBanListE;
BanManager::m_Ptr->m_pTempBanListE = m_pBanToChange;
}
}
m_pBanToChange->m_ui8Bits |= BanManager::TEMP;
m_pBanToChange->m_tTempBanExpire = ban_time;
} else {
if(((m_pBanToChange->m_ui8Bits & BanManager::TEMP) == BanManager::TEMP) == true) {
m_pBanToChange->m_ui8Bits &= ~BanManager::TEMP;
// remove from temp
if(m_pBanToChange->m_pPrev == nullptr) {
if(m_pBanToChange->m_pNext == nullptr) {
BanManager::m_Ptr->m_pTempBanListS = nullptr;
BanManager::m_Ptr->m_pTempBanListE = nullptr;
} else {
m_pBanToChange->m_pNext->m_pPrev = nullptr;
BanManager::m_Ptr->m_pTempBanListS = m_pBanToChange->m_pNext;
}
} else if(m_pBanToChange->m_pNext == nullptr) {
m_pBanToChange->m_pPrev->m_pNext = nullptr;
BanManager::m_Ptr->m_pTempBanListE = m_pBanToChange->m_pPrev;
} else {
m_pBanToChange->m_pPrev->m_pNext = m_pBanToChange->m_pNext;
m_pBanToChange->m_pNext->m_pPrev = m_pBanToChange->m_pPrev;
}
m_pBanToChange->m_pPrev = nullptr;
m_pBanToChange->m_pNext = nullptr;
// add to perm
if(BanManager::m_Ptr->m_pPermBanListE == nullptr) {
BanManager::m_Ptr->m_pPermBanListS = m_pBanToChange;
BanManager::m_Ptr->m_pPermBanListE = m_pBanToChange;
} else {
BanManager::m_Ptr->m_pPermBanListE->m_pNext = m_pBanToChange;
m_pBanToChange->m_pPrev = BanManager::m_Ptr->m_pPermBanListE;
BanManager::m_Ptr->m_pPermBanListE = m_pBanToChange;
}
}
m_pBanToChange->m_ui8Bits |= BanManager::PERM;
m_pBanToChange->m_tTempBanExpire = 0;
}
char * sNick = nullptr;
if(iNickLen != 0) {
sNick = (char *)HeapAlloc(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, iNickLen+1);
if(sNick == nullptr) {
AppendDebugLogFormat("[MEM] Cannot allocate %d bytes for sNick in BanDialog::OnAccept\n", iNickLen+1);
return false;
}
::GetWindowText(m_hWndWindowItems[EDT_NICK], sNick, iNickLen+1);
}
if(m_pBanToChange->m_sNick != nullptr && iNickLen == 0) {
if(((m_pBanToChange->m_ui8Bits & BanManager::NICK) == BanManager::NICK) == true) {
BanManager::m_Ptr->RemFromNickTable(m_pBanToChange);
}
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)m_pBanToChange->m_sNick) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sNick in BanDialog::OnAccept\n");
}
m_pBanToChange->m_sNick = nullptr;
m_pBanToChange->m_ui32NickHash = 0;
m_pBanToChange->m_ui8Bits &= ~BanManager::NICK;
} else if((m_pBanToChange->m_sNick == nullptr && iNickLen != 0) ||
(m_pBanToChange->m_sNick != nullptr && iNickLen != 0 && strcmp(m_pBanToChange->m_sNick, sNick) != 0)) {
if(((m_pBanToChange->m_ui8Bits & BanManager::NICK) == BanManager::NICK) == true) {
BanManager::m_Ptr->RemFromNickTable(m_pBanToChange);
}
if(m_pBanToChange->m_sNick != nullptr) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)m_pBanToChange->m_sNick) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sNick in BanDialog::OnAccept\n");
}
m_pBanToChange->m_sNick = nullptr;
}
m_pBanToChange->m_sNick = sNick;
m_pBanToChange->m_ui32NickHash = HashNick(m_pBanToChange->m_sNick, iNickLen);
if(bNickBan == true) {
m_pBanToChange->m_ui8Bits |= BanManager::NICK;
BanManager::m_Ptr->Add2NickTable(m_pBanToChange);
} else {
m_pBanToChange->m_ui8Bits &= ~BanManager::NICK;
}
}
if(sNick != nullptr && (m_pBanToChange->m_sNick != sNick)) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)sNick) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sNick in BanDialog::OnAccept\n");
}
}
if(iNickLen != 0) {
if(bNickBan == true) {
if(((m_pBanToChange->m_ui8Bits & BanManager::NICK) == BanManager::NICK) == false) {
BanManager::m_Ptr->Add2NickTable(m_pBanToChange);
}
m_pBanToChange->m_ui8Bits |= BanManager::NICK;
} else {
if(((m_pBanToChange->m_ui8Bits & BanManager::NICK) == BanManager::NICK) == true) {
BanManager::m_Ptr->RemFromNickTable(m_pBanToChange);
}
m_pBanToChange->m_ui8Bits &= ~BanManager::NICK;
}
}
int iReasonLen = ::GetWindowTextLength(m_hWndWindowItems[EDT_REASON]);
char * sReason = nullptr;
if(iReasonLen != 0) {
sReason = (char *)HeapAlloc(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, iReasonLen+1);
if(sReason == nullptr) {
AppendDebugLogFormat("[MEM] Cannot allocate %d bytes for sReason in BanDialog::OnAccept\n", iReasonLen+1);
return false;
}
::GetWindowText(m_hWndWindowItems[EDT_REASON], sReason, iReasonLen+1);
}
if(iReasonLen != 0) {
if(m_pBanToChange->m_sReason == nullptr || strcmp(m_pBanToChange->m_sReason, sReason) != 0) {
if(m_pBanToChange->m_sReason != nullptr) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)m_pBanToChange->m_sReason) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sReason in BanDialog::OnAccept\n");
}
m_pBanToChange->m_sReason = nullptr;
}
m_pBanToChange->m_sReason = sReason;
}
} else if(m_pBanToChange->m_sReason != nullptr) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)m_pBanToChange->m_sReason) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sReason in BanDialog::OnAccept\n");
}
m_pBanToChange->m_sReason = nullptr;
}
if(sReason != nullptr && (m_pBanToChange->m_sReason != sReason)) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)sReason) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sReason in BanDialog::OnAccept\n");
}
}
int iByLen = ::GetWindowTextLength(m_hWndWindowItems[EDT_BY]);
char * sBy = nullptr;
if(iByLen != 0) {
sBy = (char *)HeapAlloc(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, iByLen+1);
if(sBy == nullptr) {
AppendDebugLogFormat("[MEM] Cannot allocate %d bytes for sBy in BanDialog::OnAccept\n", iByLen+1);
return false;
}
::GetWindowText(m_hWndWindowItems[EDT_BY], sBy, iByLen+1);
}
if(iByLen != 0) {
if(m_pBanToChange->m_sBy == nullptr || strcmp(m_pBanToChange->m_sBy, sBy) != 0) {
if(m_pBanToChange->m_sBy != nullptr) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)m_pBanToChange->m_sBy) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sBy in BanDialog::OnAccept\n");
}
m_pBanToChange->m_sBy = nullptr;
}
m_pBanToChange->m_sBy = sBy;
}
} else if(m_pBanToChange->m_sBy != nullptr) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)m_pBanToChange->m_sBy) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sBy in BanDialog::OnAccept\n");
}
m_pBanToChange->m_sBy = nullptr;
}
if(sBy != nullptr && (m_pBanToChange->m_sBy != sBy)) {
if(HeapFree(ServerManager::m_hPtokaXHeap, HEAP_NO_SERIALIZE, (void *)sBy) == 0) {
AppendDebugLog("%s - [MEM] Cannot deallocate sBy in BanDialog::OnAccept\n");
}
}
if(BansDialog::m_Ptr != nullptr) {
BansDialog::m_Ptr->RemoveBan(m_pBanToChange);
BansDialog::m_Ptr->AddBan(m_pBanToChange);
}
return true;
}
}
//------------------------------------------------------------------------------
void BanDialog::BanDeleted(BanItem * pBan) {
if(m_pBanToChange == nullptr || pBan != m_pBanToChange) {
return;
}
::MessageBox(m_hWndWindowItems[WINDOW_HANDLE], LanguageManager::m_Ptr->m_sTexts[LAN_BAN_DELETED_ACCEPT_TO_NEW], g_sPtokaXTitle, MB_OK | MB_ICONEXCLAMATION);
}
//------------------------------------------------------------------------------
↑ V595 The 'sNick' pointer was utilized before it was verified against nullptr. Check lines: 691, 716.
↑ V595 The 'sReason' pointer was utilized before it was verified against nullptr. Check lines: 754, 772.
↑ V595 The 'sBy' pointer was utilized before it was verified against nullptr. Check lines: 793, 810.
↑ V575 The potential null pointer is passed into 'strcmp' function. Inspect the second argument.
↑ V575 The potential null pointer is passed into 'strcmp' function. Inspect the second argument.
↑ V575 The potential null pointer is passed into 'strcmp' function. Inspect the second argument.
↑ V796 It is possible that 'break' statement is missing in switch statement.