summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/options.go24
-rw-r--r--transports/transports.go147
2 files changed, 171 insertions, 0 deletions
diff --git a/common/options.go b/common/options.go
new file mode 100644
index 0000000..9c73616
--- /dev/null
+++ b/common/options.go
@@ -0,0 +1,24 @@
+package options
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "strings"
+)
+
+func ParseOptions(s string) (map[string]interface{}, error) {
+ var result map[string]interface{}
+
+ if len(s) == 0 {
+ return nil, errors.New("Empty options")
+ }
+
+ decoder := json.NewDecoder(strings.NewReader(s))
+ if err := decoder.Decode(&result); err != nil {
+ fmt.Errorf("Error decoding JSON %q", err)
+ return nil, err
+ }
+
+ return result, nil
+}
diff --git a/transports/transports.go b/transports/transports.go
index e435423..df05d33 100644
--- a/transports/transports.go
+++ b/transports/transports.go
@@ -29,7 +29,154 @@
// transports.
package transports
+import (
+ "errors"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
+ "github.com/mufti1/interconv/package"
+ "strconv"
+)
+
// Transports returns the list of registered transport protocols.
func Transports() []string {
return []string{"obfs2", "shadow", "obfs4", "Optimizer"}
}
+
+func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transport, error) {
+ var cert string
+ var iatMode int
+
+ untypedCert, ok := args["cert"]
+ if !ok {
+ return nil, errors.New("obfs4 transport missing cert argument")
+ }
+
+ switch untypedCert.(type) {
+ case string:
+ var icerr error
+ cert, icerr = interconv.ParseString(untypedCert)
+ if icerr != nil {
+ return nil, icerr
+ }
+ default:
+ return nil, errors.New("Unsupported type for obfs4 cert option")
+ }
+
+ untypedIatMode, ok2 := args["iatMode"]
+ if !ok2 {
+ return nil, errors.New("obfs4 transport missing iatMode argument")
+ }
+
+ switch untypedCert.(type) {
+ case string:
+ iatModeStr, icerr := interconv.ParseString(untypedIatMode)
+ if icerr != nil {
+ return nil, icerr
+ }
+ iatModeInt, scerr := strconv.Atoi(iatModeStr)
+ if scerr != nil {
+ return nil, errors.New("obfs4 transport bad iatMode value")
+ }
+ switch iatModeInt {
+ case 0:
+ iatMode = iatModeInt
+ case 1:
+ iatMode = iatModeInt
+ default:
+ return nil, errors.New("Unsupported value for obfs4 iatMode option")
+ }
+ case float64:
+ iatModeFloat, icerr := interconv.ParseFloat64(untypedIatMode)
+ if icerr != nil {
+ return nil, icerr
+ }
+ iatModeInt := int(iatModeFloat)
+ switch iatModeInt {
+ case 0:
+ iatMode = iatModeInt
+ case 1:
+ iatMode = iatModeInt
+ default:
+ return nil, errors.New("Unsupported value for obfs4 iatMode option")
+ }
+ case int:
+ iatModeInt, icerr := interconv.ParseInt(untypedIatMode)
+ if icerr != nil {
+ return nil, icerr
+ }
+ switch iatModeInt {
+ case 0:
+ iatMode = iatModeInt
+ case 1:
+ iatMode = iatModeInt
+ default:
+ return nil, errors.New("Unsupported value for obfs4 iatMode option")
+ }
+ case bool:
+ iatModeBool, icerr := interconv.ParseBoolean(untypedCert)
+ if icerr != nil {
+ return nil, icerr
+ }
+ switch iatModeBool {
+ case true:
+ iatMode = 1
+ case false:
+ iatMode = 0
+ }
+ default:
+ return nil, errors.New("Unsupported type for obfs4 iatMode option")
+ }
+
+ transport := obfs4.Transport{
+ CertString: cert,
+ IatMode: iatMode,
+ Address: target,
+ }
+
+ return &transport, nil
+}
+
+func ParseArgsShadow(args map[string]interface{}, target string) (*shadow.Transport, error) {
+ var password string
+ var cipherName string
+
+ untypedPassword, ok := args["password"]
+ if !ok {
+ return nil, errors.New("shadow transport missing password argument")
+ }
+
+ switch untypedPassword.(type) {
+ case string:
+ var icerr error
+ password, icerr = interconv.ParseString(untypedPassword)
+ if icerr != nil {
+ return nil, icerr
+ }
+ default:
+ return nil, errors.New("Unsupported type for shadow password option")
+ }
+
+ untypedCipherName, ok2 := args["cipherName"]
+ if !ok2 {
+ return nil, errors.New("shadow transport missing cipherName argument")
+ }
+
+ switch untypedCipherName.(type) {
+ case string:
+ var icerr error
+ cipherName, icerr = interconv.ParseString(untypedCipherName)
+ if icerr != nil {
+ return nil, icerr
+ }
+ default:
+ return nil, errors.New("Unsupported type for shadow cipherName option")
+ }
+
+ transport := shadow.Transport{
+ Password: password,
+ CipherName: cipherName,
+ Address: target,
+ }
+
+ return &transport, nil
+}