PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backup, Restore, Migration & Clone / 4.9.2
WP STAGING – WordPress Backup, Restore, Migration & Clone v4.9.2
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 / Service / BackupSigner.php
wp-staging / Backup / Service Last commit date
Compression 4 months ago Database 2 weeks ago AbstractBackupsFinder.php 1 year ago AbstractExtractor.php 1 day ago AbstractServiceProvider.php 2 years ago Archiver.php 2 weeks ago BackupAssets.php 1 month ago BackupContent.php 1 year ago BackupMetadataEditor.php 1 year ago BackupMetadataReader.php 5 months ago BackupSigner.php 7 months ago BackupsDirectoryResolver.php 2 weeks ago BackupsFinder.php 2 weeks ago Extractor.php 2 weeks ago FileBackupService.php 1 day ago FileBackupServiceProvider.php 2 years ago ServiceInterface.php 2 years ago TmpBackupCleaner.php 2 weeks ago ZlibCompressor.php 11 months 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 = $backupMetadata->hydrateByFile($file);
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 = $backupMetadata->hydrateByFile($file);
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(sprintf('Unexpected Backup Size in Metadata. Size in Metadata %s, Size in File %s', $backupMetadata->getBackupSize(), $backupSize));
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 2 bytes 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((string)$backupSize);
154 }
155 }
156