fix: clearance failure caused by UA changes

This commit is contained in:
Roi Feng
2025-03-07 19:52:29 -05:00
parent eaec9574b2
commit 81a9ca5591
3 changed files with 28 additions and 3 deletions

5
go.mod
View File

@ -2,4 +2,7 @@ module server_torii
go 1.23.5
require gopkg.in/yaml.v3 v3.0.1
require (
github.com/mssola/useragent v1.0.0
gopkg.in/yaml.v3 v3.0.1
)

View File

@ -12,6 +12,7 @@ import (
"server_torii/internal/action"
"server_torii/internal/config"
"server_torii/internal/dataType"
"server_torii/internal/utils"
"strconv"
"strings"
"time"
@ -96,7 +97,7 @@ func CheckCaptcha(r *http.Request, reqData dataType.UserRequest, ruleSet *config
func GenClearance(reqData dataType.UserRequest, ruleSet config.RuleSet) []byte {
timeNow := time.Now().Unix()
mac := hmac.New(sha512.New, []byte(ruleSet.CAPTCHARule.SecretKey))
mac.Write([]byte(fmt.Sprintf("%d%s%sCAPTCHA-CLEARANCE", timeNow, reqData.Host, reqData.UserAgent)))
mac.Write([]byte(fmt.Sprintf("%d%s%sCAPTCHA-CLEARANCE", timeNow, reqData.Host, utils.GetClearanceUserAgent(reqData.UserAgent))))
return []byte(fmt.Sprintf("%s:%s", fmt.Sprintf("%d", time.Now().Unix()), fmt.Sprintf("%x", mac.Sum(nil))))
}
@ -123,7 +124,7 @@ func verifyClearanceCookie(reqData dataType.UserRequest, ruleSet config.RuleSet)
}
mac := hmac.New(sha512.New, []byte(ruleSet.CAPTCHARule.SecretKey))
mac.Write([]byte(fmt.Sprintf("%d%s%sCAPTCHA-CLEARANCE", parsedTimestamp, reqData.Host, reqData.UserAgent)))
mac.Write([]byte(fmt.Sprintf("%d%s%sCAPTCHA-CLEARANCE", parsedTimestamp, reqData.Host, utils.GetClearanceUserAgent(reqData.UserAgent))))
computedHash := fmt.Sprintf("%x", mac.Sum(nil))
return hmac.Equal([]byte(computedHash), []byte(expectedHash))

View File

@ -0,0 +1,21 @@
package utils
import (
"fmt"
"github.com/mssola/useragent"
)
func GetClearanceUserAgent(inputUA string) string {
if len(inputUA) < 8 || inputUA[:8] != "Mozilla/" {
return inputUA
}
ua := useragent.New(inputUA)
engin, enginVersion := ua.Engine()
browser, browserVersion := ua.Browser()
ret := fmt.Sprintf("Mozilla:%v,Module:%v,Platform:%v,OS:%v,Engine:%v,EngineVersion:%v,Browser:%v,BrowserVersion:%v", ua.Mozilla(), ua.Model(), ua.Platform(), ua.OS(), engin, enginVersion, browser, browserVersion)
return ret
}