summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBluesaxorcist <joshua@operatorfoundation.org>2019-08-01 18:23:54 -0500
committerBluesaxorcist <joshua@operatorfoundation.org>2019-08-01 18:23:54 -0500
commit5d034ec8d228cd1914e036b4828e4f2ddc8d0754 (patch)
tree131c0f1efac415bfbab9e7abbd21e4d2b82221fa
parentf95b28c267640a039c8968e105bf62b203fa8978 (diff)
made code conform to optimizer
-rw-r--r--.idea/.gitignore2
-rw-r--r--.idea/misc.xml6
-rw-r--r--.idea/modules.xml8
-rw-r--r--.idea/shapeshifter-dispatcher.iml9
-rw-r--r--.idea/vcs.xml6
-rw-r--r--README.md2
-rw-r--r--modes/transparent_tcp/transparent_tcp.go146
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
diff --git a/README.md b/README.md
index d2ad39c..5833ab9 100644
--- a/README.md
+++ b/README.md
@@ -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