lego/providers/dns/wedos/internal/token.go

74 lines
1.8 KiB
Go
Raw Normal View History

package internal
import (
"crypto/sha1"
"fmt"
"io"
"time"
)
func authToken(userName string, wapiPass string) string {
return sha1string(userName + sha1string(wapiPass) + czechHourString())
}
func sha1string(txt string) string {
h := sha1.New()
_, _ = io.WriteString(h, txt)
return fmt.Sprintf("%x", h.Sum(nil))
}
func czechHourString() string {
return formatHour(czechHour())
}
func czechHour() int {
tryZones := []string{"Europe/Prague", "Europe/Paris", "CET"}
for _, zoneName := range tryZones {
loc, err := time.LoadLocation(zoneName)
if err == nil {
return time.Now().In(loc).Hour()
}
}
// hopefully this will never be used
// this is fallback for containers without tzdata installed
return utcToCet(time.Now().UTC()).Hour()
}
func utcToCet(utc time.Time) time.Time {
// https://en.wikipedia.org/wiki/Central_European_Time
// As of 2011, all member states of the European Union observe summer time (daylight saving time),
// from the last Sunday in March to the last Sunday in October.
// States within the CET area switch to Central European Summer Time (CEST -- UTC+02:00) for the summer.[1]
utcMonth := utc.Month()
if utcMonth < time.March || utcMonth > time.October {
return utc.Add(time.Hour)
}
if utcMonth > time.March && utcMonth < time.October {
return utc.Add(time.Hour * 2)
}
dayOff := 0
breaking := time.Date(utc.Year(), utcMonth+1, dayOff, 1, 0, 0, 0, time.UTC)
for {
if breaking.Weekday() == time.Sunday {
break
}
dayOff--
breaking = time.Date(utc.Year(), utcMonth+1, dayOff, 1, 0, 0, 0, time.UTC)
if dayOff < -7 {
panic("safety exit to avoid infinite loop")
}
}
if (utcMonth == time.March && utc.Before(breaking)) || (utcMonth == time.October && utc.After(breaking)) {
return utc.Add(time.Hour)
}
return utc.Add(time.Hour * 2)
}
func formatHour(hour int) string {
return fmt.Sprintf("%02d", hour)
}