Skip to content

Commit 3370f9a

Browse files
refactor(signature): simplify signature verification for relative URLs
1 parent 90ec899 commit 3370f9a

File tree

1 file changed

+3
-54
lines changed

1 file changed

+3
-54
lines changed

src/VerifyEmailHelper.php

Lines changed: 3 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ public function generateSignature(string $routeName, string $userId, string $use
6363
$extraParams['token'] = $this->tokenGenerator->createToken($userId, $userEmail);
6464
$extraParams['expires'] = $expiryTimestamp;
6565

66-
$uri = $this->router->generate($routeName, $extraParams, UrlGeneratorInterface::ABSOLUTE_URL);
66+
$uri = $this->router->generate($routeName, $extraParams, $this->useRelativePath ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
67+
$signature = $this->uriSigner->sign($uri);
6768

6869
/** @psalm-suppress PossiblyFalseArgument */
69-
return new VerifyEmailSignatureComponents(\DateTimeImmutable::createFromFormat('U', (string) $expiryTimestamp), $this->getSignedUrl($uri), $generatedAt);
70+
return new VerifyEmailSignatureComponents(\DateTimeImmutable::createFromFormat('U', (string) $expiryTimestamp), $signature, $generatedAt);
7071
}
7172

7273
public function validateEmailConfirmation(string $signedUrl, string $userId, string $userEmail): void
@@ -112,56 +113,4 @@ public function validateEmailConfirmationFromRequest(Request $request, string $u
112113
}
113114
}
114115

115-
private function generateAbsolutePath(string $absoluteUri): string
116-
{
117-
$parsedUri = parse_url($absoluteUri);
118-
\assert(\is_array($parsedUri), 'Could not parse the provided URI.');
119-
120-
$path = $parsedUri['path'] ?? '';
121-
$query = $this->getQueryStringFromParsedUrl($parsedUri);
122-
$fragment = isset($parsedUri['fragment']) ? '#'.$parsedUri['fragment'] : '';
123-
124-
return $path.$query.$fragment;
125-
}
126-
127-
public function generateSigningString(string $uri): string
128-
{
129-
if (!$this->useRelativePath) {
130-
return $uri;
131-
}
132-
133-
return $this->generateAbsolutePath($uri);
134-
}
135-
136-
private function generateBaseUrl(string $absoluteUri): string
137-
{
138-
$parsedUri = parse_url($absoluteUri);
139-
$scheme = isset($parsedUri['scheme']) ? $parsedUri['scheme'].'://' : '';
140-
$host = $parsedUri['host'] ?? '';
141-
142-
return $scheme.$host;
143-
}
144-
145-
private function getSignedUrl(string $uri): string
146-
{
147-
$signature = $this->uriSigner->sign($this->generateSigningString($uri));
148-
149-
if (false === $this->useRelativePath) {
150-
return $signature;
151-
}
152-
153-
return $this->generateBaseUrl($uri).$signature;
154-
}
155-
156-
/**
157-
* @param array{scheme?: string, host?: string, port?: int, user?: string, pass?: string, query?: string, path?: string, fragment?: string} $parsedUrl
158-
*/
159-
private function getQueryStringFromParsedUrl(array $parsedUrl): string
160-
{
161-
if (!\array_key_exists('query', $parsedUrl)) {
162-
return '';
163-
}
164-
165-
return $parsedUrl['query'] ? ('?'.$parsedUrl['query']) : '';
166-
}
167116
}

0 commit comments

Comments
 (0)