From 24b43ade8fc7015553bd40e708e6d18d3fe8f74d Mon Sep 17 00:00:00 2001 From: Taras Kushnir Date: Fri, 19 Dec 2025 10:36:09 +0100 Subject: [PATCH] Refactor email verification --- cmd/server/main.go | 1 + pkg/common/store.go | 4 ++++ pkg/portal/email.go | 9 +++++++++ pkg/portal/register.go | 3 +-- pkg/portal/server.go | 1 + pkg/portal/server_test.go | 2 ++ 6 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 49f83210..35f6fd33 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -219,6 +219,7 @@ func run(ctx context.Context, cfg common.ConfigStore, stderr io.Writer, listener CountryCodeHeader: cfg.Get(common.CountryCodeHeaderKey), UserLimiter: userLimiter, SubscriptionLimits: subscriptionLimits, + EmailVerifier: &portal.PortalEmailVerifier{}, } templatesBuilder := portal.NewTemplatesBuilder() diff --git a/pkg/common/store.go b/pkg/common/store.go index 08b00f77..03368be9 100644 --- a/pkg/common/store.go +++ b/pkg/common/store.go @@ -82,3 +82,7 @@ type AuditLog interface { RecordEvent(ctx context.Context, event *AuditLogEvent, source AuditLogSource) RecordEvents(ctx context.Context, events []*AuditLogEvent, source AuditLogSource) } + +type EmailVerifier interface { + VerifyEmail(ctx context.Context, email string) error +} diff --git a/pkg/portal/email.go b/pkg/portal/email.go index e31ef77b..e65c3b01 100644 --- a/pkg/portal/email.go +++ b/pkg/portal/email.go @@ -8,6 +8,7 @@ import ( "strings" "time" + "github.com/badoux/checkmail" "github.com/medama-io/go-useragent" "github.com/PrivateCaptcha/PrivateCaptcha/pkg/common" @@ -18,6 +19,14 @@ var ( errInvalidEmail = errors.New("email is not valid") ) +type PortalEmailVerifier struct{} + +var _ common.EmailVerifier = (*PortalEmailVerifier)(nil) + +func (ev *PortalEmailVerifier) VerifyEmail(ctx context.Context, email string) error { + return checkmail.ValidateFormat(email) +} + type PortalMailer struct { Mailer emailpkg.Sender CDNURL string diff --git a/pkg/portal/register.go b/pkg/portal/register.go index 84473045..dbafc3d5 100644 --- a/pkg/portal/register.go +++ b/pkg/portal/register.go @@ -14,7 +14,6 @@ import ( "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db" dbgen "github.com/PrivateCaptcha/PrivateCaptcha/pkg/db/generated" "github.com/PrivateCaptcha/PrivateCaptcha/pkg/session" - "github.com/badoux/checkmail" "github.com/jackc/pgx/v5/pgtype" ) @@ -137,7 +136,7 @@ func (s *Server) postRegister(w http.ResponseWriter, r *http.Request) { } email := strings.TrimSpace(r.FormValue(common.ParamEmail)) - if err := checkmail.ValidateFormat(email); err != nil { + if err := s.EmailVerifier.VerifyEmail(ctx, email); err != nil { slog.WarnContext(ctx, "Failed to validate email format", common.ErrAttr(err)) data.EmailError = "Email address is not valid." s.render(w, r, registerContentsTemplate, data) diff --git a/pkg/portal/server.go b/pkg/portal/server.go index ea543101..e990bdff 100644 --- a/pkg/portal/server.go +++ b/pkg/portal/server.go @@ -144,6 +144,7 @@ type Server struct { UserLimiter api.UserLimiter AuditLogsFunc AuditLogsConstructor SubscriptionLimits db.SubscriptionLimits + EmailVerifier common.EmailVerifier } func (s *Server) createSettingsTabs() []*SettingsTab { diff --git a/pkg/portal/server_test.go b/pkg/portal/server_test.go index 42a75cfc..fed53a83 100644 --- a/pkg/portal/server_test.go +++ b/pkg/portal/server_test.go @@ -77,6 +77,7 @@ func TestMain(m *testing.M) { DataCtx: dataCtx, PlatformCtx: platformCtx, SubscriptionLimits: &db.StubSubscriptionLimits{}, + EmailVerifier: &PortalEmailVerifier{}, } ctx := context.TODO() @@ -135,6 +136,7 @@ func TestMain(m *testing.M) { CountryCodeHeader: cfg.Get(common.CountryCodeHeaderKey), UserLimiter: api.NewUserLimiter(store), SubscriptionLimits: db.NewSubscriptionLimits(common.StageTest, store, planService), + EmailVerifier: &PortalEmailVerifier{}, } ctx := context.TODO()