PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.1
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.1
4.11.2 4.11.1 4.11.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 1 week ago FileList 1 week ago Restore 1 week ago Backup.php 1 week ago BackupDownloader.php 1 week ago BackupSizeCalculator.php 1 week ago BackupSpeedIndex.php 1 week ago BaseFileList.php 1 week ago BaseListing.php 1 week ago Delete.php 1 week ago Edit.php 1 week ago Explore.php 1 week ago ExploreCache.php 1 week ago FileInfo.php 1 week ago FileList.php 1 week ago Listing.php 1 week ago Parts.php 1 week ago Restore.php 1 week ago ScheduleList.php 1 week ago Upload.php 1 week ago
Edit.php
176 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
17 private $backupMetadataEditor;
18
19
20 private $backupsFinder;
21
22
23 private $backupPathResolver;
24
25
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
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
78 if (empty($name)) {
79 $name = __('Backup', 'wp-staging');
80 }
81
82
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;
98 if ($oldNote !== null) {
99 $oldNoteLength = strlen($oldNote);
100 }
101
102 $backupSize = $metaData->getBackupSize();
103 $backupSize = $backupSize + $increment - strlen($metaData->getName()) - $oldNoteLength;
104 $backupSize = $backupSize - $this->backupMetadataEditor->getLineTerminatorOverhead($file);
105
106 $metaData->setName($name);
107 $metaData->setNote($notes);
108 $metaData->setBackupSize($backupSize);
109
110 $this->backupMetadataEditor->setBackupMetadata($file, $metaData);
111 } catch (\Exception $e) {
112 wp_send_json([
113 'error' => true,
114
115 'message' => esc_html__($e->getMessage(), 'wp-staging'),
116 ]);
117 }
118 }
119 }
120
121 wp_send_json(true);
122 }
123
124
125
126
127
128
129
130
131 protected function updateBackupParts($metaData, $name, $notes, $incrementSize, $backupFilename)
132 {
133 $backupSize = 0;
134 $backupParts = [];
135 foreach ($metaData->getMultipartMetadata()->getBackupParts() as $part) {
136 $backupPart = $this->backupPathResolver->resolveBackupPartPath($part, $backupFilename);
137 if ($backupPart === '') {
138 continue;
139 }
140
141 $partFile = new FileObject($backupPart, FileObject::MODE_APPEND_AND_READ);
142 $partMetadata = (new BackupMetadata())->hydrateByFile($partFile);
143 $partSize = filesize($backupPart);
144
145 $oldNote = $partMetadata->getNote();
146 $oldNoteLength = 2;
147 if ($oldNote !== null) {
148 $oldNoteLength = strlen($oldNote);
149 }
150
151 $partSize = $partSize + $incrementSize - strlen($partMetadata->getName()) - $oldNoteLength;
152 $partSize = $partSize - $this->backupMetadataEditor->getLineTerminatorOverhead($partFile);
153 $backupSize += $partSize;
154 $backupParts[] = [
155 'metadata' => $partMetadata,
156 'file' => $partFile,
157 'size' => $partSize,
158 ];
159 }
160
161 foreach ($backupParts as $part) {
162
163 $partMetadata = $part['metadata'];
164 $partMetadata->setName($name);
165 $partMetadata->setNote($notes);
166 $partMetadata->setBackupSize($backupSize);
167
168 $multipartMetadata = $partMetadata->getMultipartMetadata();
169 $multipartMetadata->setPartSize($part['size']);
170 $partMetadata->setMultipartMetadata($multipartMetadata);
171
172 $this->backupMetadataEditor->setBackupMetadata($part['file'], $partMetadata);
173 }
174 }
175 }
176