@@ -20,6 +20,7 @@ import (
20
20
"github.com/WangYihang/Platypus/lib/util/str"
21
21
humanize "github.com/dustin/go-humanize"
22
22
"github.com/jedib0t/go-pretty/table"
23
+ "github.com/phayes/freeport"
23
24
)
24
25
25
26
type WebSocketMessage struct {
@@ -471,10 +472,12 @@ func (s *TCPServer) AddTermiteClient(client *TermiteClient) {
471
472
log .Error ("Duplicated income connection detected!" )
472
473
473
474
// Respond to termite client that the client is duplicated
475
+ client .EncoderLock .Lock ()
474
476
err := client .Encoder .Encode (message.Message {
475
477
Type : message .DUPLICATED_CLIENT ,
476
478
Body : message.BodyDuplicateClient {},
477
479
})
480
+ client .EncoderLock .Unlock ()
478
481
if err != nil {
479
482
// TODO: handle network error
480
483
log .Error ("Network error: %s" , err )
@@ -607,50 +610,58 @@ func TermiteMessageDispatcher(client *TermiteClient) {
607
610
conn , err := net .Dial ("tcp" , tc .Address )
608
611
if err != nil {
609
612
log .Error ("Connecting to %s failed: %s" , tc .Address , err .Error ())
613
+ tc .Termite .EncoderLock .Lock ()
610
614
tc .Termite .Encoder .Encode (message.Message {
611
615
Type : message .PUSH_TUNNEL_CONNECT_FAILED ,
612
616
Body : message.BodyPushTunnelConnectFailed {
613
617
Token : token ,
614
618
Reason : err .Error (),
615
619
},
616
620
})
621
+ tc .Termite .EncoderLock .Unlock ()
617
622
} else {
618
623
log .Success ("Connecting to %s succeed" , tc .Address )
619
624
Ctx .PushTunnelInstance [token ] = PushTunnelInstance {
620
625
Termite : tc .Termite ,
621
626
Conn : & conn ,
622
627
}
628
+ tc .Termite .EncoderLock .Lock ()
623
629
tc .Termite .Encoder .Encode (message.Message {
624
630
Type : message .PUSH_TUNNEL_CONNECTED ,
625
631
Body : message.BodyPushTunnelConnected {
626
632
Token : token ,
627
633
},
628
634
})
635
+ tc .Termite .EncoderLock .Unlock ()
629
636
go func () {
630
637
for {
631
638
buffer := make ([]byte , 0x400 )
632
639
n , err := conn .Read (buffer )
633
640
if err != nil {
634
641
log .Debug ("Reading from %s failed: %s" , tc .Address , err .Error ())
642
+ tc .Termite .EncoderLock .Lock ()
635
643
tc .Termite .Encoder .Encode (message.Message {
636
644
Type : message .PUSH_TUNNEL_DISCONNECTED ,
637
645
Body : message.BodyPushTunnelDisonnected {
638
646
Token : token ,
639
647
Reason : err .Error (),
640
648
},
641
649
})
650
+ tc .Termite .EncoderLock .Unlock ()
642
651
conn .Close ()
643
652
delete (Ctx .PushTunnelInstance , token )
644
653
break
645
654
} else {
646
655
log .Debug ("%d bytes read from %s" , n , tc .Address )
656
+ tc .Termite .EncoderLock .Lock ()
647
657
tc .Termite .Encoder .Encode (message.Message {
648
658
Type : message .PUSH_TUNNEL_DATA ,
649
659
Body : message.BodyPushTunnelData {
650
660
Token : token ,
651
661
Data : buffer [0 :n ],
652
662
},
653
663
})
664
+ tc .Termite .EncoderLock .Unlock ()
654
665
}
655
666
}
656
667
}()
@@ -703,19 +714,33 @@ func TermiteMessageDispatcher(client *TermiteClient) {
703
714
if ti , exists := Ctx .PushTunnelInstance [token ]; exists {
704
715
_ , err := (* ti .Conn ).Write (data )
705
716
if err != nil {
717
+ ti .Termite .EncoderLock .Lock ()
706
718
ti .Termite .Encoder .Encode (message.Message {
707
719
Type : message .PUSH_TUNNEL_CONNECT_FAILED ,
708
720
Body : message.BodyPushTunnelConnectFailed {
709
721
Token : token ,
710
722
Reason : err .Error (),
711
723
},
712
724
})
725
+ ti .Termite .EncoderLock .Unlock ()
713
726
(* ti .Conn ).Close ()
714
727
delete (Ctx .PushTunnelInstance , token )
715
728
}
716
729
} else {
717
730
log .Debug ("No such tunnel: %s" , token )
718
731
}
732
+ case message .DYNAMIC_TUNNEL_CREATED :
733
+ port := msg .Body .(* message.BodyDynamicTunnelCreated ).Port
734
+ local_address := fmt .Sprintf ("127.0.0.1:%d" , freeport .GetPort ())
735
+ remote_address := fmt .Sprintf ("127.0.0.1:%d" , port )
736
+ log .Success ("Mapping remote socks server (%s) into local address (%s)" , remote_address , local_address )
737
+ AddPullTunnelConfig (
738
+ Ctx .CurrentTermite ,
739
+ local_address ,
740
+ remote_address ,
741
+ )
742
+ case message .DYNAMIC_TUNNEL_CREATE_FAILED :
743
+ log .Error (msg .Body .(* message.BodyDynamicTunnelCreateFailed ).Reason )
719
744
}
720
745
}
721
746
}
0 commit comments