mirror of
https://github.com/labring/sealos.git
synced 2026-11-01 19:21:43 +08:00
* fix: replace text/template from html/template Signed-off-by: fengxsong <fengxsong@outlook.com> * fix: semgrep ignore import-text-template finding Signed-off-by: fengxsong <fengxsong@outlook.com> Signed-off-by: fengxsong <fengxsong@outlook.com>
184 lines
5.1 KiB
Go
184 lines
5.1 KiB
Go
/*
|
|
Copyright The Helm Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
// since funcMap is non-importable function, just copy/paste file:)
|
|
|
|
package template
|
|
|
|
// nosemgrep: go.lang.security.audit.xss.import-text-template.import-text-template
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
"text/template"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
"github.com/Masterminds/sprig/v3"
|
|
"sigs.k8s.io/yaml"
|
|
)
|
|
|
|
// funcMap returns a mapping of all of the functions that Engine has.
|
|
func funcMap() template.FuncMap {
|
|
f := sprig.TxtFuncMap()
|
|
// delete(f, "env")
|
|
// delete(f, "expandenv")
|
|
|
|
// Add some extra functionality
|
|
extra := template.FuncMap{
|
|
"toToml": toTOML,
|
|
"toYaml": toYAML,
|
|
"fromYaml": fromYAML,
|
|
"fromYamlArray": fromYAMLArray,
|
|
"toJson": toJSON,
|
|
"fromJson": fromJSON,
|
|
"fromJsonArray": fromJSONArray,
|
|
"ipNet": ipNet,
|
|
"ipAt": ipAt,
|
|
}
|
|
|
|
for k, v := range extra {
|
|
f[k] = v
|
|
}
|
|
|
|
return f
|
|
}
|
|
|
|
// toYAML takes an interface, marshals it to yaml, and returns a string. It will
|
|
// always return a string, even on marshal error (empty string).
|
|
//
|
|
// This is designed to be called from a template.
|
|
func toYAML(v interface{}) string {
|
|
data, err := yaml.Marshal(v)
|
|
if err != nil {
|
|
// Swallow errors inside of a template.
|
|
return ""
|
|
}
|
|
return strings.TrimSuffix(string(data), "\n")
|
|
}
|
|
|
|
// fromYAML converts a YAML document into a map[string]interface{}.
|
|
//
|
|
// This is not a general-purpose YAML parser, and will not parse all valid
|
|
// YAML documents. Additionally, because its intended use is within templates
|
|
// it tolerates errors. It will insert the returned error message string into
|
|
// m["Error"] in the returned map.
|
|
func fromYAML(str string) map[string]interface{} {
|
|
m := map[string]interface{}{}
|
|
|
|
if err := yaml.Unmarshal([]byte(str), &m); err != nil {
|
|
m["Error"] = err.Error()
|
|
}
|
|
return m
|
|
}
|
|
|
|
// fromYAMLArray converts a YAML array into a []interface{}.
|
|
//
|
|
// This is not a general-purpose YAML parser, and will not parse all valid
|
|
// YAML documents. Additionally, because its intended use is within templates
|
|
// it tolerates errors. It will insert the returned error message string as
|
|
// the first and only item in the returned array.
|
|
func fromYAMLArray(str string) []interface{} {
|
|
a := []interface{}{}
|
|
|
|
if err := yaml.Unmarshal([]byte(str), &a); err != nil {
|
|
a = []interface{}{err.Error()}
|
|
}
|
|
return a
|
|
}
|
|
|
|
// toTOML takes an interface, marshals it to toml, and returns a string. It will
|
|
// always return a string, even on marshal error (empty string).
|
|
//
|
|
// This is designed to be called from a template.
|
|
func toTOML(v interface{}) string {
|
|
b := bytes.NewBuffer(nil)
|
|
e := toml.NewEncoder(b)
|
|
if err := e.Encode(v); err != nil {
|
|
return err.Error()
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// toJSON takes an interface, marshals it to json, and returns a string. It will
|
|
// always return a string, even on marshal error (empty string).
|
|
//
|
|
// This is designed to be called from a template.
|
|
func toJSON(v interface{}) string {
|
|
data, err := json.Marshal(v)
|
|
if err != nil {
|
|
// Swallow errors inside of a template.
|
|
return ""
|
|
}
|
|
return string(data)
|
|
}
|
|
|
|
// fromJSON converts a JSON document into a map[string]interface{}.
|
|
//
|
|
// This is not a general-purpose JSON parser, and will not parse all valid
|
|
// JSON documents. Additionally, because its intended use is within templates
|
|
// it tolerates errors. It will insert the returned error message string into
|
|
// m["Error"] in the returned map.
|
|
func fromJSON(str string) map[string]interface{} {
|
|
m := make(map[string]interface{})
|
|
|
|
if err := json.Unmarshal([]byte(str), &m); err != nil {
|
|
m["Error"] = err.Error()
|
|
}
|
|
return m
|
|
}
|
|
|
|
// fromJSONArray converts a JSON array into a []interface{}.
|
|
//
|
|
// This is not a general-purpose JSON parser, and will not parse all valid
|
|
// JSON documents. Additionally, because its intended use is within templates
|
|
// it tolerates errors. It will insert the returned error message string as
|
|
// the first and only item in the returned array.
|
|
func fromJSONArray(str string) []interface{} {
|
|
a := []interface{}{}
|
|
|
|
if err := json.Unmarshal([]byte(str), &a); err != nil {
|
|
a = []interface{}{err.Error()}
|
|
}
|
|
return a
|
|
}
|
|
|
|
func ipNet(s string) string {
|
|
_, ipv4Net, err := net.ParseCIDR(s)
|
|
if err != nil {
|
|
return fmt.Sprintf("invalid cidr: %s", err)
|
|
}
|
|
return ipv4Net.String()
|
|
}
|
|
|
|
func ipAt(s string, idx uint32) string {
|
|
_, ipv4Net, err := net.ParseCIDR(s)
|
|
if err != nil {
|
|
return fmt.Sprintf("invalid cidr: %s", err)
|
|
}
|
|
mask := binary.BigEndian.Uint32(ipv4Net.Mask)
|
|
start := binary.BigEndian.Uint32(ipv4Net.IP)
|
|
finish := (start & mask) | (mask ^ 0xffffffff)
|
|
if start+idx > finish {
|
|
return "out of ip address range"
|
|
}
|
|
ip := make(net.IP, 4)
|
|
binary.BigEndian.PutUint32(ip, start+idx)
|
|
return ip.String()
|
|
}
|