diff --git a/ExpressAPI/src/express/API.ts b/ExpressAPI/src/express/API.ts index d9040027335181ab03ad25d9cf4bb42cfc5ed49e..55d2fe4765ecb0810e206d456715a1da4895adae 100644 --- a/ExpressAPI/src/express/API.ts +++ b/ExpressAPI/src/express/API.ts @@ -1,18 +1,19 @@ -import { Express } from 'express-serve-static-core'; -import cors from 'cors'; -import morganMiddleware from '../logging/MorganMiddleware'; -import { AddressInfo } from 'net'; -import http from 'http'; -import helmet from 'helmet'; -import express from 'express'; -import WorkerTask from '../process/WorkerTask'; -import multer from 'multer'; -import SessionMiddleware from '../middlewares/SessionMiddleware'; -import Config from '../config/Config'; -import logger from '../shared/logging/WinstonLogger'; -import ParamsCallbackManager from '../middlewares/ParamsCallbackManager'; -import ApiRoutesManager from '../routes/ApiRoutesManager'; -import compression from 'compression'; +import { Express } from 'express-serve-static-core'; +import cors from 'cors'; +import morganMiddleware from '../logging/MorganMiddleware'; +import { AddressInfo } from 'net'; +import http from 'http'; +import helmet from 'helmet'; +import express from 'express'; +import WorkerTask from '../process/WorkerTask'; +import multer from 'multer'; +import SessionMiddleware from '../middlewares/SessionMiddleware'; +import Config from '../config/Config'; +import logger from '../shared/logging/WinstonLogger'; +import ParamsCallbackManager from '../middlewares/ParamsCallbackManager'; +import ApiRoutesManager from '../routes/ApiRoutesManager'; +import compression from 'compression'; +import ClientVersionMiddleware from '../middlewares/ClientVersionMiddleware'; class API implements WorkerTask { @@ -30,6 +31,8 @@ class API implements WorkerTask { this.backend.use(cors()); //Allow CORS requests this.backend.use(compression()); //Compress responses + this.backend.use(ClientVersionMiddleware.register()); + ParamsCallbackManager.register(this.backend); this.backend.use(SessionMiddleware.register()); diff --git a/ExpressAPI/src/middlewares/ClientVersionMiddleware.ts b/ExpressAPI/src/middlewares/ClientVersionMiddleware.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4bed40e30357b8fb035c66e3012f582950c817d --- /dev/null +++ b/ExpressAPI/src/middlewares/ClientVersionMiddleware.ts @@ -0,0 +1,35 @@ +import express from 'express'; +import Config from '../config/Config'; +import semver from 'semver/preload'; +import Session from '../controllers/Session'; +import { HttpStatusCode } from 'axios'; +import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode'; + + +class ClientVersionMiddleware { + register(): (req: express.Request, res: express.Response, next: express.NextFunction) => void { + return async (req: express.Request, res: express.Response, next: express.NextFunction) => { + if ( req.headers['client'] && req.headers['client-version'] ) { + const requestClient = req.headers['client'] as string; + const requestClientVersion = req.headers['client-version'] as string; + + for ( const [ client, condition ] of Object.entries(Config.requestClientValidation.version) ) { + if ( requestClient === client ) { + if ( semver.satisfies(semver.valid(semver.coerce(requestClientVersion)) || '0', condition) ) { + next(); + return; + } else { + new Session().sendResponse(res, HttpStatusCode.MethodNotAllowed, {}, `Client version ${ requestClientVersion } is not supported. Please update your client.`, DojoStatusCode.CLIENT_VERSION_NOT_SUPPORTED); + return; + } + } + } + + new Session().sendResponse(res, HttpStatusCode.MethodNotAllowed, {}, `Unsupported client.`, DojoStatusCode.CLIENT_NOT_SUPPORTED); + } + }; + } +} + + +export default new ClientVersionMiddleware(); \ No newline at end of file