Files
Client/Server/ToolProject/AuthGama/AuthGamaDlg.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

319 lines
8.6 KiB
C++

// AuthGamaDlg.cpp : 구현 파일
//
#include "stdafx.h"
#include "AuthGama.h"
#include "AuthGamaDlg.h"
#include <Utility/Setup/ServerSetup.h>
#include <Log/ServerLog.h>
#include <DB/DBComponent.h>
#include <DB/AuthDBComponent.h>
extern "C"
{
#include <MD5/global.h>
#include <MD5/md5.h>
#include ".\authgamadlg.h"
}
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAuthGamaDlg 대화 상자
static void MD5Print (unsigned char digest[16], char *szOutput)
{
for (unsigned int i = 0; i < 16; i++)
{
sprintf (szOutput + i * 2, "%02x", digest[i]);
}
}
static void MD5String (char *szString, char* szOutput)
{
MD5_CTX context;
unsigned char digest[16];
unsigned int len = static_cast<unsigned int>(strlen(szString));
MD5Init (&context);
MD5Update (&context, reinterpret_cast<unsigned char*>(szString), len);
MD5Final (digest, &context);
MD5Print (digest, szOutput);
}
CAuthGamaDlg::CAuthGamaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAuthGamaDlg::IDD, pParent)
, m_szAuthAccount(_T(""))
, m_szAuthPassword(_T(""))
, m_szAuthResult(_T(""))
, m_szMD5Password(_T(""))
, m_szMD5HashVal(_T(""))
, m_szFindUID(_T(""))
, m_szFindAccount(_T(""))
, m_szFoundUID(_T(""))
, m_szFoundAccount(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CAuthGamaDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_AUTH_USER, m_szAuthAccount);
DDX_Text(pDX, IDC_AUTH_PASSWD, m_szAuthPassword);
DDX_Text(pDX, IDC_AUTH_RESULT, m_szAuthResult);
DDX_Text(pDX, IDC_MD5_PASSWORD, m_szMD5Password);
DDX_Text(pDX, IDC_MD5_HASHVAL, m_szMD5HashVal);
DDX_Text(pDX, IDC_UID_IN, m_szFindUID);
DDX_Text(pDX, IDC_ACCOUNT_IN, m_szFindAccount);
DDX_Text(pDX, IDC_UID_OUT, m_szFoundUID);
DDX_Text(pDX, IDC_ACCOUNT_OUT, m_szFoundAccount);
DDX_Control(pDX, IDC_AUTH_BTN, m_btnAuth);
DDX_Control(pDX, IDC_MD5_CONVERT_BTN, m_btnMD5);
DDX_Control(pDX, IDC_FIND_BTN, m_btnFind);
}
BEGIN_MESSAGE_MAP(CAuthGamaDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_DB_CONNECT, OnBnClickedDbConnect)
ON_BN_CLICKED(IDC_AUTH_BTN, OnBnClickedAuthBtn)
ON_BN_CLICKED(IDC_MD5_CONVERT_BTN, OnBnClickedMd5ConvertBtn)
ON_BN_CLICKED(IDC_FIND_BTN, OnBnClickedFindBtn)
ON_EN_CHANGE(IDC_ACCOUNT_IN, OnEnChangeAccountIn)
ON_EN_CHANGE(IDC_UID_IN, OnEnChangeUidIn)
END_MESSAGE_MAP()
// CAuthGamaDlg 메시지 처리기
BOOL CAuthGamaDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
// 프레임워크가 이 작업을 자동으로 수행합니다.
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
// DB에 연결되기 전까지 버튼을 누를 수 없도록 합니다.
m_btnAuth.EnableWindow(FALSE);
//m_btnMD5.EnableWindow(FALSE); // MD5 변환기능은 DB연결에 상관없이 사용가능하도록 변경(by zun!)
m_btnFind.EnableWindow(FALSE);
// 로그를 남기지 않습니다.
g_Log.Disable(0xFFFFFFFF);
g_SessionLog.Disable(0xFFFFFFFF);
return TRUE; // 컨트롤에 대한 포커스를 설정하지 않을 경우 TRUE를 반환합니다.
}
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
// 프레임워크에서 이 작업을 자동으로 수행합니다.
void CAuthGamaDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
// 이 함수를 호출합니다.
HCURSOR CAuthGamaDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CAuthGamaDlg::OnBnClickedDbConnect()
{
// 서버셋업에서 셋업을 읽어오고, 인증DB로 연결을 합니다.
CString szError;
CDBComponent& DBComponent = CDBSingleObject::GetInstance();
if (!CServerSetup::GetInstance().Initialize(CServerSetup::AuthServer))
{
// 인증서버 정보를 읽는 데 실패했습니다.
szError.Format("Read AuthServer info failed");
}
else if (!DBComponent.Connect(CDBComponent::Class_AuthDB))
{
// 연결에 실패하였습니다.
szError.Format("Connect DB failed : %s ", DBComponent.GetErrorString());
}
else
{
// 연결에 성공하였습니다.
m_btnAuth.EnableWindow(TRUE);
m_btnMD5.EnableWindow(TRUE);
m_btnFind.EnableWindow(TRUE);
SetWindowText(_T("AuthGama : AuthDB Connect Succeeded"));
}
if (!szError.IsEmpty())
{
AfxMessageBox(szError, MB_OK | MB_ICONERROR);
}
}
void CAuthGamaDlg::OnBnClickedAuthBtn()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(TRUE);
DWORD dwUID = 0;
CDBComponent& DBComponent = CDBSingleObject::GetInstance();
char szPassword[33];
char szMD5String[33];
_snprintf(szPassword, 33, m_szAuthPassword);
szPassword[32] = 0;
MD5String(szPassword, szMD5String);
szMD5String[32] = 0;
if (!DBComponent::AuthDB::LoginAuthGama(DBComponent,
m_szAuthAccount, szMD5String, dwUID))
{
m_szAuthResult.Format(_T("DB Error : %s"), DBComponent.GetErrorString());
}
else if (dwUID < 100)
{
switch(dwUID)
{
case 1: m_szAuthResult.Format(_T("Invalid password")); break;
case 2: m_szAuthResult.Format(_T("Unknown Account")); break;
case 5: m_szAuthResult.Format(_T("Password failed more than 3")); break;
default: m_szAuthResult.Format(_T("Unknown Error")); break;
}
}
else
{
m_szAuthResult.Format(_T("%d"), dwUID);
}
UpdateData(FALSE);
}
void CAuthGamaDlg::OnBnClickedMd5ConvertBtn()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(TRUE);
char szPassword[33];
char szMD5String[33];
_snprintf(szPassword, 33, m_szMD5Password);
szPassword[32] = 0;
MD5String(szPassword, szMD5String);
szMD5String[32] = 0;
m_szMD5HashVal.SetString(szMD5String);
UpdateData(FALSE);
}
void CAuthGamaDlg::OnBnClickedFindBtn()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(TRUE);
const int MAX_BUFFER = 64;
CString szError;
CDBComponent& DBComponent = CDBSingleObject::GetInstance();
unsigned long dwUID = 0;
if (!m_szFindUID.IsEmpty() && (0 != (dwUID = atol(m_szFindUID))))
{
char szAccount[MAX_BUFFER];
if (DBComponent::AuthDB::GetGamaAccountByUID(DBComponent, dwUID, szAccount, MAX_BUFFER))
{
m_szFoundUID.Format(_T("%d"), dwUID);
m_szFoundAccount.SetString(szAccount);
}
else
{
szError.Format(_T("DB Error : %s"), DBComponent.GetErrorString());
}
}
else if (!m_szFindAccount.IsEmpty())
{
if (DBComponent::AuthDB::GetGamaUIDByAccount(DBComponent, m_szFindAccount, dwUID))
{
m_szFoundUID.Format(_T("%d"), dwUID);
m_szFoundAccount.SetString(m_szFindAccount);
}
else
{
szError.Format(_T("DB Error : %s"), DBComponent.GetErrorString());
}
}
if (!szError.IsEmpty())
{
AfxMessageBox(szError, MB_OK | MB_ICONERROR);
}
UpdateData(FALSE);
}
void CAuthGamaDlg::OnOK()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
// CDialog::OnOK();
}
void CAuthGamaDlg::OnEnChangeAccountIn()
{
// TODO: RICHEDIT 컨트롤인 경우 이 컨트롤은
// CDialog::마스크에 OR 연산하여 설정된 ENM_CHANGE 플래그를 지정하여
// CRichEditCtrl().SetEventMask()를 호출하도록 OnInitDialog() 함수를 재지정하지 않으면
// 이 알림을 보내지 않습니다.
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(TRUE);
m_szFindUID.Empty();
UpdateData(FALSE);
}
void CAuthGamaDlg::OnEnChangeUidIn()
{
// TODO: RICHEDIT 컨트롤인 경우 이 컨트롤은
// CDialog::마스크에 OR 연산하여 설정된 ENM_CHANGE 플래그를 지정하여
// CRichEditCtrl().SetEventMask()를 호출하도록 OnInitDialog() 함수를 재지정하지 않으면
// 이 알림을 보내지 않습니다.
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(TRUE);
m_szFindAccount.Empty();
UpdateData(FALSE);
}