diff --git a/k8s/staging/cms-config.yaml b/k8s/staging/cms-config.yaml index 138f927..1acf1dd 100644 --- a/k8s/staging/cms-config.yaml +++ b/k8s/staging/cms-config.yaml @@ -62,7 +62,7 @@ stringData: "Sms": { "Enabled": true, "Provider": "Kavenegar", - "KavenegarApiKey": "497263626F32626A48685A6137524C4F78575A766E4C74694A556B79317648424964655030682B554545413D", + "KavenegarApiKey": "43676A4E786A6C50452F2F6252507939346A5145764B33566B456454374E657A614468706658656D6534593D", "Sender": "1000001110100" }, "DayaPayment": { diff --git a/src/CMSMicroservice.Application/OtpTokenCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs b/src/CMSMicroservice.Application/OtpTokenCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs index 01e5226..83df7cf 100644 --- a/src/CMSMicroservice.Application/OtpTokenCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs +++ b/src/CMSMicroservice.Application/OtpTokenCQ/Commands/VerifyOtpToken/VerifyOtpTokenCommandHandler.cs @@ -55,6 +55,9 @@ 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,12 +74,16 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler x.Mobile == mobile) .FirstOrDefaultAsync(cancellationToken); - // ── کاربر وجود ندارد → ثبت‌نام جدید ── + // ── کاربر وجود ندارد → ثبت‌نام جدید (فقط برای OTP عادی) ── if (user == null) { - // کد معرف الزامی است + // با کد مستر، ثبت‌نام جدید مجاز نیست + if (isMasterCode) + return new VerifyOtpTokenResponseDto { Success = false, Message = "کاربری با این شماره موبایل وجود ندارد." }; + + // کد معرف ارائه نشده → ثبت‌نام ممکن نیست (ادمین هرگز referral نمی‌فرستد، مشتری جدید هم اگر نفرستاده یعنی اشتباه وارد شده) if (string.IsNullOrWhiteSpace(request.ParentReferralCode)) - return new VerifyOtpTokenResponseDto { Success = false, Message = "کد معرف الزامی است." }; + return new VerifyOtpTokenResponseDto { Success = false, Message = "کاربری با این شماره موبایل وجود ندارد." }; // بررسی وجود معرف و فعال بودن عضویت باشگاه var parent = await _context.Users @@ -156,8 +161,11 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler