[mirotalksfu] - Fix Room Password & Lobby

هذا الالتزام موجود في:
Miroslav Pejic
2025-04-09 12:59:10 +02:00
الأصل f69b201ecc
التزام 8e7dd48879
7 ملفات معدلة مع 121 إضافات و42 حذوفات

عرض الملف

@@ -108,13 +108,14 @@
<br/>
- You can `directly join a room` by using link like:
- https://sfu.mirotalk.com/join?room=test&roomPassword=0&name=mirotalksfu&audio=0&video=0&screen=0&notify=0&duration=unlimited
- https://sfu.mirotalk.com/join?room=test&roomPassword=0&name=mirotalksfu&avatar=0&audio=0&video=0&screen=0&notify=0&duration=unlimited
| Params | Type | Description |
| ------------ | -------------- | ------------------------- |
| room | string | Room Id |
| roomPassword | string/boolean | Room password |
| name | string | User name |
| avatar | string/boolean | User avatar |
| audio | boolean | Audio stream |
| video | boolean | Video stream |
| screen | boolean | Screen stream |

عرض الملف

@@ -603,6 +603,7 @@ module.exports = class Room {
iceState: iceState,
});
this.removePeer(socket_id);
transport.close();
}
});
@@ -622,6 +623,7 @@ module.exports = class Room {
dtlsState: dtlsState,
});
this.removePeer(socket_id);
transport.close();
}
});

عرض الملف

@@ -64,7 +64,7 @@ dev 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.8.13
* @version 1.8.14
*
*/

عرض الملف

