Skip to content

Commit

Permalink
Split ./pkg/auth/webapp_request_middleware.go from ./pkg/lib/deps/mid…
Browse files Browse the repository at this point in the history
…dleware_request.go
  • Loading branch information
louischan-oursky committed Feb 26, 2025
1 parent fe7d464 commit 7ebf318
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 31 deletions.
1 change: 0 additions & 1 deletion .make-lint-expect
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ pkg/api/event/hook_response.go cannot import github.com/authgear/authgear-server

exit status 1
pkg/lib/deps/deps_common.go cannot import github.com/authgear/authgear-server/pkg/auth/handler/webapp/authflowv2
pkg/lib/deps/middleware_request.go cannot import github.com/authgear/authgear-server/pkg/auth/handler/webapp/viewmodels

exit status 1
pkg/admin/graphql/audit_log.go cannot import github.com/authgear/authgear-server/pkg/graphqlgo/relay
Expand Down
5 changes: 3 additions & 2 deletions pkg/auth/deps.go
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,6 @@ var RequestMiddlewareDependencySet = wire.NewSet(

viewmodelswebapp.NewBaseLogger,
wire.Struct(new(viewmodelswebapp.BaseViewModeler), "*"),
wire.Struct(new(deps.RequestMiddleware), "*"),

wire.Bind(new(template.ResourceManager), new(*resource.Manager)),
wire.Bind(new(web.ResourceManager), new(*resource.Manager)),
Expand All @@ -376,9 +375,11 @@ var RequestMiddlewareDependencySet = wire.NewSet(

oauthclient.DependencySet,
wire.Bind(new(viewmodelswebapp.WebappOAuthClientResolver), new(*oauthclient.Resolver)),

wire.Struct(new(WebAppRequestMiddleware), "*"),
)

func RequestMiddleware(p *deps.RootProvider, configSource *configsource.ConfigSource, factory func(http.ResponseWriter, *http.Request, *deps.RootProvider, *configsource.ConfigSource) httproute.Middleware) httproute.Middleware {
func MakeWebAppRequestMiddleware(p *deps.RootProvider, configSource *configsource.ConfigSource, factory func(http.ResponseWriter, *http.Request, *deps.RootProvider, *configsource.ConfigSource) httproute.Middleware) httproute.Middleware {
return httproute.MiddlewareFunc(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
m := factory(w, r, p, configSource)
Expand Down
2 changes: 1 addition & 1 deletion pkg/auth/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func NewRouter(p *deps.RootProvider, configSource *configsource.ConfigSource) ht
httproute.MiddlewareFunc(httputil.XContentTypeOptionsNosniff),
httproute.MiddlewareFunc(httputil.PermissionsPolicyHeader),
httproute.MiddlewareFunc(httputil.XRobotsTag),
RequestMiddleware(p, configSource, newRequestMiddleware),
MakeWebAppRequestMiddleware(p, configSource, newWebAppRequestMiddleware),
p.Middleware(newContextHolderMiddleware),
)

Expand Down
69 changes: 69 additions & 0 deletions pkg/auth/webapp_request_middleware.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package auth

import (
"context"
"errors"
"net/http"

"github.com/authgear/authgear-server/pkg/auth/handler/webapp/viewmodels"
"github.com/authgear/authgear-server/pkg/lib/config"
"github.com/authgear/authgear-server/pkg/lib/config/configsource"
"github.com/authgear/authgear-server/pkg/lib/deps"
"github.com/authgear/authgear-server/pkg/lib/otelauthgear"
"github.com/authgear/authgear-server/pkg/lib/web"
"github.com/authgear/authgear-server/pkg/util/httputil"
"github.com/authgear/authgear-server/pkg/util/template"
)

var TemplateWebAppNotFoundHTML = template.RegisterHTML(
"web/app_not_found.html",
web.ComponentsHTML...,
)

// WebAppRequestMiddleware is placed at /pkg/auth because it depends on /pkg/auth/handler/webapp/viewmodels
// So it CANNOT be replaced at /pkg/auth/webapp.
type WebAppRequestMiddleware struct {
HTTPHost httputil.HTTPHost
RootProvider *deps.RootProvider
ConfigSource *configsource.ConfigSource
TemplateEngine *template.Engine
BaseViewModeler *viewmodels.BaseViewModeler
}

func (m *WebAppRequestMiddleware) Handle(next http.Handler) http.Handler {
logger := m.RootProvider.LoggerFactory.New("request")

return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
logger.WithFields(map[string]interface{}{
"request.host": r.Host,
"request.url": r.URL.String(),
"request.header.host": r.Header.Get("Host"),
"request.header.x-forwarded-host": r.Header.Get("X-Forwarded-Host"),
"request.header.x-original-host": r.Header.Get("X-Original-Host"),
}).Debug("serving request")
err := m.ConfigSource.ProvideContext(r.Context(), r, func(ctx context.Context, appCtx *config.AppContext) error {

Check failure on line 44 in pkg/auth/webapp_request_middleware.go

View workflow job for this annotation

GitHub Actions / checks / authgear-test

Unvetted usage of request.Context is forbidden.
r = r.WithContext(ctx)

ap := m.RootProvider.NewAppProvider(r.Context(), appCtx)

Check failure on line 47 in pkg/auth/webapp_request_middleware.go

View workflow job for this annotation

GitHub Actions / checks / authgear-test

Unvetted usage of request.Context is forbidden.
r = r.WithContext(deps.WithAppProvider(r.Context(), ap))

Check failure on line 48 in pkg/auth/webapp_request_middleware.go

View workflow job for this annotation

GitHub Actions / checks / authgear-test

Unvetted usage of request.Context is forbidden.

otelauthgear.SetProjectID(r.Context(), string(appCtx.Config.AppConfig.ID))

Check failure on line 50 in pkg/auth/webapp_request_middleware.go

View workflow job for this annotation

GitHub Actions / checks / authgear-test

Unvetted usage of request.Context is forbidden.
next.ServeHTTP(w, r)
return nil
})
if err != nil {
if errors.Is(err, configsource.ErrAppNotFound) {
data := map[string]interface{}{
"HTTPHost": string(m.HTTPHost),
}
baseViewModel := m.BaseViewModeler.ViewModel(r, w)
viewmodels.Embed(data, baseViewModel)
m.TemplateEngine.RenderStatus(w, r, http.StatusNotFound, TemplateWebAppNotFoundHTML, data)
} else {
logger.WithError(err).Error("failed to resolve config")
http.Error(w, "internal server error", http.StatusInternalServerError)
}
return
}
})
}
6 changes: 3 additions & 3 deletions pkg/auth/wire_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -180843,7 +180843,7 @@ func newWebAppAuthflowV2SettingsIdentityListOAuthHandler(p *deps.RequestProvider

// Injectors from wire_middleware.go:

func newRequestMiddleware(w http.ResponseWriter, r *http.Request, p *deps.RootProvider, configSource *configsource.ConfigSource) httproute.Middleware {
func newWebAppRequestMiddleware(w http.ResponseWriter, r *http.Request, p *deps.RootProvider, configSource *configsource.ConfigSource) httproute.Middleware {
environmentConfig := p.EnvironmentConfig
trustProxy := environmentConfig.TrustProxy
httpHost := deps.ProvideHTTPHost(r, trustProxy)
Expand Down Expand Up @@ -180929,14 +180929,14 @@ func newRequestMiddleware(w http.ResponseWriter, r *http.Request, p *deps.RootPr
OAuthClientResolver: oauthclientResolver,
Logger: baseLogger,
}
requestMiddleware := &deps.RequestMiddleware{
webAppRequestMiddleware := &WebAppRequestMiddleware{
HTTPHost: httpHost,
RootProvider: p,
ConfigSource: configSource,
TemplateEngine: engine,
BaseViewModeler: baseViewModeler,
}
return requestMiddleware
return webAppRequestMiddleware
}

var (
Expand Down
4 changes: 2 additions & 2 deletions pkg/auth/wire_middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ import (
"github.com/authgear/authgear-server/pkg/util/httproute"
)

func newRequestMiddleware(w http.ResponseWriter, r *http.Request, p *deps.RootProvider, configSource *configsource.ConfigSource) httproute.Middleware {
func newWebAppRequestMiddleware(w http.ResponseWriter, r *http.Request, p *deps.RootProvider, configSource *configsource.ConfigSource) httproute.Middleware {
panic(wire.Build(
RequestMiddlewareDependencySet,
wire.Bind(new(httproute.Middleware), new(*deps.RequestMiddleware)),
wire.Bind(new(httproute.Middleware), new(*WebAppRequestMiddleware)),
))
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/lib/deps/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ type providerContext struct {
p *AppProvider
}

func withProvider(ctx context.Context, p *AppProvider) context.Context {
func WithAppProvider(ctx context.Context, p *AppProvider) context.Context {
return context.WithValue(ctx, providerContextKey, &providerContext{
p: p,
})
Expand Down
25 changes: 4 additions & 21 deletions pkg/lib/deps/middleware_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,14 @@ import (
"errors"
"net/http"

"github.com/authgear/authgear-server/pkg/auth/handler/webapp/viewmodels"
"github.com/authgear/authgear-server/pkg/lib/config"
"github.com/authgear/authgear-server/pkg/lib/config/configsource"
"github.com/authgear/authgear-server/pkg/lib/otelauthgear"
"github.com/authgear/authgear-server/pkg/lib/web"
"github.com/authgear/authgear-server/pkg/util/httputil"
"github.com/authgear/authgear-server/pkg/util/template"
)

var TemplateWebAppNotFoundHTML = template.RegisterHTML(
"web/app_not_found.html",
web.ComponentsHTML...,
)

type RequestMiddleware struct {
HTTPHost httputil.HTTPHost
RootProvider *RootProvider
ConfigSource *configsource.ConfigSource
TemplateEngine *template.Engine
BaseViewModeler *viewmodels.BaseViewModeler
RootProvider *RootProvider
ConfigSource *configsource.ConfigSource
}

func (m *RequestMiddleware) Handle(next http.Handler) http.Handler {
Expand All @@ -42,20 +30,15 @@ func (m *RequestMiddleware) Handle(next http.Handler) http.Handler {
r = r.WithContext(ctx)

ap := m.RootProvider.NewAppProvider(r.Context(), appCtx)

Check failure on line 32 in pkg/lib/deps/middleware_request.go

View workflow job for this annotation

GitHub Actions / checks / authgear-test

Unvetted usage of request.Context is forbidden.
r = r.WithContext(withProvider(r.Context(), ap))
r = r.WithContext(WithAppProvider(r.Context(), ap))

Check failure on line 33 in pkg/lib/deps/middleware_request.go

View workflow job for this annotation

GitHub Actions / checks / authgear-test

Unvetted usage of request.Context is forbidden.

otelauthgear.SetProjectID(r.Context(), string(appCtx.Config.AppConfig.ID))

Check failure on line 35 in pkg/lib/deps/middleware_request.go

View workflow job for this annotation

GitHub Actions / checks / authgear-test

Unvetted usage of request.Context is forbidden.
next.ServeHTTP(w, r)
return nil
})
if err != nil {
if errors.Is(err, configsource.ErrAppNotFound) {
data := map[string]interface{}{
"HTTPHost": string(m.HTTPHost),
}
baseViewModel := m.BaseViewModeler.ViewModel(r, w)
viewmodels.Embed(data, baseViewModel)
m.TemplateEngine.RenderStatus(w, r, http.StatusNotFound, TemplateWebAppNotFoundHTML, data)
http.Error(w, configsource.ErrAppNotFound.Error(), http.StatusNotFound)
} else {
logger.WithError(err).Error("failed to resolve config")
http.Error(w, "internal server error", http.StatusInternalServerError)
Expand Down

0 comments on commit 7ebf318

Please sign in to comment.