tildewatch/registration.go
2024-06-26 22:20:45 -04:00

91 lines
1.5 KiB
Go

package main
import (
"io"
"net/http"
"strings"
"github.com/go-gandi/go-gandi/config"
)
type Registration interface {
Valid() bool
Update(config.Config) (string, error)
HasSecret(string) bool
Domain() string
IP() string
}
type UserRegistration struct {
Subdomain string `yaml:"subdomain"`
Secret string `yaml:"secret"`
ip string
update bool
}
func (u *UserRegistration) Valid() bool {
return u.Subdomain != "" && u.Secret != ""
}
func (u *UserRegistration) Update(c config.Config) (string, error) {
if u.update {
u.update = false
return u.ip, nil
}
return "", nil
}
func (u *UserRegistration) HasSecret(s string) bool {
return u.Secret == s
}
func (u *UserRegistration) Domain() string {
return u.Subdomain
}
func (u *UserRegistration) IP() string {
return u.ip
}
type HostRegistration struct {
Subdomain string `yaml:"subdomain"`
ipddr string
}
func (h HostRegistration) Valid() bool {
return h.Subdomain != ""
}
func (h *HostRegistration) Update(_ config.Config) (string, error) {
resp, err := http.Get("https://icanhazip.com")
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
var result string
dynip := strings.TrimSpace(string(body))
if dynip != h.ipddr {
h.ipddr = dynip
result = dynip
}
return result, nil
}
func (h *HostRegistration) HasSecret(_ string) bool {
return false
}
func (h *HostRegistration) Domain() string {
return h.Subdomain
}
func (h *HostRegistration) IP() string {
return h.ipddr
}