PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backup, Restore, Migration & Clone / 3.8.2
WP STAGING – WordPress Backup, Restore, Migration & Clone v3.8.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 / Service / BackupSigner.php
wp-staging / Backup / Service Last commit date
Compression 2 years ago Database 1 year ago AbstractServiceProvider.php 2 years ago Archiver.php 2 years ago BackupAssets.php 2 years ago BackupMetadataEditor.php 3 years ago BackupSigner.php 2 years ago BackupsFinder.php 2 years ago Extractor.php 2 years ago FileBackupService.php 2 years ago FileBackupServiceProvider.php 2 years ago ServiceInterface.php 2 years ago ZlibCompressor.php 2 years ago
BackupSigner.php
156 lines
1 <?php
2
3 namespace WPStaging\Backup\Service;
4
5 use RuntimeException;
6 use WPStaging\Backup\Dto\Job\JobBackupDataDto;
7 use WPStaging\Backup\Entity\BackupMetadata;
8 use WPStaging\Framework\Filesystem\FileObject;
9
10 class BackupSigner
11 {
12 /** @var BackupMetadataEditor */
13 protected $backupMetadataEditor;
14
15 /** @var JobBackupDataDto */
16 protected $jobDataDto;
17
18 /**
19 * @param BackupMetadataEditor $backupMetadataEditor
20 */
21 public function __construct(BackupMetadataEditor $backupMetadataEditor)
22 {
23 $this->backupMetadataEditor = $backupMetadataEditor;
24 }
25
26 /**
27 * @param JobBackupDataDto $jobDataDto
28 * @return void
29 */
30 public function setup(JobBackupDataDto $jobDataDto)
31 {
32 $this->jobDataDto = $jobDataDto;
33 }
34
35 /**
36 * @param string $backupFilePath
37 * @return void
38 */
39 public function signBackup(string $backupFilePath)
40 {
41 $this->signBackupFile($backupFilePath);
42 }
43
44 /**
45 * @param string $backupFilePath
46 * @return void
47 */
48 public function validateSignedBackup(string $backupFilePath)
49 {
50 $this->validateBackupFile($backupFilePath);
51 }
52
53 /**
54 * Signing the Backup aims to give it an identifier that can be checked for its consistency.
55 *
56 * Currently, we use the size of the file. We can use this information later, during Restore or Upload,
57 * to check if the Backup file we have is complete and matches the expected one.
58 *
59 * @param string $backupFilePath
60 * @param int $backupSize
61 * @param int $partSize
62 * @return void
63 */
64 protected function signBackupFile(string $backupFilePath, int $backupSize = 0, int $partSize = 0)
65 {
66 clearstatcache();
67 if (!is_file($backupFilePath)) {
68 throw new \RuntimeException('The backup file is invalid: ' . $backupFilePath . '.');
69 }
70
71 $file = new FileObject($backupFilePath, FileObject::MODE_APPEND_AND_READ);
72 $backupMetadata = new BackupMetadata();
73 $backupMetadata->hydrate($file->readBackupMetadata());
74
75 if ($backupSize === 0) {
76 $backupSize = $file->getSize();
77
78 $backupSize = $this->reCalcBackupSize($backupSize);
79 }
80
81 $this->jobDataDto->setTotalBackupSize($backupSize);
82 $backupMetadata->setBackupSize($backupSize);
83 $this->signMultiPartMetadata($backupMetadata, $partSize);
84 $this->backupMetadataEditor->setBackupMetadata($file, $backupMetadata);
85 }
86
87 /**
88 * @param string $backupFilePath
89 * @param integer $backupSize
90 * @param integer $partSize
91 * @return void
92 */
93 protected function validateBackupFile(string $backupFilePath, int $backupSize = 0, int $partSize = 0)
94 {
95 clearstatcache();
96 if (!is_file($backupFilePath)) {
97 throw new RuntimeException('The backup file does not exist: ' . $backupFilePath);
98 }
99
100 $file = new FileObject($backupFilePath);
101
102 $backupMetadata = new BackupMetadata();
103 $backupMetadata->hydrate($file->readBackupMetadata());
104
105 if ($backupMetadata->getName() !== $this->jobDataDto->getName()) {
106 throw new RuntimeException('Unexpected Name in Metadata.');
107 }
108
109 if ($backupSize === 0) {
110 $backupSize = $file->getSize();
111 }
112
113 if ($backupMetadata->getBackupSize() !== $backupSize) {
114 throw new RuntimeException('Unexpected Backup Size in Metadata.');
115 }
116
117 $this->validateMultipartMetadata($backupMetadata, $partSize);
118 }
119
120 /**
121 * @param BackupMetadata $backupMetadata
122 * @param integer $partSize
123 * @return void
124 */
125 protected function signMultipartMetadata(BackupMetadata $backupMetadata, int $partSize)
126 {
127 // no-op
128 }
129
130 /**
131 * @param BackupMetadata $backupMetadata
132 * @param integer $partSize
133 * @return void
134 */
135 protected function validateMultipartMetadata(BackupMetadata $backupMetadata, int $partSize)
136 {
137 // no-op
138 }
139
140 /**
141 * Subtract four doublequotes from the backup Size and add the byte length of $backupSize
142 *
143 * Example:
144 *
145 * Before: "backupSize": ""
146 * After: "backupSize": 123456
147 *
148 * @param int $backupSize
149 * @return int
150 */
151 private function reCalcBackupSize(int $backupSize = 0): int
152 {
153 return $backupSize - 2 + strlen($backupSize);
154 }
155 }
156