diff --git a/app/src/Server.js b/app/src/Server.js
index c17a61fa..f63ce47c 100644
--- a/app/src/Server.js
+++ b/app/src/Server.js
@@ -7,7 +7,7 @@
██ ██ ██ ██ ██ ██ ██ ██ ██
███████ ███████ ██ ██ ████ ███████ ██ ██
-dependencies: {
+prod dependencies: {
@ffmpeg-installer/ffmpeg: https://www.npmjs.com/package/@ffmpeg-installer/ffmpeg
@sentry/node : https://www.npmjs.com/package/@sentry/node
axios : https://www.npmjs.com/package/axios
@@ -16,12 +16,15 @@ dependencies: {
colors : https://www.npmjs.com/package/colors
cors : https://www.npmjs.com/package/cors
crypto-js : https://www.npmjs.com/package/crypto-js
+ dompurify : https://www.npmjs.com/package/dompurify
express : https://www.npmjs.com/package/express
express-openid-connect : https://www.npmjs.com/package/express-openid-connect
fluent-ffmpeg : https://www.npmjs.com/package/fluent-ffmpeg
+ he : https://www.npmjs.com/package/he
httpolyglot : https://www.npmjs.com/package/httpolyglot
- jsonwebtoken : https://www.npmjs.com/package/jsonwebtoken
js-yaml : https://www.npmjs.com/package/js-yaml
+ jsdom : https://www.npmjs.com/package/jsdom
+ jsonwebtoken : https://www.npmjs.com/package/jsonwebtoken
mediasoup : https://www.npmjs.com/package/mediasoup
mediasoup-client : https://www.npmjs.com/package/mediasoup-client
ngrok : https://www.npmjs.com/package/ngrok
@@ -30,7 +33,16 @@ dependencies: {
socket.io : https://www.npmjs.com/package/socket.io
swagger-ui-express : https://www.npmjs.com/package/swagger-ui-express
uuid : https://www.npmjs.com/package/uuid
- xss : https://www.npmjs.com/package/xss
+}
+
+dev dependencies: {
+ mocha : https://www.npmjs.com/package/mocha
+ node-fetch : https://www.npmjs.com/package/node-fetch
+ nodemon : https://www.npmjs.com/package/nodemon
+ prettier : https://www.npmjs.com/package/prettier
+ proxyquire : https://www.npmjs.com/package/proxyquire
+ should : https://www.npmjs.com/package/should
+ sinon : https://www.npmjs.com/package/sinon
}
*/
@@ -43,7 +55,7 @@ dependencies: {
* @license For commercial or closed source, contact us at license.mirotalk@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
- * @version 1.5.60
+ * @version 1.5.61
*
*/
diff --git a/app/src/Validator.js b/app/src/Validator.js
index 8e78f851..b114d18f 100644
--- a/app/src/Validator.js
+++ b/app/src/Validator.js
@@ -1,10 +1,13 @@
'use strict';
+const checkXSS = require('./XSS.js');
+
function isValidRoomName(input) {
if (typeof input !== 'string') {
return false;
}
- return !hasPathTraversal(input);
+ const room = checkXSS(input);
+ return !room ? false : !hasPathTraversal(room);
}
function isValidRecFileNameFormat(input) {
diff --git a/app/src/XSS.js b/app/src/XSS.js
index 6d62d7bf..c734d32b 100644
--- a/app/src/XSS.js
+++ b/app/src/XSS.js
@@ -66,11 +66,16 @@ const checkXSS = (dataObject) => {
}
};
+function needsDecoding(str) {
+ const urlEncodedPattern = /%[0-9A-Fa-f]{2}/g;
+ return urlEncodedPattern.test(str);
+}
+
// Recursively sanitize data based on its type
function sanitizeData(data) {
if (typeof data === 'string') {
// Decode HTML entities and URL encoded content
- const decodedData = he.decode(decodeURIComponent(data));
+ const decodedData = needsDecoding(data) ? he.decode(decodeURIComponent(data)) : he.decode(data);
return purify.sanitize(decodedData);
}
diff --git a/package.json b/package.json
index 4a8e6f90..61196e1b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "mirotalksfu",
- "version": "1.5.60",
+ "version": "1.5.61",
"description": "WebRTC SFU browser-based video calls",
"main": "Server.js",
"scripts": {
@@ -28,7 +28,7 @@
"nms-stop": "docker-compose -f rtmpServers/node-media-server/docker-compose.yml down",
"nms-restart": "docker-compose -f rtmpServers/node-media-server/docker-compose.yml down && docker-compose -f rtmpServers/node-media-server/docker-compose.yml up -d",
"nms-logs": "docker logs -f mirotalk-nms",
- "unit-test": "npx mocha tests/checkXSS.js"
+ "unit-tests": "npx mocha tests"
},
"repository": {
"type": "git",
@@ -89,6 +89,8 @@
"node-fetch": "^3.3.2",
"nodemon": "^3.1.4",
"prettier": "3.3.3",
- "should": "^13.2.3"
+ "proxyquire": "^2.1.3",
+ "should": "^13.2.3",
+ "sinon": "^18.0.0"
}
}
diff --git a/public/js/Room.js b/public/js/Room.js
index 486edd4f..35a1d05d 100644
--- a/public/js/Room.js
+++ b/public/js/Room.js
@@ -11,7 +11,7 @@ if (location.href.substr(0, 5) !== 'https') location.href = 'https' + location.h
* @license For commercial or closed source, contact us at license.mirotalk@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
- * @version 1.5.60
+ * @version 1.5.61
*
*/
@@ -4444,7 +4444,7 @@ function showAbout() {
imageUrl: image.about,
customClass: { image: 'img-about' },
position: 'center',
- title: 'WebRTC SFU v1.5.60',
+ title: 'WebRTC SFU v1.5.61',
html: `