PluginProbe ʕ •ᴥ•ʔ
Limit Login Attempts Security – Login Security, 2FA, Firewall, Brute Force Prevention / 3.2.4
Limit Login Attempts Security – Login Security, 2FA, Firewall, Brute Force Prevention v3.2.4
3.2.4 3.2.3 3.2.2 3.2.1 3.2.0 trunk 2.0.0 2.1.0 2.10.0 2.10.1 2.11.0 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.14.0 2.15.0 2.15.1 2.15.2 2.16.0 2.17.0 2.17.1 2.17.2 2.17.3 2.17.4 2.18.0 2.19.0 2.19.1 2.19.2 2.2.0 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.21.1 2.22.0 2.22.1 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.25.0 2.25.1 2.25.10 2.25.11 2.25.12 2.25.13 2.25.14 2.25.15 2.25.16 2.25.17 2.25.18 2.25.19 2.25.2 2.25.20 2.25.21 2.25.22 2.25.23 2.25.24 2.25.25 2.25.26 2.25.27 2.25.28 2.25.29 2.25.3 2.25.4 2.25.5 2.25.6 2.25.7 2.25.8 2.25.9 2.26.0 2.26.1 2.26.10 2.26.11 2.26.12 2.26.13 2.26.14 2.26.15 2.26.16 2.26.17 2.26.18 2.26.19 2.26.2 2.26.20 2.26.21 2.26.22 2.26.23 2.26.24 2.26.25 2.26.26 2.26.27 2.26.28 2.26.3 2.26.4 2.26.5 2.26.6 2.26.7 2.26.8 2.26.9 2.3.0 2.4.0 2.5.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.8.0 2.8.1 2.9.0 3.0.0 3.0.1 3.0.2 3.1.0
limit-login-attempts-reloaded / core / mfa-flow / MfaFlowSendCode.php
limit-login-attempts-reloaded / core / mfa-flow Last commit date
Providers 2 weeks ago CallbackHandler.php 2 weeks ago MfaApiClient.php 2 weeks ago MfaFlowSendCode.php 2 weeks ago MfaProviderRegistry.php 2 weeks ago MfaRestApi.php 2 weeks ago SessionStore.php 2 weeks ago
MfaFlowSendCode.php
89 lines
1 <?php
2
3 namespace LLAR\Core\MfaFlow;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 /**
10 * MFA flow: shared logic for sending verification code via the session's provider.
11 * Used by both AJAX (admin-ajax.php) and REST API endpoints.
12 * Endpoints accept POST with token, secret (send_email_secret), code in request body.
13 * The same secret can be used to send the code multiple times (resend) until the session expires.
14 * Actual delivery (email, SMS, etc.) is delegated to the provider registered for the session.
15 *
16 * @return array { 'success' => bool, 'http_status' => int, 'message' => string|null }
17 */
18 class MfaFlowSendCode {
19
20 /**
21 * Execute send-code: validate secret, resolve provider from session, send via provider, save OTP.
22 *
23 * @param string $token Session token.
24 * @param string $secret Send_code secret (from request body).
25 * @param string $code Verification code to send and store.
26 * @param array $context Optional. Keys: ip, browser, location (from request body).
27 * @return array { 'success' => bool, 'http_status' => int, 'message' => string|null }
28 */
29 public static function execute( $token, $secret, $code, $context = array() ) {
30 $store = new SessionStore();
31
32 $stored_secret = $store->get_send_email_secret( $token );
33 if ( null === $stored_secret || ! hash_equals( (string) $stored_secret, (string) $secret ) ) {
34 return array(
35 'success' => false,
36 'http_status' => 403,
37 'message' => 'Forbidden',
38 );
39 }
40
41 $session = $store->get_session( $token );
42 if ( ! $session ) {
43 return array(
44 'success' => false,
45 'http_status' => 403,
46 'message' => 'Forbidden',
47 );
48 }
49
50 $user_id = ! empty( $session['user_id'] ) ? (int) $session['user_id'] : 0;
51 $user = $user_id ? get_user_by( 'id', $user_id ) : get_user_by( 'login', isset( $session['username'] ) ? $session['username'] : '' );
52 if ( ! $user || ! is_a( $user, 'WP_User' ) ) {
53 return array(
54 'success' => true,
55 'http_status' => 200,
56 'message' => null,
57 );
58 }
59
60 $provider_id = isset( $session['provider_id'] ) ? $session['provider_id'] : 'llar';
61 $provider = MfaProviderRegistry::get( $provider_id );
62 if ( ! $provider ) {
63 return array(
64 'success' => false,
65 'http_status' => 500,
66 'message' => 'Provider not available',
67 );
68 }
69
70 $context = is_array( $context ) ? $context : array();
71 $result = $provider->send_code( $user, $code, $context );
72 if ( ! empty( $result['success'] ) ) {
73 $store->save_otp( $token, $code );
74 return array(
75 'success' => true,
76 'http_status' => 200,
77 'message' => null,
78 );
79 }
80
81 $message = isset( $result['message'] ) && is_string( $result['message'] ) ? $result['message'] : 'Failed to send code';
82 return array(
83 'success' => false,
84 'http_status' => 500,
85 'message' => $message,
86 );
87 }
88 }
89