diff options
-rw-r--r-- | Examples/OptimizerConfig.json | 21 | ||||
-rw-r--r-- | Examples/obfs4Config.json | 4 | ||||
-rw-r--r-- | Examples/shadowConfig.json | 4 | ||||
-rw-r--r-- | common/pt_extras/pt_extras.go | 108 | ||||
-rw-r--r-- | modes/pt_socks5/pt_socks5.go | 40 | ||||
-rw-r--r-- | modes/stun_udp/stun_udp.go | 23 | ||||
-rw-r--r-- | modes/transparent_tcp/transparent_tcp.go | 37 | ||||
-rw-r--r-- | modes/transparent_udp/transparent_udp.go | 21 | ||||
-rw-r--r-- | shapeshifter-dispatcher/shapeshifter-dispatcher.go | 5 | ||||
-rw-r--r-- | state/dispatcher.log | 166 | ||||
-rw-r--r-- | transports/transports.go | 306 |
11 files changed, 614 insertions, 121 deletions
diff --git a/Examples/OptimizerConfig.json b/Examples/OptimizerConfig.json new file mode 100644 index 0000000..2634491 --- /dev/null +++ b/Examples/OptimizerConfig.json @@ -0,0 +1,21 @@ +{ + "strategy": "first", + "transports": [ + { + "name": "shadow", + "address": "127.0.0.1:1234", + "config": { + "password": "orange", + "cipherName": "aes-128-ctr" + } + }, + { + "name": "obfs4", + "address": "77.81.104.251:443", + "config": { + "cert": "a1cc6eI5H+1kTzXhbuwMR9w3ZkLeZuReniier8DYSlAg4ed9yTbnyDiWc1vF1WFWKFRYHQ", + "iatMode": "0" + } + } + ] +}
\ No newline at end of file diff --git a/Examples/obfs4Config.json b/Examples/obfs4Config.json new file mode 100644 index 0000000..4138172 --- /dev/null +++ b/Examples/obfs4Config.json @@ -0,0 +1,4 @@ +{ + "cert": "a1cc6eI5H+1kTzXhbuwMR9w3ZkLeZuReniier8DYSlAg4ed9yTbnyDiWc1vF1WFWKFRYHQ", + "iatMode": "0" +}
\ No newline at end of file diff --git a/Examples/shadowConfig.json b/Examples/shadowConfig.json new file mode 100644 index 0000000..9a9862b --- /dev/null +++ b/Examples/shadowConfig.json @@ -0,0 +1,4 @@ +{ + "password": "orange", + "cipherName": "aes-128-ctr" +}
\ No newline at end of file diff --git a/common/pt_extras/pt_extras.go b/common/pt_extras/pt_extras.go index 3e865bf..a41f4f7 100644 --- a/common/pt_extras/pt_extras.go +++ b/common/pt_extras/pt_extras.go @@ -31,9 +31,8 @@ import ( "errors" "fmt" "github.com/OperatorFoundation/shapeshifter-dispatcher/common/log" + "github.com/OperatorFoundation/shapeshifter-dispatcher/transports" "github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer" - "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4" - "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "net" "net/url" "os" @@ -76,7 +75,7 @@ func PtIsClient() (bool, error) { } func PtGetProxy(proxy *string) (*url.URL, error) { - var specString string + var specString string if proxy != nil { specString = *proxy @@ -175,83 +174,64 @@ func PtShouldExitOnStdinClose() bool { return os.Getenv("TOR_PT_EXIT_ON_STDIN_CLOSE") == "1" } -func ArgsToDialer(target string, name string, args pt.Args) (Optimizer.Transport, error) { +func ArgsToDialer(target string, name string, args map[string]interface{}) (Optimizer.Transport, error) { 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") - } + //refactor starts here + transport, err := transports.ParseArgsObfs4(args, target) + if err != nil { + log.Errorf("Could not parse options %s", err.Error()) + return nil, err } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - return nil, errors.New("obfs4 transport missing cert argument") + return transport, nil } 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") - } + transport, err := transports.ParseArgsShadow(args, target) + if err != nil { + log.Errorf("Could not parse options %s", err.Error()) + return nil, err } else { - log.Errorf("shadow transport missing password argument: %s", args) - return nil, errors.New("shadow transport missing password argument") + return transport, nil } case "Optimizer": - //replace underscore with ArgsToDialer - if _, 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() - } - transports := []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") - } + transport, err := transports.ParseArgsOptimizer(args) + if err != nil { + log.Errorf("Could not parse options %s", err.Error()) + return nil, err + } else { + return transport, nil + } + case "Dust": + transport, err := transports.ParseArgsDust(args, target) + if err != nil { + log.Errorf("Could not parse options %s", err.Error()) + return nil, err } else { - log.Errorf("Optimizer transport missing strategy argument: %s", args) - return nil, errors.New("optimizer transport missing strategy argument") + return transport, nil + } + case "Meeklite": + transport, err := transports.ParseArgsMeeklite(args, target) + if err != nil { + log.Errorf("Could not parse options %s", err.Error()) + return nil, err + } else { + return transport, nil + } + case "Replicant": + transport, err := transports.ParseArgsReplicant(args, target) + if err != nil { + log.Errorf("Could not parse options %s", err.Error()) + return nil, err + } else { + return transport, nil } default: log.Errorf("Unknown transport: %s", name) return nil, errors.New("unknown transport") } -}
\ No newline at end of file +} diff --git a/modes/pt_socks5/pt_socks5.go b/modes/pt_socks5/pt_socks5.go index dfd7359..59c4a7c 100644 --- a/modes/pt_socks5/pt_socks5.go +++ b/modes/pt_socks5/pt_socks5.go @@ -30,8 +30,11 @@ package pt_socks5 import ( + "fmt" + options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common" "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" "github.com/OperatorFoundation/shapeshifter-transports/transports/Dust" + replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant" "github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite" "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "io" @@ -101,14 +104,20 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, con } addrStr := log.ElideAddr(socksReq.Target) - var args pt.Args - if needOptions { - args = socksReq.Args - } else { - args, err = pt.ParsePT2ClientParameters(options) - if err != nil { - return - } + //var args pt.Args + //if needOptions { + // args = socksReq.Args + //} else { + // args, err = pt.ParsePT2ClientParameters(options) + // if err != nil { + // return + // } + //} + + args, argsErr := options2.ParseOptions(options) + if argsErr != nil { + log.Errorf("Error parsing transport options: %s", options) + return } var dialer func() (net.Conn, error) @@ -192,13 +201,14 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn log.Errorf("obfs4 transport missing cert argument: %s", args) return } - //case "replicant": - // config, ok :=args.Get("config") - // if !ok { - // return false, nil - // } - // transport := replicant.New(config) - // listen = transport.Listen + case "replicant": + config, ok :=args.Get("config") + fmt.Println(config) + if !ok { + return false, nil + } + transport := replicant.New(replicant.Config{}) + listen = transport.Listen case "Dust": idPath, ok :=args.Get("idPath") if !ok { diff --git a/modes/stun_udp/stun_udp.go b/modes/stun_udp/stun_udp.go index f12e69e..70d5565 100644 --- a/modes/stun_udp/stun_udp.go +++ b/modes/stun_udp/stun_udp.go @@ -31,8 +31,10 @@ package stun_udp import ( "fmt" + options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common" "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" "github.com/OperatorFoundation/shapeshifter-transports/transports/Dust" + replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant" "github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite" "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "io" @@ -166,7 +168,7 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt fmt.Println("Dialing....") - args, argsErr := pt.ParsePT2ClientParameters(options) + args, argsErr := options2.ParseOptions(options) if argsErr != nil { log.Errorf("Error parsing transport options: %s", options) return @@ -243,14 +245,15 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn log.Errorf("meeklite transport missing Front argument: %s", args) return } - //case "replicant": - // if config, ok := args["config"]; ok { - // transport := replicant.New(config[0]) - // listen = transport.Listen - // } else { - // log.Errorf("replicant transport missing config argument: %s", args) - // return - // } + case "replicant": + if config, ok := args["config"]; ok { + fmt.Println(config) + transport := replicant.New(replicant.Config{}) + listen = transport.Listen + } else { + log.Errorf("replicant transport missing config argument: %s", args) + return + } case "Dust": if idPath, ok := args["idPath"]; ok { transport := Dust.NewDustServer(idPath[0]) @@ -434,4 +437,4 @@ func serverHandler(termMon *termmon.TermMonitor, name string, remote net.Conn, i dest.Write(writeBuffer) } -} +}
\ No newline at end of file diff --git a/modes/transparent_tcp/transparent_tcp.go b/modes/transparent_tcp/transparent_tcp.go index 9f9fc18..51ec43b 100644 --- a/modes/transparent_tcp/transparent_tcp.go +++ b/modes/transparent_tcp/transparent_tcp.go @@ -30,8 +30,12 @@ package transparent_tcp import ( + options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common" + "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" + "github.com/OperatorFoundation/shapeshifter-dispatcher/transports" "github.com/OperatorFoundation/shapeshifter-transports/transports/Dust" + replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant" "github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite" "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs2" "io" @@ -92,8 +96,8 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt defer termMon.OnHandlerFinish() var dialer func() (net.Conn, error) - - args, argsErr := pt.ParsePT2ClientParameters(options) +//this is where the refactoring begins + args, argsErr := options2.ParseOptions(options) if argsErr != nil { log.Errorf("Error parsing transport options: %s", options) return @@ -163,18 +167,22 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn case "obfs4": transport := obfs4.NewObfs4Server(statedir) listen = transport.Listen - //case "Replicant": - // shargs, aok := args["Replicant"] - // if !aok { - // return false, nil - // } - // - // config, ok := shargs.Get("config") - // if !ok { - // return false, nil - // } - // transport := replicant.New(config) - // listen = transport.Listen + case "Replicant": + shargs, aok := args["Replicant"] + if !aok { + return false, nil + } + + configString, ok := shargs.Get("config") + if !ok { + return false, nil + } + config, err := transports.ParseReplicantConfig(configString) + if err != nil { + return false, nil + } + transport := replicant.New(config) + listen = transport.Listen case "Dust": shargs, aok := args["Dust"] if !aok { @@ -335,3 +343,4 @@ func copyLoop(a net.Conn, b net.Conn) error { return nil } + diff --git a/modes/transparent_udp/transparent_udp.go b/modes/transparent_udp/transparent_udp.go index 62d0689..eade8c8 100644 --- a/modes/transparent_udp/transparent_udp.go +++ b/modes/transparent_udp/transparent_udp.go @@ -33,8 +33,10 @@ import ( "bytes" "encoding/binary" "fmt" + options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common" "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" "github.com/OperatorFoundation/shapeshifter-transports/transports/Dust" + replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant" "github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite" "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "io" @@ -179,7 +181,7 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt fmt.Println("Dialing....") - args, argsErr := pt.ParsePT2ClientParameters(options) + args, argsErr := options2.ParseOptions(options) if argsErr != nil { log.Errorf("Error parsing transport options: %s", options) return @@ -242,14 +244,15 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn log.Errorf("obfs4 transport missing cert argument: %s", args) return } - //case "Replicant": - // Config, ok := args.Get("config") - // if !ok { - // return false, nil - // } - // - // transport := replicant.New(Config) - // listen = transport.Listen + case "Replicant": + config, ok := args.Get("config") + fmt.Println(config) + if !ok { + return false, nil + } + + transport := replicant.New(replicant.Config{}) + listen = transport.Listen case "Dust": idPath, ok := args.Get("idPath") if !ok { diff --git a/shapeshifter-dispatcher/shapeshifter-dispatcher.go b/shapeshifter-dispatcher/shapeshifter-dispatcher.go index 72f2efb..d7f49e4 100644 --- a/shapeshifter-dispatcher/shapeshifter-dispatcher.go +++ b/shapeshifter-dispatcher/shapeshifter-dispatcher.go @@ -103,7 +103,7 @@ func main() { // Experimental flags under consideration for PT 2.1 socksAddr := flag.String("proxylistenaddr", "127.0.0.1:0", "Specify the bind address for the local SOCKS server provided by the client") optionsFile := flag.String("optionsFile", "", "store all the options in a single file") - + fmt.Println("checking for optionsFile") // Additional command line flags inherited from obfs4proxy showVer := flag.Bool("version", false, "Print version and exit") logLevelStr := flag.String("logLevel", "ERROR", "Log level (ERROR/WARN/INFO/DEBUG)") @@ -152,7 +152,8 @@ func main() { if *optionsFile != "" { _, err := os.Stat(*optionsFile) if err != nil { - log.Errorf("optionsFile does not exist %s", *optionsFile) + log.Errorf("optionsFile does not exist with error %s %s", *optionsFile, err.Error()) + log.Errorf("optionsFile does not exist %s", *optionsFile, err.Error()) } else { contents, readErr := ioutil.ReadFile(*optionsFile) if readErr != nil { diff --git a/state/dispatcher.log b/state/dispatcher.log index 9e869ae..ff272da 100644 --- a/state/dispatcher.log +++ b/state/dispatcher.log @@ -104,3 +104,169 @@ 2019/08/28 22:50:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy 2019/08/28 22:50:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners 2019/08/28 22:50:27 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use +2019/09/03 19:33:32 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 19:33:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 19:33:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 19:33:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners +2019/09/03 19:33:32 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use +2019/09/03 19:34:35 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 19:34:35 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 19:34:35 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 19:34:35 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners +2019/09/03 19:34:35 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use +2019/09/03 19:35:19 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 19:35:19 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 19:35:19 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 19:35:19 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners +2019/09/03 19:35:19 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use +2019/09/03 19:36:38 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 19:36:38 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 19:36:38 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 19:36:38 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners +2019/09/03 19:36:38 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use +2019/09/03 20:23:06 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:23:06 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:23:06 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:23:06 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:26:33 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:26:39 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:26:43 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:26:45 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:27:23 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:27:30 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:27:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:27:44 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:31:16 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:31:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:31:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:31:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:31:20 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:31:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:31:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:31:30 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:31:57 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:31:59 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:32:02 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:32:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:33:28 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:33:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:33:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:33:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:34:29 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:34:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:34:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:34:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:34:41 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:34:41 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:34:41 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:34:41 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:34:54 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:34:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:34:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:34:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:35:08 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:35:12 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:35:14 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:35:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:38:39 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:38:43 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:38:44 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:38:45 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:40:24 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:40:24 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:40:24 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:40:24 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:41:36 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:41:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:41:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:41:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:51:16 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:51:16 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:51:16 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:51:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:51:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:51:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:51:21 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:51:21 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:51:21 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:51:21 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:51:21 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:51:21 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:52:37 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:52:37 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:52:37 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:52:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:52:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:52:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:53:37 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:53:37 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:53:37 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:53:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:53:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:53:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:55:48 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:55:48 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:55:48 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:55:48 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:55:48 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:55:48 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:57:36 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:57:36 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:57:36 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:57:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:57:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:57:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:57:58 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:57:58 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:57:58 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:57:58 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:57:58 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:57:58 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 20:58:05 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 20:58:05 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 20:58:05 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 20:58:05 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 20:58:05 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 20:58:05 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 21:00:46 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 21:00:46 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 21:00:46 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 21:00:46 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 21:00:46 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 21:00:46 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 21:01:29 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 21:01:29 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 21:01:29 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 21:01:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 21:01:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 21:01:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 21:02:15 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 21:02:15 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 21:02:15 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 21:02:15 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 21:02:15 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 21:02:15 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 21:02:32 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 21:02:32 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 21:02:32 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 21:02:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 21:02:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 21:02:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 21:03:03 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 21:03:03 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 21:03:03 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 21:03:03 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 21:03:03 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 21:03:03 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 21:03:18 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 21:03:18 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 21:03:18 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 21:03:18 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 21:03:18 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 21:03:18 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners +2019/09/03 21:04:04 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory +2019/09/03 21:04:04 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory) +2019/09/03 21:04:04 [NOTICE]: dispatcher-0.0.7-dev - launched +2019/09/03 21:04:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy +2019/09/03 21:04:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy +2019/09/03 21:04:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners diff --git a/transports/transports.go b/transports/transports.go index df05d33..4ca49eb 100644 --- a/transports/transports.go +++ b/transports/transports.go @@ -31,9 +31,15 @@ package transports import ( "errors" + "fmt" + "github.com/OperatorFoundation/shapeshifter-transports/transports/Dust" + "github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer" + replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant" + "github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite" "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4" "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "github.com/mufti1/interconv/package" + gourl "net/url" "strconv" ) @@ -59,7 +65,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor return nil, icerr } default: - return nil, errors.New("Unsupported type for obfs4 cert option") + return nil, errors.New("unsupported type for obfs4 cert option") } untypedIatMode, ok2 := args["iatMode"] @@ -83,7 +89,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor case 1: iatMode = iatModeInt default: - return nil, errors.New("Unsupported value for obfs4 iatMode option") + return nil, errors.New("unsupported value for obfs4 iatMode option") } case float64: iatModeFloat, icerr := interconv.ParseFloat64(untypedIatMode) @@ -97,7 +103,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor case 1: iatMode = iatModeInt default: - return nil, errors.New("Unsupported value for obfs4 iatMode option") + return nil, errors.New("unsupported value for obfs4 iatMode option") } case int: iatModeInt, icerr := interconv.ParseInt(untypedIatMode) @@ -110,7 +116,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor case 1: iatMode = iatModeInt default: - return nil, errors.New("Unsupported value for obfs4 iatMode option") + return nil, errors.New("unsupported value for obfs4 iatMode option") } case bool: iatModeBool, icerr := interconv.ParseBoolean(untypedCert) @@ -124,7 +130,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor iatMode = 0 } default: - return nil, errors.New("Unsupported type for obfs4 iatMode option") + return nil, errors.New("unsupported type for obfs4 iatMode option") } transport := obfs4.Transport{ @@ -153,7 +159,7 @@ func ParseArgsShadow(args map[string]interface{}, target string) (*shadow.Transp return nil, icerr } default: - return nil, errors.New("Unsupported type for shadow password option") + return nil, errors.New("unsupported type for shadow password option") } untypedCipherName, ok2 := args["cipherName"] @@ -169,7 +175,7 @@ func ParseArgsShadow(args map[string]interface{}, target string) (*shadow.Transp return nil, icerr } default: - return nil, errors.New("Unsupported type for shadow cipherName option") + return nil, errors.New("unsupported type for shadow cipherName option") } transport := shadow.Transport{ @@ -180,3 +186,289 @@ func ParseArgsShadow(args map[string]interface{}, target string) (*shadow.Transp return &transport, nil } + +func ParseArgsDust(args map[string]interface{}, target string) (*Dust.Transport, error) { + var serverPublic string + + untypedServerPublic, ok := args["serverPublic"] + if !ok { + return nil, errors.New("dust transport missing serverpublic argument") + } + + switch untypedServerPublic.(type) { + case string: + var icerr error + serverPublic, icerr = interconv.ParseString(untypedServerPublic) + if icerr != nil { + return nil, icerr + } + default: + return nil, errors.New("unsupported type for dust serverpublic option") + } + + transport := Dust.Transport{ + ServerPublic: serverPublic, + Address: target, + } + + return &transport, nil +} + +func ParseArgsReplicant(args map[string]interface{}, target string) (*replicant.Transport, error) { + var conf string + fmt.Println(conf) + untypedConfig, ok := args["config"] + if !ok { + return nil, errors.New("replicant transport missing config argument") + } + + switch untypedConfig.(type) { + case string: + var icerr error + conf, icerr = interconv.ParseString(untypedConfig) + if icerr != nil { + return nil, icerr + } + default: + return nil, errors.New("unsupported type for replicant config option") + } + + transport := replicant.Transport{ + Config: replicant.Config{}, + Address: target, + } + + return &transport, nil +} + +func ParseArgsMeeklite(args map[string]interface{}, target string) (*meeklite.Transport, error) { + + var url *gourl.URL + var front string + + untypedUrl, ok := args["url"] + if !ok { + return nil, errors.New("meeklite transport missing url argument") + } + + switch untypedUrl.(type) { + case string: + + urlString, icerr := interconv.ParseString(untypedUrl) + if icerr != nil { + return nil, icerr + } + var parseErr error + url, parseErr = gourl.Parse(urlString) + if parseErr != nil { + return nil, errors.New("could not parse URL") + } + + default: + return nil, errors.New("unsupported type for meeklite url option") + } + + untypedFront, ok2 := args["front"] + if !ok2 { + return nil, errors.New("meeklite transport missing front argument") + } + + switch untypedFront.(type) { + case string: + var icerr error + front, icerr = interconv.ParseString(untypedFront) + if icerr != nil { + return nil, icerr + } + default: + return nil, errors.New("unsupported type for meeklite front option") + } + + transport := meeklite.Transport{ + Url: url, + Front: front, + Address: target, + } + + return &transport, nil +} + +func ParseArgsOptimizer(args map[string]interface{}) (*Optimizer.OptimizerTransport, error) { + var transports []Optimizer.Transport + var strategy Optimizer.Strategy + + untypedTransports, ok := args["transports"] + if !ok { + return nil, errors.New("optimizer transport missing transports argument") + } + + switch untypedTransports.(type) { + case []map[string]interface{}: + otcs := untypedTransports.([]map[string]interface{}) + + var parseErr error + transports, parseErr = parseTransports(otcs) + if parseErr != nil { + return nil, errors.New("could not parse transports") + } + default: + return nil, errors.New("unsupported type for Optimizer transports option") + } + + untypedStrategy, ok2 := args["strategy"] + if !ok2 { + return nil, errors.New("optimizer transport missing strategy argument") + } + + switch untypedStrategy.(type) { + case string: + strategyString, icerr := interconv.ParseString(untypedStrategy) + if icerr != nil { + return nil, icerr + } + var parseErr error + strategy, parseErr = parseStrategy(strategyString, transports) + if parseErr != nil { + return nil, errors.New("could not parse strategy") + } + default: + return nil, errors.New("unsupported type for optimizer strategy option") + } + + transport := Optimizer.OptimizerTransport{ + Transports: transports, + Strategy: strategy, + } + + return &transport, nil +} + +func parseStrategy(strategyString string, transports []Optimizer.Transport) (Optimizer.Strategy, error) { + switch strategyString { + case "first": + strategy := Optimizer.NewFirstStrategy(transports) + return strategy, nil + case "random": + strategy := Optimizer.NewRandomStrategy(transports) + return strategy, nil + case "rotate": + strategy := Optimizer.NewRotateStrategy(transports) + return strategy, nil + case "track": + return Optimizer.NewTrackStrategy(transports), nil + case "minimizeDialDuration": + return Optimizer.NewMinimizeDialDuration(transports), nil + + default: + return nil, errors.New("invalid strategy") + } +} + +func parseTransports(otcs []map[string]interface{}) ([]Optimizer.Transport, error) { + transports := make([]Optimizer.Transport, len(otcs)) + for index, otc := range otcs { + transport, err := parsedTransport(otc) + if err != nil { + return nil, errors.New("transport could not parse config") + //this error sucks and is uninformative + } + transports[index] = transport + } + return transports, nil +} + +func parsedTransport(otc map[string]interface{}) (Optimizer.Transport, error) { + var address string + var name string + var config map[string]interface{} + //start by parsing the address + untypedAddress, ok := otc["address"] + if !ok { + return nil, errors.New("missing address in transport parser") + } + + switch untypedAddress.(type) { + + case string: + var icerr error + address, icerr = interconv.ParseString(untypedAddress) + if icerr != nil { + return nil, icerr + } + + default: + return nil, errors.New("unsupported type for optimizer address option") + } + //now to parse the name + untypedName, ok2 := otc["name"] + if !ok2 { + return nil, errors.New("missing name in transport parser") + } + + switch untypedName.(type) { + + case string: + var icerr error + name, icerr = interconv.ParseString(untypedName) + if icerr != nil { + return nil, icerr + } + + default: + return nil, errors.New("unsupported type for optimizer name option") + } + //on to parsing the config + untypedConfig, ok3 := otc["config"] + if !ok3 { + return nil, errors.New("missing config in transport parser") + } + + switch untypedConfig.(type) { + + case map[string]interface{}: + config = untypedConfig.(map[string]interface{}) + + default: + return nil, errors.New("unsupported type for optimizer config option") + } + + switch name { + case "shadow": + shadowTransport, parseErr := ParseArgsShadow(config, address) + if parseErr != nil { + return nil, errors.New("could not parse shadow Args") + } + return shadowTransport, nil + case "obfs4": + obfs4Transport, parseErr := ParseArgsObfs4(config, address) + if parseErr != nil { + return nil, errors.New("could not parse obfs4 Args") + } + return obfs4Transport, nil + case "meeklite": + meekliteTransport, parseErr := ParseArgsMeeklite(config, address) + if parseErr != nil { + return nil, errors.New("could not parse meeklite Args") + } + return meekliteTransport, nil + case "Dust": + DustTransport, parseErr := ParseArgsDust(config, address) + if parseErr != nil { + return nil, errors.New("could not parse dust Args") + } + return DustTransport, nil + case "replicant": + replicantTransport, parseErr := ParseArgsReplicant(config, address) + if parseErr != nil { + return nil, errors.New("could not parse replicant Args") + } + return replicantTransport, nil + default: + return nil, errors.New("unsupported transport name") + } +} + +func ParseReplicantConfig(config string) (replicant.Config, error) { + return replicant.Config{}, errors.New("function not implemented") + +}
\ No newline at end of file |