PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.9.4
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.9.4
4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Staging / Ajax / StagingSiteDataChecker.php
wp-staging / Staging / Ajax Last commit date
Create 3 weeks ago Delete 1 month ago Reset 1 month ago Update 1 month ago AbstractAjaxPrepare.php 3 weeks ago Create.php 1 month ago Delete.php 1 year ago DirectoryChildren.php 2 weeks ago Listing.php 9 months ago Repair.php 7 months ago Reset.php 1 month ago Setup.php 1 month ago SizeCalculator.php 2 weeks ago StagingSiteDataChecker.php 4 months ago Update.php 1 month ago
StagingSiteDataChecker.php
103 lines
1 <?php
2
3 namespace WPStaging\Staging\Ajax;
4
5 use WPStaging\Core\WPStaging;
6 use WPStaging\Framework\Language\Language;
7 use WPStaging\Framework\Security\Auth;
8 use WPStaging\Framework\Adapter\Directory;
9 use WPStaging\Framework\Filesystem\DirectoryListing;
10
11 /**
12 * Handles AJAX requests for validating staging site destinations
13 *
14 * Validates that the target directory for staging site creation is writable,
15 * checking both the root path and the wp-content fallback location.
16 */
17 class StagingSiteDataChecker
18 {
19 /** @var Auth */
20 private $auth;
21
22 /** @var Directory */
23 private $dirAdapter;
24
25 public function __construct(Auth $auth, Directory $directory)
26 {
27 $this->auth = $auth;
28 $this->dirAdapter = $directory;
29 }
30
31 /**
32 * @return void
33 */
34 public function ajaxIsWritableCloneDestinationDir()
35 {
36 if (!$this->auth->isAuthenticatedRequest()) {
37 return;
38 }
39
40 $cloneDir = !empty($_POST['cloneDir']) ? sanitize_text_field($_POST['cloneDir']) : '';
41
42 if (!empty($cloneDir)) {
43 wp_mkdir_p($cloneDir);
44 if (!is_writable($cloneDir)) {
45 $directoryListing = WPStaging::getInstance()->getContainer()->get(DirectoryListing::class);
46 $reason = __('restricted folder permissions', 'wp-staging');
47 $howToFix = sprintf(
48 __('Adjust the permissions for <strong>%s</strong> to <code>755</code> and follow %s step-by-step guide', 'wp-staging'),
49 esc_html($cloneDir),
50 '<a href="https://wp-staging.com/docs/folder-permission-error-folder-xy-is-not-write-and-or-readable/" target="_blank" rel="noopener noreferrer">' . esc_html__('this', 'wp-staging') . '</a>'
51 );
52
53 if (!$directoryListing->isPathInOpenBaseDir($cloneDir)) {
54 $reason = __('the PHP open_basedir setting', 'wp-staging');
55 $howToFix = sprintf(
56 __('Add <strong>%s</strong> to your PHP <code>open_basedir</code> setting and follow %s step-by-step guide', 'wp-staging'),
57 esc_html($cloneDir),
58 '<a href="https://wp-staging.com/docs/how-to-fix-open_basedir-restriction-error/" target="_blank" rel="noopener noreferrer">' . esc_html__('this', 'wp-staging') . '</a>'
59 );
60 }
61
62 $supportLink = '<a href="' . esc_url(Language::localizeSupportUrl('https://wp-staging.com/support/')) . '" target="_blank" rel="noopener noreferrer">' . esc_html__('open a support ticket', 'wp-staging') . '</a>';
63 $message = sprintf(
64 __('The directory <strong>%s</strong> is not writable due to %s.<br/>
65 <p class="wpstg-mb-10px wpstg-mt-10px"><strong>How to fix this:</strong></p>
66 <ul style="list-style:circle;" class="wpstg-ml-15px wpstg-mt-5px">
67 <li>%s.</li>
68 <li>Or %s.</li>
69 </ul>', 'wp-staging'),
70 esc_html($cloneDir),
71 esc_html($reason),
72 $howToFix,
73 $supportLink
74 );
75
76 wp_send_json_error(['message' => $message]);
77 }
78
79 wp_send_json_success();
80 }
81
82 $cloneDirRootPath = $this->dirAdapter->getAbsPath();
83 if (is_writable($cloneDirRootPath)) {
84 wp_send_json_success();
85 }
86
87 $cloneDir = $this->dirAdapter->getStagingSiteDirectoryInsideWpcontent();
88 if ($cloneDir === false) {
89 wp_send_json_error([
90 'message' => sprintf(__('Clone destination dir cannot be created. Please choose another path.', 'wp-staging')),
91 ]);
92 }
93
94 if (is_writable($cloneDir)) {
95 wp_send_json_success();
96 }
97
98 wp_send_json_error([
99 'message' => sprintf(__('Clone destination dir is not writable. Please make <code>%s</code> or <code>%s</code> writable to proceed!', 'wp-staging'), esc_html($cloneDirRootPath), esc_html($cloneDir)),
100 ]);
101 }
102 }
103