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>
319 lines
8.6 KiB
C++
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);
|
|
}
|