summaryrefslogtreecommitdiff
path: root/pkg/server/module
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-02-23 05:20:04 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-02-23 05:20:04 +0300
commitde868930e2301b68a50bde088dd83dc575b72c54 (patch)
tree9f3df0bbdb5035100311fe7194aef66186478ec4 /pkg/server/module
parent7c7fafefef94c5fb8bfe319e7745d80a1e88205d (diff)
prepare to auth
Diffstat (limited to 'pkg/server/module')
-rw-r--r--pkg/server/module/alpha.go6
-rw-r--r--pkg/server/module/auth.go32
-rw-r--r--pkg/server/module/hex.go4
-rw-r--r--pkg/server/module/module.go55
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)
}