PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backup, Restore, Migration & Clone / 4.9.2
WP STAGING – WordPress Backup, Restore, Migration & Clone v4.9.2
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 / Backup / Ajax / Edit.php
wp-staging / Backup / Ajax Last commit date
Backup 2 months ago FileList 4 months ago Restore 2 months ago Backup.php 2 years ago BackupDownloader.php 1 day ago BackupSizeCalculator.php 1 day ago BackupSpeedIndex.php 9 months ago BaseFileList.php 1 year ago BaseListing.php 9 months ago Delete.php 4 months ago Edit.php 4 months ago Explore.php 3 months ago ExploreCache.php 3 months ago FileInfo.php 9 months ago FileList.php 1 year ago Listing.php 7 months ago Parts.php 1 day ago Restore.php 2 years ago ScheduleList.php 1 year ago Upload.php 1 month ago
Edit.php
165 lines
1 <?php
2
3 namespace WPStaging\Backup\Ajax;
4
5 use WPStaging\Backup\Entity\BackupMetadata;
6 use WPStaging\Backup\Service\BackupMetadataEditor;
7 use WPStaging\Backup\Service\BackupsFinder;
8 use WPStaging\Core\WPStaging;
9 use WPStaging\Framework\Component\AbstractTemplateComponent;
10 use WPStaging\Framework\Filesystem\FileObject;
11 use WPStaging\Framework\TemplateEngine\TemplateEngine;
12 use WPStaging\Framework\Utils\Sanitize;
13
14 class Edit extends AbstractTemplateComponent
15 {
16 /** @var BackupMetadataEditor */
17 private $backupMetadataEditor;
18
19 /** @var BackupsFinder */
20 private $backupsFinder;
21
22 /** @var Sanitize */
23 private $sanitize;
24
25 public function __construct(
26 BackupsFinder $backupsFinder,
27 BackupMetadataEditor $backupMetadataEditor,
28 Sanitize $sanitize,
29 TemplateEngine $templateEngine
30 ) {
31 parent::__construct($templateEngine);
32 $this->backupsFinder = $backupsFinder;
33 $this->backupMetadataEditor = $backupMetadataEditor;
34 $this->sanitize = $sanitize;
35 }
36
37 public function render()
38 {
39 if (!$this->canRenderAjax()) {
40 return;
41 }
42
43 $md5 = sanitize_text_field(isset($_POST['md5']) ? $_POST['md5'] : '');
44
45 $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : 'Backup';
46
47 $name = substr(sanitize_text_field(html_entity_decode($name)), 0, 100);
48 $name = htmlentities($name, ENT_QUOTES);
49 $name = str_replace('\\\'', '\'', $name);
50 $name = str_replace('\\\"', '\"', $name);
51
52 $notes = isset($_POST['notes']) ? sanitize_textarea_field($_POST['notes']) : '';
53 $notes = substr($notes, 0, 1000);
54
55 if (strlen($md5) !== 32) {
56 wp_send_json([
57 'error' => true,
58 'message' => __('Invalid request.', 'wp-staging'),
59 ]);
60 }
61
62 $backups = $this->backupsFinder->findBackups();
63
64 // Early bail: No backups found, nothing to edit
65 if (empty($backups)) {
66 wp_send_json([
67 'error' => true,
68 'message' => __('No backups found, nothing to edit.', 'wp-staging'),
69 ]);
70 }
71
72 // Name must not be empty.
73 if (empty($name)) {
74 $name = __('Backup', 'wp-staging');
75 }
76
77 /** @var \SplFileInfo $backup */
78 foreach ($backups as $backup) {
79 if ($md5 === md5($backup->getBasename())) {
80 try {
81 $file = new FileObject($backup->getPathname(), FileObject::MODE_APPEND_AND_READ);
82 $metaData = (new BackupMetadata())->hydrateByFile($file);
83
84 $increment = strlen($name) + strlen($notes);
85
86 if ($metaData->getIsMultipartBackup()) {
87 $this->updateBackupParts($metaData, $name, $notes, $increment);
88 return;
89 }
90
91 $oldNote = $metaData->getNote();
92 $oldNoteLength = 2; // null takes 2 bytes!?
93 if ($oldNote !== null) {
94 $oldNoteLength = strlen($oldNote);
95 }
96
97 $backupSize = $metaData->getBackupSize();
98 $backupSize = $backupSize + $increment - strlen($metaData->getName()) - $oldNoteLength;
99
100 $metaData->setName($name);
101 $metaData->setNote($notes);
102 $metaData->setBackupSize($backupSize);
103
104 $this->backupMetadataEditor->setBackupMetadata($file, $metaData);
105 } catch (\Exception $e) {
106 wp_send_json([
107 'error' => true,
108 /* We might need to translate the error */
109 'message' => esc_html__($e->getMessage(), 'wp-staging'),
110 ]);
111 }
112 }
113 }
114
115 wp_send_json(true);
116 }
117
118 /**
119 * @param BackupMetadata $metaData
120 * @param string $name
121 * @param string $notes
122 * @param int $incrementSize
123 */
124 protected function updateBackupParts($metaData, $name, $notes, $incrementSize)
125 {
126 $backupSize = 0;
127 $backupsDirectory = WPStaging::make(BackupsFinder::class)->getBackupsDirectory();
128 $backupParts = [];
129 foreach ($metaData->getMultipartMetadata()->getBackupParts() as $part) {
130 $backupPart = $backupsDirectory . $part;
131 $partFile = new FileObject($backupPart, FileObject::MODE_APPEND_AND_READ);
132 $partMetadata = (new BackupMetadata())->hydrateByFile($partFile);
133 $partSize = filesize($backupPart);
134
135 $oldNote = $partMetadata->getNote();
136 $oldNoteLength = 2;
137 if ($oldNote !== null) {
138 $oldNoteLength = strlen($oldNote);
139 }
140
141 $partSize = $partSize + $incrementSize - strlen($partMetadata->getName()) - $oldNoteLength;
142 $backupSize += $partSize;
143 $backupParts[] = [
144 'metadata' => $partMetadata,
145 'file' => $partFile,
146 'size' => $partSize,
147 ];
148 }
149
150 foreach ($backupParts as $part) {
151 /** @var BackupMetadata $partMetadata */
152 $partMetadata = $part['metadata'];
153 $partMetadata->setName($name);
154 $partMetadata->setNote($notes);
155 $partMetadata->setBackupSize($backupSize);
156
157 $multipartMetadata = $partMetadata->getMultipartMetadata();
158 $multipartMetadata->setPartSize($part['size']);
159 $partMetadata->setMultipartMetadata($multipartMetadata);
160
161 $this->backupMetadataEditor->setBackupMetadata($part['file'], $partMetadata);
162 }
163 }
164 }
165