55"encoding/hex"
66"errors"
77"net"
8+ "os"
89"strings"
910
1011"github.com/go-ini/ini"
@@ -68,6 +69,18 @@ func parseString(section *ini.Section, keyName string) (string, error) {
6869if key == nil {
6970return "" , errors .New (keyName + " should not be empty" )
7071}
72+ value := key .String ()
73+ if strings .HasPrefix (value , "$" ) {
74+ if strings .HasPrefix (value , "$$" ) {
75+ return strings .Replace (value , "$$" , "$" , 1 ), nil
76+ }
77+ var ok bool
78+ value , ok = os .LookupEnv (strings .TrimPrefix (value , "$" ))
79+ if ! ok {
80+ return "" , errors .New (keyName + " references unset environment variable " + key .String ())
81+ }
82+ return value , nil
83+ }
7184return key .String (), nil
7285}
7386
@@ -122,15 +135,21 @@ func encodeBase64ToHex(key string) (string, error) {
122135}
123136
124137func parseNetIP (section * ini.Section , keyName string ) ([]netip.Addr , error ) {
125- key := section .Key (keyName )
126- if key == nil {
127- return []netip.Addr {}, nil
138+ key , err := parseString (section , keyName )
139+ if err != nil {
140+ if strings .Contains (err .Error (), "should not be empty" ) {
141+ return []netip.Addr {}, nil
142+ }
143+ return nil , err
128144}
129145
130- keys := key . StringsWithShadows ( "," )
146+ keys := strings . Split ( key , "," )
131147var ips = make ([]netip.Addr , 0 , len (keys ))
132148for _ , str := range keys {
133149str = strings .TrimSpace (str )
150+ if len (str ) == 0 {
151+ continue
152+ }
134153ip , err := netip .ParseAddr (str )
135154if err != nil {
136155return nil , err
@@ -141,22 +160,30 @@ func parseNetIP(section *ini.Section, keyName string) ([]netip.Addr, error) {
141160}
142161
143162func parseCIDRNetIP (section * ini.Section , keyName string ) ([]netip.Addr , error ) {
144- key := section .Key (keyName )
145- if key == nil {
146- return []netip.Addr {}, nil
163+ key , err := parseString (section , keyName )
164+ if err != nil {
165+ if strings .Contains (err .Error (), "should not be empty" ) {
166+ return []netip.Addr {}, nil
167+ }
168+ return nil , err
147169}
148170
149- keys := key . StringsWithShadows ( "," )
171+ keys := strings . Split ( key , "," )
150172var ips = make ([]netip.Addr , 0 , len (keys ))
151173for _ , str := range keys {
174+ str = strings .TrimSpace (str )
175+ if len (str ) == 0 {
176+ continue
177+ }
178+
152179if addr , err := netip .ParseAddr (str ); err == nil {
153180ips = append (ips , addr )
154181} else {
155182prefix , err := netip .ParsePrefix (str )
156183if err != nil {
157184return nil , err
158185}
159-
186+
160187addr := prefix .Addr ()
161188ips = append (ips , addr )
162189}
@@ -165,14 +192,21 @@ func parseCIDRNetIP(section *ini.Section, keyName string) ([]netip.Addr, error)
165192}
166193
167194func parseAllowedIPs (section * ini.Section ) ([]netip.Prefix , error ) {
168- key := section .Key ("AllowedIPs" )
169- if key == nil {
170- return []netip.Prefix {}, nil
195+ key , err := parseString (section , "AllowedIPs" )
196+ if err != nil {
197+ if strings .Contains (err .Error (), "should not be empty" ) {
198+ return []netip.Prefix {}, nil
199+ }
200+ return nil , err
171201}
172202
173- keys := key . StringsWithShadows ( "," )
203+ keys := strings . Split ( key , "," )
174204var ips = make ([]netip.Prefix , 0 , len (keys ))
175205for _ , str := range keys {
206+ str = strings .TrimSpace (str )
207+ if len (str ) == 0 {
208+ continue
209+ }
176210prefix , err := netip .ParsePrefix (str )
177211if err != nil {
178212return nil , err
@@ -292,8 +326,7 @@ func ParsePeers(cfg *ini.File, peers *[]PeerConfig) error {
292326peer .PreSharedKey = value
293327}
294328
295- if sectionKey , err := section .GetKey ("Endpoint" ); err == nil {
296- value := sectionKey .String ()
329+ if value , err := parseString (section , "Endpoint" ); err == nil {
297330decoded , err = resolveIPPAndPort (strings .ToLower (value ))
298331if err != nil {
299332return err
0 commit comments