diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-23 05:20:04 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-23 05:20:04 +0300 |
| commit | de868930e2301b68a50bde088dd83dc575b72c54 (patch) | |
| tree | 9f3df0bbdb5035100311fe7194aef66186478ec4 /pkg/server/module | |
| parent | 7c7fafefef94c5fb8bfe319e7745d80a1e88205d (diff) | |
prepare to auth
Diffstat (limited to 'pkg/server/module')
| -rw-r--r-- | pkg/server/module/alpha.go | 6 | ||||
| -rw-r--r-- | pkg/server/module/auth.go | 32 | ||||
| -rw-r--r-- | pkg/server/module/hex.go | 4 | ||||
| -rw-r--r-- | pkg/server/module/module.go | 55 |
4 files changed, 79 insertions, 18 deletions
diff --git a/pkg/server/module/alpha.go b/pkg/server/module/alpha.go index be9032c..9eb1e2c 100644 --- a/pkg/server/module/alpha.go +++ b/pkg/server/module/alpha.go @@ -7,7 +7,7 @@ import ( "io" ) -func alpha(cb func (rune) rune) pipe { +func alpha(cb func (rune) rune) Pipe { return func (rq, wq queue.Q) error { r := bufio.NewReader(rq.Reader()) @@ -27,6 +27,6 @@ func alpha(cb func (rune) rune) pipe { } func init() { - register("lower", alpha(unicode.ToLower)) - register("upper", alpha(unicode.ToUpper)) + registerPipe("lower", alpha(unicode.ToLower)) + registerPipe("upper", alpha(unicode.ToUpper)) } diff --git a/pkg/server/module/auth.go b/pkg/server/module/auth.go new file mode 100644 index 0000000..05761ed --- /dev/null +++ b/pkg/server/module/auth.go @@ -0,0 +1,32 @@ +package module + +import ( + "tunnel/pkg/server/queue" + "tunnel/pkg/server/opts" + "tunnel/pkg/server/env" +) + +type auth struct { + secret string +} + +type authModule struct{} + +func (a *auth) Send(rq, wq queue.Q) error { + return queue.Copy(rq, wq) +} + +func (a *auth) Recv(rq, wq queue.Q) error { + return queue.Copy(rq, wq) +} + +func (m authModule) Open(env env.Env) (Pipe, Pipe) { + a := &auth{env.Get("secret")} + return a.Send, a.Recv +} + +func init() { + register("auth", func (opts.Opts, env.Env) (module, error) { + return authModule{}, nil + }) +} diff --git a/pkg/server/module/hex.go b/pkg/server/module/hex.go index 2ffd1fc..9b80e0d 100644 --- a/pkg/server/module/hex.go +++ b/pkg/server/module/hex.go @@ -22,6 +22,6 @@ func hexDecoder(rq, wq queue.Q) error { } func init() { - register("hex", pipe(hexEncoder)) - register("unhex", pipe(hexDecoder)) + registerPipe("hex", Pipe(hexEncoder)) + registerPipe("unhex", Pipe(hexDecoder)) } diff --git a/pkg/server/module/module.go b/pkg/server/module/module.go index 768a87b..87bdd20 100644 --- a/pkg/server/module/module.go +++ b/pkg/server/module/module.go @@ -2,16 +2,29 @@ package module import ( "tunnel/pkg/server/queue" + "tunnel/pkg/server/opts" + "tunnel/pkg/server/env" "fmt" "log" ) -var modules = map[string]M{} +type moduleInitFunc func (opts.Opts, env.Env) (module, error) -type pipe func (rq, wq queue.Q) error +var modules = map[string]moduleInitFunc{} + +type module interface { + Open(env env.Env) (Pipe, Pipe) +} type M interface { - Open() (pipe, pipe) + module + String() string +} + +type Pipe func (rq, wq queue.Q) error + +func (p Pipe) Open(env env.Env) (Pipe, Pipe) { + return p, nil } type reverse struct { @@ -22,27 +35,43 @@ func Reverse(m M) M { return &reverse{m} } -func (r *reverse) Open() (pipe, pipe) { - p1, p2 := r.M.Open() +func (r *reverse) Open(env env.Env) (Pipe, Pipe) { + p1, p2 := r.M.Open(env) return p2, p1 } -func (p pipe) Open() (pipe, pipe) { - return p, nil +type named struct { + name string + module +} + +func (m *named) String() string { + return fmt.Sprintf("module:%s", m.name) } -func register(name string, m M) { +func register(name string, f moduleInitFunc) { if _, ok := modules[name]; ok { log.Panicf("duplicate module name '%s'", name) } - modules[name] = m + modules[name] = f } -func New(name string) (M, error) { - if m, ok := modules[name]; ok { - return m, nil +func registerPipe(name string, p Pipe) { + register(name, func (opts.Opts, env.Env) (module, error) { + return p, nil + }) +} + +func New(desc string, env env.Env) (M, error) { + name, opts := opts.Parse(desc) + + if f, ok := modules[name]; !ok { + return nil, fmt.Errorf("unknown module '%s'", name) + } else if m, err := f(opts, env); err != nil { + return nil, err + } else { + return &named{name: name, module: m}, nil } - return nil, fmt.Errorf("unknown module '%s'", name) } |
