Example #1
0
int statcom_main(uint16_t server_port, uint16_t max_clients, char* module_name, int (*call_command_handler_function) (SSL *, int))
{
	int 	    setupdone=0, connection_id, connectSocket;
	pid_t 	    pid;

    /*SSL specific.*/
    SSL *ssl;
	SSL_CTX *ctx;

	total_clients = 0;
	ctx = initialize_SSL(server_port, max_clients, module_name);

	while(1) /*while loop to serve many connections. When one connection arrives, a new process is forked to handle it.*/
	{         /*and the parent process comes here again to continue listening.*/
        if((connectSocket = create_socket_connect_verify(server_port, max_clients, module_name, setupdone, &connection_id)) == ERROR)
            goto error;

        switch(pid = fork()) /* here a new child process is created and the parent continues.*/
        {
            case -1:/*something went wrong..*/
                mysyslog(LOG_ERR, "Error in forking a new %s connection.\nAborting.....\n", module_name);
                break;

            case  0:/*child process*/
                signal(SIGCHLD,SIG_IGN); /* to keep track of when a child is terminated.*/
                signal(SIGCLD,SIG_IGN); /* to keep track of when a child is terminated.*/

                if((ssl = do_ssl_handshake(ctx, connectSocket)) != NULL) /* if OK call function to handle engstation comms.*/
                    call_command_handler_function(ssl, connection_id); /* this function don't return until the station ends the connection.*/

                closeconnection(connectSocket, ssl, ctx, module_name); /* we're done handling this connection, the client will exit now.*/
                exit(0);	/*when finished handling comms, we kill the child.*/
                break;

            default: /*parent process go on. The parent goes back to the begining of the while loop to continue listening.*/
                      /*the child handles the new connection.*/
                setupdone = 1;
                mysyslog(LOG_INFO, "Parent saving PID=%d of child in slot=%d\n", pid,connection_id );
                used_ports[connection_id].childpid = pid; /*save the PID of the child in the used_port table.*/
                break;
        }
error: ; /*an empty statmenent is needed by the compiler.*/
    }

	return 0; 	/*we should never reach here !*/
}
//---------------------------------------------------------------------------------
int HandleCommand(t_connection c[], DWORD dwIndex, t_packet *packet, DWORD dwUserID, int cn)
{
	const int ttype	= packet->h.header.type;
	switch(ttype)
	{
	case CMD_NONE :
		break;
	case CMD_PING :
		break;
	case CMD_LOST_CONNECTION : 
		closeconnection(c, cn, CCT_NORMAL);
		break;
	case CMD_IM_GAME_SERVER :
		break;
	case CMD_ACCESS_CHAR_DB :		// 010613 YGI
		{
			const int server_id = packet->u.server_access_char_db.server_id;
			memcpy(c[cn].id, packet->u.server_access_char_db.id, ID_LENGTH);
			memcpy(c[cn].name, packet->u.server_access_char_db.name, NM_LENGTH);

			if(GetCharDB_SQL(c, cn) != 1) break;
			if(GetCharGameDB_SQL(c, cn) != 1 )  break;
			LPCHARLIST ch = &c[cn].chrlst;
			if(!CheckRookieServerAble(ch->Level))//021230 lsw
			{
				break;
			}
			ch->server_id = cn;
			// 030923 HK YGI
			int ret = get_BinaryData_from_Chr_Info(	(UCHAR *)ch->Ws, 
											(UCHAR *)ch->Ps, 
											(UCHAR *)ch->Skill, 
											(UCHAR *)ch->skillexp, 
											(UCHAR *)ch->tac_skillEXP, 
											(UCHAR *)var[cn], 						
											(UCHAR *)ch->inv, 
											(UCHAR *)ch->equip, 
											(UCHAR *)ch->quick, 
											(UCHAR *)ch->party, 
											(UCHAR *)ch->relation, 
											(UCHAR *)ch->employment, 
											(UCHAR *)ch->Item, 
											c[cn].id, c[cn].name ) ;
			if( ret != 1 ) break;

			ret = get_BinaryData_from_Chr_Info2 ( (UCHAR *)c[cn].chrlst.bank,  c[cn].id, c[cn].name ) ;
			if( ret != 1 ) break;
			/////////////////////////////
			ResetCharInfo(var[cn], ch);

//			PutEventItem( 2, &c[cn] );		// 이벤트용 아이템 넣어 주기	// BBD 040308	Map서버가 주기로 했음

			int refresh_inventory = CheckEventITem( ch );

			CheckEventJoin(&c[cn].chrlst);			// 020115 LTS

			/////////////////////////////////////////////////////////////////////////////////////
			memset(packet, 0, sizeof(t_packet));

			packet->h.header.type = CMD_ACCEPT_CHAR_DB;
			packet->h.header.size = sizeof(t_server_accept_char_db);
			t_server_accept_char_db *tp = &(packet->u.server_accept_char_db);

			strcpy( tp->name, c[cn].name );// 030923 HK YGI
			tp->server_id	= server_id;
			tp->Level		= ch->Level;
			tp->Exp			= ch->Exp;

			tp->Gender		= ch->Gender;
			tp->Face		= ch->Face;
			tp->nGuildCode	= ch->nGuildCode; // CSD-030324
			tp->Class		= ch->Class;
			tp->Spell		= ch->Spell;
			tp->Job			= ch->Job;		// 0212 YGI

			tp->Str			= ch->Str;
			tp->Con			= ch->Con;
			tp->Dex			= ch->Dex;
			tp->Wis			= ch->Wis;
			tp->Int			= ch->Int;
			tp->MoveP		= ch->MoveP;
			tp->Char		= ch->Char;
			tp->Endu		= ch->Endu;
			tp->Moral		= ch->Moral;

			tp->Money		= ch->Money;
			tp->nLife	= ch->Hp;
			tp->nMaxHp = ch->HpMax;
			tp->nMana = ch->Mana;
			tp->nMaxMp = ch->ManaMax;
			tp->nHungry	= ch->Hungry;
			tp->nMaxHungry	= ch->HungryMax;
			tp->Condition	= ch->Condition;
			tp->SprNo		= ch->SprNo;
			tp->X			= ch->X;
			tp->Y			= ch->Y;
			memcpy( tp->MapName, ch->MapName, 20);
			tp->Peacests	= ch->Peacests;
			tp->Sight		= ch->Sight;

			tp->BodyR		= ch->BodyR;
			tp->BodyG		= ch->BodyG;
			tp->BodyB		= ch->BodyB;

			tp->ClothR		= ch->ClothR;
			tp->ClothG		= ch->ClothG;
			tp->ClothB		= ch->ClothB;

			tp->Age			= ch->Age;
			tp->Luck		= ch->Luck;
			tp->wsps		= ch->wsps;
			memcpy( &tp->nation, &ch->name_status, sizeof( DWORD ) );			// 1004 YGI

			tp->accessory[0]	= ch->accessory[0];
			tp->accessory[1]	= ch->accessory[1];
			tp->accessory[2]	= ch->accessory[2];
			tp->accessory[3]	= ch->accessory[3];
			
			ch->mantle =   ch->equip[ WT_NECK].item_no;
			tp->mantle = ch->mantle;

			tp->bAlive			= ch->bAlive;
			tp->openhouse		= ch->openhouse;
			tp->disease[0]		= ch->disease[0];
			tp->disease[1]		= ch->disease[1];
			tp->disease[2]		= ch->disease[2];
			tp->disease[3]		= ch->disease[3];
			tp->disease[4]		= ch->disease[4];
			tp->disease[5]		= ch->disease[5];
			tp->total_id		= ch->total_id;

			tp->nPoison	= ch->nPoison;
			tp->nCurse = ch->nCurse;
			tp->nFire = ch->nFire;
			tp->nIce = ch->nIce;
			tp->nElect = ch->nElect;
			tp->nHoly = ch->nHoly;
			tp->viewtype		= ch->viewtype;		// 0212 YGI
			tp->social_status	= ch->social_status;
			tp->fame			= ch->fame;
			tp->fame_pk			= ch->fame_pk;		// 010915 LTS		//Fame_PK -> NWCharacter로 교체 DB에는 실제로 NWCharacter의 값이 들어갑니다.		
			tp->NWCharacter		= ch->NWCharacter;	// 010915 LTS
			tp->EventJoin		= ch->EventJoin;	// 020115 LTS
			tp->nUserAge		= GetUserAge(c[cn].id); // 030929 kyo
  			memcpy(tp->aStepInfo, ch->aStepInfo, sizeof(ch->aStepInfo));
  			if(!QueuePacket(c, cn, packet, 1)){break;}

			/////////////////////////////////////////////////////////////////////////
			memset(packet, 0, sizeof(t_packet));
			t_server_accept_char_game_db *tsac = &(packet->u.server_accept_char_game_db);

			packet->h.header.type = CMD_ACCEPT_CHAR_GAME_DB;
			packet->h.header.size = sizeof(t_server_accept_char_game_db);

			strcpy( tsac->name, c[cn].name );// 030923 HK YGI
			tsac->server_id		= server_id;
			tsac->BankMoney		= ch->BankMoney;	
			memcpy( &tsac->win_defeat, &ch->WinLoseScore, sizeof( DWORD ) );
			tsac->LadderScore = ch->LadderScore;
			tsac->LastLoan		= ch->LastLoan;
			tsac->nk3			= ch->nk[N_VYSEUS];
			tsac->nk4			= ch->nk[N_ZYPERN];
			tsac->nk6			= ch->nk[N_YILSE];
			tsac->killmon		= ch->killmon;
			tsac->killanimal	= ch->killanimal;
			tsac->killpc		= ch->killpc;
			tsac->reserved_point= ch->reserved_point;
			tsac->Tactics		= ch->Tactics;

			if(!QueuePacket(c, cn, packet, 1)) break;

			///////////////////////////////////////////////////////////////////////
			memset(packet, 0, sizeof(t_packet));

			packet->h.header.type = CMD_ACCEPT_BINARY_DATA;
			packet->h.header.size = sizeof(t_server_accept_binary_data);

			packet->u.server_accept_binary_data.server_id = server_id;
			strcpy( packet->u.server_accept_binary_data.name, c[cn].name );// 030923 HK YGI

			memcpy((UCHAR *)packet->u.server_accept_binary_data.Ws, (UCHAR *)ch->Ws, SIZE_OF_WS);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.Ps, (UCHAR *)ch->Ps, SIZE_OF_PS);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.Skill, (UCHAR *)ch->Skill, SIZE_OF_SKILL);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.skillexp, (UCHAR *)ch->skillexp, SIZE_OF_SKILL_EXP);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.tac_skillEXP, (UCHAR *)ch->tac_skillEXP, SIZE_OF_TAC_SKILL_EXP);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.equip, (UCHAR *)ch->equip, SIZE_OF_EQUIP);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.quick, (UCHAR *)ch->quick, SIZE_OF_QUICK);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.party, (UCHAR *)ch->party, SIZE_OF_PARTY);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.relation, (UCHAR *)ch->relation, SIZE_OF_RELATION);
			memcpy((UCHAR *)packet->u.server_accept_binary_data.employment, (UCHAR *)ch->employment, SIZE_OF_EMPLOYMENT);

			if(!QueuePacket(c, cn, packet, 1)) break;

			///////////////////////////////////////////////////////////////////////
			memset(packet, 0, sizeof(t_packet));

			packet->h.header.type = CMD_ACCEPT_SCRIPT_DATA;
			packet->h.header.size = sizeof(t_server_accept_script_data);

			packet->u.server_accept_script_data.server_id = server_id;
			strcpy( packet->u.server_accept_script_data.name, c[cn].name );// 030923 HK YGI
			memcpy((UCHAR *)packet->u.server_accept_script_data.script_var, (UCHAR *)var[cn], SIZE_OF_SCRIPT_VAR);

			if(!QueuePacket(c, cn, packet, 1)) break;

			///////////////////////////////////////////////////////////////////////
			memset(packet, 0, sizeof(t_packet));

			packet->h.header.type = CMD_ACCEPT_INV_DATA;
			packet->h.header.size = sizeof(t_server_accept_inv_data);

			packet->u.server_accept_inv_data.server_id = server_id;
			strcpy( packet->u.server_accept_inv_data.name, c[cn].name );// 030923 HK YGI
			memcpy((UCHAR *)packet->u.server_accept_inv_data.inv, (UCHAR *)ch->inv, SIZE_OF_INV);
			//021030 YGI
			packet->u.server_accept_inv_data.refresh_inventory = refresh_inventory;


			if(!QueuePacket(c, cn, packet, 1)) break;

			///////////////////////////////////////////////////////////////////////
			memset(packet, 0, sizeof(t_packet));

			packet->h.header.type = CMD_ACCEPT_ITEM_DATA;
			packet->h.header.size = sizeof(t_server_accept_item_data);

			packet->u.server_accept_item_data.server_id = server_id;

			strcpy( packet->u.server_accept_item_data.name, c[cn].name );// 030923 HK YGI
			memcpy((UCHAR *)packet->u.server_accept_item_data.Item, (UCHAR *)c[cn].chrlst.Item, SIZE_OF_ITEMINDEX);

			if(!QueuePacket(c, cn, packet, 1)) break;
			
			///////////////////////////////////////////////////////////////////////
			memset(packet, 0, sizeof(t_packet));

			packet->h.header.type = CMD_ACCEPT_BANKITEM_DATA;
			packet->h.header.size = sizeof(t_server_accept_bankitem_data);

			packet->u.server_accept_bankitem_data.server_id = server_id;
			strcpy( packet->u.server_accept_bankitem_data.name, c[cn].name );// 030923 HK YGI
			memcpy((UCHAR *)packet->u.server_accept_bankitem_data.bankitem, (UCHAR *)c[cn].chrlst.bank, SIZE_OF_BANKITEM);
			if(!QueuePacket(c, cn, packet, 1)) break;
		}break;
	case CMD_ACCESS_LOGIN :
		{
			::CheckIDAutherizing(*packet,cn);
		}break;
	case CMD_PARTY_ACCESS : 
		{
			::SendPartyInforForGameserver( packet->u.kein.server_req_party_db.server_id, packet->u.kein.server_req_party_db.ct, packet->u.kein.server_req_party_db.name, c, cn );
		}break;
	case CMD_REQ_PARTY_TOGETHER : 
		{
			::SendPartyInfoOfOtherCharToGameserver( packet->u.kein.server_req_party_together.party_name, packet->u.kein.server_req_party_together.my_name, packet->u.kein.server_req_party_together.server_id, c, cn );
		}break;

