diff --git a/src/backend/middlewares/RenderingMWs.ts b/src/backend/middlewares/RenderingMWs.ts index 9f2636be..b48948cf 100644 --- a/src/backend/middlewares/RenderingMWs.ts +++ b/src/backend/middlewares/RenderingMWs.ts @@ -98,7 +98,7 @@ export class RenderingMWs { delete (err.details); // do not send back error object to the client side // hide error details for non developers - if (!(req.session.user && req.session.user.role >= UserRoles.Developer)) { + if (!(req.session && req.session.user && req.session.user.role >= UserRoles.Developer)) { delete (err.detailsStr); } } diff --git a/src/common/Utils.ts b/src/common/Utils.ts index 12cd8264..b42bacb7 100644 --- a/src/common/Utils.ts +++ b/src/common/Utils.ts @@ -106,7 +106,7 @@ export class Utils { .replace(new RegExp('/+', 'g'), '/'); } - static concatUrls(...args: Array): string { + static concatUrls(...args: string[]): string { let url = ''; for (const item of args) { if (item === '' || typeof item === 'undefined') { diff --git a/src/frontend/app/ui/gallery/Media.ts b/src/frontend/app/ui/gallery/Media.ts index 007f06b2..c9f7b6de 100644 --- a/src/frontend/app/ui/gallery/Media.ts +++ b/src/frontend/app/ui/gallery/Media.ts @@ -1,7 +1,7 @@ import {Utils} from '../../../../common/Utils'; import {MediaIcon} from './MediaIcon'; import {Config} from '../../../../common/config/public/Config'; -import {MediaBaseDTO, MediaDTO, MediaDTOUtils} from '../../../../common/entities/MediaDTO'; +import {MediaBaseDTO, MediaDTOUtils} from '../../../../common/entities/MediaDTO'; export class Media extends MediaIcon { @@ -54,8 +54,7 @@ export class Media extends MediaIcon { getReplacementThumbnailPath(): string { const size = this.getReplacementThumbnailSize(); return Utils.concatUrls(Config.Client.urlBase, - '/api/gallery/content/', - this.media.directory.path, this.media.directory.name, this.media.name, 'thumbnail', size.toString()); + '/api/gallery/content/', this.getRelativePath(), 'thumbnail', size.toString()); } @@ -66,8 +65,7 @@ export class Media extends MediaIcon { getThumbnailPath(): string { const size = this.getThumbnailSize(); return Utils.concatUrls(Config.Client.urlBase, - '/api/gallery/content/', - this.media.directory.path, this.media.directory.name, this.media.name, 'thumbnail', size.toString()); + '/api/gallery/content/', this.getRelativePath(), 'thumbnail', size.toString()); } diff --git a/src/frontend/app/ui/gallery/MediaIcon.ts b/src/frontend/app/ui/gallery/MediaIcon.ts index 83634914..9f1bfc20 100644 --- a/src/frontend/app/ui/gallery/MediaIcon.ts +++ b/src/frontend/app/ui/gallery/MediaIcon.ts @@ -24,19 +24,25 @@ export class MediaIcon { } getRelativePath(): string { - return Utils.concatUrls(this.media.directory.path, this.media.directory.name, this.media.name); + return Utils.concatUrls(this.media.directory.path, + this.media.directory.name, + this.media.name) + // do not escape all urls with encodeURIComponent because that make the URL ugly and not needed + // do not escape before concatUrls as that would make prevent optimizations + .replace(new RegExp('%', 'g'), '%25') // order important + .replace(new RegExp('#', 'g'), '%23') + .replace(new RegExp('\\$', 'g'), '%24'); } getIconPath(): string { return Utils.concatUrls(Config.Client.urlBase, '/api/gallery/content/', - this.media.directory.path, this.media.directory.name, this.media.name, 'icon'); + this.getRelativePath(), 'icon'); } getMediaPath(): string { return Utils.concatUrls(Config.Client.urlBase, - '/api/gallery/content/', - this.media.directory.path, this.media.directory.name, this.media.name); + '/api/gallery/content/', this.getRelativePath()); } getBestFitMediaPath(): string {