1/*2Maddy Mail Server - Composable all-in-one email server.3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors45This program is free software: you can redistribute it and/or modify6it under the terms of the GNU General Public License as published by7the Free Software Foundation, either version 3 of the License, or8(at your option) any later version.910This program is distributed in the hope that it will be useful,11but WITHOUT ANY WARRANTY; without even the implied warranty of12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13GNU General Public License for more details.1415You should have received a copy of the GNU General Public License16along with this program. If not, see <https://www.gnu.org/licenses/>.17*/1819package parser2021import (22 "os"23 "regexp"24 "strings"25)2627func expandEnvironment(nodes []Node) []Node {28 // If nodes is nil - don't replace with empty slice, as nil indicates "no29 // block".30 if nodes == nil {31 return nil32 }3334 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 = newArgs43 node.Children = expandEnvironment(node.Children)44 newNodes = append(newNodes, node)45 }46 return newNodes47}4849var unixEnvvarRe = regexp.MustCompile(`{env:([^\$]+)}`)5051func removeUnexpandedEnvvars(s string) string {52 s = unixEnvvarRe.ReplaceAllString(s, "")53 return s54}5556func 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]6364 pairs = append(pairs, "{env:"+key+"}", value)65 }66 return strings.NewReplacer(pairs...)67}