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