commit 34047d7cae18337ff9eb56809f3cd2447a85c894
Author: David Fifield <da...@bamsoftware.com>
Date:   Wed Dec 4 01:56:02 2013 -0800

    Simulate loading configuration from a file.
---
 obfs-flash-server.go |   76 +++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 66 insertions(+), 10 deletions(-)

diff --git a/obfs-flash-server.go b/obfs-flash-server.go
index e70b842..20b5b65 100644
--- a/obfs-flash-server.go
+++ b/obfs-flash-server.go
@@ -155,7 +155,7 @@ type ServerTransportPlugin struct {
        Command    []string
 }
 
-func startProcesses(connectBackAddr net.Addr) (bindAddr *net.TCPAddr, procs 
ProcList, err error) {
+func startProcesses(connectBackAddr net.Addr, plugins []ServerTransportPlugin) 
(bindAddr *net.TCPAddr, procs ProcList, err error) {
        var stdout io.ReadCloser
 
        defer func() {
@@ -166,11 +166,6 @@ func startProcesses(connectBackAddr net.Addr) (bindAddr 
*net.TCPAddr, procs Proc
                }
        }()
 
-       plugins := []ServerTransportPlugin{
-               {"obfs3", []string{"obfsproxy", "managed"}},
-               {"websocket", []string{"websocket-server"}},
-       }
-
        bindAddr = connectBackAddr.(*net.TCPAddr)
        for _, plugin := range plugins {
                // This plugin has its TOR_PT_ORPORT set to the previous
@@ -327,7 +322,7 @@ loop:
        }
 }
 
-func startChain(bindAddr *net.TCPAddr) (*Chain, error) {
+func startChain(bindAddr *net.TCPAddr, plugins []ServerTransportPlugin) 
(*Chain, error) {
        chain := &Chain{}
        var err error
 
@@ -343,7 +338,7 @@ func startChain(bindAddr *net.TCPAddr) (*Chain, error) {
        log("Internal listener on %s.", chain.IntLn.Addr())
 
        // Start subprocesses.
-       chain.ProcsAddr, chain.Procs, err = startProcesses(chain.IntLn.Addr())
+       chain.ProcsAddr, chain.Procs, err = startProcesses(chain.IntLn.Addr(), 
plugins)
        if err != nil {
                log("Error starting proxy chain: %s.", err)
                chain.Shutdown()
@@ -366,6 +361,59 @@ func startChain(bindAddr *net.TCPAddr) (*Chain, error) {
        return chain, nil
 }
 
+type Configuration struct {
+       // Map from method names to command strings.
+       Transports map[string][]string
+       // Map from tor-friendly names like "obfs3_websocket" to systematic
+       // names like "obfs3|websocket".
+       Aliases map[string]string
+}
+
+func (conf *Configuration) MethodNames() []string {
+       result := make([]string, 0)
+       // We understand all the single transports
+       for k, _ := range conf.Transports {
+               result = append(result, k)
+       }
+       // and aliases.
+       for k, _ := range conf.Aliases {
+               result = append(result, k)
+       }
+       return result
+}
+
+// Parse a (possibly composed) method name into a slice of single method names.
+func (conf *Configuration) ParseMethodName(methodName string) []string {
+       if name, ok := conf.Aliases[methodName]; ok {
+               methodName = name
+       }
+       return strings.Split(methodName, "|")
+}
+
+func (conf *Configuration) PluginList(methodName string) 
([]ServerTransportPlugin, error) {
+       names := conf.ParseMethodName(methodName)
+       stp := make([]ServerTransportPlugin, 0)
+       for _, name := range names {
+               command, ok := conf.Transports[name]
+               if !ok {
+                       return nil, errors.New(fmt.Sprintf("no transport named 
%q", name))
+               }
+               stp = append(stp, ServerTransportPlugin{name, command})
+       }
+       return stp, nil
+}
+
+// Simulate loading a configuration file.
+func getConfiguration() (conf *Configuration) {
+       conf = new(Configuration)
+       conf.Transports = make(map[string][]string)
+       conf.Aliases = make(map[string]string)
+       conf.Transports["obfs3"] = []string{"obfsproxy", "managed"}
+       conf.Transports["websocket"] = []string{"websocket-server"}
+       conf.Aliases["obfs3_websocket"] = "obfs3|websocket"
+       return conf
+}
+
 func main() {
        var logFilename string
        var port int
@@ -385,7 +433,9 @@ func main() {
        }
 
        log("Starting.")
-       ptInfo = pt.ServerSetup([]string{ptMethodName})
+
+       conf := getConfiguration()
+       ptInfo = pt.ServerSetup(conf.MethodNames())
 
        chains := make([]*Chain, 0)
        for _, bindAddr := range ptInfo.BindAddrs {
@@ -396,7 +446,13 @@ func main() {
                        bindAddr.Addr.Port = port
                }
 
-               chain, err := startChain(bindAddr.Addr)
+               plugins, err := conf.PluginList(bindAddr.MethodName)
+               if err != nil {
+                       pt.SmethodError(bindAddr.MethodName, err.Error())
+                       continue
+               }
+
+               chain, err := startChain(bindAddr.Addr, plugins)
                if err != nil {
                        pt.SmethodError(bindAddr.MethodName, err.Error())
                        continue

_______________________________________________
tor-commits mailing list
tor-commits@lists.torproject.org
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits

Reply via email to