diff --git a/src/controllers/plugins.controller.ts b/src/controllers/plugins.controller.ts index 1ff7c39cd10807363107b6dcd84d030cc9e457da..1f0e5a089532e86e7a6b4b10e28e49fd09537f0f 100644 --- a/src/controllers/plugins.controller.ts +++ b/src/controllers/plugins.controller.ts @@ -20,6 +20,7 @@ import {PluginsManager} from '../services/plugins_manager.service'; import {type Request, type Response, Router} from 'express'; import fs from 'fs'; import {Service} from 'typedi'; +import {NotFoundException} from '../interfaces/NotFoundException'; import {StatusCodes} from 'http-status-codes'; import {LanguageManager} from '../services/language_manager.service'; @@ -290,13 +291,12 @@ export class PluginsController { req.params.id, req.query.arch as string ); - if (icon === '') { - console.log('sending not found ' + icon); + res.status(StatusCodes.OK).send(icon); + } catch (e) { + if (e instanceof NotFoundException) { res.status(StatusCodes.NOT_FOUND).send(); return; } - res.status(StatusCodes.OK).send(icon); - } catch (e) { res.status(StatusCodes.INTERNAL_SERVER_ERROR).send(); } }); @@ -394,12 +394,14 @@ export class PluginsController { req.params.id, req.query.arch as string ); - res - .status(background === '' ? StatusCodes.NOT_FOUND : StatusCodes.OK) - .send(background === '' ? undefined : background); + res.status(StatusCodes.OK).send(background); return; } catch (e) { - res.status(StatusCodes.INTERNAL_SERVER_ERROR).send(); + if (e instanceof NotFoundException) { + res.status(StatusCodes.NOT_FOUND).send(); + return; + } + res.status(StatusCodes.NOT_FOUND).send(); } }); } diff --git a/src/interfaces/NotFoundException.ts b/src/interfaces/NotFoundException.ts new file mode 100644 index 0000000000000000000000000000000000000000..25b4d903d2db695330f2bc0a28e6d1436edf4b7d --- /dev/null +++ b/src/interfaces/NotFoundException.ts @@ -0,0 +1 @@ +export class NotFoundException extends Error {} diff --git a/src/services/certificate_manager.ts b/src/services/certificate_manager.ts index c18cb13037675bfe4aaaa720420d49ffdd819a3b..5ea63b4c83b87a8f93334566a186c7cb0d22c75a 100644 --- a/src/services/certificate_manager.ts +++ b/src/services/certificate_manager.ts @@ -34,8 +34,8 @@ export class CertificateManagerService { ): Promise<X509Certificate> { return await this.fileManager .readArchive(path, file) - .then((content: string) => { - return new X509Certificate(Buffer.from(content)); + .then((content: Buffer) => { + return new X509Certificate(content); }); } diff --git a/src/services/file_manager.service.ts b/src/services/file_manager.service.ts index 925e0bc605f8113c7d90e37dd9e7fbf69b068cb0..15634921690c5a9c8dcc5288aba60931393889e3 100644 --- a/src/services/file_manager.service.ts +++ b/src/services/file_manager.service.ts @@ -61,16 +61,12 @@ export class FileManagerService { } } - async readArchive(path: string, file: string): Promise<string> { - try { - // eslint-disable-next-line + async readArchive(path: string, file: string): Promise<Buffer> { + // eslint-disable-next-line const zip = new StreamZip.async({ file: path }); - const content = await zip.entryData(file); - zip.close(); - return await Promise.resolve(content.toString()); - } catch (e) { - return await Promise.resolve(''); - } + const content = await zip.entryData(file); + zip.close(); + return content; } async getStat(path: string): Promise<Stats> { diff --git a/src/services/plugins_manager.service.ts b/src/services/plugins_manager.service.ts index 96ff1a59e6e3c2585ac566cf43a4d5621ccdb2fa..e4e1afd097d894ab48b888d5d598ea7c2a0b268b 100644 --- a/src/services/plugins_manager.service.ts +++ b/src/services/plugins_manager.service.ts @@ -20,6 +20,7 @@ import {Service} from 'typedi'; import {FileManagerService} from './file_manager.service'; import {type Plugins} from '../interfaces/plugins'; import {CertificateManagerService} from './certificate_manager'; +import {NotFoundException} from '../interfaces/NotFoundException'; import {basename, extname} from 'path'; @Service() @@ -216,7 +217,7 @@ export class PluginsManager { background: string; }> { const manifest = JSON.parse( - await this.fileManager.readArchive(path, 'manifest.json') + (await this.fileManager.readArchive(path, 'manifest.json')).toString() ); return { id: manifest.id === undefined ? manifest.name : manifest.id, @@ -231,7 +232,7 @@ export class PluginsManager { async getIcon( id: string, arch: string | undefined = undefined - ): Promise<string> { + ): Promise<Buffer> { if (this.plugins.length === 0) { await this.setPlugins(); } @@ -248,7 +249,7 @@ export class PluginsManager { plugin.icon === undefined || platform === undefined ) { - return ''; + throw new NotFoundException('Plugin not found'); } return await this.fileManager.readArchive( @@ -321,7 +322,7 @@ export class PluginsManager { [platformPath] ); // TODO: should refactor this because it's possible that two plugins in different platform have the same id - if ( plugin === undefined) { + if (plugin === undefined) { continue; } plugins.push(plugin); @@ -330,7 +331,7 @@ export class PluginsManager { this.plugins = plugins; } - async getPluginBackground(id: string, arch: string): Promise<string> { + async getPluginBackground(id: string, arch: string): Promise<Buffer> { if (this.plugins.length === 0) { await this.setPlugins(); } @@ -345,30 +346,23 @@ export class PluginsManager { plugin.background === undefined || platform === undefined ) { - return ''; + throw new NotFoundException('Plugin not found'); } - return await this.fileManager - .readArchive( - // eslint-disable-next-line + return await this.fileManager.readArchive( + // eslint-disable-next-line __dirname + - '/../..' + - process.env.DATA_DIRECTORY + - '/' + - plugin.id + - '/' + - platform + - '/' + - plugin.id + - '.jpl', - 'data/' + plugin.background - ) - .then(data => { - return data; - }) - .catch(e => { - return ''; - }); + '/../..' + + process.env.DATA_DIRECTORY + + '/' + + plugin.id + + '/' + + platform + + '/' + + plugin.id + + '.jpl', + 'data/' + plugin.background + ); } private addPluginArch(platforms: string[], arches: string[]): void { @@ -411,12 +405,13 @@ export class PluginsManager { } return await this.fileManager .readArchive(pluginPath, 'data/locale/' + languageFile) - .then((languageFileContent: string) => { - if (languageFileContent === '') { + .then((languageFileContent: Buffer) => { + if (languageFileContent.length === 0) { return text; } - const languageFileContentParsed = JSON.parse(languageFileContent); - + const languageFileContentParsed = JSON.parse( + languageFileContent.toString() + ); return text.replace( /(\{\{([^}]+)\}\})/g, (_: string, p1: string) => { diff --git a/tests/certificate.manager.test.ts b/tests/certificate.manager.test.ts index 86ff1bbad132cdb8489c9420c884e804feac26a9..eda62e0865e3c02fac96a0f753711bde816807cb 100644 --- a/tests/certificate.manager.test.ts +++ b/tests/certificate.manager.test.ts @@ -56,7 +56,7 @@ describe('Certificate manager service tests', function () { const expectedCertificate = await promises.readFile(`${__dirname}/TestCertificate.crt`); const expectedSubject = 'CN=Test'; - fileManager.readArchive.resolves(expectedCertificate.toString()); + fileManager.readArchive.resolves(expectedCertificate); const actual = await certificateManagerService['readCertificate'](path, file); diff --git a/tests/plugins.controller.test.ts b/tests/plugins.controller.test.ts index 00a637b1e50723349cfdc32db3a31cef7b95f13e..1e20ad003a4674a4151de70a6d24d9b6f8266243 100644 --- a/tests/plugins.controller.test.ts +++ b/tests/plugins.controller.test.ts @@ -177,13 +177,13 @@ describe('Routes', function () { it("should get icon if the given id is valid", (done) => { const expectedIcon = 'test'; - pluginsManagerServiceStub.getIcon.resolves(expectedIcon); + pluginsManagerServiceStub.getIcon.resolves(Buffer.from(expectedIcon)); request(expressApp) .get("/icons/test?arch=test") .expect(StatusCodes.OK) .then((response) => { - expect(response.text).toEqual(expectedIcon); + expect(response.body).toEqual(Buffer.from(expectedIcon)); done(); }); }); diff --git a/tests/plugins.manager.test.ts b/tests/plugins.manager.test.ts index 7732666df9de1ffb7b6e1fd54ccd78ce0eae73ae..8d2f54f353e90dcfeb0c3ecc3910b697166c0d8e 100644 --- a/tests/plugins.manager.test.ts +++ b/tests/plugins.manager.test.ts @@ -244,7 +244,7 @@ describe('Plugins manager service tests', function () { version: '1.0.0', }; - fileManager.readArchive.resolves(JSON.stringify(manifest)); + fileManager.readArchive.resolves(Buffer.from(JSON.stringify(manifest))); const actual = await pluginsManagerService['readManifest'](pluginPath); @@ -280,12 +280,12 @@ describe('Plugins manager service tests', function () { const expected = 'test'; - fileManager.readArchive.resolves(JSON.stringify(manifest)); - fileManager.readArchive.resolves(expected); + fileManager.readArchive.resolves(Buffer.from(JSON.stringify(manifest))); + fileManager.readArchive.resolves(Buffer.from(expected)); stub(Object.getPrototypeOf(pluginsManagerService), 'getPlatform').returns(['test']); const actual = await pluginsManagerService['getIcon']("test", "test"); - expect(actual).toEqual(expected); + expect(actual).toEqual(Buffer.from(expected)); }); it('should return an array of plugin versions', async () => {