allow renewal of token if its safe to do so when using proxy auth with custom login

pull/3884/head
jake-dog 2025-05-13 21:06:35 -04:00
parent 8dd871df17
commit 07fe90ff5f
1 changed files with 17 additions and 1 deletions

View File

@ -12,7 +12,9 @@ import (
"github.com/golang-jwt/jwt/v4" "github.com/golang-jwt/jwt/v4"
"github.com/golang-jwt/jwt/v4/request" "github.com/golang-jwt/jwt/v4/request"
fbAuth "github.com/filebrowser/filebrowser/v2/auth"
fbErrors "github.com/filebrowser/filebrowser/v2/errors" fbErrors "github.com/filebrowser/filebrowser/v2/errors"
"github.com/filebrowser/filebrowser/v2/settings"
"github.com/filebrowser/filebrowser/v2/users" "github.com/filebrowser/filebrowser/v2/users"
) )
@ -64,6 +66,20 @@ func (e extractor) ExtractToken(r *http.Request) (string, error) {
return "", request.ErrNoTokenInRequest return "", request.ErrNoTokenInRequest
} }
func renewableErr(err error, d *data) bool {
if d.settings.AuthMethod != fbAuth.MethodProxyAuth || err == nil {
return false
}
if d.settings.LogoutPage == "" || d.settings.LogoutPage == settings.DefaultLogoutPage {
return false
}
var verr *jwt.ValidationError
if !errors.As(err, &verr) || verr == nil || verr.Errors != jwt.ValidationErrorExpired {
return false
}
return true
}
func withUser(fn handleFunc) handleFunc { func withUser(fn handleFunc) handleFunc {
return func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { return func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
keyFunc := func(_ *jwt.Token) (interface{}, error) { keyFunc := func(_ *jwt.Token) (interface{}, error) {
@ -73,7 +89,7 @@ func withUser(fn handleFunc) handleFunc {
var tk authToken var tk authToken
token, err := request.ParseFromRequest(r, &extractor{}, keyFunc, request.WithClaims(&tk)) token, err := request.ParseFromRequest(r, &extractor{}, keyFunc, request.WithClaims(&tk))
if err != nil || !token.Valid { if (err != nil || !token.Valid) && !renewableErr(err, d) {
return http.StatusUnauthorized, nil return http.StatusUnauthorized, nil
} }