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