diff options
| author | Bluesaxorcist <joshua@operatorfoundation.org> | 2019-08-01 18:23:54 -0500 | 
|---|---|---|
| committer | Bluesaxorcist <joshua@operatorfoundation.org> | 2019-08-01 18:23:54 -0500 | 
| commit | 5d034ec8d228cd1914e036b4828e4f2ddc8d0754 (patch) | |
| tree | 131c0f1efac415bfbab9e7abbd21e4d2b82221fa | |
| parent | f95b28c267640a039c8968e105bf62b203fa8978 (diff) | |
made code conform to optimizer
| -rw-r--r-- | .idea/.gitignore | 2 | ||||
| -rw-r--r-- | .idea/misc.xml | 6 | ||||
| -rw-r--r-- | .idea/modules.xml | 8 | ||||
| -rw-r--r-- | .idea/shapeshifter-dispatcher.iml | 9 | ||||
| -rw-r--r-- | .idea/vcs.xml | 6 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | modes/transparent_tcp/transparent_tcp.go | 146 | 
7 files changed, 136 insertions, 43 deletions
diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml
\ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> +  <component name="JavaScriptSettings"> +    <option name="languageLevel" value="ES6" /> +  </component> +</project>
\ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..08a8900 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> +  <component name="ProjectModuleManager"> +    <modules> +      <module fileurl="file://$PROJECT_DIR$/.idea/shapeshifter-dispatcher.iml" filepath="$PROJECT_DIR$/.idea/shapeshifter-dispatcher.iml" /> +    </modules> +  </component> +</project>
\ No newline at end of file diff --git a/.idea/shapeshifter-dispatcher.iml b/.idea/shapeshifter-dispatcher.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/shapeshifter-dispatcher.iml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="WEB_MODULE" version="4"> +  <component name="Go" enabled="true" /> +  <component name="NewModuleRootManager"> +    <content url="file://$MODULE_DIR$" /> +    <orderEntry type="inheritedJdk" /> +    <orderEntry type="sourceFolder" forTests="false" /> +  </component> +</module>
\ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> +  <component name="VcsDirectoryMappings"> +    <mapping directory="$PROJECT_DIR$" vcs="Git" /> +  </component> +</project>
\ No newline at end of file @@ -55,7 +55,7 @@ The dispatcher currently supports the following proxy modes:  The dispatcher currently supports the following transports:   * obfs4 - * obfs2 + * optimizer   * shadow (Shadowsocks)  #### Installation diff --git a/modes/transparent_tcp/transparent_tcp.go b/modes/transparent_tcp/transparent_tcp.go index f96f8d5..f641b39 100644 --- a/modes/transparent_tcp/transparent_tcp.go +++ b/modes/transparent_tcp/transparent_tcp.go @@ -30,6 +30,7 @@  package transparent_tcp  import ( +	"errors"  	"fmt"  	"io"  	"net" @@ -41,6 +42,7 @@ import (  	"github.com/OperatorFoundation/shapeshifter-dispatcher/common/log"  	"github.com/OperatorFoundation/shapeshifter-dispatcher/common/termmon"  	"github.com/OperatorFoundation/shapeshifter-ipc" +	"github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer"  	"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs2"  	"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"  	"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" @@ -87,7 +89,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt  	termMon.OnHandlerStart()  	defer termMon.OnHandlerFinish() -	var dialer func(address string) net.Conn +	var dialer func() net.Conn  	args, argsErr := pt.ParsePT2ClientParameters(options)  	if argsErr != nil { @@ -96,47 +98,9 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt  	}  	// Deal with arguments. -	switch name { -	case "obfs2": -		transport := obfs2.NewObfs2Transport() -		dialer = transport.Dial -	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) -					dialer = transport.Dial -				} else { -					log.Errorf("obfs4 transport bad iatMode value: %s %s", iatModeStr[0], err) -					return -				} -			} else { -				log.Errorf("obfs4 transport missing iatMode argument: %s", args) -				return -			} -		} else { -			log.Errorf("obfs4 transport missing cert 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]) -				dialer = transport.Dial -			} else { -				log.Errorf("shadow transport missing cipher argument: %s", args) -				return -			} -		} else { -			log.Errorf("shadow transport missing password argument: %s", args) -			return -		} -	default: -		log.Errorf("Unknown transport: %s", name) -		return -	} +	transport, _ := argsToDialer(target, name, args) +	dialer = transport.Dial  	f := dialer  	// Obtain the proxy dialer if any, and create the outgoing TCP connection. @@ -153,7 +117,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt  	// }  	// FIXME - use dialFn if a proxy is needed to connect to the network -	remote := f(target) +	remote := f()  	// if err != nil {  	// 	log.Errorf("%s(%s) - outgoing connection failed: %s", name, target, log.ElideError(err))  	// 	return @@ -174,6 +138,88 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt  	return  } +func argsToDialer(target string, name string, args pt.Args) (Optimizer.Transport, error) { +	var dialer func(string) net.Conn = nil +	switch name { +	//case "obfs2": +	//	transport := obfs2.NewObfs2Transport() +	//	dialer = transport.Dial +	//	return dialer, nil +	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.Transport{ +						CertString: cert[0], +						IatMode:    iatMode, +						Address:    target, +					} +					return transport, nil +				} else { +					log.Errorf("obfs4 transport bad iatMode value: %s %s", iatModeStr[0], err) +					return nil, errors.New("obfs4 transport bad iatMode value") +				} +			} else { +				log.Errorf("obfs4 transport missing iatMode argument: %s", args) +				return nil, errors.New("obfs4 transport missing iatMode argument") +			} +		} else { +			log.Errorf("obfs4 transport missing cert argument: %s", args) +			return nil, errors.New("obfs4 transport missing cert argument") +		} +	case "shadow": +		if password, ok := args["password"]; ok { +			if cipher, ok2 := args["cipherName"]; ok2 { +				transport := shadow.Transport{ +					Password:   password[0], +					CipherName: cipher[0], +					Address:    target, +				} +				return transport, nil +			} else { +				log.Errorf("shadow transport missing cipher argument: %s", args) +				return nil, errors.New("shadow transport missing cipher argument") +			} +		} else { +			log.Errorf("shadow transport missing password argument: %s", args) +			return nil, errors.New("shadow transport missing password argument") +		} +	case "Optimizer": +		if transports, ok := args["transports"]; ok { +			if strategyName, ok2 := args["strategy"]; ok2 { +				var strategy Optimizer.Strategy = nil +				switch strategyName[0] { +				case "first": +					strategy = Optimizer.NewFirstStrategy() +				case "random": +					strategy = Optimizer.NewRandomStrategy() +				case "rotate": +					strategy = Optimizer.NewRotateStrategy() +				case "track": +					strategy = Optimizer.NewTrackStrategy() +				case "min": +					strategy = Optimizer.NewMinimizeDialDuration() +				} +				var transports []Optimizer.Transport +				transports = make([]Optimizer.Transport) +				transport := Optimizer.NewOptimizerClient(transports, strategy) +				return transport, nil +			} else { +				log.Errorf("Optimizer transport missing transports argument: %s", args) +				return nil, errors.New("optimizer transport missing transports argument") +			} +		} else { +			log.Errorf("Optimizer transport missing strategy argument: %s", args) +			return nil, errors.New("optimizer transport missing strategy argument") +		} + +	default: +		log.Errorf("Unknown transport: %s", name) +		return nil, errors.New("unknown transport") +	} +} +  func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerInfo pt.ServerInfo, statedir string, options string) (launched bool, listeners []net.Listener) {  	// Launch each of the server listeners.  	for _, bindaddr := range ptServerInfo.Bindaddrs { @@ -213,6 +259,22 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn  			transport := shadow.NewShadowServer(password, cipherName)  			listen = transport.Listen +		case "Optimizer": +			shargs, aok := args["Optimizer"] +			if !aok { +				return false, nil +			} + +			transports, ok := shargs.Get("transports") +			if !ok { +				return false, nil +			} + +			strategy, ok2 := shargs.Get("strategy") +			if !ok2 { +				return false, nil +			} +  		default:  			log.Errorf("Unknown transport: %s", name)  			return false, nil  | 
