summaryrefslogtreecommitdiff
path: root/pkg/server/env/env.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-10-19 10:33:07 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-10-19 10:55:16 +0300
commitba26de9f705831cf4d6f932b0ddebca82c96bf58 (patch)
tree0aae866abe9ca43481ce920b2b9426c32d7a40f8 /pkg/server/env/env.go
parent0ff71a73f4ccca2fb6b366d5896886e281eeac62 (diff)
expand tunnel.* vars, auth proto fix, go test
Diffstat (limited to 'pkg/server/env/env.go')
-rw-r--r--pkg/server/env/env.go64
1 files changed, 35 insertions, 29 deletions
diff --git a/pkg/server/env/env.go b/pkg/server/env/env.go
index b75d9a8..2c97669 100644
--- a/pkg/server/env/env.go
+++ b/pkg/server/env/env.go
@@ -10,11 +10,11 @@ import (
type env struct {
m map[string]string
sync.Mutex
+ p *env
}
type Env struct {
*env
- p *env
}
const namePattern = "[a-zA-Z][a-zA-Z0-9.]*"
@@ -30,15 +30,15 @@ func New() Env {
return Env{env: new(env)}
}
-func (e *env) init() {
+func (e Env) init() {
if e.m == nil {
e.m = make(map[string]string)
}
}
-func (e *env) Fork() Env {
+func (e Env) Fork() Env {
t := New()
- t.p = e
+ t.p = e.env
return t
}
@@ -47,12 +47,7 @@ func (e *env) Find(key string) (string, bool) {
defer e.Unlock()
v, ok := e.m[key]
-
- return v, ok
-}
-
-func (e Env) Find(key string) (string, bool) {
- if v, ok := e.env.Find(key); ok {
+ if ok {
return v, ok
}
@@ -68,11 +63,6 @@ func (e Env) Get(key string) string {
return v
}
-func (e Env) Has(key string) bool {
- _, ok := e.Find(key)
- return ok
-}
-
func validKeyValue(key string, value string) error {
if !isGoodName(key) {
return errBadVariable
@@ -119,7 +109,7 @@ func (e Env) Push(key string, value string) error {
return nil
}
-func (e *env) Del(key string) bool {
+func (e Env) Del(key string) bool {
e.Lock()
defer e.Unlock()
@@ -136,7 +126,7 @@ func (e *env) Del(key string) bool {
return true
}
-func (e *env) Each(f func(string, string) bool) {
+func (e Env) Each(f func(string, string) bool) {
var keys []string
e.Lock()
@@ -155,7 +145,7 @@ func (e *env) Each(f func(string, string) bool) {
}
}
-func (e *env) Clear() {
+func (e Env) Clear() {
e.Lock()
defer e.Unlock()
@@ -163,10 +153,22 @@ func (e *env) Clear() {
}
func (e Env) replaceWith(r *regexp.Regexp, s string, f func(string) string) string {
- for {
- t := r.ReplaceAllStringFunc(s, f)
+ const maxIter = 16
+
+ for iter := 0; ; iter++ {
+ found := false
+
+ t := r.ReplaceAllStringFunc(s, func(v string) string {
+ found = true
+
+ if iter >= maxIter {
+ return ""
+ }
+
+ return f(v)
+ })
- if t == s {
+ if !found && t == s {
break
}
@@ -194,18 +196,22 @@ func (e Env) EvalStrings(s []string) []string {
return t
}
+func (e Env) getLocal(key string) string {
+ if tunnel, ok := e.Find("tunnel"); ok {
+ if v, ok := e.Find("tunnel." + tunnel + "." + key); ok {
+ return v
+ }
+ }
+
+ return e.Get(key)
+}
+
func (e Env) Expand(s string) string {
return e.replaceWith(expandRe, s, func(v string) string {
- return e.Get(v[2 : len(v)-1])
+ return e.getLocal(v[2 : len(v)-1])
})
}
func (e Env) Value(key string) string {
- if e.Has("tunnel") {
- if v := e.Expand("@[tunnel.@[tunnel]." + key + "]"); v != "" {
- return v
- }
- }
-
- return e.Expand(e.Get(key))
+ return e.Expand(e.getLocal(key))
}