package cron
import (
"fmt"
"html/template"
"io/ioutil"
"os"
"path/filepath"
"time"
"chaitin.cn/patronus/safeline-2/management/tcontrollerd/utils"
)
const (
specCheckChallengePage = "0/5 * * * * ?"
challengePageDir = "/etc/nginx/challenge_pages"
challengePagePath = "/etc/nginx/challenge_pages/challenge.html"
)
// challengePageData holds template data for the challenge page.
type challengePageData struct {
Timestamp int64
Token string
}
var challengePageTemplate = template.Must(template.New("challenge").Parse(`
安全验证
安全验证
正在验证您的浏览器安全环境...
验证失败,请刷新重试
`))
func checkAndUpdateChallengePage() {
// Ensure directory exists
if err := os.MkdirAll(challengePageDir, 0755); err != nil {
logger.Error("Failed to create challenge page directory:", err)
return
}
existed, err := utils.FileExist(challengePagePath)
if err != nil {
logger.Error(err)
return
}
// Always regenerate with fresh timestamp
data := challengePageData{
Timestamp: time.Now().Unix(),
Token: fmt.Sprintf("%d", time.Now().UnixNano()),
}
var buf []byte
templateWriter := &templateBuffer{buf: buf}
if err := challengePageTemplate.Execute(templateWriter, data); err != nil {
logger.Error("Failed to execute challenge template:", err)
return
}
if err := ioutil.WriteFile(challengePagePath, templateWriter.buf, 0644); err != nil {
logger.Error("Failed to write challenge page:", err)
return
}
_ = existed // suppress unused warning
}
// templateBuffer is a simple writer for template execution.
type templateBuffer struct {
buf []byte
}
func (w *templateBuffer) Write(p []byte) (n int, err error) {
w.buf = append(w.buf, p...)
return len(p), nil
}
func init() {
// Ensure challenge page directory exists on startup
_ = os.MkdirAll(challengePageDir, 0755)
_ = filepath.Clean(challengePagePath)
}