| | package common |
| |
|
| | import ( |
| | "encoding/base64" |
| | "encoding/json" |
| | "math/rand" |
| | "net/url" |
| | "regexp" |
| | "strconv" |
| | "strings" |
| | "unsafe" |
| | ) |
| |
|
| | func GetStringIfEmpty(str string, defaultValue string) string { |
| | if str == "" { |
| | return defaultValue |
| | } |
| | return str |
| | } |
| |
|
| | func GetRandomString(length int) string { |
| | |
| | key := make([]byte, length) |
| | for i := 0; i < length; i++ { |
| | key[i] = keyChars[rand.Intn(len(keyChars))] |
| | } |
| | return string(key) |
| | } |
| |
|
| | func MapToJsonStr(m map[string]interface{}) string { |
| | bytes, err := json.Marshal(m) |
| | if err != nil { |
| | return "" |
| | } |
| | return string(bytes) |
| | } |
| |
|
| | func StrToMap(str string) (map[string]interface{}, error) { |
| | m := make(map[string]interface{}) |
| | err := Unmarshal([]byte(str), &m) |
| | if err != nil { |
| | return nil, err |
| | } |
| | return m, nil |
| | } |
| |
|
| | func StrToJsonArray(str string) ([]interface{}, error) { |
| | var js []interface{} |
| | err := json.Unmarshal([]byte(str), &js) |
| | if err != nil { |
| | return nil, err |
| | } |
| | return js, nil |
| | } |
| |
|
| | func IsJsonArray(str string) bool { |
| | var js []interface{} |
| | return json.Unmarshal([]byte(str), &js) == nil |
| | } |
| |
|
| | func IsJsonObject(str string) bool { |
| | var js map[string]interface{} |
| | return json.Unmarshal([]byte(str), &js) == nil |
| | } |
| |
|
| | func String2Int(str string) int { |
| | num, err := strconv.Atoi(str) |
| | if err != nil { |
| | return 0 |
| | } |
| | return num |
| | } |
| |
|
| | func StringsContains(strs []string, str string) bool { |
| | for _, s := range strs { |
| | if s == str { |
| | return true |
| | } |
| | } |
| | return false |
| | } |
| |
|
| | |
| | func StringToByteSlice(s string) []byte { |
| | tmp1 := (*[2]uintptr)(unsafe.Pointer(&s)) |
| | tmp2 := [3]uintptr{tmp1[0], tmp1[1], tmp1[1]} |
| | return *(*[]byte)(unsafe.Pointer(&tmp2)) |
| | } |
| |
|
| | func EncodeBase64(str string) string { |
| | return base64.StdEncoding.EncodeToString([]byte(str)) |
| | } |
| |
|
| | func GetJsonString(data any) string { |
| | if data == nil { |
| | return "" |
| | } |
| | b, _ := json.Marshal(data) |
| | return string(b) |
| | } |
| |
|
| | |
| | |
| | func MaskEmail(email string) string { |
| | if email == "" { |
| | return "***masked***" |
| | } |
| |
|
| | |
| | atIndex := strings.Index(email, "@") |
| | if atIndex == -1 { |
| | |
| | return "***masked***" |
| | } |
| |
|
| | |
| | return "***@" + email[atIndex+1:] |
| | } |
| |
|
| | |
| | |
| | func maskHostTail(parts []string) []string { |
| | if len(parts) < 2 { |
| | return parts |
| | } |
| | lastPart := parts[len(parts)-1] |
| | secondLastPart := parts[len(parts)-2] |
| | if len(lastPart) == 2 && len(secondLastPart) <= 3 { |
| | |
| | return []string{secondLastPart, lastPart} |
| | } |
| | return []string{lastPart} |
| | } |
| |
|
| | |
| | |
| | func maskHostForURL(host string) string { |
| | parts := strings.Split(host, ".") |
| | if len(parts) < 2 { |
| | return "***" |
| | } |
| | tail := maskHostTail(parts) |
| | return "***." + strings.Join(tail, ".") |
| | } |
| |
|
| | |
| | |
| | func maskHostForPlainDomain(domain string) string { |
| | parts := strings.Split(domain, ".") |
| | if len(parts) < 2 { |
| | return domain |
| | } |
| | tail := maskHostTail(parts) |
| | numStars := len(parts) - len(tail) |
| | if numStars < 1 { |
| | numStars = 1 |
| | } |
| | stars := strings.TrimSuffix(strings.Repeat("***.", numStars), ".") |
| | return stars + "." + strings.Join(tail, ".") |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | func MaskSensitiveInfo(str string) string { |
| | |
| | urlPattern := regexp.MustCompile(`(http|https)://[^\s/$.?#].[^\s]*`) |
| | str = urlPattern.ReplaceAllStringFunc(str, func(urlStr string) string { |
| | u, err := url.Parse(urlStr) |
| | if err != nil { |
| | return urlStr |
| | } |
| |
|
| | host := u.Host |
| | if host == "" { |
| | return urlStr |
| | } |
| |
|
| | |
| | maskedHost := maskHostForURL(host) |
| |
|
| | result := u.Scheme + "://" + maskedHost |
| |
|
| | |
| | if u.Path != "" && u.Path != "/" { |
| | pathParts := strings.Split(strings.Trim(u.Path, "/"), "/") |
| | maskedPathParts := make([]string, len(pathParts)) |
| | for i := range pathParts { |
| | if pathParts[i] != "" { |
| | maskedPathParts[i] = "***" |
| | } |
| | } |
| | if len(maskedPathParts) > 0 { |
| | result += "/" + strings.Join(maskedPathParts, "/") |
| | } |
| | } else if u.Path == "/" { |
| | result += "/" |
| | } |
| |
|
| | |
| | if u.RawQuery != "" { |
| | values, err := url.ParseQuery(u.RawQuery) |
| | if err != nil { |
| | |
| | result += "?***" |
| | } else { |
| | maskedParams := make([]string, 0, len(values)) |
| | for key := range values { |
| | maskedParams = append(maskedParams, key+"=***") |
| | } |
| | if len(maskedParams) > 0 { |
| | result += "?" + strings.Join(maskedParams, "&") |
| | } |
| | } |
| | } |
| |
|
| | return result |
| | }) |
| |
|
| | |
| | domainPattern := regexp.MustCompile(`\b(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}\b`) |
| | str = domainPattern.ReplaceAllStringFunc(str, func(domain string) string { |
| | return maskHostForPlainDomain(domain) |
| | }) |
| |
|
| | |
| | ipPattern := regexp.MustCompile(`\b(?:\d{1,3}\.){3}\d{1,3}\b`) |
| | str = ipPattern.ReplaceAllString(str, "***.***.***.***") |
| |
|
| | return str |
| | } |
| |
|