@@ -21,6 +21,7 @@ import (
2121 "github.com/anywherelan/awl/api"
2222 "github.com/anywherelan/awl/config"
2323 "github.com/anywherelan/awl/entity"
24+ "github.com/anywherelan/awl/protocol"
2425)
2526
2627func TestMakeFriends (t * testing.T ) {
@@ -391,6 +392,43 @@ func TestUpdateUseAsExitNodeConfig(t *testing.T) {
391392 ts .Equal ("" , info .SOCKS5 .UsingPeerID )
392393}
393394
395+ func TestSOCKS5ProxyFallbackToOldProtocol (t * testing.T ) {
396+ ts := NewTestSuite (t )
397+
398+ peer1 := ts .NewTestPeer (false ) // client
399+ peer2 := ts .NewTestPeer (false ) // server (simulates old version)
400+
401+ ts .makeFriends (peer2 , peer1 )
402+
403+ // Remove new protocol handler from peer2 to simulate old peer
404+ peer2 .app .P2p .Host ().RemoveStreamHandler (protocol .Socks5NoAuthMethod )
405+
406+ // Allow peer1 to use peer2 as exit node
407+ peer1Config , err := peer2 .api .KnownPeerConfig (peer1 .PeerID ())
408+ ts .NoError (err )
409+
410+ err = peer2 .api .UpdatePeerSettings (entity.UpdatePeerSettingsRequest {
411+ PeerID : peer1 .PeerID (),
412+ Alias : peer1Config .Alias ,
413+ DomainName : peer1Config .DomainName ,
414+ IPAddr : peer1Config .IPAddr ,
415+ AllowUsingAsExitNode : true ,
416+ })
417+ ts .NoError (err )
418+
419+ ts .Eventually (func () bool {
420+ peer2Config , err := peer1 .api .KnownPeerConfig (peer2 .PeerID ())
421+ ts .NoError (err )
422+ return peer2Config .AllowedUsingAsExitNode
423+ }, 15 * time .Second , 100 * time .Millisecond )
424+
425+ peer1 .app .SOCKS5 .SetProxyPeerID (peer2 .PeerID ())
426+ peer2 .app .SOCKS5 .SetProxyingLocalhostEnabled (true )
427+
428+ // Verify SOCKS5 still works via fallback to old protocol
429+ testSOCKS5Proxy (ts , peer1 .app .Conf .SOCKS5 .ListenAddress , "" )
430+ }
431+
394432func TestUpdatePeerSettingsIPAddr (t * testing.T ) {
395433 ts := NewTestSuite (t )
396434
0 commit comments