PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.9.5
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.9.5
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 6 days ago Restore 3 months ago Backup.php 2 years ago BackupDownloader.php 1 month ago BackupSizeCalculator.php 1 month ago BackupSpeedIndex.php 10 months ago BaseFileList.php 1 year ago BaseListing.php 10 months ago Delete.php 6 days ago Edit.php 6 days ago Explore.php 4 months ago ExploreCache.php 4 months ago FileInfo.php 6 days ago FileList.php 1 year ago Listing.php 8 months ago Parts.php 6 days ago Restore.php 2 years 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