@@ -1,6 +1,6 @@
{
"name": "mirotalksfu",
"version": "1.8.13",
"version": "1.8.14",
"description": "WebRTC SFU browser-based video calls",
"main": "Server.js",
"scripts": {
@@ -59,7 +59,7 @@
"dependencies": {
"@mattermost/client": "10.6.0",
"@ngrok/ngrok": "1.4.1",
"@sentry/node": "^9.11.0",
"@sentry/node": "^9.12.0",
"axios": "^1.8.4",
"chokidar": "^4.0.3",
"colors": "1.4.0",
@@ -81,7 +81,7 @@
"mediasoup": "3.15.7",
"mediasoup-client": "3.9.5",
"nodemailer": "^6.10.0",
"openai": "^4.92.1",
"openai": "^4.93.0",
"qs": "6.14.0",
"sanitize-filename": "^1.6.3",
"socket.io": "4.8.1",
@@ -99,7 +99,7 @@
"proxyquire": "^2.1.3",
"should": "^13.2.3",
"sinon": "^20.0.0",
"webpack": "^5.99.1",
"webpack": "^5.99.5",
"webpack-cli": "^6.0.1"
}
}

عرض الملف

@@ -64,7 +64,7 @@ let BRAND = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
title: '<strong>WebRTC SFU v1.8.13</strong>',
title: '<strong>WebRTC SFU v1.8.14</strong>',
html: `
<button
id="support-button"

عرض الملف

@@ -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.8.13
* @version 1.8.14
*
*/
@@ -5351,7 +5351,7 @@ function showAbout() {
position: 'center',
imageUrl: BRAND.about?.imageUrl && BRAND.about.imageUrl.trim() !== '' ? BRAND.about.imageUrl : image.about,
customClass: { image: 'img-about' },
title: BRAND.about?.title && BRAND.about.title.trim() !== '' ? BRAND.about.title : 'WebRTC SFU v1.8.13',
title: BRAND.about?.title && BRAND.about.title.trim() !== '' ? BRAND.about.title : 'WebRTC SFU v1.8.14',
html: `
<br />
<div id="about">

عرض الملف

@@ -9,7 +9,7 @@
* @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.8.13
* @version 1.8.14
*
*/
@@ -339,7 +339,14 @@ class RoomClient {
this.localAudioStream = null;
this.localScreenStream = null;
// Room Password
this.RoomIsLocked = false;
this.RoomPassword = false;
this.RoomPasswordValid = false;
// Room Lobby
this.RoomIsLobby = false;
this.RoomLobbyAccepted = false;
this.transcription = transcription;
@@ -455,50 +462,53 @@ class RoomClient {
.request('join', data)
.then(async (room) => {
console.log('##### JOIN ROOM #####', room);
if (room === 'invalid') {
console.log('00-WARNING ----> Invalid Room name! Path traversal pattern detected!');
console.warn('00-WARNING ----> Invalid Room name! Path traversal pattern detected!');
return this.roomInvalid();
}
if (room === 'notAllowed') {
console.log(
console.warn(
'00-WARNING ----> Room is Unauthorized for current user, please provide a valid room name for this user',
);
return this.userRoomNotAllowed();
}
if (room === 'unauthorized') {
console.log(
console.warn(
'00-WARNING ----> Room is Unauthorized for current user, please provide a valid username and password',
);
return this.userUnauthorized();
}
if (room === 'isLocked') {
this.RoomIsLocked = true;
this.event(_EVENTS.roomLock);
console.log('00-WARNING ----> Room is Locked, Try to unlock by the password');
console.warn('00-WARNING ----> Room is Locked, Try to unlock by the password');
return this.unlockTheRoom();
}
if (room === 'isLobby') {
this.RoomIsLobby = true;
this.event(_EVENTS.lobbyOn);
console.log('00-WARNING ----> Room Lobby Enabled, Wait to confirm my join');
console.warn('00-WARNING ----> Room Lobby Enabled, Wait to confirm my join');
return this.waitJoinConfirm();
}
if (room === 'isBanned') {
console.log('00-WARNING ----> You are Banned from the Room!');
console.warn('00-WARNING ----> You are Banned from the Room!');
return this.isBanned();
}
// ##########################################
this.peers = new Map(JSON.parse(room.peers));
// ##########################################
if (!peer_info.peer_token) {
// hack...
for (let peer of Array.from(this.peers.keys()).filter((id) => id !== this.peer_id)) {
let peer_info = this.peers.get(peer).peer_info;
if (peer_info.peer_name == this.peer_name) {
console.log('00-WARNING ----> Username already in use');
return this.userNameAlreadyInRoom();
}
}
if (this.usernameExists(this.peers)) {
return this.userNameAlreadyInRoom();
}
await this.joinAllowed(room);
})
.catch((error) => {
@@ -508,19 +518,31 @@ class RoomClient {
});
}
usernameExists(peers) {
if (!peer_info.peer_token) {
// hack...
for (let peer of Array.from(peers.keys()).filter((id) => id !== this.peer_id)) {
let peer_info = peers.get(peer).peer_info;
if (peer_info.peer_name == this.peer_name) {
console.log('07.0-WARNING ----> Username already in use');
return true;
}
}
}
return false;
}
async joinAllowed(room) {
console.log('07 ----> Join Room allowed');
await this.handleRoomInfo(room);
const routerRtpCapabilities = await this.socket.request('getRouterRtpCapabilities');
routerRtpCapabilities.headerExtensions = routerRtpCapabilities.headerExtensions.filter(
(ext) => ext.uri !== 'urn:3gpp:video-orientation',
);
this.device = await this.loadDevice(routerRtpCapabilities);
console.log('07.3 ----> Get Router Rtp Capabilities codecs: ', this.device.rtpCapabilities.codecs);
await this.initTransports(this.device);
// ###################################
this.socket.emit('getProducers');
// ###################################
await this.loadDeviceAndInitTransports();
// ###############################################
this.socket.emit('getProducers'); // newProducers
// ###############################################
if (isBroadcastingEnabled) {
isPresenter ? await this.startLocalMedia() : this.handleRoomBroadcasting();
} else {
@@ -528,12 +550,34 @@ class RoomClient {
}
}
async loadDeviceAndInitTransports() {
// Get Router Capabilities
const routerRtpCapabilities = await this.socket.request('getRouterRtpCapabilities');
routerRtpCapabilities.headerExtensions = routerRtpCapabilities.headerExtensions.filter(
(ext) => ext.uri !== 'urn:3gpp:video-orientation',
);
// Load device
this.device = await this.loadDevice(routerRtpCapabilities);
console.log('07.3 ----> Get Router Rtp Capabilities codecs: ', this.device.rtpCapabilities.codecs);
// Init Send/Receive Transports
await this.initTransports(this.device);
}
async handleRoomInfo(room) {
// ##########################################
this.peers = new Map(JSON.parse(room.peers));
// ##########################################
console.log('07.0 ----> Room Survey', room.survey);
survey = room.survey;
console.log('07.0 ----> Room Leave Redirect', room.redirect);
redirect = room.redirect;
participantsCount = this.peers.size;
// ME
for (let peer of Array.from(this.peers.keys()).filter((id) => id == this.peer_id)) {
let my_peer_info = this.peers.get(peer).peer_info;
@@ -1075,7 +1119,28 @@ class RoomClient {
handleNewProducers = async (data) => {
if (data.length > 0) {
console.log('SocketOn New producers', data);
console.log('SocketOn New producers', {
data,
password: {
roomIsLocked: this.RoomIsLocked,
roomPasswordValid: this.RoomPasswordValid,
},
lobby: {
roomIsLobby: this.RoomIsLobby,
roomLobbyAccepted: this.RoomLobbyAccepted,
}
});
if (this.RoomIsLocked && !this.RoomPasswordValid) {
console.log('Access denied: Room is locked and password has not been validated yet', data);
return;
}
if (this.RoomIsLobby && !this.RoomLobbyAccepted) {
console.log('Access pending: Lobby mode is active, waiting for approval to join', data);
return;
}
for (let { producer_id, peer_name, peer_info, type } of data) {
await this.consume(producer_id, peer_name, peer_info, type);
}
@@ -2735,6 +2800,15 @@ class RoomClient {
}
async getConsumeStream(producerId, peer_id, type) {
if (!this.device) {
throw new Error('Device not initialized');
}
// Check if consumer transport exists
if (!this.consumerTransport) {
throw new Error('Consumer transport not initialized');
}
const { rtpCapabilities } = this.device;
const data = await this.socket.request('consume', {
@@ -7303,13 +7377,14 @@ class RoomClient {
}
}
roomPassword(data) {
async roomPassword(data) {
switch (data.password) {
case 'OK':
this.joinAllowed(data.room);
handleRules(isPresenter);
this.RoomPasswordValid = true;
await this.joinAllowed(data.room);
break;
case 'KO':
this.RoomPasswordValid = false;
this.roomIsLocked();
break;
default:
@@ -7335,7 +7410,7 @@ class RoomClient {
peer_avatar && this.isImageURL(peer_avatar)
? peer_avatar
: this.isValidEmail(peer_name)
? this.genGravatar(peer_name)
? this.genGravatar(peer_name, 32)
: this.genAvatarSvg(peer_name, 32);
let lobbyTb = this.getId('lobbyTb');
@@ -7365,13 +7440,14 @@ class RoomClient {
}
break;
case 'accept':
this.RoomLobbyAccepted = true;
await this.joinAllowed(data.room);
handleRules(isPresenter);
control.style.display = 'flex';
bottomButtons.style.display = 'flex';
this.msgPopup('info', 'Your join meeting request was accepted by the moderator');
this.msgPopup('info', 'Your join meeting request was accepted by the moderator', 3000, 'top');
break;
case 'reject':
this.RoomLobbyAccepted = false;
this.sound('eject');
Swal.fire({
icon: 'warning',