case CMD_CONNECT_INFO :							// 4개중의 하나의 캐릭터를 선택했다
	{	
		// 캐릭터초기화이후실행 0405 KHS 
		// 0405 YGI	new char
		int is_new_char = 0;
		if( ::GetCharNew(is_new_char, packet->u.client_connect_info.name ) )			// 4월 1일 새롭게 만든 캐릭터 인가?
		{
			if( is_new_char )
			{
				break;
			}// 1: 예전 캐릭터	0: 새로운 캐릭터
		}
		else 
		{
			break;
		}

		if( !CheckIsRealName( connections[cn].id, packet->u.client_connect_info.name ) )
		{
			break;
		}

		// 010301 khs  probide to hacking..
		memset(c[cn].name, 0, NM_LENGTH);
		strcpy(c[cn].name, packet->u.client_connect_info.name);

		StartMap		= packet->u.client_connect_info.startmap;	
		StartPosition	= packet->u.client_connect_info.startposition;
		
		if( StartMap < 0 || StartMap > 1 )				StartMap = 0;

		if( StartPosition == 99 ) 
		{			
		}			
		else if( StartPosition < 1 || StartPosition > 20 )
		{
			StartPosition = 1;
		}
					
		c[cn].chrlst.startmap		= StartMap;
		c[cn].chrlst.startposition	= StartPosition;
						
		memset(packet, 0, sizeof(t_packet));
		int ret = GetCharDB_SQL(c, cn);
		if( ret )		
		{				
			CheckStartMap( c, cn, StartPosition );		// 1004 YGI
			ret = GetCharGameDB_SQL(c,cn);
		}
		if( c[cn].chrlst.Hp == 0 )
		{	
			c[cn].chrlst.bAlive		= DEAD_; 
			c[cn].chrlst.Condition	= CON_DEATH;
			c[cn].chrlst.viewtype	= VIEWTYPE_GHOST_;
		}	
		else 
		{	
			c[cn].chrlst.bAlive 	= ALIVE_;
			c[cn].chrlst.Condition	= CON_NORMAL;
			c[cn].chrlst.viewtype	= VIEWTYPE_NORMAL_;
		}		
			
		if( c[cn].chrlst.startposition != 99 ) // 원래의 위치에 들어간다. 
		{	
			strcpy( c[cn].mapname, StartMapPosition[ StartMap][ StartPosition ] );
			strcpy( c[cn].chrlst.MapName, StartMapPosition[ StartMap][ StartPosition ] );
		}	
			
		if(ret == 1)
		{	
			//< CSD-030324
			extern void CheckNewGuildCode( CHARLIST *ch );
			CheckNewGuildCode( &c[cn].chrlst );
			//> CSD-030324
			packet->h.header.type = CMD_USER_DB;
			{
				PutPacketCharDB( c, cn, packet );
			}
			packet->h.header.size = sizeof(t_server_user_db_data);
			if(!QueuePacket(c, cn, packet, 1)) break;
		}	
		else // Invalid DB
		{	
			::MyLog(1, "Invalid DB [%s]", c[cn].name);

			packet->h.header.type = CMD_INVALID_DB;
			packet->h.header.size = 0;
			QueuePacket(c, cn, packet, 1);
			break;				
		}					
		break;				
	}
							
	case CMD_CHR_ITEM_INFO_0 :
		{					
			//------------------------------------------------------------
			// Send Char Binary Data
			//------------------------------------------------------------
			get_BinaryData_from_Chr_Info(	(UCHAR *)c[cn].chrlst.Ws, 
											(UCHAR *)c[cn].chrlst.Ps, 
											(UCHAR *)c[cn].chrlst.Skill, 
											(UCHAR *)c[cn].chrlst.skillexp, 
											(UCHAR *)c[cn].chrlst.tac_skillEXP, 
											(UCHAR *)var[c[cn].chrlst.server_id], 						
											(UCHAR *)c[cn].chrlst.inv, 
											(UCHAR *)c[cn].chrlst.equip, 
											(UCHAR *)c[cn].chrlst.quick, 
											(UCHAR *)c[cn].chrlst.party, 
											(UCHAR *)c[cn].chrlst.relation, 
											(UCHAR *)c[cn].chrlst.employment, 
											(UCHAR *)c[cn].chrlst.Item, 
											c[cn].id, c[cn].name ) ;
//			PutEventItem( 1, &c[cn] );		// 이벤트용 아이템 넣어 주기	// BBD 040308	Map서버가 주기로 했음
			SendItemQuick( c, cn ); 

			// 마법을 배우지 않고 모든 마법을 사용하려면 이곳에서  Ws/Ps를 Setting해주면 된다. 
			for( int i = 0 ; i < 1000 ; i ++)
			{
				if( c[cn].chrlst.Item[i] == 0) break;
			}
			c[cn].chrlst.ItemMax = i;
			SendLearnedItem( c, cn );		// 0730 YGI										
			break;			
		}					
								
	case CMD_CHR_ITEM_INFO_1 : SendItemEquip( c, cn ); break;
	case CMD_CHR_ITEM_INFO_2 : SendItemInventory( packet->u.client_item_inv.count, c, cn ); break;
			
	case CMD_CHAR_INFO_MAGIC : SendCharInfoMagic( c, cn ); break;
	case CMD_CHAR_INFO_SKILL : 
		{
			SendCharInfoSkill( c, cn ); 
			::MyLog(0, "Send [%s]Info to [%s]", c[cn].name, c[cn].id);
		}break;
			
	case CMD_CHAR_INFO_TAC_SKILL_EXP : SendCharInfotac_skillEXP( c, cn ); break;
				
	case CMD_CONNECT_INFO1 :	
		{
			char *map_name = 0;
			int ret = 0;
			if( c[cn].chrlst.startposition == 99 )
			{
				ret = GetMapName_SQL( c, cn); // 001126 KHS
				if( ret == 1 ) map_name = c[cn].mapname;
			}
			else
			{
				map_name = StartMapPosition[ c[cn].chrlst.startmap][c[cn].chrlst.startposition];
			}

			if( map_name )
			{
				ret = 0;
				int port = MapPort( map_name );
				if( port )
				{
					ret = 1;
					packet->u.kein.server_connect_info_kein.data1.port = port;
					ret += CheckEventObject( map_name, &packet->u.kein.server_connect_info_kein.u.data3);
					ret += CheckEventSound( map_name, &packet->u.kein.server_connect_info_kein.u.data3);
				}
			}

			if( ret )
			{	
				//-----------------------------------------------------------------
				//-----------------------------------------------------------------
				packet->h.header.type = CMD_CONNECT_INFO;
				packet->h.header.size = sizeof(t_server_connect_info);
				if( ret == 4 ) // object + sound
				{
					packet->h.header.size += sizeof(k_event_object_sound);
				}
				else if( ret == 3 )		// sound
				{
					packet->h.header.size += sizeof(k_event_sound);
					int sound_no = packet->u.kein.server_connect_info_kein.u.data3.sound_no;
					packet->u.kein.server_connect_info_kein.u.data4.sound_no = sound_no;
				}
				else if( ret == 2 )		// object
				{
					packet->h.header.size += sizeof(k_event_object);
				}
				packet->u.server_connect_info.startposition = c[cn].chrlst.startposition;
				if(!QueuePacket(c, cn, packet, 1))
				{
					break;
				}
			
				//-----------------------------------------------------------------
				c[cn].state = CONNECT_JOIN;
			}
			else // Invalid DB
			{
				::MyLog(0, "Invalid User DB [%s]", c[cn].name);

				packet->h.header.type = CMD_INVALID_DB;
				packet->h.header.size = 0;
				QueuePacket(c, cn, packet, 1);
				break;
			}	
			break;
		}
			
	case CMD_CREATE_CHAR :
	{		
		int ret = CreateChar_SQL(c, cn, packet);
		if(ret == 1)
		{	
			packet->h.header.type = CMD_ACCEPT_CREATE;
			packet->h.header.size = 1;
			packet->u.data[0]= 0 ;
			QueuePacket(c, cn, packet, 1);
			
			::MyLog( 0, "%s (ID:%s) is Generated ! IP %s", c[cn].id, c[cn].chrlst.Name, c[cn].ip_address );
			break;
		}	
		else
		{	
			int is_delete = 1;
			switch( ret )
			{
			case -100 : ::MyLog( 0, "Fail:Character Generation ( Already character %s, ID:%s :%d)", packet->u.client_create_char.name, c[cn].id, ret );
						RecvHackingUser( c[cn].id, packet->u.client_create_char.name, 20009, " ", "Not his Char" );
						is_delete = 0;		// 지우지 않는다.
				break;
			case -30 : ::MyLog( 0, "Fail : Try to make Character but NO ID in chr_log_info ( %s, ID:%s )", packet->u.client_create_char.name, c[cn].id );
				break;
			default  : ::MyLog( 0, "Fail : Character Generation( %s, ID:%s :%d)", packet->u.client_create_char.name, c[cn].id, ret );
				break;
			}

			if(is_delete) 
			{
				delete_char_create_fail( packet->u.client_create_char.name );
			}
		
			packet->h.header.type = CMD_INVALID_DB;
			packet->h.header.size = 1;
			packet->u.data[0]= 0 ;
			QueuePacket(c, cn, packet, 1);

			break;
		}	
		break;
	}		
	case CMD_DELETE_CHAR :
	{	
		const char* szName = packet->u.client_delete_char.szName;
		int ret = DeleteChar_SQL( c[cn].id, szName ,packet->u.client_delete_char.szSecretKeyCode );
		if(ret == 1)
		{	
			MyLog( LOG_NORMAL, "Success : Character Deleted (%s, ID:%s)", szName, c[cn].id );
			RecvHackingUser( c[cn].id, szName, HACKING_DELETE_CHAR_NORMAL_, c[cn].ip_address, "Character Deleted !! Normally.." );
									
			packet->h.header.type = CMD_ACCEPT_DELETE;
			packet->h.header.size = 1;
			packet->u.data[0]= 0 ;
			QueuePacket(c, cn, packet, 1);
			break;
		}	
		else
		{		
			MyLog( LOG_NORMAL, "Delete Fail !");
			
			packet->h.header.type = CMD_INVALID_DB;
			packet->h.header.size = 1;
			packet->u.data[0]= 0 ;
			QueuePacket(c, cn, packet, 1);
			break;
		}		
			
		break;
	}		
	case CMD_ISTHERE_CHARNAME : RecvIsThereCharName( cn, packet->u.client_isthere_charname.name );
		break;
			
	case CMD_CHECK_BETA_TEST : CheckBetaIdTest( cn, packet->u.kein.beta_check_id.id ); break;
	
	case  CMD_SPECIAL_ITEM		:
		RecvUpdateSpecial( &(packet->u.server_special_item)  );					break;
	
	case  CMD_UPDATE_CHAR_DB:	
		{
			int iRet = RecvUpdateCharDB( &(packet->u.update_char_db)  );					
			if(iRet != 1)
			{
				MyLog(0,"RecvUpdateCharDB Failed");
			}
		}break;
	case  CMD_UPDATE_BINARY_DATA0	:	
		{
			int iRet = RecvUpdateBinaryData( &(packet->u.server_update_binary_data0)  );	
			if(iRet != 1)
			{
				MyLog(0,"RecvUpdateBinaryData Failed");
			}
		}break;
	case  CMD_UPDATE_BINARY_DATA1	:	
		{
			int iRet = RecvUpdateBinaryData1( &(packet->u.server_update_binary_data1)  );	
			if(iRet != 1)
			{
				MyLog(0,"RecvUpdateBinaryData1 Failed");
			}
		}break;
	case  CMD_UPDATE_SCRIPT_DATA	:	
		{
			int iRet = RecvUpdateScriptData( &(packet->u.server_update_script_data)  );	
			if(iRet != 1)
			{
				MyLog(0,"RecvUpdateScriptData Failed");
			}
		}break;
	case  CMD_UPDATE_INV_DATA		:	
		{
			int iRet = RecvUpdateInvData( &(packet->u.server_update_inv_data)  );			
			if(iRet != 1)
			{
				MyLog(0,"RecvUpdateInvData Failed");
			} 
		}break;
	case  CMD_UPDATE_ITEM_DATA		:	
		{
			int iRet = RecvUpdateItemData( &(packet->u.server_update_item_data ) );		
			if(iRet != 1)
			{
				MyLog(0,"RecvUpdateItemData Failed");
			}
		}break;
	case  CMD_UPDATE_BANKITEM_DATA	:	
		{
			int iRet = RecvUpdateBankItemData( c, cn, &(packet->u.server_update_bankitem_data));	
			if(iRet != 1)
			{
				MyLog(0,"RecvUpdateBankItemData Failed");
			}
		}break;

	case CMD_REQ_DELETE_USERID :
		onepass.DeleteUsedID_SQL_ForPay( packet->u.gs_req_delete_userid.mapname, packet->u.gs_req_delete_userid.id, 0 ); 
		break;
			
	case CMD_REQ_INSERT_USERID : 
		{
			if(!::CheckIsRealName(packet->u.gs_req_insert_userid.id, packet->u.gs_req_insert_userid.name ) )
			{
				break;
			}
			
			t_packet tp;
			gs_req_insert_userid* pGRIU = &packet->u.gs_req_insert_userid;
			if( ::UpdateLogintablebyChangeMap( pGRIU->id, pGRIU->mapname ))	// LoginTable에 없음.. 즉, 들어갈수 있음..
			{	
				tp.h.header.type = CMD_JOINABLE;
				tp.u.ls_joinable.server_id = packet->u.gs_req_insert_userid.server_id;
				tp.h.header.size = sizeof( t_ls_joinable );
			}	
			else	
			{	
				tp.h.header.type = CMD_UPDATING;
				tp.u.ls_updating.server_id = packet->u.gs_req_insert_userid.server_id;
				tp.h.header.size = sizeof( t_ls_updating );
			}
			::QueuePacket( c, cn, &tp, 1 );
		}break;		
			
	///////////// network2.h을 위해..  0224 YGI ///////////////
	case CMD_CREATE_ABILITY :	SendCreateAbility( cn ); break;
	case CMD_THROW_DICE		:	SendThrowDice( packet->u.kein.client_throw_dice.type, cn ); break;
			
	case CMD_HOW_MANY_IN_MAP :	UpdateTotalMapConnections( packet->u.how_many_in_map.map, packet->u.how_many_in_map.how );
		break;
			
	case CMD_UPDATE_VERY_IMPORTANT_STATUS	:	RecvUpdateCharacterVeryImportantStatus( &(packet->u.update_very_important_status) );
		break;
			
	case CMD_UPDATE_VERY_IMPORTANT_TACTICS  :	RecvUpdateTacticSkillExpData( &(packet->u.update_very_important_tactics ));
		break;
			
	case CMD_ITEM_DURATION_CHANGE :
	case CMD_TACTICS_PARRYING_EXP :
	case CMD_REQ_PARTY_MEMBER	  : 
	case CMD_LEVELUP_POINT		  :
	case CMD_DELETE_ITEM		  : 
		
				MyLog( LOG_NORMAL,  "No Useful Protocol...%d from %d", packet->h.header.type, cn) ;
				
		break;
		
	case CMD_SEALSTONEFROMKING	:
				RecvSealStoneFromKing( packet->u.sealstone_fromking.nation );
		break;
		
	case CMD_SEALSTONE_STATUS	:
				RecvSealStoneStatus( packet );
		break;
		
	case CMD_NATION2NATION_RELATION :
				RecvNation2NationRelation( cn, &(packet->u.nation2nation_relation) );
		break;



	case CMD_HACKING_USER :
		{
				t_hacking_user *tp = &(packet->u.hacking_user );
				RecvHackingUser( tp->id, tp->name, tp->type, tp->ip, tp->cause );
		}
		break;

	case CMD_RARE_ITEM_MAKE_LOG :
		{
				RecvRareItemMakeLog( &packet->u.rare_item_make_log );
		}
		break;
	case CMD_SET_COMMANDER :						// 010915 LTS
	case CMD_SET_WARFIELD_POSSESSION :
	case CMD_DELETE_EVENT_JOIN :					// 020115 LTS
	case CMD_SAVE_WARNO :							// LTS NEW NATIONWAR
		CheckHandleByNationWar(packet,c,cn);
		break;
