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.go241
1 files changed, 117 insertions, 124 deletions
diff --git a/modes/stun_udp/stun_udp.go b/modes/stun_udp/stun_udp.go
index cba7132..4abe433 100644
--- a/modes/stun_udp/stun_udp.go
+++ b/modes/stun_udp/stun_udp.go
@@ -37,14 +37,12 @@ import (
replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant"
"github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite"
"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
+ common "github.com/willscott/goturn/common"
+ "golang.org/x/net/proxy"
"io"
golog "log"
"net"
"net/url"
- "strconv"
- "strings"
-
- common "github.com/willscott/goturn/common"
"github.com/willscott/goturn"
@@ -55,8 +53,6 @@ import (
"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"
)
-var stateDir string
-
type ConnState struct {
Conn net.Conn
Waiting bool
@@ -92,9 +88,11 @@ func ClientSetup(termMon *termmon.TermMonitor, socksAddr string, target string,
}
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()
+ //defers are never called due to infinite loop
+ //defer termMon.OnHandlerFinish()
+ //defer conn.Close()
fmt.Println("@@@ handling...")
@@ -126,7 +124,8 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt
// There is an open transport connection.
// Send the packet through the transport.
fmt.Println("recv: write")
- state.Conn.Write(buf)
+ //ignoring failed writes because packets can be dropped
+ _, _ = state.Conn.Write(buf)
}
} else {
// There is not an open transport connection and a connection attempt is not in progress.
@@ -152,19 +151,21 @@ func openConnection(tracker *ConnTracker, addr string, target string, termMon *t
}
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 {
- // dialer, err := proxy.FromURL(proxyURI, proxy.Direct)
- // if err != nil {
- // // This should basically never happen, since config protocol
- // // verifies this.
- // fmt.Println("failed to obtain dialer", proxyURI, proxy.Direct)
- // log.Errorf("(%s) - failed to obtain proxy dialer: %s", target, log.ElideError(err))
- // return
- // }
- // dialFn = dialer.Dial
- // }
+ //Obtain the proxy dialer if any, and create the outgoing TCP connection.
+ var dialer proxy.Dialer
+ dialer = proxy.Direct
+ if proxyURI != nil {
+ var err error
+ dialer, err = proxy.FromURL(proxyURI, proxy.Direct)
+ if err != nil {
+ // This should basically never happen, since config protocol
+ // verifies this.
+ fmt.Println("failed to obtain dialer", proxyURI, proxy.Direct)
+ log.Errorf("(%s) - failed to obtain proxy dialer: %s", target, log.ElideError(err))
+ return
+ }
+
+ }
fmt.Println("Dialing....")
@@ -175,7 +176,7 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt
}
// Deal with arguments.
- transport, _ := pt_extras.ArgsToDialer(target, name, args)
+ transport, _ := pt_extras.ArgsToDialer(target, name, args, dialer)
fmt.Println("Dialing ", target)
remote, _ := transport.Dial()
@@ -192,7 +193,7 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt
(*tracker)[addr] = ConnState{remote, false}
}
-func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerInfo pt.ServerInfo, options string) (launched bool, listeners []net.Listener) {
+func ServerSetup(termMon *termmon.TermMonitor, ptServerInfo pt.ServerInfo, options string, stateDir string) (launched bool, listeners []net.Listener) {
fmt.Println("ServerSetup")
// Launch each of the server listeners.
@@ -212,26 +213,10 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
switch name {
case "obfs2":
transport := obfs2.NewObfs2Transport()
- listen=transport.Listen
+ listen = transport.Listen
case "obfs4":
- if cert, ok := args["cert"]; ok {
- if iatModeStr, ok2 := args["iat-mode"]; ok2 {
- iatMode, err := strconv.Atoi(iatModeStr[0])
- if err != nil {
- transport := obfs4.NewObfs4Client(cert[0], iatMode)
- listen=transport.Listen
- } else {
- log.Errorf("obfs4 transport bad iat-mode 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
- }
+ transport := obfs4.NewObfs4Server(stateDir)
+ listen = transport.Listen
case "meeklite":
if Url, ok := args["Url"]; ok {
if Front, ok2 := args["Front"]; ok2 {
@@ -256,25 +241,25 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
}
case "Dust":
if idPath, ok := args["idPath"]; ok {
- transport := Dust.NewDustServer(idPath[0])
- listen = transport.Listen
+ transport := Dust.NewDustServer(idPath[0])
+ listen = transport.Listen
} else {
log.Errorf("Dust transport missing idPath argument: %s", args)
return
}
- case "shadow":
- if password, ok := args["password"]; ok {
- if cipher, ok2 := args["cipherName"]; ok2 {
- transport := shadow.NewShadowClient(password[0], cipher[0])
- listen = transport.Listen
+ case "shadow":
+ if password, ok := args["password"]; ok {
+ if cipher, ok2 := args["cipherName"]; ok2 {
+ transport := shadow.NewShadowClient(password[0], cipher[0])
+ listen = transport.Listen
+ } else {
+ log.Errorf("shadow transport missing cipher argument: %s", args)
+ return
+ }
} else {
- log.Errorf("shadow transport missing cipher argument: %s", args)
+ log.Errorf("shadow transport missing password argument: %s", args)
return
}
- } else {
- log.Errorf("shadow transport missing password argument: %s", args)
- return
- }
default:
log.Errorf("Unknown transport: %s", name)
@@ -294,80 +279,81 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
return
}
-func getServerBindaddrs(serverBindaddr string) ([]pt.Bindaddr, error) {
- var result []pt.Bindaddr
-
- for _, spec := range strings.Split(serverBindaddr, ",") {
- var bindaddr pt.Bindaddr
-
- parts := strings.SplitN(spec, "-", 2)
- if len(parts) != 2 {
- fmt.Println("TOR_PT_SERVER_BINDADDR: doesn't contain \"-\"", spec)
- return nil, nil
- }
- bindaddr.MethodName = parts[0]
- addr, err := resolveAddr(parts[1])
- if err != nil {
- fmt.Println("TOR_PT_SERVER_BINDADDR: ", spec, err.Error())
- return nil, nil
- }
- bindaddr.Addr = addr
- // bindaddr.Options = optionsMap[bindaddr.MethodName]
- result = append(result, bindaddr)
- }
-
- return result, nil
-}
+//func getServerBindaddrs(serverBindaddr string) ([]pt.Bindaddr, error) {
+// var result []pt.Bindaddr
+//
+// for _, spec := range strings.Split(serverBindaddr, ",") {
+// var bindaddr pt.Bindaddr
+//
+// parts := strings.SplitN(spec, "-", 2)
+// if len(parts) != 2 {
+// fmt.Println("TOR_PT_SERVER_BINDADDR: doesn't contain \"-\"", spec)
+// return nil, nil
+// }
+// bindaddr.MethodName = parts[0]
+// addr, err := resolveAddr(parts[1])
+// if err != nil {
+// fmt.Println("TOR_PT_SERVER_BINDADDR: ", spec, err.Error())
+// return nil, nil
+// }
+// bindaddr.Addr = addr
+// // bindaddr.Options = optionsMap[bindaddr.MethodName]
+// result = append(result, bindaddr)
+// }
+//
+// return result, nil
+//}
// Resolve an address string into a net.TCPAddr. We are a bit more strict than
// net.ResolveTCPAddr; we don't allow an empty host or port, and the host part
// must be a literal IP address.
-func resolveAddr(addrStr string) (*net.TCPAddr, error) {
- ipStr, portStr, err := net.SplitHostPort(addrStr)
- if err != nil {
- // Before the fixing of bug #7011, tor doesn't put brackets around IPv6
- // addresses. Split after the last colon, assuming it is a port
- // separator, and try adding the brackets.
- parts := strings.Split(addrStr, ":")
- if len(parts) <= 2 {
- return nil, err
- }
- addrStr := "[" + strings.Join(parts[:len(parts)-1], ":") + "]:" + parts[len(parts)-1]
- ipStr, portStr, err = net.SplitHostPort(addrStr)
- }
- if err != nil {
- return nil, err
- }
- if ipStr == "" {
- return nil, net.InvalidAddrError(fmt.Sprintf("address string %q lacks a host part", addrStr))
- }
- if portStr == "" {
- return nil, net.InvalidAddrError(fmt.Sprintf("address string %q lacks a port part", addrStr))
- }
- ip := net.ParseIP(ipStr)
- if ip == nil {
- return nil, net.InvalidAddrError(fmt.Sprintf("not an IP string: %q", ipStr))
- }
- port, err := parsePort(portStr)
- if err != nil {
- return nil, err
- }
- return &net.TCPAddr{IP: ip, Port: port}, nil
-}
-
-func parsePort(portStr string) (int, error) {
- port, err := strconv.ParseUint(portStr, 10, 16)
- return int(port), err
-}
-
-func serverAcceptLoop(termMon *termmon.TermMonitor, name string, ln net.Listener, info *pt.ServerInfo) error {
- defer ln.Close()
+////func resolveAddr(addrStr string) (*net.TCPAddr, error) {
+//// ipStr, portStr, err := net.SplitHostPort(addrStr)
+//// if err != nil {
+//// // Before the fixing of bug #7011, tor doesn't put brackets around IPv6
+//// // addresses. Split after the last colon, assuming it is a port
+//// // separator, and try adding the brackets.
+//// parts := strings.Split(addrStr, ":")
+//// if len(parts) <= 2 {
+//// return nil, err
+//// }
+//// addrStr := "[" + strings.Join(parts[:len(parts)-1], ":") + "]:" + parts[len(parts)-1]
+//// ipStr, portStr, err = net.SplitHostPort(addrStr)
+//// }
+//// if err != nil {
+//// return nil, err
+//// }
+//// if ipStr == "" {
+//// return nil, net.InvalidAddrError(fmt.Sprintf("address string %q lacks a host part", addrStr))
+//// }
+//// if portStr == "" {
+//// return nil, net.InvalidAddrError(fmt.Sprintf("address string %q lacks a port part", addrStr))
+//// }
+//// ip := net.ParseIP(ipStr)
+//// if ip == nil {
+//// return nil, net.InvalidAddrError(fmt.Sprintf("not an IP string: %q", ipStr))
+//// }
+//// port, err := parsePort(portStr)
+//// if err != nil {
+//// return nil, err
+//// }
+//// return &net.TCPAddr{IP: ip, Port: port}, nil
+////}
+//
+//func parsePort(portStr string) (int, error) {
+// port, err := strconv.ParseUint(portStr, 10, 16)
+// return int(port), err
+//}
+
+func serverAcceptLoop(termMon *termmon.TermMonitor, name string, ln net.Listener, info *pt.ServerInfo){
for {
conn, err := ln.Accept()
fmt.Println("accepted")
if err != nil {
if e, ok := err.(net.Error); ok && !e.Temporary() {
- return err
+ log.Errorf("serverAcceptLoop failed")
+ _ = ln.Close()
+ return
}
continue
}
@@ -378,9 +364,7 @@ func serverAcceptLoop(termMon *termmon.TermMonitor, name string, ln net.Listener
func serverHandler(termMon *termmon.TermMonitor, name string, remote net.Conn, info *pt.ServerInfo) {
var header *common.Message
- defer remote.Close()
termMon.OnHandlerStart()
- defer termMon.OnHandlerFinish()
addrStr := log.ElideAddr(remote.RemoteAddr().String())
fmt.Println("### handling", name)
@@ -388,16 +372,22 @@ func serverHandler(termMon *termmon.TermMonitor, name string, remote net.Conn, i
serverAddr, err := net.ResolveUDPAddr("udp", info.OrAddr.String())
if err != nil {
+ _ = remote.Close()
+ termMon.OnHandlerFinish()
golog.Fatal(err)
}
localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
if err != nil {
+ _ = remote.Close()
+ termMon.OnHandlerFinish()
golog.Fatal(err)
}
dest, err := net.DialUDP("udp", localAddr, serverAddr)
if err != nil {
+ _ = remote.Close()
+ termMon.OnHandlerFinish()
golog.Fatal(err)
}
@@ -435,6 +425,9 @@ func serverHandler(termMon *termmon.TermMonitor, name string, remote net.Conn, i
writeBuffer := append(headerBuffer, readBuffer...)
- dest.Write(writeBuffer)
+ _, _ = dest.Write(writeBuffer)
}
-} \ No newline at end of file
+
+ _ = remote.Close()
+ termMon.OnHandlerFinish()
+}