khanat-opennel-code/code/nelns/login_system/nel_launcher_windows_ext/LoginDlg.cpp
2010-05-06 02:08:41 +02:00

387 lines
9 KiB
C++

// LoginDlg.cpp : implementation file
//
#include "stdafx.h"
#include "nel/misc/string_mapper.h"
#include "nel/misc/config_file.h"
#include "nel/misc/path.h"
#include "nel_launcherDlg.h"
#include "nel_launcher.h"
#include "MsgDlg.h"
#include "LoginDlg.h"
#include "patch.h"
#include "Md5.h"
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg dialog
using namespace std;
#define LOGIN_BG_X 0
#define LOGIN_BG_Y 0
CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoginDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
APP.ResetConnection();
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
ON_WM_CTLCOLOR()
ON_WM_SETCURSOR()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_NCLBUTTONUP()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg message handlers
HBRUSH CLoginDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd && pWnd->GetDlgCtrlID() == IDC_ERR_STATIC)
{
hbr = m_brush;
pDC->SetBkColor(RGB(12, 42, 52));
pDC->SetTextColor(RGB(255, 0, 0));
}
else if(nCtlColor == CTLCOLOR_STATIC)
{
hbr = m_brush;
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255, 255, 127));
}
else if(nCtlColor == CTLCOLOR_EDIT)
{
hbr = m_brushEdit;
pDC->SetTextColor(RGB(255, 255, 127));
pDC->SetBkColor(RGB(12, 42, 52));
}
return hbr;
}
CString CLoginDlg::GetLogin()
{
return APP.m_csLogin;
}
CString CLoginDlg::GetPassword()
{
return APP.m_csPassword;
}
BOOL CLoginDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString csLogin = APP.GetRegKeyValue(_T("Pseudo"));
m_brush.CreateStockObject(NULL_BRUSH);
m_brushEdit.CreateSolidBrush(RGB(12, 42, 52));
SetDlgItemText(IDC_ERR_STATIC, "");
SetDlgItemText(IDC_LOGIN_EDIT, csLogin);
if(csLogin.IsEmpty())
GotoDlgCtrl(GetDlgItem(IDC_LOGIN_EDIT));
else
GotoDlgCtrl(GetDlgItem(IDC_PWD_EDIT));
GetDlgItem(IDC_LOGINU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LOGIND_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_QUITU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_QUITD_STATIC)->ShowWindow(SW_HIDE);
((CEdit*)GetDlgItem(IDC_LOGIN_EDIT))->SetLimitText(12);
m_pictBG.LoadPicture(IDP_BG_LOGIN);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CLoginDlg::OnLogin()
{
unsigned char lpszBuffer[16];
CMD5 md5;
CString csHash;
char httpBuff[1024];
int nBytes;
CString csBuff;
CWaitCursor wc;
CString csUrl;
string Version = getVersion();
CTime t = CTime::GetCurrentTime();
APP.m_bAuthGame = FALSE;
GetDlgItemText(IDC_LOGIN_EDIT, APP.m_csLogin);
GetDlgItemText(IDC_PWD_EDIT, APP.m_csPassword);
SetDlgItemText(IDC_ERR_STATIC, "");
md5.SetContent(APP.m_csLogin + APP.m_csPassword + t.Format("%Y%m%d") + MAGIC_KEY_MD5);
md5.GetDigest(lpszBuffer);
csHash = md5.ConvertToAscii(lpszBuffer);
csUrl = "http://" + APP.m_config.m_csHost + APP.m_config.m_csUrlMain + "?digest=" + csHash + "&newlogin=" + APP.m_csLogin + "&clientApplication=ryzom";
TRY
{
CInternetSession session("nel_launcher");
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000);
session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 3);
CFile* pf = session.OpenURL(csUrl, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
while(nBytes = pf->Read(httpBuff, 1024))
{
csBuff += httpBuff;
}
}
CATCH_ALL(error)
{
SetDlgItemText(IDC_ERR_STATIC, "Cannot connect to server !");
return;
}
END_CATCH_ALL;
if(csBuff.Find("<!-- DEBUG: id:") != -1)
{
// Authentication OK !
APP.m_bAuthGame = TRUE;
APP.SetRegKey(_T("Pseudo"), APP.m_csLogin);
APP.SetRegKey(_T("Login"), "yes");
AuthWeb();
EndDialog(IDOK);
}
else
{
APP.m_bAuthGame = FALSE;
SetDlgItemText(IDC_ERR_STATIC, "Invalid login or password !");
}
}
BOOL CLoginDlg::AuthWeb()
{
CString csBuff;
char httpBuff[1024];
CString csHash;
CMD5 md5SPIP;
int nBytes;
unsigned char lpszBuffer[16];
// Authentication for web pages
TRY
{
CInternetSession session;
CString csIdSession, csSession;
csBuff.Empty();
memset(httpBuff, 0, 1024);
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000);
session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 3);
CFile* pf = session.OpenURL(URL_LOGIN_WEB, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
while(nBytes = pf->Read(httpBuff, 1024))
{
csBuff += httpBuff;
}
pf->Close();
if(csBuff.Find('/') != -1)
{
csSession = csBuff.Left(csBuff.Find('/'));
csIdSession = csBuff.Mid(csSession.GetLength()+1);
md5SPIP.SetContent(APP.m_csPassword + csSession);
memset(lpszBuffer, 0, 16);
md5SPIP.GetDigest(lpszBuffer);
csHash = md5SPIP.ConvertToAscii(lpszBuffer);
APP.m_bAuthWeb = TRUE;
TRY
{
CHttpConnection* phttp = session.GetHttpConnection(_T(RYZOM_HOST));
CHttpFile* pfile = phttp->OpenRequest(CHttpConnection::HTTP_VERB_POST, "/betatest/betatest_login_valid.php");
if(pfile)
{
CString csHeaders = _T("Content-Type: application/x-www-form-urlencoded");
CString csFormParams = _T("txtLogin="+APP.m_csLogin+"&digest="+csHash+"&idsession="+csIdSession);
TRY
{
csBuff.Empty();
pfile->SendRequest(csHeaders, (LPVOID)(LPCTSTR)csFormParams, csFormParams.GetLength());
UINT nRead = pfile->Read(csBuff.GetBuffer(15000), 14999);
csBuff.ReleaseBuffer();
csBuff.SetAt(nRead, 0);
if(csBuff.Find("/news/") == -1)
{
APP.m_bAuthWeb = FALSE;
}
}
CATCH_ALL(error)
{
APP.m_bAuthWeb = FALSE;
}
END_CATCH_ALL;
delete pfile;
}
else
{
APP.m_bAuthWeb = FALSE;
}
}
CATCH_ALL(error)
{
APP.m_bAuthWeb = FALSE;
}
END_CATCH_ALL;
}
}
CATCH_ALL(error)
{
APP.m_bAuthWeb = FALSE;
}
END_CATCH_ALL;
return APP.m_bAuthWeb;
}
void CLoginDlg::OnQuit()
{
EndDialog(IDCANCEL);
}
void CLoginDlg::OnOK()
{
OnLogin();
}
BOOL CLoginDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
POINT p;
CRect r1, r2;
GetCursorPos(&p);
GetDlgItem(IDC_LOGIND_STATIC)->GetWindowRect(&r1);
GetDlgItem(IDC_QUITD_STATIC)->GetWindowRect(&r2);
if(PtInRect(&r1, p) || PtInRect(&r2, p))
SetCursor(APP.m_hcPointer);
else
return CDialog::OnSetCursor(pWnd, nHitTest, message);
return TRUE;
}
void CLoginDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
POINT p;
CRect r1, r2;
SetCapture();
GetCursorPos(&p);
GetDlgItem(IDC_LOGIND_STATIC)->GetWindowRect(&r1);
GetDlgItem(IDC_QUITD_STATIC)->GetWindowRect(&r2);
if(PtInRect(&r1, p))
{
GetDlgItem(IDC_LOGIND_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LOGINU_STATIC)->ShowWindow(SW_HIDE);
}
else if(PtInRect(&r2, p))
{
GetDlgItem(IDC_QUITD_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_QUITU_STATIC)->ShowWindow(SW_HIDE);
}
else
CDialog::OnLButtonDown(nFlags, point);
}
void CLoginDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
POINT p;
CRect r1, r2;
ReleaseCapture();
GetCursorPos(&p);
GetDlgItem(IDC_LOGIND_STATIC)->GetWindowRect(&r1);
GetDlgItem(IDC_QUITD_STATIC)->GetWindowRect(&r2);
if(PtInRect(&r1, p))
{
GetDlgItem(IDC_LOGIND_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LOGINU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LOGINU_STATIC)->UpdateWindow();
OnLogin();
}
else if(PtInRect(&r2, p))
{
GetDlgItem(IDC_QUITD_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_QUITU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_QUITU_STATIC)->UpdateWindow();
OnQuit();
}
else
{
GetDlgItem(IDC_LOGIND_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LOGINU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_QUITD_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_QUITU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LOGINU_STATIC)->UpdateWindow();
GetDlgItem(IDC_QUITU_STATIC)->UpdateWindow();
CDialog::OnLButtonUp(nFlags, point);
}
}
void CLoginDlg::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
ReleaseCapture();
GetDlgItem(IDC_LOGIND_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_LOGINU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_QUITD_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_QUITU_STATIC)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_LOGINU_STATIC)->UpdateWindow();
GetDlgItem(IDC_QUITU_STATIC)->UpdateWindow();
CDialog::OnNcLButtonUp(nHitTest, point);
}
BOOL CLoginDlg::OnEraseBkgnd(CDC* pDC)
{
CRect r;
GetClientRect(&r);
m_pictBG.Display(*pDC, r);
return TRUE;
}