-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHmacMediaItemUrlGenerator.php
More file actions
47 lines (39 loc) · 1.62 KB
/
HmacMediaItemUrlGenerator.php
File metadata and controls
47 lines (39 loc) · 1.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
namespace SprayMedia\Infrastructure\Url;
use SprayMedia\Contracts\MediaItemUrlGeneratorInterface;
use SprayMedia\Domain\Enums\MediaAction;
use SprayMedia\Domain\Models\MediaItem;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\URL;
/**
* Generates a URL with a payload signed using an HMAC hash for MediaItem resources.
*/
class HmacMediaItemUrlGenerator implements MediaItemUrlGeneratorInterface
{
public function generate(MediaItem $media, MediaAction $action = MediaAction::VIEW, array $options = []): string
{
$payload = $this->buildPayload($media, $action, $options);
$config = Config::get('spray-media.hmac');
$data = base64_encode(json_encode($payload));
$signature = hash_hmac($config['algorithm'], $data, $config['secret']);
$routeUrl = URL::route(Config::get('spray-media.route.name'));
return $routeUrl . '?data=' . urlencode($data) . '&signature=' . $signature;
}
/**
* Builds the payload array to be signed.
*/
private function buildPayload(MediaItem $media, MediaAction $action, array $options): array
{
$defaultExpiration = Config::get('spray-media.hmac.default_expiration_minutes');
$expirationMinutes = $options['expiration_minutes'] ?? $defaultExpiration;
return [
'id' => $media->id,
'action' => $action->value,
'expires_at' => $expirationMinutes !== null
? Carbon::now()->addMinutes($expirationMinutes)->timestamp
: null,
'metadata' => $options['metadata'] ?? [],
];
}
}