summaryrefslogtreecommitdiffstats
path: root/wp-includes/class-wp-recovery-mode-link-service.php
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 07:56:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 07:56:49 +0000
commita415c29efee45520ae252d2aa28f1083a521cd7b (patch)
treef4ade4b6668ecc0765de7e1424f7c1427ad433ff /wp-includes/class-wp-recovery-mode-link-service.php
parentInitial commit. (diff)
downloadwordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.tar.xz
wordpress-a415c29efee45520ae252d2aa28f1083a521cd7b.zip
Adding upstream version 6.4.3+dfsg1.upstream/6.4.3+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'wp-includes/class-wp-recovery-mode-link-service.php')
-rw-r--r--wp-includes/class-wp-recovery-mode-link-service.php130
1 files changed, 130 insertions, 0 deletions
diff --git a/wp-includes/class-wp-recovery-mode-link-service.php b/wp-includes/class-wp-recovery-mode-link-service.php
new file mode 100644
index 0000000..4fb888c
--- /dev/null
+++ b/wp-includes/class-wp-recovery-mode-link-service.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Error Protection API: WP_Recovery_Mode_Link_Handler class
+ *
+ * @package WordPress
+ * @since 5.2.0
+ */
+
+/**
+ * Core class used to generate and handle recovery mode links.
+ *
+ * @since 5.2.0
+ */
+#[AllowDynamicProperties]
+class WP_Recovery_Mode_Link_Service {
+ const LOGIN_ACTION_ENTER = 'enter_recovery_mode';
+ const LOGIN_ACTION_ENTERED = 'entered_recovery_mode';
+
+ /**
+ * Service to generate and validate recovery mode keys.
+ *
+ * @since 5.2.0
+ * @var WP_Recovery_Mode_Key_Service
+ */
+ private $key_service;
+
+ /**
+ * Service to handle cookies.
+ *
+ * @since 5.2.0
+ * @var WP_Recovery_Mode_Cookie_Service
+ */
+ private $cookie_service;
+
+ /**
+ * WP_Recovery_Mode_Link_Service constructor.
+ *
+ * @since 5.2.0
+ *
+ * @param WP_Recovery_Mode_Cookie_Service $cookie_service Service to handle setting the recovery mode cookie.
+ * @param WP_Recovery_Mode_Key_Service $key_service Service to handle generating recovery mode keys.
+ */
+ public function __construct( WP_Recovery_Mode_Cookie_Service $cookie_service, WP_Recovery_Mode_Key_Service $key_service ) {
+ $this->cookie_service = $cookie_service;
+ $this->key_service = $key_service;
+ }
+
+ /**
+ * Generates a URL to begin recovery mode.
+ *
+ * Only one recovery mode URL can may be valid at the same time.
+ *
+ * @since 5.2.0
+ *
+ * @return string Generated URL.
+ */
+ public function generate_url() {
+ $token = $this->key_service->generate_recovery_mode_token();
+ $key = $this->key_service->generate_and_store_recovery_mode_key( $token );
+
+ return $this->get_recovery_mode_begin_url( $token, $key );
+ }
+
+ /**
+ * Enters recovery mode when the user hits wp-login.php with a valid recovery mode link.
+ *
+ * @since 5.2.0
+ *
+ * @global string $pagenow The filename of the current screen.
+ *
+ * @param int $ttl Number of seconds the link should be valid for.
+ */
+ public function handle_begin_link( $ttl ) {
+ if ( ! isset( $GLOBALS['pagenow'] ) || 'wp-login.php' !== $GLOBALS['pagenow'] ) {
+ return;
+ }
+
+ if ( ! isset( $_GET['action'], $_GET['rm_token'], $_GET['rm_key'] ) || self::LOGIN_ACTION_ENTER !== $_GET['action'] ) {
+ return;
+ }
+
+ if ( ! function_exists( 'wp_generate_password' ) ) {
+ require_once ABSPATH . WPINC . '/pluggable.php';
+ }
+
+ $validated = $this->key_service->validate_recovery_mode_key( $_GET['rm_token'], $_GET['rm_key'], $ttl );
+
+ if ( is_wp_error( $validated ) ) {
+ wp_die( $validated, '' );
+ }
+
+ $this->cookie_service->set_cookie();
+
+ $url = add_query_arg( 'action', self::LOGIN_ACTION_ENTERED, wp_login_url() );
+ wp_redirect( $url );
+ die;
+ }
+
+ /**
+ * Gets a URL to begin recovery mode.
+ *
+ * @since 5.2.0
+ *
+ * @param string $token Recovery Mode token created by {@see generate_recovery_mode_token()}.
+ * @param string $key Recovery Mode key created by {@see generate_and_store_recovery_mode_key()}.
+ * @return string Recovery mode begin URL.
+ */
+ private function get_recovery_mode_begin_url( $token, $key ) {
+
+ $url = add_query_arg(
+ array(
+ 'action' => self::LOGIN_ACTION_ENTER,
+ 'rm_token' => $token,
+ 'rm_key' => $key,
+ ),
+ wp_login_url()
+ );
+
+ /**
+ * Filters the URL to begin recovery mode.
+ *
+ * @since 5.2.0
+ *
+ * @param string $url The generated recovery mode begin URL.
+ * @param string $token The token used to identify the key.
+ * @param string $key The recovery mode key.
+ */
+ return apply_filters( 'recovery_mode_begin_url', $url, $token, $key );
+ }
+}