diff --git a/lib/challenge/helper.go b/lib/challenge/helper.go index 9c5b5e5..de42e2e 100644 --- a/lib/challenge/helper.go +++ b/lib/challenge/helper.go @@ -8,7 +8,9 @@ import ( "git.gammaspectra.live/git/go-away/utils" "net/http" "net/url" + "strconv" "strings" + "time" ) var ErrInvalidToken = errors.New("invalid token") @@ -47,6 +49,7 @@ const ( QueryArgRequestId = QueryArgPrefix + "_id" QueryArgChallenge = QueryArgPrefix + "_challenge" QueryArgToken = QueryArgPrefix + "_token" + QueryArgBust = QueryArgPrefix + "_bust" ) const MakeChallengeUrlSuffix = "/make-challenge" @@ -96,6 +99,7 @@ func VerifyUrl(r *http.Request, reg *Registration, token string) (*url.URL, erro values.Set(QueryArgRedirect, redirectUrl.String()) values.Set(QueryArgToken, token) values.Set(QueryArgChallenge, reg.Name) + values.Set(QueryArgBust, strconv.FormatInt(time.Now().UTC().UnixMilli(), 10)) uri.RawQuery = values.Encode() return uri, nil diff --git a/lib/challenge/resource-load/resource-load.go b/lib/challenge/resource-load/resource-load.go index 8ffc017..be0a19d 100644 --- a/lib/challenge/resource-load/resource-load.go +++ b/lib/challenge/resource-load/resource-load.go @@ -23,9 +23,13 @@ func FillRegistrationHeader(state challenge.StateInterface, reg *challenge.Regis return challenge.VerifyResultFail } + redirectUri, err := challenge.RedirectUrl(r, reg) + if err != nil { + return challenge.VerifyResultFail + } // self redirect! //TODO: adjust deadline - w.Header().Set("Refresh", "2; url="+r.URL.String()) + w.Header().Set("Refresh", "2; url="+redirectUri.String()) state.ChallengePage(w, r, state.Settings().ChallengeResponseCode, reg, map[string]any{ "LinkTags": []map[string]string{ diff --git a/lib/challenge/script.go b/lib/challenge/script.go index 7abf11f..4af76d9 100644 --- a/lib/challenge/script.go +++ b/lib/challenge/script.go @@ -23,6 +23,7 @@ func ServeChallengeScript(w http.ResponseWriter, r *http.Request, reg *Registrat //TODO: log panic(err) } + data.ResponseHeaders(w) w.WriteHeader(http.StatusOK) @@ -30,7 +31,7 @@ func ServeChallengeScript(w http.ResponseWriter, r *http.Request, reg *Registrat "Id": data.Id.String(), "Path": reg.Path, "Parameters": paramData, - "Random": utils.CacheBust(), + "Random": utils.StaticCacheBust(), "Challenge": reg.Name, "ChallengeScript": script, "Strings": data.State.Strings(), diff --git a/lib/challenge/wasm/registration.go b/lib/challenge/wasm/registration.go index 0aff07f..92139ca 100644 --- a/lib/challenge/wasm/registration.go +++ b/lib/challenge/wasm/registration.go @@ -97,7 +97,7 @@ func FillJavaScriptRegistration(state challenge.StateInterface, reg *challenge.R reg.IssueChallenge = func(w http.ResponseWriter, r *http.Request, key challenge.Key, expiry time.Time) challenge.VerifyResult { state.ChallengePage(w, r, state.Settings().ChallengeResponseCode, reg, map[string]any{ "EndTags": []template.HTML{ - template.HTML(fmt.Sprintf("", reg.Path+"/script.mjs", utils.CacheBust())), + template.HTML(fmt.Sprintf("", reg.Path+"/script.mjs", utils.StaticCacheBust())), }, }) return challenge.VerifyResultNone @@ -164,6 +164,8 @@ func FillJavaScriptRegistration(state challenge.StateInterface, reg *challenge.R w.Header()[k] = v } w.Header().Set("Content-Length", fmt.Sprintf("%d", len(out.Data))) + + data.ResponseHeaders(w) w.WriteHeader(out.Code) _, _ = w.Write(out.Data) return nil diff --git a/lib/template.go b/lib/template.go index aeaced0..5442de6 100644 --- a/lib/template.go +++ b/lib/template.go @@ -78,7 +78,7 @@ func (state *State) ChallengePage(w http.ResponseWriter, r *http.Request, status data := challenge.RequestDataFromContext(r.Context()) input := make(map[string]any) input["Id"] = data.Id.String() - input["Random"] = utils.CacheBust() + input["Random"] = utils.StaticCacheBust() input["Path"] = state.UrlPath() input["Links"] = state.opt.Links @@ -121,7 +121,7 @@ func (state *State) ErrorPage(w http.ResponseWriter, r *http.Request, status int input := map[string]any{ "Id": data.Id.String(), - "Random": utils.CacheBust(), + "Random": utils.StaticCacheBust(), "Error": err.Error(), "Path": state.UrlPath(), "Theme": "", diff --git a/utils/http.go b/utils/http.go index e55e263..0bb5f5c 100644 --- a/utils/http.go +++ b/utils/http.go @@ -167,15 +167,14 @@ func GetRemoteAddress(ctx context.Context) *netip.AddrPort { return &ip } -func CacheBust() string { - return cacheBust -} - -var cacheBust string - -func init() { - - buf := make([]byte, 16) +func RandomCacheBust(n int) string { + buf := make([]byte, n) _, _ = rand.Read(buf) - cacheBust = base64.RawURLEncoding.EncodeToString(buf) + return base64.RawURLEncoding.EncodeToString(buf) +} + +var staticCacheBust = RandomCacheBust(16) + +func StaticCacheBust() string { + return staticCacheBust }