// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef NL_SECURITY_CHECK_H
#define NL_SECURITY_CHECK_H
#include "nel/misc/types_nl.h"
#include "nel/net/login_cookie.h"
#include "nel/misc/md5.h"
#include "game_share/r2_basic_types.h"
/**
* CSecurityCode
*/
class CSecurityCode
{
public:
CSecurityCode() : AsNum(0) {}
void serial( NLMISC::IStream& s ) { s.serial(AsNum); } // dependency on msg.xml:CLIENT_QUIT_REQUEST format
private:
union
{
uint8 Data [2];
uint16 AsNum;
};
friend class CSecurityCheckForFastDisconnection;
friend bool operator!=( const CSecurityCode& sc1, const CSecurityCode& sc2 );
};
inline bool operator!=( const CSecurityCode& sc1, const CSecurityCode& sc2 )
{
return sc1.AsNum != sc2.AsNum;
}
/**
* CSecurityCheckForFastDisconnection
*/
class CSecurityCheckForFastDisconnection
{
public:
/// Default constructor
CSecurityCheckForFastDisconnection();
/// Set session (or can be set by receiveSecurityCode())
void setSessionId(TSessionId sessionId) { Block.SessionId = sessionId; }
/// Set cookie
void setCookie(const NLNET::CLoginCookie& cookie) { Block.Cookie.set(cookie.getUserAddr(), cookie.getUserKey(), cookie.getUserId()); } // don't use the default generated bitwise assignment operator, because of padding junk that would be copied
/// Return the security code
CSecurityCode encode(char *passPhrase);
/// Check the security code
void check(char *passPhrase);
/// Read some data from stream
void receiveSecurityCode(NLMISC::IStream& msgin);
/// Write some data to stream
static void forwardSecurityCode(NLMISC::IStream& msgout, TSessionId sessionId, CSecurityCode& securityCode);
private:
struct CBlock
{
TSessionId SessionId;
NLNET::CLoginCookie Cookie;
char PassPhrase [10];
};
CBlock Block;
CSecurityCode SecurityCode;
};
#endif // NL_SECURITY_CHECK_H
/* End of security_check.h */