22
22
*/
23
23
class UriSigner
24
24
{
25
+ private const STATUS_VALID = 1 ;
26
+ private const STATUS_INVALID = 2 ;
27
+ private const STATUS_MISSING = 3 ;
28
+ private const STATUS_EXPIRED = 4 ;
29
+
25
30
/**
26
31
* @param string $hashParameter Query string parameter to use
27
32
* @param string $expirationParameter Query string parameter to use for expiration
@@ -93,24 +98,12 @@ public function sign(string $uri/* , \DateTimeInterface|\DateInterval|int|null $
93
98
*/
94
99
public function check (string $ uri ): bool
95
100
{
96
- try {
97
- $ this ->verify ($ uri );
98
- } catch (SignedUriException ) {
99
- return false ;
100
- }
101
-
102
- return true ;
101
+ return self ::STATUS_VALID === $ this ->doVerify ($ uri );
103
102
}
104
103
105
104
public function checkRequest (Request $ request ): bool
106
105
{
107
- try {
108
- $ this ->verify ($ request );
109
- } catch (SignedUriException ) {
110
- return false ;
111
- }
112
-
113
- return true ;
106
+ return self ::STATUS_VALID === $ this ->doVerify (self ::normalize ($ request ));
114
107
}
115
108
116
109
/**
@@ -123,37 +116,24 @@ public function checkRequest(Request $request): bool
123
116
*/
124
117
public function verify (Request |string $ uri ): void
125
118
{
126
- if ($ uri instanceof Request) {
127
- $ qs = ($ qs = $ uri ->server ->get ('QUERY_STRING ' )) ? '? ' .$ qs : '' ;
128
- $ uri = $ uri ->getSchemeAndHttpHost ().$ uri ->getBaseUrl ().$ uri ->getPathInfo ().$ qs ;
129
- }
119
+ $ uri = self ::normalize ($ uri );
120
+ $ status = $ this ->doVerify ($ uri );
130
121
131
- $ url = parse_url ($ uri );
132
- $ params = [];
133
-
134
- if (isset ($ url ['query ' ])) {
135
- parse_str ($ url ['query ' ], $ params );
122
+ if (self ::STATUS_VALID === $ status ) {
123
+ return ;
136
124
}
137
125
138
- if (empty ( $ params [ $ this -> hashParameter ]) ) {
126
+ if (self :: STATUS_MISSING === $ status ) {
139
127
throw new UnsignedUriException ($ uri );
140
128
}
141
129
142
- $ hash = $ params [$ this ->hashParameter ];
143
- unset($ params [$ this ->hashParameter ]);
144
-
145
- // In 8.0, remove support for non-url-safe tokens
146
- if (!hash_equals ($ this ->computeHash ($ this ->buildUrl ($ url , $ params )), strtr (rtrim ($ hash , '= ' ), ['/ ' => '_ ' , '+ ' => '- ' ]))) {
130
+ if (self ::STATUS_INVALID === $ status ) {
147
131
throw new UnverifiedSignedUriException ($ uri );
148
132
}
149
133
150
- if (!$ expiration = $ params [$ this ->expirationParameter ] ?? false ) {
151
- return ;
152
- }
153
-
154
- if (time () < $ expiration ) {
155
- return ;
156
- }
134
+ $ url = parse_url ($ uri );
135
+ parse_str ($ url ['query ' ], $ params );
136
+ $ expiration = $ params [$ this ->expirationParameter ];
157
137
158
138
throw new ExpiredSignedUriException (\DateTimeImmutable::createFromFormat ('U ' , $ expiration ), $ uri );
159
139
}
@@ -193,4 +173,49 @@ private function getExpirationTime(\DateTimeInterface|\DateInterval|int $expirat
193
173
194
174
return (string ) $ expiration ;
195
175
}
176
+
177
+ /**
178
+ * @return self::STATUS_*
179
+ */
180
+ private function doVerify (string $ uri ): int
181
+ {
182
+ $ url = parse_url ($ uri );
183
+ $ params = [];
184
+
185
+ if (isset ($ url ['query ' ])) {
186
+ parse_str ($ url ['query ' ], $ params );
187
+ }
188
+
189
+ if (empty ($ params [$ this ->hashParameter ])) {
190
+ return self ::STATUS_MISSING ;
191
+ }
192
+
193
+ $ hash = $ params [$ this ->hashParameter ];
194
+ unset($ params [$ this ->hashParameter ]);
195
+
196
+ // In 8.0, remove support for non-url-safe tokens
197
+ if (!hash_equals ($ this ->computeHash ($ this ->buildUrl ($ url , $ params )), strtr (rtrim ($ hash , '= ' ), ['/ ' => '_ ' , '+ ' => '- ' ]))) {
198
+ return self ::STATUS_INVALID ;
199
+ }
200
+
201
+ if (!$ expiration = $ params [$ this ->expirationParameter ] ?? false ) {
202
+ return self ::STATUS_VALID ;
203
+ }
204
+
205
+ if (time () < $ expiration ) {
206
+ return self ::STATUS_VALID ;
207
+ }
208
+
209
+ return self ::STATUS_EXPIRED ;
210
+ }
211
+
212
+ private static function normalize (Request |string $ uri ): string
213
+ {
214
+ if ($ uri instanceof Request) {
215
+ $ qs = ($ qs = $ uri ->server ->get ('QUERY_STRING ' )) ? '? ' .$ qs : '' ;
216
+ $ uri = $ uri ->getSchemeAndHttpHost ().$ uri ->getBaseUrl ().$ uri ->getPathInfo ().$ qs ;
217
+ }
218
+
219
+ return $ uri ;
220
+ }
196
221
}
0 commit comments