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