diff options
| author | James Elliott <james-d-elliott@users.noreply.github.com> | 2023-04-08 14:48:55 +1000 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-08 14:48:55 +1000 | 
| commit | 2dcfc0b04c3fbe57ecc11322487089bc8970e79f (patch) | |
| tree | 54538032cbe1cdd9220d1418251d1c848c987519 /internal/handlers/handler_authz_impl_forwardauth_test.go | |
| parent | fa250ea7ddb902132f4df74c407be84015577fa3 (diff) | |
feat(handlers): authz authrequest authelia url (#5181)
This adjusts the AuthRequest Authz implementation behave similarly to the other implementations in as much as Authelia can return the relevant redirection to the proxy and the proxy just utilizes it if possible. In addition it swaps the HAProxy examples over to the ForwardAuth implementation as that's now supported.
Signed-off-by: James Elliott <james-d-elliott@users.noreply.github.com>
Diffstat (limited to 'internal/handlers/handler_authz_impl_forwardauth_test.go')
| -rw-r--r-- | internal/handlers/handler_authz_impl_forwardauth_test.go | 117 | 
1 files changed, 37 insertions, 80 deletions
diff --git a/internal/handlers/handler_authz_impl_forwardauth_test.go b/internal/handlers/handler_authz_impl_forwardauth_test.go index d7ea3baab..de8be0ba5 100644 --- a/internal/handlers/handler_authz_impl_forwardauth_test.go +++ b/internal/handlers/handler_authz_impl_forwardauth_test.go @@ -13,7 +13,7 @@ import (  	"github.com/authelia/authelia/v4/internal/authorization"  	"github.com/authelia/authelia/v4/internal/middlewares"  	"github.com/authelia/authelia/v4/internal/mocks" -	"github.com/authelia/authelia/v4/internal/session" +	"github.com/authelia/authelia/v4/internal/utils"  )  func TestRunForwardAuthAuthzSuite(t *testing.T) { @@ -51,11 +51,9 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsDeny() {  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock) -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					s.setRequest(mock.Ctx, method, pairURI.TargetURI, true, false) @@ -98,11 +96,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsOverrideAutheliaURLDen  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					mock.Ctx.RequestCtx.QueryArgs().Set("authelia_url", pairURI.AutheliaURI.String())  					s.setRequest(mock.Ctx, method, pairURI.TargetURI, true, false) @@ -148,8 +142,10 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsMissingAutheliaURLDeny  					authz.Handler(mock.Ctx) -					assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +					assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode()) +					assert.Equal(t, fmt.Sprintf("%d %s", fasthttp.StatusBadRequest, fasthttp.StatusMessage(fasthttp.StatusBadRequest)), string(mock.Ctx.Response.Body()))  					assert.Equal(t, "", string(mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))) +					assert.Equal(t, "text/plain; charset=utf-8", string(mock.Ctx.Response.Header.Peek(fasthttp.HeaderContentType)))  				})  			}  		}) @@ -176,11 +172,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsXHRDeny() {  							defer mock.Close() -							for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -								mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -							} - -							mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +							s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  							s.setRequest(mock.Ctx, method, pairURI.TargetURI, x, x) @@ -220,17 +212,13 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleInvalidMethodCharsDeny() {  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					s.setRequest(mock.Ctx, method, targetURI, true, false)  					authz.Handler(mock.Ctx) -					assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +					assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode())  					assert.Equal(t, []byte(nil), mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))  				})  			} @@ -247,11 +235,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleMissingHostDeny() {  			defer mock.Close() -			for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -				mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -			} - -			mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +			s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  			mock.Ctx.Request.Header.Set("X-Forwarded-Method", method)  			mock.Ctx.Request.Header.Set(fasthttp.HeaderXForwardedProto, "https") @@ -261,7 +245,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleMissingHostDeny() {  			authz.Handler(mock.Ctx) -			assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +			assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode())  			assert.Equal(t, []byte(nil), mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))  		})  	} @@ -283,11 +267,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsAllow() {  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					s.setRequest(mock.Ctx, method, targetURI, true, false) @@ -313,11 +293,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsWithMethodsACL() {  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					s.setRequest(mock.Ctx, method, targetURI, true, false) @@ -329,18 +305,23 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsWithMethodsACL() {  					} else {  						expected := s.RequireParseRequestURI("https://auth.example.com/") +						query := expected.Query() +						query.Set(queryArgRD, targetURI.String()) +						query.Set(queryArgRM, method) +						expected.RawQuery = query.Encode() +  						switch method { -						case fasthttp.MethodGet, fasthttp.MethodOptions, fasthttp.MethodHead: +						case fasthttp.MethodHead: +							assert.Equal(t, fasthttp.StatusFound, mock.Ctx.Response.StatusCode()) +							assert.Nil(t, mock.Ctx.Response.Body()) +						case fasthttp.MethodGet, fasthttp.MethodOptions:  							assert.Equal(t, fasthttp.StatusFound, mock.Ctx.Response.StatusCode()) +							assert.Equal(t, fmt.Sprintf(`<a href="%s">%d %s</a>`, utils.StringHTMLEscape(expected.String()), fasthttp.StatusFound, fasthttp.StatusMessage(fasthttp.StatusFound)), string(mock.Ctx.Response.Body()))  						default:  							assert.Equal(t, fasthttp.StatusSeeOther, mock.Ctx.Response.StatusCode()) +							assert.Equal(t, fmt.Sprintf(`<a href="%s">%d %s</a>`, utils.StringHTMLEscape(expected.String()), fasthttp.StatusSeeOther, fasthttp.StatusMessage(fasthttp.StatusSeeOther)), string(mock.Ctx.Response.Body()))  						} -						query := expected.Query() -						query.Set(queryArgRD, targetURI.String()) -						query.Set(queryArgRM, method) -						expected.RawQuery = query.Encode() -  						assert.Equal(t, expected.String(), string(mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation)))  					}  				}) @@ -365,11 +346,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleAllMethodsAllowXHR() {  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					s.setRequest(mock.Ctx, method, targetURI, true, true) @@ -392,7 +369,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleInvalidURLForCVE202132637() {  	}{  		{"Should401UnauthorizedWithNullByte",  			[]byte("https"), []byte{0, 110, 111, 116, 45, 111, 110, 101, 45, 102, 97, 99, 116, 111, 114, 46, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109}, "/path-example", -			fasthttp.StatusUnauthorized, +			fasthttp.StatusBadRequest,  		},  		{"Should200OkWithoutNullByte",  			[]byte("https"), []byte{110, 111, 116, 45, 111, 110, 101, 45, 102, 97, 99, 116, 111, 114, 46, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109}, "/path-example", @@ -413,11 +390,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldHandleInvalidURLForCVE202132637() {  					mock.Ctx.Configuration.AccessControl.DefaultPolicy = testBypass  					mock.Ctx.Providers.Authorizer = authorization.NewAuthorizer(&mock.Ctx.Configuration) -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					mock.Ctx.Request.Header.Set("X-Forwarded-Method", method)  					mock.Ctx.Request.Header.SetBytesKV([]byte(fasthttp.HeaderXForwardedProto), tc.scheme) @@ -455,7 +428,7 @@ func (s *ForwardAuthAuthzSuite) TestShouldNotHandleAuthRequestAllMethodsAllow()  					authz.Handler(mock.Ctx) -					assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +					assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode())  					assert.Equal(t, []byte(nil), mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))  				})  			} @@ -475,17 +448,13 @@ func (s *ForwardAuthAuthzSuite) TestShouldNotHandleAuthRequestAllMethodsWithMeth  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					setRequestAuthRequest(mock.Ctx, method, targetURI, true, false)  					authz.Handler(mock.Ctx) -					assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +					assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode())  					assert.Equal(t, []byte(nil), mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))  				})  			} @@ -509,17 +478,13 @@ func (s *ForwardAuthAuthzSuite) TestShouldNotHandleExtAuthzAllMethodsAllow() {  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					setRequestExtAuthz(mock.Ctx, method, targetURI, true, false)  					authz.Handler(mock.Ctx) -					assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +					assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode())  					assert.Equal(t, []byte(nil), mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))  				})  			} @@ -545,17 +510,13 @@ func (s *ForwardAuthAuthzSuite) TestShouldNotHandleExtAuthzAllMethodsAllowXHR()  							defer mock.Close() -							for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -								mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -							} - -							mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +							s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  							setRequestExtAuthz(mock.Ctx, method, targetURI, x, x)  							authz.Handler(mock.Ctx) -							assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +							assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode())  							assert.Equal(t, []byte(nil), mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))  						})  					} @@ -577,17 +538,13 @@ func (s *ForwardAuthAuthzSuite) TestShouldNotHandleExtAuthzAllMethodsWithMethods  					defer mock.Close() -					for i, cookie := range mock.Ctx.Configuration.Session.Cookies { -						mock.Ctx.Configuration.Session.Cookies[i].AutheliaURL = s.RequireParseRequestURI(fmt.Sprintf("https://auth.%s", cookie.Domain)) -					} - -					mock.Ctx.Providers.SessionProvider = session.NewProvider(mock.Ctx.Configuration.Session, nil) +					s.ConfigureMockSessionProviderWithAutomaticAutheliaURLs(mock)  					setRequestExtAuthz(mock.Ctx, method, targetURI, true, false)  					authz.Handler(mock.Ctx) -					assert.Equal(t, fasthttp.StatusUnauthorized, mock.Ctx.Response.StatusCode()) +					assert.Equal(t, fasthttp.StatusBadRequest, mock.Ctx.Response.StatusCode())  					assert.Equal(t, []byte(nil), mock.Ctx.Response.Header.Peek(fasthttp.HeaderLocation))  				})  			}  | 
