75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
import { container } from '../config/dependency-injector.config.js';
|
|
import { Request, Response, NextFunction } from 'express';
|
|
import { OpenViduMeetPermissions, OpenViduMeetRoom } from '@typings-ce';
|
|
import { LoggerService } from '../services/logger.service.js';
|
|
import { RoomService } from '../services/room.service.js';
|
|
import { RecordingHelper } from '../helpers/recording.helper.js';
|
|
|
|
export const withRecordingEnabled = async (req: Request, res: Response, next: NextFunction) => {
|
|
const logger = container.get(LoggerService);
|
|
const roomIdParam = req.body.roomId;
|
|
let roomId: string;
|
|
|
|
// Extract roomId from body or from recordingId
|
|
if (roomIdParam) {
|
|
roomId = roomIdParam as string;
|
|
} else {
|
|
const recordingId = req.params.recordingId as string;
|
|
({ roomId } = RecordingHelper.extractInfoFromRecordingId(recordingId));
|
|
}
|
|
|
|
let room: OpenViduMeetRoom;
|
|
|
|
try {
|
|
const roomService = container.get(RoomService);
|
|
room = await roomService.getOpenViduRoom(roomId);
|
|
} catch (error) {
|
|
logger.error('Error checking recording preferences:' + error);
|
|
return res.status(403).json({ message: 'Recording is disabled in this room' });
|
|
}
|
|
|
|
if (!room.preferences) {
|
|
logger.error('No room preferences found checking recording preferences. Refusing access');
|
|
return res.status(403).json({ message: 'Recording is disabled in this room' });
|
|
}
|
|
|
|
const { recordingPreferences } = room.preferences;
|
|
const { enabled: recordingEnabled } = recordingPreferences;
|
|
|
|
if (!recordingEnabled) {
|
|
return res.status(403).json({ message: 'Recording is disabled in this room' });
|
|
}
|
|
|
|
return next();
|
|
};
|
|
|
|
export const withCorrectPermissions = async (req: Request, res: Response, next: NextFunction) => {
|
|
const roomIdParam = req.body.roomId;
|
|
let roomId: string;
|
|
|
|
// Extract roomId from body or from recordingId
|
|
if (roomIdParam) {
|
|
roomId = roomIdParam as string;
|
|
} else {
|
|
const recordingId = req.params.recordingId as string;
|
|
({ roomId } = RecordingHelper.extractInfoFromRecordingId(recordingId));
|
|
}
|
|
|
|
const payload = req.session?.tokenClaims;
|
|
|
|
if (!payload) {
|
|
return res.status(403).json({ message: 'Insufficient permissions to access this resource' });
|
|
}
|
|
|
|
const sameRoom = payload.video?.room === roomId;
|
|
const metadata = JSON.parse(payload.metadata || '{}');
|
|
const permissions = metadata.permissions as OpenViduMeetPermissions | undefined;
|
|
const canRecord = permissions?.canRecord === true;
|
|
|
|
if (!sameRoom || !canRecord) {
|
|
return res.status(403).json({ message: 'Insufficient permissions to access this resource' });
|
|
}
|
|
|
|
return next();
|
|
};
|