maddy

Fork https://github.com/foxcpp/maddy

git clone git://git.lin.moe/go/maddy.git

 1/*
 2Maddy Mail Server - Composable all-in-one email server.
 3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors
 4
 5This program is free software: you can redistribute it and/or modify
 6it under the terms of the GNU General Public License as published by
 7the Free Software Foundation, either version 3 of the License, or
 8(at your option) any later version.
 9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*/
18
19package parser
20
21import (
22	"os"
23	"regexp"
24	"strings"
25)
26
27func expandEnvironment(nodes []Node) []Node {
28	// If nodes is nil - don't replace with empty slice, as nil indicates "no
29	// block".
30	if nodes == nil {
31		return nil
32	}
33
34	replacer := buildEnvReplacer()
35	newNodes := make([]Node, 0, len(nodes))
36	for _, node := range nodes {
37		node.Name = removeUnexpandedEnvvars(replacer.Replace(node.Name))
38		newArgs := make([]string, 0, len(node.Args))
39		for _, arg := range node.Args {
40			newArgs = append(newArgs, removeUnexpandedEnvvars(replacer.Replace(arg)))
41		}
42		node.Args = newArgs
43		node.Children = expandEnvironment(node.Children)
44		newNodes = append(newNodes, node)
45	}
46	return newNodes
47}
48
49var unixEnvvarRe = regexp.MustCompile(`{env:([^\$]+)}`)
50
51func removeUnexpandedEnvvars(s string) string {
52	s = unixEnvvarRe.ReplaceAllString(s, "")
53	return s
54}
55
56func buildEnvReplacer() *strings.Replacer {
57	env := os.Environ()
58	pairs := make([]string, 0, len(env)*4)
59	for _, entry := range env {
60		parts := strings.SplitN(entry, "=", 2)
61		key := parts[0]
62		value := parts[1]
63
64		pairs = append(pairs, "{env:"+key+"}", value)
65	}
66	return strings.NewReplacer(pairs...)
67}