@@ -84,7 +84,7 @@ public partial class Session : ISession
84
84
/// <summary>
85
85
/// Holds metada about session messages
86
86
/// </summary>
87
- private IEnumerable < MessageMetadata > _messagesMetadata ;
87
+ private SshMessageFactory _sshMessageFactory ;
88
88
89
89
/// <summary>
90
90
/// Holds connection socket.
@@ -523,7 +523,7 @@ public void Connect()
523
523
Reset ( ) ;
524
524
525
525
// Build list of available messages while connecting
526
- _messagesMetadata = GetMessagesMetadata ( ) ;
526
+ _sshMessageFactory = new SshMessageFactory ( ) ;
527
527
528
528
switch ( ConnectionInfo . ProxyType )
529
529
{
@@ -621,6 +621,8 @@ public void Connect()
621
621
ConnectionInfo . Authenticate ( this , _serviceFactory ) ;
622
622
_isAuthenticated = true ;
623
623
624
+ Thread . Sleep ( 2000 ) ;
625
+
624
626
// Register Connection messages
625
627
RegisterMessage ( "SSH_MSG_GLOBAL_REQUEST" ) ;
626
628
RegisterMessage ( "SSH_MSG_REQUEST_SUCCESS" ) ;
@@ -864,49 +866,6 @@ private bool TrySendMessage(Message message)
864
866
}
865
867
}
866
868
867
- private static IEnumerable < MessageMetadata > GetMessagesMetadata ( )
868
- {
869
- return new [ ]
870
- {
871
- new MessageMetadata { Name = "SSH_MSG_NEWKEYS" , Number = 21 , Type = typeof ( NewKeysMessage ) } ,
872
- new MessageMetadata { Name = "SSH_MSG_REQUEST_FAILURE" , Number = 82 , Type = typeof ( RequestFailureMessage ) } ,
873
- new MessageMetadata { Name = "SSH_MSG_KEXINIT" , Number = 20 , Type = typeof ( KeyExchangeInitMessage ) } ,
874
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_OPEN_FAILURE" , Number = 92 , Type = typeof ( ChannelOpenFailureMessage ) } ,
875
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_FAILURE" , Number = 100 , Type = typeof ( ChannelFailureMessage ) } ,
876
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_EXTENDED_DATA" , Number = 95 , Type = typeof ( ChannelExtendedDataMessage ) } ,
877
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_DATA" , Number = 94 , Type = typeof ( ChannelDataMessage ) } ,
878
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_REQUEST" , Number = 50 , Type = typeof ( RequestMessage ) } ,
879
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_REQUEST" , Number = 98 , Type = typeof ( ChannelRequestMessage ) } ,
880
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_BANNER" , Number = 53 , Type = typeof ( BannerMessage ) } ,
881
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_INFO_RESPONSE" , Number = 61 , Type = typeof ( InformationResponseMessage ) } ,
882
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_FAILURE" , Number = 51 , Type = typeof ( FailureMessage ) } ,
883
- new MessageMetadata { Name = "SSH_MSG_DEBUG" , Number = 4 , Type = typeof ( DebugMessage ) , } ,
884
- new MessageMetadata { Name = "SSH_MSG_KEXDH_INIT" , Number = 30 , Type = typeof ( KeyExchangeDhInitMessage ) } ,
885
- new MessageMetadata { Name = "SSH_MSG_GLOBAL_REQUEST" , Number = 80 , Type = typeof ( GlobalRequestMessage ) } ,
886
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_OPEN" , Number = 90 , Type = typeof ( ChannelOpenMessage ) } ,
887
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_OPEN_CONFIRMATION" , Number = 91 , Type = typeof ( ChannelOpenConfirmationMessage ) } ,
888
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_INFO_REQUEST" , Number = 60 , Type = typeof ( InformationRequestMessage ) } ,
889
- new MessageMetadata { Name = "SSH_MSG_UNIMPLEMENTED" , Number = 3 , Type = typeof ( UnimplementedMessage ) } ,
890
- new MessageMetadata { Name = "SSH_MSG_REQUEST_SUCCESS" , Number = 81 , Type = typeof ( RequestSuccessMessage ) } ,
891
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_SUCCESS" , Number = 99 , Type = typeof ( ChannelSuccessMessage ) } ,
892
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_PASSWD_CHANGEREQ" , Number = 60 , Type = typeof ( PasswordChangeRequiredMessage ) } ,
893
- new MessageMetadata { Name = "SSH_MSG_DISCONNECT" , Number = 1 , Type = typeof ( DisconnectMessage ) } ,
894
- new MessageMetadata { Name = "SSH_MSG_SERVICE_REQUEST" , Number = 5 , Type = typeof ( ServiceRequestMessage ) } ,
895
- new MessageMetadata { Name = "SSH_MSG_KEX_DH_GEX_REQUEST" , Number = 34 , Type = typeof ( KeyExchangeDhGroupExchangeRequest ) } ,
896
- new MessageMetadata { Name = "SSH_MSG_KEX_DH_GEX_GROUP" , Number = 31 , Type = typeof ( KeyExchangeDhGroupExchangeGroup ) } ,
897
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_SUCCESS" , Number = 52 , Type = typeof ( SuccessMessage ) } ,
898
- new MessageMetadata { Name = "SSH_MSG_USERAUTH_PK_OK" , Number = 60 , Type = typeof ( PublicKeyMessage ) } ,
899
- new MessageMetadata { Name = "SSH_MSG_IGNORE" , Number = 2 , Type = typeof ( IgnoreMessage ) } ,
900
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_WINDOW_ADJUST" , Number = 93 , Type = typeof ( ChannelWindowAdjustMessage ) } ,
901
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_EOF" , Number = 96 , Type = typeof ( ChannelEofMessage ) } ,
902
- new MessageMetadata { Name = "SSH_MSG_CHANNEL_CLOSE" , Number = 97 , Type = typeof ( ChannelCloseMessage ) } ,
903
- new MessageMetadata { Name = "SSH_MSG_SERVICE_ACCEPT" , Number = 6 , Type = typeof ( ServiceAcceptMessage ) } ,
904
- new MessageMetadata { Name = "SSH_MSG_KEXDH_REPLY" , Number = 31 , Type = typeof ( KeyExchangeDhReplyMessage ) } ,
905
- new MessageMetadata { Name = "SSH_MSG_KEX_DH_GEX_INIT" , Number = 32 , Type = typeof ( KeyExchangeDhGroupExchangeInit ) } ,
906
- new MessageMetadata { Name = "SSH_MSG_KEX_DH_GEX_REPLY" , Number = 33 , Type = typeof ( KeyExchangeDhGroupExchangeReply ) }
907
- } ;
908
- }
909
-
910
869
/// <summary>
911
870
/// Receives the message from the server.
912
871
/// </summary>
@@ -1332,12 +1291,8 @@ protected virtual void OnKeyExchangeInitReceived(KeyExchangeInitMessage message)
1332
1291
1333
1292
_keyExchangeCompletedWaitHandle . Reset ( ) ;
1334
1293
1335
- // Disable all registered messages except key exchange related
1336
- foreach ( var messageMetadata in _messagesMetadata )
1337
- {
1338
- if ( messageMetadata . Activated && messageMetadata . Number > 2 && ( messageMetadata . Number < 20 || messageMetadata . Number > 30 ) )
1339
- messageMetadata . Enabled = false ;
1340
- }
1294
+ // Disable messages that are not key exchange related
1295
+ _sshMessageFactory . DisableNonKeyExchangeMessages ( ) ;
1341
1296
1342
1297
_keyExchange = _serviceFactory . CreateKeyExchange ( ConnectionInfo . KeyExchangeAlgorithms ,
1343
1298
message . KeyExchangeAlgorithms ) ;
@@ -1395,12 +1350,8 @@ protected virtual void OnNewKeysReceived(NewKeysMessage message)
1395
1350
_keyExchange = null ;
1396
1351
}
1397
1352
1398
- // Enable all active registered messages
1399
- foreach ( var messageMetadata in _messagesMetadata )
1400
- {
1401
- if ( messageMetadata . Activated )
1402
- messageMetadata . Enabled = true ;
1403
- }
1353
+ // Enable activated messages that are not key exchange related
1354
+ _sshMessageFactory . EnableActivatedMessages ( ) ;
1404
1355
1405
1356
var newKeysReceived = NewKeysReceived ;
1406
1357
if ( newKeysReceived != null )
@@ -1662,7 +1613,7 @@ private byte[] Read(int length)
1662
1613
/// <param name="messageName">The name of the message to register with the session.</param>
1663
1614
public void RegisterMessage ( string messageName )
1664
1615
{
1665
- InternalRegisterMessage ( messageName ) ;
1616
+ _sshMessageFactory . EnableAndActivateMessage ( messageName ) ;
1666
1617
}
1667
1618
1668
1619
/// <summary>
@@ -1671,7 +1622,7 @@ public void RegisterMessage(string messageName)
1671
1622
/// <param name="messageName">The name of the message to unregister with the session.</param>
1672
1623
public void UnRegisterMessage ( string messageName )
1673
1624
{
1674
- InternalUnRegisterMessage ( messageName ) ;
1625
+ _sshMessageFactory . DisableAndDeactivateMessage ( messageName ) ;
1675
1626
}
1676
1627
1677
1628
/// <summary>
@@ -1686,23 +1637,14 @@ public void UnRegisterMessage(string messageName)
1686
1637
private Message LoadMessage ( byte [ ] data , int offset )
1687
1638
{
1688
1639
var messageType = data [ offset ] ;
1689
- var messageMetadata = ( from m in _messagesMetadata where m . Number == messageType && m . Enabled && m . Activated select m ) . FirstOrDefault ( ) ;
1690
- if ( messageMetadata == null )
1691
- throw new SshException ( string . Format ( CultureInfo . CurrentCulture , "Message type {0} is not valid." , messageType ) ) ;
1692
-
1693
- var message = messageMetadata . Type . CreateInstance < Message > ( ) ;
1694
-
1640
+ var message = _sshMessageFactory . Create ( messageType ) ;
1695
1641
message . Load ( data , offset ) ;
1696
1642
1697
1643
DiagnosticAbstraction . Log ( string . Format ( "ReceiveMessage from server: '{0}': '{1}'." , message . GetType ( ) . Name , message ) ) ;
1698
1644
1699
1645
return message ;
1700
1646
}
1701
1647
1702
- partial void InternalRegisterMessage ( string messageName ) ;
1703
-
1704
- partial void InternalUnRegisterMessage ( string messageName ) ;
1705
-
1706
1648
#endregion
1707
1649
1708
1650
/// <summary>
@@ -2402,18 +2344,5 @@ bool ISession.TrySendMessage(Message message)
2402
2344
}
2403
2345
2404
2346
#endregion ISession implementation
2405
-
2406
- private class MessageMetadata
2407
- {
2408
- public string Name { get ; set ; }
2409
-
2410
- public byte Number { get ; set ; }
2411
-
2412
- public bool Enabled { get ; set ; }
2413
-
2414
- public bool Activated { get ; set ; }
2415
-
2416
- public Type Type { get ; set ; }
2417
- }
2418
2347
}
2419
2348
}
0 commit comments