//<soto-030504
	case CMD_NEW_EVENT: if(LottoDBMgr())LottoDBMgr()->RecvNewEvent(&packet->u.Lotto_Info,cn);
		break;
	case CMD_WINNER_CHECK: if(LottoDBMgr())LottoDBMgr()->RecvWinnerCheck(&packet->u.Check_Winner,cn);
		break;
	case CMD_DEL_LOTTO_USER:
		{
			if (LottoDBMgr())
			{
				LottoDBMgr()->RecvDelUser(&packet->u.Check_Winner, cn);	// BBD 040127 인자추가
			}

			break;
		}
	case CMD_LOTTERY_INFO: if(LottoDBMgr())LottoDBMgr()->RecvLottery(&packet->u.Lotto_Info,cn);
		break;
	case CMD_CHECK_WINNER_MENU: if(LottoDBMgr())LottoDBMgr()->RecvCheckOpenWinnerMenu(&packet->u.Lotto_Winner_Menu,cn);
		break;
//>soto-030504
//<soto-HK
	case CMD_CAN_BUY: if(LottoDBMgr())
					  {
						  if(LocalMgr.IsAbleNation(TAIWAN | HONGKONG | CHINA))
						  {
							  if(GetShopDemon() != NULL)
							  {
								  DebugPrintf("GetShopDemon() Request CMD_CAN_BUY");
								  GetShopDemon()->RecvCanBuyLotto(&packet->u.Lotto_Buy,cn);
							  }
							  else
							  {
								  DebugPrintf("GetShopDemon() is NULL =====> 	 CMD_CAN_BUY");
							  }
						  }
						  else
						  {
								LottoDBMgr()->RecvCanBuyLotto(&packet->u.Lotto_Buy,cn);
						  }
					  }
		break;
	case CMD_LOTTO_BUY: if(LottoDBMgr())
						{
							if(LocalMgr.IsAbleNation(TAIWAN | HONGKONG | CHINA))
							{
								if(GetShopDemon() != NULL)
								{
									DebugPrintf("GetShopDemon() Request CMD_LOTTO_BUY");
									GetShopDemon()->RecvLottoBuy(&packet->u.Lotto_Buy,cn);
								}
								else
								{
									DebugPrintf("GetShopDemon() is NULL =====> 	 CMD_LOTTO_BUY");								
								}
							}
							else
							{
								
								LottoDBMgr()->RecvLottoBuy(&packet->u.Lotto_Buy);
							}
						}
						else
						{
														
						}
		break;
