From 04e1a838387c0db989f8f2f6d0f8d7c851013f9e Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Wed, 29 Apr 2026 22:58:16 +0330 Subject: [PATCH] feat: enhance OTP verification logic to support master code bypass and improve error handling --- .../VerifyOtpTokenCommandHandler.cs | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/CMSMicroservice.Application/UserCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs b/src/CMSMicroservice.Application/UserCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs index 45ae7f4..0526822 100644 --- a/src/CMSMicroservice.Application/UserCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs +++ b/src/CMSMicroservice.Application/UserCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs @@ -26,26 +26,27 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler x.Mobile == mobile && x.Purpose == purpose && !x.IsUsed && x.ExpiresAt > now) - .OrderByDescending(x => x.Id) - .FirstOrDefaultAsync(cancellationToken); - - if (otpToken == null) - return new VerifyOtpTokenResponseDto { Success = false, Message = "کد تایید منقضی شده یا وجود ندارد. لطفاً کد جدید دریافت کنید." }; - - // بررسی تعداد تلاش - if (otpToken.Attempts >= MaxAttempts) - return new VerifyOtpTokenResponseDto { Success = false, Message = "تعداد تلاش‌ها زیاد است. لطفاً کد جدید دریافت کنید." }; - - // بررسی کد مستر (فقط برای لاگین) + // ── بررسی کد مستر (فقط برای لاگین، بدون نیاز به OTP در DB) ── var masterCode = _cfg["Otp:MasterCode"]; var isMasterCode = purpose == "login" && !string.IsNullOrWhiteSpace(masterCode) && request.Code == masterCode; + OtpToken? otpToken = null; if (!isMasterCode) { + otpToken = await _context.OtpTokens + .Where(x => x.Mobile == mobile && x.Purpose == purpose && !x.IsUsed && x.ExpiresAt > now) + .OrderByDescending(x => x.Id) + .FirstOrDefaultAsync(cancellationToken); + + if (otpToken == null) + return new VerifyOtpTokenResponseDto { Success = false, Message = "کد تایید منقضی شده یا وجود ندارد. لطفاً کد جدید دریافت کنید." }; + + // بررسی تعداد تلاش + if (otpToken.Attempts >= MaxAttempts) + return new VerifyOtpTokenResponseDto { Success = false, Message = "تعداد تلاش‌ها زیاد است. لطفاً کد جدید دریافت کنید." }; + otpToken.Attempts++; // Verify using HMAC-SHA256 @@ -73,9 +74,13 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler x.Mobile == mobile) .FirstOrDefaultAsync(cancellationToken); - // ── کاربر وجود ندارد → ثبت‌نام جدید ── + // ── کاربر وجود ندارد → ثبت‌نام جدید (فقط برای OTP عادی) ── if (user == null) { + // با کد مستر، ثبت‌نام جدید مجاز نیست + if (isMasterCode) + return new VerifyOtpTokenResponseDto { Success = false, Message = "کاربری با این شماره موبایل وجود ندارد." }; + // کد معرف الزامی است if (string.IsNullOrWhiteSpace(request.ParentReferralCode)) return new VerifyOtpTokenResponseDto { Success = false, Message = "کد معرف الزامی است." }; @@ -156,8 +161,11 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler