1package types
2
3import (
4	"strings"
5)
6
7// +k8s:deepcopy-gen=true
8
9// Domain holds a domain name with SANs.
10type Domain struct {
11	Main string   `description:"Default subject name." json:"main,omitempty" toml:"main,omitempty" yaml:"main,omitempty"`
12	SANs []string `description:"Subject alternative names." json:"sans,omitempty" toml:"sans,omitempty" yaml:"sans,omitempty"`
13}
14
15// ToStrArray convert a domain into an array of strings.
16func (d *Domain) ToStrArray() []string {
17	var domains []string
18	if len(d.Main) > 0 {
19		domains = []string{d.Main}
20	}
21	return append(domains, d.SANs...)
22}
23
24// Set sets a domains from an array of strings.
25func (d *Domain) Set(domains []string) {
26	if len(domains) > 0 {
27		d.Main = domains[0]
28		d.SANs = domains[1:]
29	}
30}
31
32// MatchDomain returns true if a domain match the cert domain.
33func MatchDomain(domain, certDomain string) bool {
34	if domain == certDomain {
35		return true
36	}
37
38	for len(certDomain) > 0 && certDomain[len(certDomain)-1] == '.' {
39		certDomain = certDomain[:len(certDomain)-1]
40	}
41
42	labels := strings.Split(domain, ".")
43	for i := range labels {
44		labels[i] = "*"
45		candidate := strings.Join(labels, ".")
46		if certDomain == candidate {
47			return true
48		}
49	}
50	return false
51}
52
53// CanonicalDomain returns a lower case domain with trim space.
54func CanonicalDomain(domain string) string {
55	return strings.ToLower(strings.TrimSpace(domain))
56}
57