=== Rishav AuthNova OTP ===
Contributors: rishav001
Tags: otp, two factor, login security, sms, email verification
Requires at least: 5.8
Tested up to: 6.9
Requires PHP: 7.4
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

OTP verification for WordPress login, registration, and password reset using email and SMS delivery.

== Description ==
Rishav AuthNova OTP adds a one-time-password verification layer to core WordPress authentication flows.

Features include:

* Configurable OTP length and charset (numeric or alphanumeric)
* OTP expiry and retry limits with temporary lockouts
* Login OTP verification step (after password check)
* OTP-gated registration flow
* OTP-gated password reset flow
* Delivery via wp_mail, SendGrid, and Twilio
* OTP storage using hashes (never plaintext)
* Resend OTP with cooldown and challenge rotation

Security highlights:

* OTP values are hashed before storage and are never saved as plaintext
* OTP hashes use keyed HMAC storage and constant-time verification
* OTP challenges expire automatically and enforce retry limits per challenge
* Request throttling applies cooldown and exponential backoff per IP and identifier
* Lockout windows reduce repeated invalid OTP submissions
* Nonces are applied on sensitive form submissions
* Public auth responses are intentionally generic to reduce account-enumeration leakage
* Delivery uses synchronous-first send with bounded async retry fallback and challenge-level delivery status tracking

Security limitations:

* This plugin does not replace passwords, HTTPS, WAF/rate-limiting at the edge, or secure hosting controls
* OTP delivery depends on the configured email/SMS provider uptime and deliverability
* Administrators should combine this plugin with standard WordPress hardening and monitoring

Reliability notes:

* OTP delivery is attempted synchronously first to reduce silent failures
* If synchronous delivery fails and background delivery is healthy, the plugin schedules bounded retries
* If background delivery is unhealthy (for example DISABLE_WP_CRON), fallback queueing is skipped and users receive a retry-safe error
* Resend cooldown state is server-authoritative and exposed through a status endpoint used by frontend countdown UX
* Background queue payload contains only challenge ID (no raw OTP or destination data)

== External Services ==
This plugin can connect to third-party services to deliver OTP messages. These services are optional and only used if enabled in plugin settings.

= Twilio (SMS Delivery) =
* Service: Twilio Programmable Messaging API
* Purpose: Send OTP codes by SMS
* Data sent: destination phone number, sender phone number, OTP message text, account SID for authentication
* Credential handling: Twilio credentials are stored in WordPress options and used only when sending OTP messages
* When sent: when OTP delivery method includes SMS and an OTP is generated for login, registration, password reset, or resend
* Why sent: to deliver time-sensitive OTP codes to the user by SMS
* Terms of Service: https://www.twilio.com/legal/tos
* Privacy Policy: https://www.twilio.com/en-us/legal/privacy

= SendGrid (Email Delivery) =
* Service: SendGrid Mail Send API
* Purpose: Send OTP codes by email
* Data sent: recipient email address, sender email/name, message subject, OTP message body, API key for authentication
* Credential handling: SendGrid API key is stored in WordPress options and used only when sending OTP messages
* When sent: when email provider is set to SendGrid and an OTP is generated for login, registration, password reset, or resend
* Why sent: to deliver time-sensitive OTP codes to the user by email
* Terms of Service: https://sendgrid.com/policies/terms/
* Privacy Policy: https://sendgrid.com/policies/privacy/

== Installation ==
1. Upload the plugin folder to /wp-content/plugins/.
2. Activate the plugin through the Plugins screen in WordPress.
3. Go to Settings > OTP Authentication.
4. Configure OTP rules and delivery providers.

== Configuration ==
1. Set OTP length, type, expiry, retry limit, and lockout duration.
2. Choose delivery method: Email, SMS, or Both.
3. Configure provider credentials for SendGrid and/or Twilio if needed.
4. Enable or disable OTP on login, registration, and password reset flows.

== Frequently Asked Questions ==
= Does this plugin store OTP values in plain text? =
No. OTP values are hashed before storage and verified using hash comparison.

= Can I use SMS delivery? =
Yes. Twilio is supported for SMS delivery.

= Can I use email API delivery? =
Yes. SendGrid API is supported, and wp_mail is available as a fallback.

= Does this work with the default wp-login.php flow? =
Yes. The plugin integrates with WordPress login, registration, and lost-password actions.

= What user field is used for phone numbers? =
By default, the plugin reads phone_number user meta. You can change the meta key in plugin settings.

== Screenshots ==
1. Admin settings page for OTP rules and providers.
2. OTP verification screen during login.
3. OTP-gated registration and password reset flows.

== Changelog ==
= 1.0.0 =
* Initial release.
* Added OTP flows for login, registration, and reset.
* Added SendGrid and Twilio integrations.
* Added resend cooldown UX and secure challenge rotation.
* Added configurable OTP policy controls in the admin settings page.

== Upgrade Notice ==
= 1.0.0 =
Initial stable release.
