Skip to content

Commit 2d0ce5c

Browse files
committed
Signature and Version parameters in the response
- added Lambda's config variable `VERSION_PARAMETER_NAME` - added Signature and Version parameters into an image response - added Signature parameter into a noimage response
1 parent 09f9de6 commit 2d0ce5c

File tree

4 files changed

+50
-9
lines changed

4 files changed

+50
-9
lines changed

src/config/config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class Config {
99
HOST: null,
1010
MODIFIER_SEPARATOR: ',',
1111
MODIFIER_ASSIGNER: ':',
12+
VERSION_PARAMETER_NAME: '_v',
1213
SIGNATURE_PARAMETER_NAME: '_s',
1314
SIGNATURE_KEY: null,
1415
SIGNATURE_ALGORITHM: 'sha256',

src/image-server/image-server.js

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ class ImageServer {
3434
}
3535

3636
// validate signature token
37-
this._signatureStrategy.verifyToken(request.hasQuery(this._config.SIGNATURE_PARAMETER_NAME) ? request.getQuery(this._config.SIGNATURE_PARAMETER_NAME) : null, path);
37+
const signatureToken = request.hasQuery(this._config.SIGNATURE_PARAMETER_NAME) ? request.getQuery(this._config.SIGNATURE_PARAMETER_NAME) : null;
38+
39+
this._signatureStrategy.verifyToken(signatureToken, path);
3840

3941
// parse image info & modifiers
4042
const parts = path.split('/');
@@ -49,6 +51,10 @@ class ImageServer {
4951

5052
const info = new ImageInfo(parts.join('/'));
5153

54+
if (request.hasQuery(this._config.VERSION_PARAMETER_NAME)) {
55+
info.version = request.getQuery(this._config.VERSION_PARAMETER_NAME);
56+
}
57+
5258
if (null === info.extension) {
5359
throw new InvalidStateError('Missing file extension in requested path.');
5460
}
@@ -72,7 +78,7 @@ class ImageServer {
7278
CacheControl: `public, max-age=${this._config.CACHE_MAX_AGE.toString()}`,
7379
Expires: new Date(now.getTime() + (this._config.CACHE_MAX_AGE * 1000))
7480
}).promise().then(
75-
() => this._responseFactory.createRedirectResponse(this._createLink(resource.info, modifierString)),
81+
() => this._responseFactory.createRedirectResponse(this._createLink(resource.info, modifierString, signatureToken)),
7682
e => {
7783
throw new InvalidStateError(e.message);
7884
}
@@ -96,15 +102,39 @@ class ImageServer {
96102
return `${basePath}${info.createCachedPath(modifierString)}`;
97103
}
98104

99-
_createLink(info, modifierString, addSignature = false) {
100-
const host = null !== this._config.HOST ? this._config.HOST : `https://${this._config.CACHE_BUCKET}.s3.${this._s3.config.region}.amazonaws.com`;
101-
let path = this._createCachedPath(info, modifierString);
105+
_getHostUrl() {
106+
return new URL(
107+
null !== this._config.HOST ? this._config.HOST : `https://${this._config.CACHE_BUCKET}.s3.${this._s3.config.region}.amazonaws.com`
108+
);
109+
}
110+
111+
_createLink(info, modifierString, signatureToken = null) {
112+
const url = this._getHostUrl();
113+
url.pathname = this._createCachedPath(info, modifierString);
114+
115+
if (null !== signatureToken) {
116+
url.searchParams.set(this._config.SIGNATURE_PARAMETER_NAME, signatureToken);
117+
}
118+
119+
if (null !== info.version) {
120+
url.searchParams.set(this._config.SIGNATURE_PARAMETER_NAME, info.version);
121+
}
122+
123+
return url.toString();
124+
}
125+
126+
_createNoImageLink(info, modifierString) {
127+
const url = this._getHostUrl();
128+
const path = this._createCachedPath(info, modifierString);
129+
const signatureToken = this._signatureStrategy.createToken(path);
130+
131+
url.pathname = path;
102132

103-
if (addSignature) {
104-
path += `?${this._config.SIGNATURE_PARAMETER_NAME}=${this._signatureStrategy.createToken(path)}`;
133+
if (null !== signatureToken) {
134+
url.searchParams.set(this._config.SIGNATURE_PARAMETER_NAME, signatureToken);
105135
}
106136

107-
return `${host}/${path}`;
137+
return url.toString();
108138
}
109139

110140
_getNoImageResponse(info, modifierString) {
@@ -114,7 +144,7 @@ class ImageServer {
114144
noImageInfo.extension = info.extension;
115145

116146
return this._responseFactory.createRedirectResponse(
117-
this._createLink(noImageInfo, modifierString, true)
147+
this._createNoImageLink(noImageInfo, modifierString)
118148
);
119149
} catch (e) {
120150
return null;

src/resource/image-info.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class ImageInfo {
1111
this._name = name.join('.');
1212
this._namespace = namespace.join('/');
1313
this._extension = extension;
14+
this._version = null;
1415
}
1516

1617
get name() {
@@ -29,6 +30,14 @@ class ImageInfo {
2930
this._extension = extension;
3031
}
3132

33+
get version() {
34+
return this._version;
35+
}
36+
37+
set version(version) {
38+
this._version = version;
39+
}
40+
3241
createCachedPath(modifier) {
3342
const extension = null !== this.extension ? this.extension : SupportedType.getDefaultExtension();
3443

template.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ Resources:
127127
BASE_PATH: !Ref BasePath
128128
MODIFIER_SEPARATOR: !Ref ModifierSeparator
129129
MODIFIER_ASSIGNER: !Ref ModifierAssigner
130+
VERSION_PARAMETER_NAME: !Ref VersionParameterName
130131
SIGNATURE_PARAMETER_NAME: !Ref SignatureParameterName
131132
SIGNATURE_KEY: !Ref SignatureKey
132133
SIGNATURE_ALGORITHM: !Ref SignatureAlgorithm

0 commit comments

Comments
 (0)