85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
package acme
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
tools "vServer/Backend/tools"
|
|
)
|
|
|
|
// HandleChallenge обрабатывает HTTP-01 ACME challenge
|
|
// Путь: /.well-known/acme-challenge/{token}
|
|
func (m *Manager) HandleChallenge(w http.ResponseWriter, r *http.Request) bool {
|
|
path := r.URL.Path
|
|
|
|
// Проверяем что это ACME challenge
|
|
if !strings.HasPrefix(path, "/.well-known/acme-challenge/") {
|
|
return false
|
|
}
|
|
|
|
// Извлекаем token из пути
|
|
token := strings.TrimPrefix(path, "/.well-known/acme-challenge/")
|
|
if token == "" {
|
|
http.Error(w, "Token not found", http.StatusNotFound)
|
|
return true
|
|
}
|
|
|
|
// Ищем challenge по token
|
|
m.mu.RLock()
|
|
challenge, exists := m.challenges[token]
|
|
m.mu.RUnlock()
|
|
|
|
if !exists {
|
|
tools.Logs_file(1, "ACME", "⚠️ Challenge не найден для token: "+token, "logs_acme.log", false)
|
|
http.Error(w, "Challenge not found", http.StatusNotFound)
|
|
return true
|
|
}
|
|
|
|
// Отдаём KeyAuth для подтверждения владения доменом
|
|
tools.Logs_file(0, "ACME", "✅ Challenge ответ для домена: "+challenge.Domain, "logs_acme.log", true)
|
|
w.Header().Set("Content-Type", "text/plain")
|
|
w.Write([]byte(challenge.KeyAuth))
|
|
|
|
return true
|
|
}
|
|
|
|
// addChallenge добавляет challenge в хранилище
|
|
func (m *Manager) addChallenge(token, keyAuth, domain string) {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
m.challenges[token] = &ChallengeData{
|
|
Token: token,
|
|
KeyAuth: keyAuth,
|
|
Domain: domain,
|
|
Created: getCurrentTimestamp(),
|
|
}
|
|
|
|
tools.Logs_file(0, "ACME", "📝 Challenge добавлен для: "+domain, "logs_acme.log", false)
|
|
}
|
|
|
|
// removeChallenge удаляет challenge из хранилища
|
|
func (m *Manager) removeChallenge(token string) {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
if challenge, exists := m.challenges[token]; exists {
|
|
tools.Logs_file(0, "ACME", "🗑️ Challenge удалён для: "+challenge.Domain, "logs_acme.log", false)
|
|
delete(m.challenges, token)
|
|
}
|
|
}
|
|
|
|
// cleanupOldChallenges удаляет старые challenges (старше 10 минут)
|
|
func (m *Manager) cleanupOldChallenges() {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
now := getCurrentTimestamp()
|
|
maxAge := int64(600) // 10 минут
|
|
|
|
for token, challenge := range m.challenges {
|
|
if now-challenge.Created > maxAge {
|
|
delete(m.challenges, token)
|
|
}
|
|
}
|
|
}
|