From b4ef1dd428a7441e8c1d78a8fb5b4085e48074c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Szekiel?= <12242002+mszekiel@users.noreply.github.com> Date: Wed, 12 Oct 2022 13:28:44 +0200 Subject: [PATCH 1/2] feat: disable email dispatch for invalid recovery --- driver/config/config.go | 5 ++++ embedx/config.schema.json | 36 +++++++++++++++++++++--- selfservice/strategy/link/sender.go | 6 ++++ selfservice/strategy/link/sender_test.go | 24 ++++++++++++++++ 4 files changed, 67 insertions(+), 4 deletions(-) diff --git a/driver/config/config.go b/driver/config/config.go index 3e6b52ae3e0a..0ba76430b730 100644 --- a/driver/config/config.go +++ b/driver/config/config.go @@ -66,6 +66,7 @@ const ( ViperKeyCourierSMTPClientKeyPath = "courier.smtp.client_key_path" ViperKeyCourierTemplatesPath = "courier.template_override_path" ViperKeyCourierTemplatesRecoveryInvalidEmail = "courier.templates.recovery.invalid.email" + ViperKeyCourierTemplatesRecoveryInvalidSend = "courier.templates.recovery.invalid.send" ViperKeyCourierTemplatesRecoveryValidEmail = "courier.templates.recovery.valid.email" ViperKeyCourierTemplatesRecoveryCodeInvalidEmail = "courier.templates.recovery_code.invalid.email" ViperKeyCourierTemplatesRecoveryCodeValidEmail = "courier.templates.recovery_code.valid.email" @@ -995,6 +996,10 @@ func (p *Config) CourierTemplatesRecoveryValid(ctx context.Context) *CourierEmai return p.CourierTemplatesHelper(ctx, ViperKeyCourierTemplatesRecoveryValidEmail) } +func (p *Config) CourierTemplatesRecoveryInvalidSend(ctx context.Context) bool { + return p.p.BoolF(ViperKeyCourierTemplatesRecoveryInvalidSend, true) +} + func (p *Config) CourierTemplatesRecoveryCodeInvalid(ctx context.Context) *CourierEmailTemplate { return p.CourierTemplatesHelper(ctx, ViperKeyCourierTemplatesRecoveryCodeInvalidEmail) } diff --git a/embedx/config.schema.json b/embedx/config.schema.json index 60b4e8768949..7d66a47d2e27 100644 --- a/embedx/config.schema.json +++ b/embedx/config.schema.json @@ -1545,7 +1545,7 @@ } } }, - "database": { + "database": { "type": "object", "title": "Database related configuration", "description": "Miscellaneous settings used in database related tasks (cleanup, etc.)", @@ -1555,7 +1555,7 @@ "title": "Database cleanup settings", "description": "Settings that controls how the database cleanup process is configured (delays, batch size, etc.)", "properties": { - "batch_size" : { + "batch_size": { "type": "integer", "title": "Number of records to clean in one iteration", "description": "Controls how many records should be purged from one table during database cleanup task", @@ -1609,7 +1609,35 @@ "type": "object", "properties": { "recovery": { - "$ref": "#/definitions/courierTemplates" + "invalid": { + "additionalProperties": false, + "type": "object", + "properties": { + "send": { + "type": "boolean", + "description": "Enable sending invalid recovery email", + "default": true + }, + "email": { + "$ref": "#/definitions/emailCourierTemplate" + } + }, + "required": [ + "email" + ] + }, + "valid": { + "additionalProperties": false, + "type": "object", + "properties": { + "email": { + "$ref": "#/definitions/emailCourierTemplate" + } + }, + "required": [ + "email" + ] + } }, "recovery_code": { "$ref": "#/definitions/courierTemplates" @@ -2533,4 +2561,4 @@ "selfservice" ], "additionalProperties": false -} +} \ No newline at end of file diff --git a/selfservice/strategy/link/sender.go b/selfservice/strategy/link/sender.go index a63e197ba882..ebf08c04124b 100644 --- a/selfservice/strategy/link/sender.go +++ b/selfservice/strategy/link/sender.go @@ -67,6 +67,12 @@ func (s *Sender) SendRecoveryLink(ctx context.Context, r *http.Request, f *recov address, err := s.r.IdentityPool().FindRecoveryAddressByValue(ctx, identity.RecoveryAddressTypeEmail, to) if err != nil { + if !s.r.Config().CourierTemplatesRecoveryInvalidSend(ctx) { + s.r.Logger().Info("Suppressing invalid recovery email.") + + return nil + } + if err := s.send(ctx, string(via), email.NewRecoveryInvalid(s.r, &email.RecoveryInvalidModel{To: to})); err != nil { return err } diff --git a/selfservice/strategy/link/sender_test.go b/selfservice/strategy/link/sender_test.go index 779acba21d00..3d19fbad61f2 100644 --- a/selfservice/strategy/link/sender_test.go +++ b/selfservice/strategy/link/sender_test.go @@ -8,10 +8,12 @@ import ( "time" "github.com/ory/kratos/internal/testhelpers" + "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/ory/kratos/courier" "github.com/ory/kratos/driver/config" "github.com/ory/kratos/identity" "github.com/ory/kratos/internal" @@ -92,4 +94,26 @@ func TestManager(t *testing.T) { require.NoError(t, err) assert.EqualValues(t, identity.VerifiableAddressStatusSent, address.Status) }) + + t.Run("case=should not send recovery link", func(t *testing.T) { + conf.Set(ctx, "courier.templates.recovery.invalid.send", false) + + t.Cleanup(func() { + conf.Set(ctx, "courier.templates.recovery.invalid.send", true) + }) + + s, err := reg.RecoveryStrategies(ctx).Strategy("link") + require.NoError(t, err) + f, err := recovery.NewFlow(conf, time.Hour, "", u, s, flow.TypeBrowser) + require.NoError(t, err) + + require.NoError(t, reg.RecoveryFlowPersister().CreateRecoveryFlow(context.Background(), f)) + + require.Equal(t, reg.LinkSender().SendRecoveryLink(context.Background(), hr, f, "email", "not-tracked@ory.sh"), nil) + + messages, err := reg.CourierPersister().NextMessages(context.Background(), 0) + + require.True(t, errors.Is(err, courier.ErrQueueEmpty)) + require.Len(t, messages, 0) + }) } From 901a7f9f51408b805c2104460b4311a34d21d0cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Szekiel?= <12242002+mszekiel@users.noreply.github.com> Date: Wed, 12 Oct 2022 15:03:24 +0200 Subject: [PATCH 2/2] fix: formatting --- selfservice/strategy/link/sender_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfservice/strategy/link/sender_test.go b/selfservice/strategy/link/sender_test.go index 3d19fbad61f2..6b9b7e55be53 100644 --- a/selfservice/strategy/link/sender_test.go +++ b/selfservice/strategy/link/sender_test.go @@ -7,9 +7,10 @@ import ( "testing" "time" - "github.com/ory/kratos/internal/testhelpers" "github.com/pkg/errors" + "github.com/ory/kratos/internal/testhelpers" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"