Path: blob/1.0-develop/app/Services/Backups/DownloadLinkService.php
10260 views
<?php12namespace Pterodactyl\Services\Backups;34use Carbon\CarbonImmutable;5use Pterodactyl\Models\User;6use Pterodactyl\Models\Backup;7use Pterodactyl\Services\Nodes\NodeJWTService;8use Pterodactyl\Extensions\Backups\BackupManager;910class DownloadLinkService11{12/**13* DownloadLinkService constructor.14*/15public function __construct(private BackupManager $backupManager, private NodeJWTService $jwtService)16{17}1819/**20* Returns the URL that allows for a backup to be downloaded by an individual21* user, or by the Wings control software.22*/23public function handle(Backup $backup, User $user): string24{25if ($backup->disk === Backup::ADAPTER_AWS_S3) {26return $this->getS3BackupUrl($backup);27}2829$token = $this->jwtService30->setExpiresAt(CarbonImmutable::now()->addMinutes(15))31->setUser($user)32->setClaims([33'backup_uuid' => $backup->uuid,34'server_uuid' => $backup->server->uuid,35])36->handle($backup->server->node, $user->id . $backup->server->uuid);3738return sprintf('%s/download/backup?token=%s', $backup->server->node->getConnectionAddress(), $token->toString());39}4041/**42* Returns a signed URL that allows us to download a file directly out of a non-public43* S3 bucket by using a signed URL.44*/45protected function getS3BackupUrl(Backup $backup): string46{47/** @var \Pterodactyl\Extensions\Filesystem\S3Filesystem $adapter */48$adapter = $this->backupManager->adapter(Backup::ADAPTER_AWS_S3);4950$request = $adapter->getClient()->createPresignedRequest(51$adapter->getClient()->getCommand('GetObject', [52'Bucket' => $adapter->getBucket(),53'Key' => sprintf('%s/%s.tar.gz', $backup->server->uuid, $backup->uuid),54'ContentType' => 'application/x-gzip',55]),56CarbonImmutable::now()->addMinutes(5)57);5859return $request->getUri()->__toString();60}61}626364