diff --git a/driver/registry_default_hooks.go b/driver/registry_default_hooks.go index dcfb37b9eb7..bb796bd5658 100644 --- a/driver/registry_default_hooks.go +++ b/driver/registry_default_hooks.go @@ -1,8 +1,6 @@ package driver import ( - "encoding/json" - "github.com/ory/kratos/driver/configuration" "github.com/ory/kratos/selfservice/hook" ) @@ -28,10 +26,6 @@ func (m *RegistryDefault) HookSessionDestroyer() *hook.SessionDestroyer { return m.hookSessionDestroyer } -func (m *RegistryDefault) HookRedirector(config json.RawMessage) *hook.Redirector { - return hook.NewRedirector(config) -} - func (m *RegistryDefault) WithHooks(hooks map[string]func(configuration.SelfServiceHook) interface{}) { m.injectedSelfserviceHooks = hooks } diff --git a/selfservice/hook/redirector.go b/selfservice/hook/redirector.go deleted file mode 100644 index 0176faac5d3..00000000000 --- a/selfservice/hook/redirector.go +++ /dev/null @@ -1,73 +0,0 @@ -package hook - -import ( - "encoding/json" - "net/http" - - "github.com/pkg/errors" - "github.com/tidwall/gjson" - - "github.com/ory/herodot" - - "github.com/ory/kratos/identity" - "github.com/ory/kratos/selfservice/flow" - "github.com/ory/kratos/selfservice/flow/login" - "github.com/ory/kratos/selfservice/flow/registration" - "github.com/ory/kratos/selfservice/flow/settings" - "github.com/ory/kratos/session" -) - -var ( - _ login.PostHookExecutor = new(Redirector) - _ registration.PostHookPrePersistExecutor = new(Redirector) - _ registration.PreHookExecutor = new(Redirector) - _ login.PreHookExecutor = new(Redirector) - _ settings.PostHookPostPersistExecutor = new(Redirector) -) - -func NewRedirector(config json.RawMessage) *Redirector { - return &Redirector{config: config} -} - -type Redirector struct { - config json.RawMessage -} - -func (e *Redirector) ExecuteSettingsPostPersistHook(w http.ResponseWriter, r *http.Request, f *settings.Request, _ *identity.Identity) error { - return e.do(w, r, f.Type, settings.ErrHookAbortRequest) -} - -func (e *Redirector) ExecuteLoginPreHook(w http.ResponseWriter, r *http.Request, f *login.Flow) error { - return e.do(w, r, f.Type, login.ErrHookAbortFlow) -} - -func (e *Redirector) ExecuteRegistrationPreHook(w http.ResponseWriter, r *http.Request, f *registration.Flow) error { - return e.do(w, r, f.Type, registration.ErrHookAbortFlow) -} - -func (e *Redirector) ExecutePostRegistrationPrePersistHook(w http.ResponseWriter, r *http.Request, f *registration.Flow, _ *identity.Identity) error { - return e.do(w, r, f.Type, registration.ErrHookAbortFlow) -} - -func (e *Redirector) ExecuteSettingsPrePersistHook(w http.ResponseWriter, r *http.Request, f *settings.Request, _ *identity.Identity) error { - return e.do(w, r, f.Type, settings.ErrHookAbortRequest) -} - -func (e *Redirector) ExecuteLoginPostHook(w http.ResponseWriter, r *http.Request, f *login.Flow, _ *session.Session) error { - return e.do(w, r, f.Type, login.ErrHookAbortFlow) -} - -func (e *Redirector) do(w http.ResponseWriter, r *http.Request, ft flow.Type, abort error) error { - if ft == flow.TypeAPI { - // do nothing - return nil - } - - rt := gjson.GetBytes(e.config, "to").String() - if rt == "" { - return errors.WithStack(herodot.ErrInternalServerError.WithReasonf("A redirector hook was configured without a redirect_to value set.")) - } - - http.Redirect(w, r, rt, http.StatusFound) - return abort -} diff --git a/selfservice/hook/redirector_test.go b/selfservice/hook/redirector_test.go deleted file mode 100644 index 828770f6388..00000000000 --- a/selfservice/hook/redirector_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package hook - -import ( - "encoding/json" - "net/http" - "testing" - - "github.com/gobuffalo/httptest" - "github.com/julienschmidt/httprouter" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/ory/kratos/selfservice/flow" - "github.com/ory/kratos/selfservice/flow/login" - "github.com/ory/kratos/selfservice/flow/registration" - "github.com/ory/kratos/selfservice/flow/settings" -) - -func TestRedirector(t *testing.T) { - l := NewRedirector(json.RawMessage("")) - assert.Error(t, l.ExecuteSettingsPrePersistHook(nil, nil, &settings.Request{Type: flow.TypeBrowser}, nil)) - assert.Error(t, l.ExecuteLoginPostHook(nil, nil, &login.Flow{Type: flow.TypeBrowser}, nil)) - assert.Error(t, l.ExecutePostRegistrationPrePersistHook(nil, nil, ®istration.Flow{Type: flow.TypeBrowser}, nil)) - assert.Error(t, l.ExecuteSettingsPostPersistHook(nil, nil, &settings.Request{Type: flow.TypeBrowser}, nil)) - assert.Error(t, l.ExecuteLoginPreHook(nil, nil, &login.Flow{Type: flow.TypeBrowser})) - assert.Error(t, l.ExecuteRegistrationPreHook(nil, nil, ®istration.Flow{Type: flow.TypeBrowser})) - - assert.NoError(t, l.ExecuteSettingsPrePersistHook(nil, nil, &settings.Request{Type: flow.TypeAPI}, nil)) - assert.NoError(t, l.ExecuteLoginPostHook(nil, nil, &login.Flow{Type: flow.TypeAPI}, nil)) - assert.NoError(t, l.ExecutePostRegistrationPrePersistHook(nil, nil, ®istration.Flow{Type: flow.TypeAPI}, nil)) - assert.NoError(t, l.ExecuteSettingsPostPersistHook(nil, nil, &settings.Request{Type: flow.TypeAPI}, nil)) - assert.NoError(t, l.ExecuteLoginPreHook(nil, nil, &login.Flow{Type: flow.TypeAPI})) - assert.NoError(t, l.ExecuteRegistrationPreHook(nil, nil, ®istration.Flow{Type: flow.TypeAPI})) - - l = NewRedirector(json.RawMessage(`{"to":"https://www.ory.sh/"}`)) - router := httprouter.New() - router.GET("/a", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - require.Error(t, l.ExecuteSettingsPrePersistHook(w, r, &settings.Request{Type: flow.TypeAPI}, nil), settings.ErrHookAbortRequest) - }) - router.GET("/b", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - require.Error(t, l.ExecuteLoginPostHook(w, r, &login.Flow{Type: flow.TypeAPI}, nil), login.ErrHookAbortFlow) - }) - router.GET("/c", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - require.Error(t, l.ExecutePostRegistrationPrePersistHook(w, r, ®istration.Flow{Type: flow.TypeAPI}, nil), registration.ErrHookAbortFlow) - }) - router.GET("/d", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - require.Error(t, l.ExecuteSettingsPostPersistHook(w, r, &settings.Request{Type: flow.TypeAPI}, nil), settings.ErrHookAbortRequest) - }) - router.GET("/e", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - require.Error(t, l.ExecutePostRegistrationPrePersistHook(w, r, ®istration.Flow{Type: flow.TypeAPI}, nil), registration.ErrHookAbortFlow) - }) - router.GET("/f", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - require.Error(t, l.ExecuteLoginPreHook(w, r, &login.Flow{Type: flow.TypeAPI}), login.ErrHookAbortFlow) - }) - ts := httptest.NewServer(router) - t.Cleanup(ts.Close) - - for _, p := range []string{"a", "b", "c", "d", "e", "f"} { - t.Run("route="+p, func(t *testing.T) { - res, err := http.Get(ts.URL + "/" + p) - require.NoError(t, err) - require.NoError(t, res.Body.Close()) - assert.Equal(t, http.StatusOK, res.StatusCode) - assert.Equal(t, "https://www.ory.sh/", res.Request.URL.String()) - }) - } -}