summaryrefslogtreecommitdiff
path: root/modes/stun_udp/stun_udp.go
diff options
context:
space:
mode:
Diffstat (limited to 'modes/stun_udp/stun_udp.go')
-rw-r--r--modes/stun_udp/stun_udp.go125
1 files changed, 105 insertions, 20 deletions
diff --git a/modes/stun_udp/stun_udp.go b/modes/stun_udp/stun_udp.go
index d1cff6f..81ef6d8 100644
--- a/modes/stun_udp/stun_udp.go
+++ b/modes/stun_udp/stun_udp.go
@@ -46,6 +46,9 @@ import (
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/termmon"
"github.com/OperatorFoundation/shapeshifter-ipc"
"github.com/OperatorFoundation/shapeshifter-transports/transports/base"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs2"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"
)
const (
@@ -65,9 +68,9 @@ func NewConnState() ConnState {
type ConnTracker map[string]ConnState
-func ClientSetup(termMon *termmon.TermMonitor, target string, ptClientProxy *url.URL, factories map[string]base.ClientFactory) bool {
+func ClientSetup(termMon *termmon.TermMonitor, target string, ptClientProxy *url.URL, names []string, options string) bool {
// Launch each of the client listeners.
- for name, f := range factories {
+ for _, name := range names {
udpAddr, err := net.ResolveUDPAddr("udp", socksAddr)
if err != nil {
fmt.Println("Error resolving address", socksAddr)
@@ -80,7 +83,7 @@ func ClientSetup(termMon *termmon.TermMonitor, target string, ptClientProxy *url
continue
}
- go clientHandler(target, termMon, name, f, ln, ptClientProxy)
+ go clientHandler(target, termMon, name, options, ln, ptClientProxy)
log.Infof("%s - registered listener: %s", name, ln)
}
@@ -88,7 +91,7 @@ func ClientSetup(termMon *termmon.TermMonitor, target string, ptClientProxy *url
return true
}
-func clientHandler(target string, termMon *termmon.TermMonitor, name string, f base.ClientFactory, conn *net.UDPConn, proxyURI *url.URL) {
+func clientHandler(target string, termMon *termmon.TermMonitor, name string, options string, conn *net.UDPConn, proxyURI *url.URL) {
defer conn.Close()
termMon.OnHandlerStart()
defer termMon.OnHandlerFinish()
@@ -131,7 +134,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, f b
fmt.Println("Opening connection to ", target)
- openConnection(&tracker, addr.String(), target, termMon, f, proxyURI)
+ openConnection(&tracker, addr.String(), target, termMon, name, options, proxyURI)
// Drop the packet.
fmt.Println("recv: Open")
@@ -139,16 +142,16 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, f b
}
}
-func openConnection(tracker *ConnTracker, addr string, target string, termMon *termmon.TermMonitor, f base.ClientFactory, proxyURI *url.URL) {
+func openConnection(tracker *ConnTracker, addr string, target string, termMon *termmon.TermMonitor, name string, options string, proxyURI *url.URL) {
fmt.Println("Making dialer...")
newConn := NewConnState()
(*tracker)[addr] = newConn
- go dialConn(tracker, addr, target, f, proxyURI)
+ go dialConn(tracker, addr, target, name, options, proxyURI)
}
-func dialConn(tracker *ConnTracker, addr string, target string, f base.ClientFactory, proxyURI *url.URL) {
+func dialConn(tracker *ConnTracker, addr string, target string, name string, options string, proxyURI *url.URL) {
// Obtain the proxy dialer if any, and create the outgoing TCP connection.
// dialFn := proxy.Direct.Dial
// if proxyURI != nil {
@@ -165,14 +168,53 @@ func dialConn(tracker *ConnTracker, addr string, target string, f base.ClientFac
fmt.Println("Dialing....")
+ var transport base.Transport
+
+ args, argsErr := pt.ParsePT2ClientParameters(options)
+ if argsErr != nil {
+ log.Errorf("Error parsing transport options: %s", options)
+ return
+ }
+
// Deal with arguments.
- // args, err := f.ParseArgs(&pt.Args{})
- // if err != nil {
- // fmt.Println("Invalid arguments")
- // log.Errorf("(%s) - invalid arguments: %s", target, err)
- // delete(*tracker, addr)
- // return
- // }
+ switch name {
+ case "obfs2":
+ transport = obfs2.NewObfs2Transport()
+ case "meeklite":
+ if url, ok := args["url"]; ok {
+ if front, ok2 := args["front"]; ok2 {
+ transport = meeklite.NewMeekTransportWithFront(url[0], front[0])
+ } else {
+ transport = meeklite.NewMeekTransport(url[0])
+ }
+ } else {
+ log.Errorf("meeklite transport missing URL argument: %s", args)
+ return
+ }
+ case "obfs4":
+ if cert, ok := args["cert"]; ok {
+ if iatModeStr, ok2 := args["iatMode"]; ok2 {
+ iatMode, err := strconv.Atoi(iatModeStr[0])
+ if err != nil {
+ transport = obfs4.NewObfs4Client(cert[0], iatMode)
+ } else {
+ log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr)
+ return
+ }
+ } else {
+ log.Errorf("obfs4 transport missing cert argument: %s", args)
+ return
+ }
+ } else {
+ log.Errorf("obfs4 transport missing cert argument: %s", args)
+ return
+ }
+ default:
+ log.Errorf("Unknown transport: %s", name)
+ return
+ }
+
+ f := transport.Dial
fmt.Println("Dialing ", target)
remote := f(target)
@@ -189,19 +231,62 @@ func dialConn(tracker *ConnTracker, addr string, target string, f base.ClientFac
(*tracker)[addr] = ConnState{remote, false}
}
-func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, factories map[string]base.ServerFactory, ptServerInfo pt.ServerInfo) (launched bool, listeners []base.TransportListener) {
+func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerInfo pt.ServerInfo, options string) (launched bool, listeners []base.TransportListener) {
fmt.Println("ServerSetup")
// Launch each of the server listeners.
for _, bindaddr := range ptServerInfo.Bindaddrs {
name := bindaddr.MethodName
fmt.Println("bindaddr", bindaddr)
- f := factories[name]
- if f == nil {
- fmt.Println(name, "no such transport is supported")
- continue
+
+ var transport base.Transport
+
+ args, argsErr := pt.ParsePT2ClientParameters(options)
+ if argsErr != nil {
+ log.Errorf("Error parsing transport options: %s", options)
+ return
}
+ // Deal with arguments.
+ switch name {
+ case "obfs2":
+ transport = obfs2.NewObfs2Transport()
+ case "meeklite":
+ if url, ok := args["url"]; ok {
+ if front, ok2 := args["front"]; ok2 {
+ transport = meeklite.NewMeekTransportWithFront(url[0], front[0])
+ } else {
+ transport = meeklite.NewMeekTransport(url[0])
+ }
+ } else {
+ log.Errorf("meeklite transport missing URL argument: %s", args)
+ return
+ }
+ case "obfs4":
+ if cert, ok := args["cert"]; ok {
+ if iatModeStr, ok2 := args["iatMode"]; ok2 {
+ iatMode, err := strconv.Atoi(iatModeStr[0])
+ if err != nil {
+ transport = obfs4.NewObfs4Client(cert[0], iatMode)
+ } else {
+ log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr)
+ return
+ }
+ } else {
+ log.Errorf("obfs4 transport missing cert argument: %s", args)
+ return
+ }
+ } else {
+ log.Errorf("obfs4 transport missing cert argument: %s", args)
+ return
+ }
+ default:
+ log.Errorf("Unknown transport: %s", name)
+ return
+ }
+
+ f := transport.Listen
+
transportLn := f(bindaddr.Addr.String())
go serverAcceptLoop(termMon, name, transportLn, &ptServerInfo)