1313using Newtonsoft . Json ;
1414
1515using OXGaming . TibiaAPI . Constants ;
16+ using OXGaming . TibiaAPI . Utilities ;
1617
1718namespace OXGaming . TibiaAPI . Network
1819{
@@ -32,7 +33,6 @@ public class Connection : Communication, IDisposable
3233
3334 private readonly Client _client ;
3435
35- private readonly HttpClient _httpClient = new HttpClient ( ) ;
3636 private readonly HttpListener _httpListener = new HttpListener ( ) ;
3737
3838 private readonly NetworkMessage _clientInMessage ;
@@ -64,11 +64,10 @@ public class Connection : Communication, IDisposable
6464 private uint _clientSequenceNumber = 1 ;
6565 private uint _serverSequenceNumber = 1 ;
6666
67- private bool _isPacketParsingEnabled ;
67+ private bool _isResettingConnection = false ;
6868 private bool _isSendingToClient = false ;
6969 private bool _isSendingToServer = false ;
7070 private bool _isStarted ;
71- private bool _recompressPackets ;
7271
7372 public delegate void ReceivedMessageEventHandler ( byte [ ] data ) ;
7473
@@ -77,7 +76,13 @@ public class Connection : Communication, IDisposable
7776
7877 public ConnectionState ConnectionState { get ; set ; } = ConnectionState . Disconnected ;
7978
80- public bool AllowPacketModification { get ; set ; } = false ;
79+ public bool IsClientPacketDecryptionEnabled { get ; set ; } = true ;
80+ public bool IsClientPacketModificationEnabled { get ; set ; } = false ;
81+ public bool IsClientPacketParsingEnabled { get ; set ; } = true ;
82+ public bool IsServerPacketDecryptionEnabled { get ; set ; } = true ;
83+ public bool IsServerPacketCompressionEnabled { get ; set ; } = false ;
84+ public bool IsServerPacketModificationEnabled { get ; set ; } = false ;
85+ public bool IsServerPacketParsingEnabled { get ; set ; } = true ;
8186
8287 /// <summary>
8388 /// Initializes a new instance of the <see cref="Connection"/> class that acts as a proxy
@@ -90,16 +95,14 @@ public Connection(Client client)
9095 _clientOutMessage = new NetworkMessage ( _client ) ;
9196 _serverInMessage = new NetworkMessage ( _client ) ;
9297 _serverOutMessage = new NetworkMessage ( _client ) ;
93-
94- _httpClient . DefaultRequestHeaders . Add ( "user-agent" , "Mozilla/5.0" ) ;
9598 }
9699
97100 /// <summary>
98101 /// Starts the <see cref="HttpListener"/> and <see cref="TcpListener"/> objects that listen for incoming
99102 /// connection requests from the Tibia client.
100103 /// </summary>
101104 /// <returns>Returns true on success, or if already started. Returns false if an exception is thrown.</returns>
102- internal bool Start ( bool enablePacketParsing = true , int httpPort = 80 , string loginWebService = "" , bool recompressPackets = false )
105+ internal bool Start ( int httpPort = 7171 , string loginWebService = "" )
103106 {
104107 if ( _isStarted )
105108 {
@@ -130,8 +133,6 @@ internal bool Start(bool enablePacketParsing = true, int httpPort = 80, string l
130133
131134 _isStarted = true ;
132135 _loginWebService = loginWebService ;
133- _isPacketParsingEnabled = enablePacketParsing ;
134- _recompressPackets = recompressPackets ;
135136 ConnectionState = ConnectionState . ConnectingStage1 ;
136137 }
137138 catch ( Exception ex )
@@ -187,7 +188,7 @@ public void SendToClient(NetworkMessage message)
187188 }
188189 }
189190
190- message . PrepareToSend ( _xteaKey , ( _recompressPackets ? _zStream : null ) ) ;
191+ message . PrepareToSend ( _xteaKey , ( IsServerPacketCompressionEnabled ? _zStream : null ) ) ;
191192 SendToClient ( message . GetData ( ) ) ;
192193 }
193194
@@ -379,6 +380,13 @@ internal void Stop()
379380 /// </summary>
380381 private void ResetConnection ( )
381382 {
383+ if ( _isResettingConnection )
384+ {
385+ return ;
386+ }
387+
388+ _isResettingConnection = true ;
389+
382390 lock ( _clientSendLock )
383391 {
384392 _isSendingToClient = false ;
@@ -408,6 +416,7 @@ private void ResetConnection()
408416 _clientSequenceNumber = 1 ;
409417 _serverSequenceNumber = 1 ;
410418 _xteaKey = null ;
419+ _isResettingConnection = false ;
411420 ConnectionState = ConnectionState . ConnectingStage1 ;
412421 }
413422
@@ -772,7 +781,7 @@ private void BeginReceiveClientCallback(IAsyncResult ar)
772781
773782 OnReceivedClientMessage ? . Invoke ( _clientInMessage . GetData ( ) ) ;
774783
775- if ( _isPacketParsingEnabled )
784+ if ( IsClientPacketParsingEnabled )
776785 {
777786 _clientOutMessage . Reset ( ) ;
778787 ParseClientMessage ( _client , _clientInMessage , _clientOutMessage ) ;
@@ -801,27 +810,33 @@ private void BeginReceiveClientCallback(IAsyncResult ar)
801810 }
802811 else
803812 {
804- _clientInMessage . PrepareToParse ( _xteaKey ) ;
805- OnReceivedClientMessage ? . Invoke ( _clientInMessage . GetData ( ) ) ;
813+ if ( IsClientPacketDecryptionEnabled )
814+ {
815+ _clientInMessage . PrepareToParse ( _xteaKey ) ;
816+ OnReceivedClientMessage ? . Invoke ( _clientInMessage . GetData ( ) ) ;
817+ }
806818
807- if ( _isPacketParsingEnabled )
819+ if ( IsClientPacketParsingEnabled )
808820 {
809821 _clientOutMessage . Reset ( ) ;
810822 _clientOutMessage . SequenceNumber = _clientInMessage . SequenceNumber ;
811823
812824 ParseClientMessage ( _client , _clientInMessage , _clientOutMessage ) ;
813825
814- if ( AllowPacketModification )
826+ if ( IsClientPacketModificationEnabled && _client . Logger . Level == Logger . LogLevel . Debug )
815827 {
816828 _client . Logger . Debug ( $ "In Size: { _clientInMessage . Size } , Out Size: { _clientOutMessage . Size } ") ;
817829 _client . Logger . Debug ( $ "In Data: { BitConverter . ToString ( _clientInMessage . GetData ( ) ) . Replace ( '-' , ' ' ) } ") ;
818830 _client . Logger . Debug ( $ "Out Data: { BitConverter . ToString ( _clientOutMessage . GetData ( ) ) . Replace ( '-' , ' ' ) } ") ;
819831 }
820- SendToServer ( AllowPacketModification ? _clientOutMessage : _clientInMessage ) ;
832+ SendToServer ( IsClientPacketModificationEnabled ? _clientOutMessage : _clientInMessage ) ;
821833 }
822834 else
823835 {
824- _clientInMessage . PrepareToSend ( _xteaKey ) ;
836+ if ( IsClientPacketDecryptionEnabled )
837+ {
838+ _clientInMessage . PrepareToSend ( _xteaKey ) ;
839+ }
825840 SendToServer ( _clientInMessage . GetData ( ) ) ;
826841 }
827842 }
@@ -879,28 +894,34 @@ private void BeginReceiveServerCallback(IAsyncResult ar)
879894 count += read ;
880895 }
881896
882- _serverInMessage . PrepareToParse ( _xteaKey , _zStream ) ;
883- OnReceivedServerMessage ? . Invoke ( _serverInMessage . GetData ( ) ) ;
897+ if ( IsServerPacketDecryptionEnabled )
898+ {
899+ _serverInMessage . PrepareToParse ( _xteaKey , _zStream ) ;
900+ OnReceivedServerMessage ? . Invoke ( _serverInMessage . GetData ( ) ) ;
901+ }
884902
885- if ( _isPacketParsingEnabled )
903+ if ( IsServerPacketParsingEnabled )
886904 {
887905 _serverOutMessage . Reset ( ) ;
888906 _serverOutMessage . SequenceNumber = _serverInMessage . SequenceNumber ;
889907
890908 ParseServerMessage ( _client , _serverInMessage , _serverOutMessage ) ;
891909
892- if ( AllowPacketModification )
910+ if ( IsServerPacketModificationEnabled && _client . Logger . Level == Logger . LogLevel . Debug )
893911 {
894912 _client . Logger . Debug ( $ "In Size: { _serverInMessage . Size } , Out Size: { _serverOutMessage . Size } ") ;
895913 _client . Logger . Debug ( $ "In Data: { BitConverter . ToString ( _serverInMessage . GetData ( ) ) . Replace ( '-' , ' ' ) } ") ;
896914 _client . Logger . Debug ( $ "Out Data: { BitConverter . ToString ( _serverOutMessage . GetData ( ) ) . Replace ( '-' , ' ' ) } ") ;
897915 }
898916
899- SendToClient ( AllowPacketModification ? _serverOutMessage : _serverInMessage ) ;
917+ SendToClient ( IsServerPacketModificationEnabled ? _serverOutMessage : _serverInMessage ) ;
900918 }
901919 else
902920 {
903- _serverInMessage . PrepareToSend ( _xteaKey , ( _recompressPackets ? _zStream : null ) ) ;
921+ if ( IsServerPacketDecryptionEnabled )
922+ {
923+ _serverInMessage . PrepareToSend ( _xteaKey , IsServerPacketCompressionEnabled ? _zStream : null ) ;
924+ }
904925 SendToClient ( _serverInMessage . GetData ( ) ) ;
905926 }
906927
@@ -935,12 +956,16 @@ private async Task<string> PostAsync(string content)
935956 {
936957 try
937958 {
938- var postContent = new StringContent ( content , Encoding . UTF8 , "application/json" ) ;
939- var response = await _httpClient
940- . PostAsync ( new Uri ( GetLoginWebService ( ) ) , postContent )
941- . ConfigureAwait ( false ) ;
942- response . EnsureSuccessStatusCode ( ) ;
943- return await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
959+ using ( var httpClient = new HttpClient ( ) )
960+ {
961+ httpClient . DefaultRequestHeaders . Add ( "user-agent" , "Mozilla/5.0" ) ;
962+ var postContent = new StringContent ( content , Encoding . UTF8 , "application/json" ) ;
963+ using ( var response = await httpClient . PostAsync ( new Uri ( GetLoginWebService ( ) ) , postContent ) . ConfigureAwait ( false ) )
964+ {
965+ postContent . Dispose ( ) ;
966+ return await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
967+ }
968+ }
944969 }
945970 catch ( Exception ex )
946971 {
@@ -978,7 +1003,7 @@ protected virtual void Dispose(bool disposing)
9781003 {
9791004 if ( disposing )
9801005 {
981- _httpClient . Dispose ( ) ;
1006+ _httpListener . Close ( ) ;
9821007
9831008 if ( _clientSocket != null )
9841009 {
0 commit comments