2023-02-02 05:34:49 +00:00
|
|
|
package validator
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"golang.org/x/net/publicsuffix"
|
2023-04-13 10:58:18 +00:00
|
|
|
|
|
|
|
"github.com/authelia/authelia/v4/internal/utils"
|
2023-02-02 05:34:49 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func isCookieDomainAPublicSuffix(domain string) (valid bool) {
|
|
|
|
var suffix string
|
|
|
|
|
|
|
|
suffix, _ = publicsuffix.PublicSuffix(domain)
|
|
|
|
|
|
|
|
return len(strings.TrimLeft(domain, ".")) == len(suffix)
|
|
|
|
}
|
2023-04-13 10:58:18 +00:00
|
|
|
|
|
|
|
func strJoinOr(items []string) string {
|
|
|
|
return strJoinComma("or", items)
|
|
|
|
}
|
|
|
|
|
|
|
|
func strJoinAnd(items []string) string {
|
|
|
|
return strJoinComma("and", items)
|
|
|
|
}
|
|
|
|
|
|
|
|
func strJoinComma(word string, items []string) string {
|
|
|
|
if word == "" {
|
|
|
|
return buildJoinedString(",", "", "'", items)
|
|
|
|
}
|
|
|
|
|
|
|
|
return buildJoinedString(",", word, "'", items)
|
|
|
|
}
|
|
|
|
|
|
|
|
func buildJoinedString(sep, sepFinal, quote string, items []string) string {
|
|
|
|
n := len(items)
|
|
|
|
|
|
|
|
if n == 0 {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
b := &strings.Builder{}
|
|
|
|
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
if quote != "" {
|
|
|
|
b.WriteString(quote)
|
|
|
|
}
|
|
|
|
|
|
|
|
b.WriteString(items[i])
|
|
|
|
|
|
|
|
if quote != "" {
|
|
|
|
b.WriteString(quote)
|
|
|
|
}
|
|
|
|
|
|
|
|
if i == (n - 1) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if sep != "" {
|
|
|
|
if sepFinal == "" || n != 2 {
|
|
|
|
b.WriteString(sep)
|
|
|
|
}
|
|
|
|
|
|
|
|
b.WriteString(" ")
|
|
|
|
}
|
|
|
|
|
|
|
|
if sepFinal != "" && i == (n-2) {
|
|
|
|
b.WriteString(strings.Trim(sepFinal, " "))
|
|
|
|
b.WriteString(" ")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return b.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
func validateList(values, valid []string, chkDuplicate bool) (invalid, duplicates []string) { //nolint:unparam
|
|
|
|
chkValid := len(valid) != 0
|
|
|
|
|
|
|
|
for i, value := range values {
|
|
|
|
if chkValid {
|
|
|
|
if !utils.IsStringInSlice(value, valid) {
|
|
|
|
invalid = append(invalid, value)
|
|
|
|
|
|
|
|
// Skip checking duplicates for invalid values.
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if chkDuplicate {
|
|
|
|
for j, valueAlt := range values {
|
|
|
|
if i == j {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if value != valueAlt {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if utils.IsStringInSlice(value, duplicates) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
duplicates = append(duplicates, value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|