Skip to content

Commit 3f61635

Browse files
authored
Merge pull request #35 from ADmad/allowed-params
Add "allowedParams" config.
2 parents ce35455 + 51d1c76 commit 3f61635

File tree

7 files changed

+53
-28
lines changed

7 files changed

+53
-28
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
strategy:
99
fail-fast: false
1010
matrix:
11-
php-version: ['7.2', '7.4', '8.0']
11+
php-version: ['7.4', '8.0', '8.1']
1212
composer-opts: ['']
1313
include:
1414
- php-version: '7.2'
@@ -38,7 +38,7 @@ jobs:
3838
3939
- name: Code Coverage Report
4040
if: matrix.php-version == '7.4'
41-
uses: codecov/codecov-action@v1
41+
uses: codecov/codecov-action@v2
4242

4343
cs-stan:
4444
name: Coding Standard & Static Analysis
@@ -53,7 +53,7 @@ jobs:
5353
php-version: '7.4'
5454
extensions: mbstring, intl
5555
coverage: none
56-
tools: cs2pr, psalm:^4.8
56+
tools: cs2pr, vimeo/psalm:^4
5757

5858
- name: Composer Install
5959
run: composer require cakephp/cakephp-codesniffer:^4.5

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,12 @@ $routes->scope('/images', function ($routes) {
7777
// Any response headers you may want to set. Default null.
7878
'headers' => [
7979
'X-Custom' => 'some-value',
80-
]
80+
],
81+
82+
// Allowed query string params. If for e.g. you are only using glide presets
83+
// then you can set allowed params as `['p']` to prevent users from using
84+
// any other image manipulation params.
85+
'allowedParams' => null
8186
]));
8287

8388
$routes->applyMiddleware('glide');

psalm.xml

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?xml version="1.0"?>
22
<psalm
3-
totallyTyped="false"
3+
errorLevel="2"
4+
resolveFromConfigFile="true"
45
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
56
xmlns="https://getpsalm.org/schema/config"
67
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
@@ -11,15 +12,4 @@
1112
<directory name="vendor" />
1213
</ignoreFiles>
1314
</projectFiles>
14-
15-
<issueHandlers>
16-
<MissingClosureReturnType errorLevel="info" />
17-
18-
<PropertyNotSetInConstructor errorLevel="info" />
19-
<MissingConstructor errorLevel="info" />
20-
<MissingClosureParamType errorLevel="info" />
21-
22-
<DocblockTypeContradiction errorLevel="info" />
23-
<RedundantConditionGivenDocblockType errorLevel="info" />
24-
</issueHandlers>
2515
</psalm>

src/Middleware/GlideMiddleware.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class GlideMiddleware implements MiddlewareInterface, EventDispatcherInterface
4747
'signKey' => null,
4848
],
4949
'headers' => null,
50+
'allowedParams' => null,
5051
'originalPassThrough' => false,
5152
];
5253

@@ -210,6 +211,10 @@ protected function _checkModified(ServerRequestInterface $request, Server $serve
210211
protected function _getResponse(ServerRequestInterface $request, Server $server): ?ResponseInterface
211212
{
212213
$queryParams = $request->getQueryParams();
214+
$allowedParams = $this->getConfig('allowedParams');
215+
if ($allowedParams) {
216+
$queryParams = array_intersect_key($queryParams, array_flip($allowedParams));
217+
}
213218

214219
if (
215220
(empty($queryParams)
@@ -233,7 +238,7 @@ protected function _getResponse(ServerRequestInterface $request, Server $server)
233238
}
234239

235240
try {
236-
$response = $server->getImageResponse($this->_path, $request->getQueryParams());
241+
$response = $server->getImageResponse($this->_path, $queryParams);
237242
} catch (Exception $exception) {
238243
return $this->_handleException($request, $exception);
239244
}

src/Response/PsrResponseFactory.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use ADmad\Glide\Exception\ResponseException;
77
use Cake\Http\Response;
88
use Laminas\Diactoros\Stream;
9+
use League\Flysystem\FilesystemException;
910
use League\Flysystem\FilesystemOperator;
1011
use League\Glide\Responses\ResponseFactoryInterface;
1112

@@ -20,10 +21,12 @@ class PsrResponseFactory implements ResponseFactoryInterface
2021
*/
2122
public function create(FilesystemOperator $cache, $path)
2223
{
23-
$resource = $cache->readStream($path);
24-
if ($resource === false) {
25-
throw new ResponseException();
24+
try {
25+
$resource = $cache->readStream($path);
26+
} catch (FilesystemException $e) {
27+
throw new ResponseException(null, null, $e);
2628
}
29+
2730
$stream = new Stream($resource);
2831

2932
$contentType = $cache->mimeType($path);

src/View/Helper/GlideHelper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class GlideHelper extends Helper
3131
* - `signKey`: Signing key to use when generating secure URLs. If empty
3232
* value of `Security::salt()` will be used. Default `null`.
3333
*
34-
* @var array
34+
* @var array<string, mixed>
3535
*/
3636
protected $_defaultConfig = [
3737
'baseUrl' => '/images/',

tests/TestCase/Middleware/GlideMiddlewareTest.php

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ public function setUp(): void
2929
],
3030
];
3131

32-
$this->request = ServerRequestFactory::fromGlobals([
33-
'REQUEST_URI' => '/images/cake-logo.png?w=100',
34-
]);
32+
$this->request = ServerRequestFactory::fromGlobals(
33+
['REQUEST_URI' => '/images/cake-logo.png'],
34+
['w' => '100']
35+
);
3536
$this->handler = new TestRequestHandler();
3637

3738
Security::setSalt('salt');
@@ -66,6 +67,24 @@ public function testServerCallable()
6667
$this->assertTrue(is_dir(TMP . 'cache/cake-logo.png'));
6768
}
6869

70+
public function testAllowedParams()
71+
{
72+
$this->config['allowedParams'] = ['w'];
73+
$middleware = new GlideMiddleware($this->config);
74+
$middleware->process($this->request, $this->handler);
75+
76+
$request = ServerRequestFactory::fromGlobals(
77+
['REQUEST_URI' => '/images/cake-logo.png'],
78+
['w' => '100', 'foo' => 'bar']
79+
);
80+
81+
$middleware = new GlideMiddleware($this->config);
82+
$middleware->process($request, $this->handler);
83+
84+
$files = glob(TMP . 'cache/cake-logo.png/*');
85+
$this->assertSame(1, count($files));
86+
}
87+
6988
public function testOriginalPassThrough()
7089
{
7190
$fileSize = filesize(PLUGIN_ROOT . '/test_app/webroot/upload/cake-logo.png');
@@ -139,10 +158,13 @@ public function testCache()
139158
$this->assertTrue(isset($headers['Last-Modified']));
140159
$this->assertTrue(isset($headers['Expires']));
141160

142-
$request = ServerRequestFactory::fromGlobals([
143-
'REQUEST_URI' => '/images/cake-logo.png?w=100',
144-
'HTTP_IF_MODIFIED_SINCE' => $headers['Last-Modified'][0],
145-
]);
161+
$request = ServerRequestFactory::fromGlobals(
162+
[
163+
'REQUEST_URI' => '/images/cake-logo.png',
164+
'HTTP_IF_MODIFIED_SINCE' => $headers['Last-Modified'][0],
165+
],
166+
['w' => '100']
167+
);
146168

147169
$middleware = new GlideMiddleware($this->config);
148170
$response = $middleware->process($request, $this->handler);

0 commit comments

Comments
 (0)