// 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 . //----------------------------------------------------------------------------- // includes //----------------------------------------------------------------------------- #include "stdpch.h" #include "dms.h" #include "nel/misc/debug.h" #include "user_connection_mgr.h" #include "server_animation_module.h" #include "server_admin_module.h" #include "server_edition_module.h" #include "string_mgr_module.h" #include "game_share/object.h" #include "game_share/scenario.h" #include "game_share/ring_access.h" #include "nel/net/module_common.h" #include "nel/net/module_manager.h" #include "nel/net/module.h" #include "nel/net/inet_address.h" #include "nel/net/module_socket.h" #include "nel/net/module_message.h" #include "game_share/module_security.h" #include "server_admin_module.h" #include "server_edition_module.h" #include "server_animation_module.h" using namespace R2; using namespace NLNET; using namespace NLMISC; using namespace std; extern CVariable TimeBeforeDisconnectionAfterKick; // If true load hibernating session and saved session at startup extern CVariable DssUseBs; // 1 minutes extern CVariable TimeBeforeAutoSaveTimeEditionSession; // 5 minutes extern CVariable TimeBeforeStopTestInEditionSessionWithNoPlayer; // 15 minutes extern CVariable TimeBeforeAutoHibernateEditionSessionWithNoPlayer; // 7 days extern CVariable TimeBeforeCloseHibernatingEditionSession; extern CVariable TimeBeforeAutoCloseAnimationSessionWithNoPlayer; CDynamicMapService* CDynamicMapService::_Instance=0; CDynamicMapService::CDynamicMapService( NLMISC::CConfigFile& confFile, NLNET::IModuleSocket * clientGateway) :_ConfigFile(confFile) { // _UserConnectionMgr = new CUserConnectionMgr(this); _UseNetwork = false; nlassert(!_Instance); _Instance = this; _AnimationModule = 0; _EditionModule = 0; _AdminModule = 0; _StringMgrModule = 0; IModuleManager &mm = IModuleManager::getInstance(); { IModule *imodule = mm.createModule("ServerAnimationModule", "ServerAnimationModule", ""); nlassert(imodule != NULL); _AnimationModule = safe_cast(imodule); _AnimationModule->init(clientGateway, this); } { IModule *imodule = mm.createModule("ServerAdminModule", "ServerAdminModule", ""); nlassert(imodule != NULL); _AdminModule = safe_cast(imodule); _AdminModule->init(clientGateway, this); } { IModule *imodule = mm.createModule("ServerEditionModule", "ServerEditionModule", ""); nlassert(imodule != NULL); _EditionModule = safe_cast(imodule); _EditionModule->init(clientGateway, this); } { IModule *imodule = mm.createModule("StringManagerModule", "StringManagerModule", ""); nlassert(imodule != NULL); _StringMgrModule = safe_cast(imodule); _StringMgrModule->init(clientGateway,this); } } CDynamicMapService::~CDynamicMapService() { IModuleManager &mm = IModuleManager::getInstance(); // _EditionModule->saveToDb(); mm.deleteModule(_EditionModule); _EditionModule = 0; mm.deleteModule(_AnimationModule); _AnimationModule = 0; mm.deleteModule(_StringMgrModule); _StringMgrModule = 0; mm.deleteModule(_AdminModule); _AdminModule = 0; _Instance = 0; } CDynamicMapService* CDynamicMapService::getInstance() { return _Instance; } void CDynamicMapService::init() { _UseNetwork = false; DssUseBs = 0; TimeBeforeAutoSaveTimeEditionSession = 0; TimeBeforeStopTestInEditionSessionWithNoPlayer = 0; TimeBeforeAutoHibernateEditionSessionWithNoPlayer = 0; TimeBeforeCloseHibernatingEditionSession = 0; TimeBeforeAutoCloseAnimationSessionWithNoPlayer = 0; } void CDynamicMapService::init2() { _UseNetwork = true; } void CDynamicMapService::translateAndForwardRequested(TDataSetRow senderId,CChatGroup::TGroupType groupType,std::string id,TSessionId sessionId) { _StringMgrModule->translateAndForward(senderId,groupType,id,sessionId); } void CDynamicMapService::forwardIncarnChat(TChanID id,TDataSetRow senderId,ucstring sentence) { _StringMgrModule->forwardIncarnChat(id, senderId,sentence); } IServerAnimationModule* CDynamicMapService::getAnimationModule() const { return _AnimationModule;} IServerEditionModule* CDynamicMapService::getEditionModule() const { return _EditionModule;} IServerAdminModule* CDynamicMapService::getAdminModule() const { return _AdminModule;} std::string CDynamicMapService::getValue(TSessionId sessionId, const std::string& msg) const { if (_StringMgrModule) { return _StringMgrModule->getValue(sessionId.asInt(), msg); } return msg; } namespace R2 { bool getCharInfo(NLNET::IModuleProxy *senderModuleProxy, uint32 & charId, NLMISC::CEntityId & clientEid, std::string & userPriv, std::string &extendedPriv) { const NLNET::TSecurityData *securityData = senderModuleProxy->findSecurityData(rmst_client_info); if (!CDynamicMapService::getInstance()->useNetwork()) { // userId = 999<; charId = 999<<4; clientEid = CEntityId::Unknown; clientEid.setShortId(charId); clientEid.setDynamicId(0x86); //FrontendId clientEid.setType(RYZOMID::player); userPriv =":DEV:"; extendedPriv = ""; return true; } if (securityData != NULL) { const struct TClientInfo* clientInfo= static_cast(securityData); //safe_cast ??? //userId = clientInfo->UserId; charId = uint32(clientInfo->ClientEid.getShortId()); clientEid = clientInfo->ClientEid; userPriv = clientInfo->UserPriv; extendedPriv = clientInfo->ExtendedPriv; return true; } else { return false; } } // same getCharInfo but return true only if client has been allowad by su to connect bool checkSecurityInfo(NLNET::IModuleProxy *senderModuleProxy, uint32 & charId, NLMISC::CEntityId & clientEid, std::string & userPriv, std::string &extendedPriv) { bool ok = getCharInfo(senderModuleProxy, charId, clientEid, userPriv, extendedPriv); if (!ok ) { nlwarning("Warning: Security issues: a client '%s' without security data try to connect... ", senderModuleProxy->getModuleName().c_str() ); return false; } IServerEditionModule* edition = CDynamicMapService::getInstance()->getEditionModule(); if (!edition) { return false; } ok = edition->isClientAuthorized(charId); if (!ok) { nlwarning( "Warning: A client '%s' '%s' %u '%s' try to send messages, without begin allowed (he was disconnected)", senderModuleProxy->getModuleName().c_str(), clientEid.toString().c_str(), charId, userPriv.c_str()); edition->disconnectChar(charId); edition->returnToPreviousSession(charId); return false; } return true; } } // namespace R2