PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.2
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.2
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 2 weeks ago FileList 2 weeks ago Restore 2 weeks ago Backup.php 2 weeks ago BackupDownloader.php 2 weeks ago BackupSizeCalculator.php 2 weeks ago BackupSpeedIndex.php 2 weeks ago BaseFileList.php 2 weeks ago BaseListing.php 2 weeks ago Delete.php 2 weeks ago Edit.php 1 week ago Explore.php 2 weeks ago ExploreCache.php 2 weeks ago FileInfo.php 2 weeks ago FileList.php 2 weeks ago Listing.php 2 weeks ago Parts.php 2 weeks ago Restore.php 2 weeks ago ScheduleList.php 2 weeks ago Upload.php 2 weeks 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