//>soto-HK
//<soto-Lotto추가
	case CMD_LOTTO_SEEK:
		{
			if(LottoDBMgr())
			{
				LottoDBMgr()->RecvLottoSeek(&packet->u.Lotto_Seek,cn);
			}
		}
		break;
//>soto-Lotto추가.
	default : 
		{		// 0308 YGI
			int msg = CheckHandleByKein( packet, c, cn );
			if(msg == 1)
			{
				break;
			}
			else 
			{	
				if(HandleCommand2(c, dwIndex, packet, dwUserID, cn))//020505 lsw 
				{
					break;
				}
				else
				{
					MyLog( LOG_NORMAL,  "ERROR : Unknown Protocol(%d) dwIndex:%d, dwUserID:%d, cn:%d ip:%d", packet->h.header.type, dwIndex, dwUserID, cn, c[cn].ip_address );
					return msg;
				}
			}
		}
	}		
				
			if( debug_SavePacketExeTimeIng() )
			{
				if( ttype != CMD_NONE )
				{		
					{	
						DWORD t = ViewCheckRoutine( 9999 );
						if( t < 30 )
						{
							Debug( "%2d:%d:%d %20s[%20s] Recv : %5d- %3d\n", g_hour,g_min,g_sec, c[cn].id, c[cn].name, ttype, t );
						}
						else if( t < 100 )
						{
							Debug( "%2d:%d:%d %20s[%20s] Recv : %5d--- %3d\n", g_hour,g_min,g_sec, c[cn].id, c[cn].name, ttype, t );
						}
						else if( t  < 200 )
						{
							Debug( "%2d:%d:%d %20s[%20s] Recv : %5d------ %3d\n",  g_hour,g_min,g_sec,c[cn].id, c[cn].name, ttype, t );
						}
						else
						{
							Debug( "%2d:%d:%d %20s[%20s] Recv : %5d---------- %3d\n", g_hour,g_min,g_sec, c[cn].id, c[cn].name, ttype, t );
						}
					}
				}
			}
	
	
	return(1);
}
Example #3
0
int main(int argc, char *argv[])
{
    DWORD dw;
    exit_th =0;

    if(argc > 1)
    {
        if(strcmp(argv[1],"-i")==0 )
            Install();
        else
            if(strcmp(argv[1],"-d")==0)
                Suppression();
            else
            {
                printf("Mauvaise option\n");
                printf("-i : installe le driver qui sera charge au demarrage\n");
                printf("-d : desinstalle le driver \n");
            }
        return 1;
    }

    //debut du programme
    printf("Appuyez sur une touche pour initialiser la connexion\n");
    system("pause 1 >Nul");
    Initialize();

    if(connection())
    {
        printf("connexion echouee, appuyez sur une touche pour sortir du programme\n");
        system("pause 1>null");
        return 1;
    }
    SetDebugPrivilege();
    printf("Connexion etablie");
    pipehandle = CreateNamedPipe("\\\\.\\\\pipe\\framework", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE,2, 2024, 2024, 0, 0);
    if(pipehandle ==  INVALID_HANDLE_VALUE)
    {
        printf("Error pipehandle\n");
        closeconnection();
        system("pause");
        return 1;
    }

     pipehandle_net = CreateNamedPipe("\\\\.\\\\pipe\\frameworkNet", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE,2, 2024, 2024, 0, 0);
    if(pipehandle ==  INVALID_HANDLE_VALUE)
    {
        printf("Error pipehandle\n");
        closeconnection();
        system("pause");
        return 1;
    }

    //Envoie IOCTL pour que le driver place les hooks ainsi que les callback
    driverhandle = CreateFile("\\\\.\\dkf",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);
    if(driverhandle == INVALID_HANDLE_VALUE)
    {
        suppression();
        printf("Error CreateFile failed \n");
        system("pause");
        return 2;
    }
    else
    {
        DeviceIoControl(driverhandle,IOCTL_DKF_START,NULL,0,NULL,0,&dw,0);
    }

    printf("Hook et callback ok\n");

    // lancement du Threaad
    th_handle =  CreateThread(0,0,(LPTHREAD_START_ROUTINE) ListenDriver,0,0,&dw);
    th_handle_net =  CreateThread(0,0,(LPTHREAD_START_ROUTINE) ListenDriverNet,0,0,&dw);
    printf("Pressez une touche pour arrêter le programme\n");
    system("pause 1>Nul");

    exit_th = 1;
    TerminateThread(th_handle_net,0);
    TerminateThread(th_handle,0);

    if(pipehandle)
        CloseHandle(pipehandle);

    printf("de-hook \n");
    DeviceIoControl(driverhandle,IOCTL_DKF_STOP,NULL,0,NULL,0,&dw,0);
    printf("Fermeture de la connexion \n");
    system("pause 1>Nul");

    closeconnection();
    return 0;
}
Example #4
0
void ClientThread::analizeCommand(QByteArray &bytearray){
    QString userName;
    if (bytearray.contains("USER")) {
        QRegExp rx("^USER\\s(.*)");
        rx.indexIn(bytearray);
        userName = rx.cap(1);
        mUser = User::getUser(userName);
        sendString(FTPProtocol::getInstance()->getResponse(331));
        return;
    }

    if (bytearray.contains("PASS")) {
        QRegExp rx("^PASS\\s(.*)");
        rx.indexIn(bytearray);
        QString pass = rx.cap(1);
        if (mUser.isNull())
        {
            sendString(FTPProtocol::getInstance()->getResponse(503,"PASS send before USER"));
        }
        else
        {
            if (mUser.auth(pass))
            {
                // logged in
                 sendString(FTPProtocol::getInstance()->getResponse(230));
                 setAuthenticated(true);
                 if (ftpFileSystem != NULL)
                    delete ftpFileSystem;
                 ftpFileSystem = new FtpFileSystem(mUser.getFolder(), mUser.getFileAccess());
            }
            else
            {
                // incorrect
                 sendString(FTPProtocol::getInstance()->getResponse(530));
            }
        }
        return;
    }
    if (isAuthenticated())
    {
        // RNFR -> RNTO sequence
        if (mRenameBeginned){
            if (bytearray.contains("RNTO")){
                QRegExp rx("^RNTO\\s(.*)");
                rx.indexIn(fromEncoding(bytearray));
                QString newName = rx.cap(1);
                mRenameBeginned = false;
                if (ftpFileSystem->rename(mRenameOldName, newName))
                    sendString(FTPProtocol::getInstance()->getResponse(250));
                else
                    sendString(FTPProtocol::getInstance()->getResponse(550));
                return;
            }
            sendString(FTPProtocol::getInstance()->getResponse(503));
            return;
        }
        if (bytearray.contains("SYST")){
            QString syst("Windows Type : L8");
            sendString(FTPProtocol::getInstance()->getResponse(215, syst));
            return;
        }
        if (bytearray.contains("FEAT")){
            QString syst("211-Features:\n\rMDTM\n\rREST STREAM\n\rSIZE\n\rMLST type*;size*;modify*;\n\rMLSD\n\rUTF8\n\rCLNT\n\rMFMT\n\r211 End");
            sendString(syst);
            return;
        }
        if (bytearray.contains("HELP")){
            QString syst("HELP OK");
            sendString(FTPProtocol::getInstance()->getResponse(214, syst));
            return;
        }
        if (bytearray.contains("PWD")){
            sendString(FTPProtocol::getInstance()->getResponse(257, toEncoding("\""+ftpFileSystem->getWorkingDirectory()+"\"")));
            return;
        }
        if (bytearray.contains("OPTS")){
            QRegExp rx("^OPTS ([\\w\\s]+)");
            rx.indexIn(bytearray);
            QRegExp rx2("^UTF8 (\\w+)");
            rx2.indexIn(rx.cap(1));
            if (rx2.cap(1) == "ON")
            {
                mIsUTF8 = true;
            }
            if (rx2.cap(1) == "OFF")
            {
                mIsUTF8 = false;
            }
            sendString(FTPProtocol::getInstance()->getResponse(200));
            return;
        }
        if (bytearray.contains("TYPE")){
            // set transfer type
            QRegExp rx("^TYPE (\\w)( (\\w))?");
            rx.indexIn(bytearray);
            qDebug() << "type" << rx.cap(1) << rx.cap(3);
            mType = rx.cap(1);
            sendString(FTPProtocol::getInstance()->getResponse(200));
            return;
            if (mType == "I")
            {
                sendString(FTPProtocol::getInstance()->getResponse(200));
            }
            else
            {
                sendString(FTPProtocol::getInstance()->getResponse(550));
            }
            return;
        }
        if (bytearray.contains("PORT")){
            mIsActiveMode = true;
            QRegExp rx("^PORT (\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)");
            rx.indexIn(bytearray);
            int p1,p2;
            QString buf(rx.cap(5));
            bool flag;
            p1 = rx.cap(5).toInt(&flag);
            p2 = rx.cap(6).toInt(&flag);
            QString addr = rx.cap(1)+"."+rx.cap(2)+"."+rx.cap(3)+"."+rx.cap(4);
            active_addr = addr;
            active_port = p1*256+p2;
            sendString(FTPProtocol::getInstance()->getResponse(200, "Port ok"));
            return;
        }

        if (bytearray.contains("LIST")){
            sendString(FTPProtocol::getInstance()->getResponse(150));
            sendList();
            sendString(FTPProtocol::getInstance()->getResponse(226));
            return;
        }
        if (bytearray.contains("QUIT")){
            sendString(FTPProtocol::getInstance()->getResponse(221));
            closeconnection();
            return;
        }
        if (bytearray.contains("CDUP")){
            if (ftpFileSystem->cdUp())
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("CWD")){
            QRegExp rx("^CWD\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString subFolder = rx.cap(1);
            if (ftpFileSystem->changeDir(subFolder))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("RETR")){
            QRegExp rx("^RETR\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            QString fullFileName = ftpFileSystem->getFileRead(filename);
            if (fullFileName != NULL)
            {
                sendString(FTPProtocol::getInstance()->getResponse(150));
                sendFile(fullFileName);
            }
            else
            {
                sendString(FTPProtocol::getInstance()->getResponse(550,"Permission denied"));
            }
            return;
        }
        if (bytearray.contains("STOR")){
            QRegExp rx("^STOR\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            QString fullFileName = ftpFileSystem->getFileWrite(filename);
            if (fullFileName != NULL)
            {
                sendString(FTPProtocol::getInstance()->getResponse(150));
                recvFile(fullFileName);
            }
            else
            {
                sendString(FTPProtocol::getInstance()->getResponse(550,"Permission denied"));
            }
            return;
        }
        if (bytearray.contains("RMD")){
            QRegExp rx("^RMD\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            if (ftpFileSystem->removeDir(filename))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("DELE")){
            QRegExp rx("^DELE\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString filename = rx.cap(1);
            if (ftpFileSystem->deleteFile(filename))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("MKD")){
            QRegExp rx("^MKD\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString dirName = rx.cap(1);
            if (ftpFileSystem->mkDir(dirName))
                sendString(FTPProtocol::getInstance()->getResponse(250));
            else
                sendString(FTPProtocol::getInstance()->getResponse(550));
            return;
        }
        if (bytearray.contains("PASV")){
            mIsActiveMode = false;
            selectPassivePort();
            return;
        }
        if (bytearray.contains("SIZE")){
            QRegExp rx("^SIZE\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString fileName = rx.cap(1);
            qint64 size;
            if (ftpFileSystem->getSize(fileName, &size))
            {
                sendString(FTPProtocol::getInstance()->getResponse(250, QString::number(size)));
            }
            else
            {
               sendString(FTPProtocol::getInstance()->getResponse(550));
            }
            return;
        }
        if (bytearray.contains("MDTM")){
            QRegExp rx("^MDTM\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            QString fileName = rx.cap(1);
            QString sdate = ftpFileSystem->getLastModified(fileName);
            if (sdate != NULL)
            {
                sendString(FTPProtocol::getInstance()->getResponse(250, sdate));
            }
            else
            {
               sendString(FTPProtocol::getInstance()->getResponse(550));
            }
            return;
        }
        if (bytearray.contains("RNFR")){
            QRegExp rx("^RNFR\\s(.*)");
            rx.indexIn(fromEncoding(bytearray));
            mRenameOldName = rx.cap(1);

            if (ftpFileSystem->exist(mRenameOldName) && ftpFileSystem->isWritable(mRenameOldName))
            {
                sendString(FTPProtocol::getInstance()->getResponse(350));
                mRenameBeginned = true;
            }
            else
                sendString(FTPProtocol::getInstance()->getResponse(550, "Permission denied"));
            return;
        }
    sendString(FTPProtocol::getInstance()->getResponse(500));
    }
    else
        sendString(FTPProtocol::getInstance()->getResponse(530));
}