frontend: add recording access guard and update HttpService for recording retrieval
This commit is contained in:
parent
d2371120d8
commit
a5f283401a
@ -98,3 +98,42 @@ export const checkParticipantRoleAndAuthGuard: CanActivateFn = async (
|
|||||||
// Allow access to the room
|
// Allow access to the room
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const checkRecordingAuthGuard: CanActivateFn = async (
|
||||||
|
route: ActivatedRouteSnapshot,
|
||||||
|
state: RouterStateSnapshot
|
||||||
|
) => {
|
||||||
|
const httpService = inject(HttpService);
|
||||||
|
const navigationService = inject(NavigationService);
|
||||||
|
|
||||||
|
const recordingId = route.params['recording-id'];
|
||||||
|
const secret = route.queryParams['secret'];
|
||||||
|
|
||||||
|
if (!secret) {
|
||||||
|
// If no secret is provided, redirect to the error page
|
||||||
|
return navigationService.createRedirectionToErrorPage(ErrorReason.MISSING_RECORDING_SECRET);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Attempt to access the recording to check if the secret is valid
|
||||||
|
await httpService.getRecording(recordingId, secret);
|
||||||
|
return true;
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('Error checking recording access:', error);
|
||||||
|
switch (error.status) {
|
||||||
|
case 400:
|
||||||
|
// Invalid secret
|
||||||
|
return navigationService.createRedirectionToErrorPage(ErrorReason.INVALID_RECORDING_SECRET);
|
||||||
|
case 401:
|
||||||
|
// Unauthorized access
|
||||||
|
// Redirect to the login page with query param to redirect back to the recording
|
||||||
|
return navigationService.createRedirectionToLoginPage(state.url);
|
||||||
|
case 404:
|
||||||
|
// Recording not found
|
||||||
|
return navigationService.createRedirectionToErrorPage(ErrorReason.INVALID_RECORDING);
|
||||||
|
default:
|
||||||
|
// Internal error
|
||||||
|
return navigationService.createRedirectionToErrorPage(ErrorReason.INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { Routes } from '@angular/router';
|
|||||||
import {
|
import {
|
||||||
applicationModeGuard,
|
applicationModeGuard,
|
||||||
checkParticipantRoleAndAuthGuard,
|
checkParticipantRoleAndAuthGuard,
|
||||||
|
checkRecordingAuthGuard,
|
||||||
checkUserAuthenticatedGuard,
|
checkUserAuthenticatedGuard,
|
||||||
checkUserNotAuthenticatedGuard,
|
checkUserNotAuthenticatedGuard,
|
||||||
extractRecordingQueryParamsGuard,
|
extractRecordingQueryParamsGuard,
|
||||||
@ -20,7 +21,8 @@ import {
|
|||||||
RoomFormComponent,
|
RoomFormComponent,
|
||||||
RoomRecordingsComponent,
|
RoomRecordingsComponent,
|
||||||
RoomsComponent,
|
RoomsComponent,
|
||||||
VideoRoomComponent
|
VideoRoomComponent,
|
||||||
|
ViewRecordingComponent
|
||||||
} from '../pages';
|
} from '../pages';
|
||||||
|
|
||||||
export const baseRoutes: Routes = [
|
export const baseRoutes: Routes = [
|
||||||
@ -95,6 +97,11 @@ export const baseRoutes: Routes = [
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'recording/:recording-id',
|
||||||
|
component: ViewRecordingComponent,
|
||||||
|
canActivate: [runGuardsSerially(applicationModeGuard, checkRecordingAuthGuard)]
|
||||||
|
},
|
||||||
{ path: 'disconnected', component: DisconnectedComponent },
|
{ path: 'disconnected', component: DisconnectedComponent },
|
||||||
{ path: 'error', component: ErrorComponent },
|
{ path: 'error', component: ErrorComponent },
|
||||||
|
|
||||||
|
|||||||
@ -110,10 +110,6 @@ export class HttpService {
|
|||||||
return this.postRequest(`${this.INTERNAL_API_PATH_PREFIX}/rooms/${roomId}/recording-token`, { secret });
|
return this.postRequest(`${this.INTERNAL_API_PATH_PREFIX}/rooms/${roomId}/recording-token`, { secret });
|
||||||
}
|
}
|
||||||
|
|
||||||
getRecordingMediaUrl(recordingId: string): string {
|
|
||||||
return `${this.API_PATH_PREFIX}/recordings/${recordingId}/media`;
|
|
||||||
}
|
|
||||||
|
|
||||||
getRecordings(filters?: MeetRecordingFilters): Promise<{
|
getRecordings(filters?: MeetRecordingFilters): Promise<{
|
||||||
recordings: MeetRecordingInfo[];
|
recordings: MeetRecordingInfo[];
|
||||||
pagination: {
|
pagination: {
|
||||||
@ -145,6 +141,18 @@ export class HttpService {
|
|||||||
return this.getRequest(path);
|
return this.getRequest(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getRecording(recordingId: string, secret?: string): Promise<MeetRecordingInfo> {
|
||||||
|
let path = `${this.API_PATH_PREFIX}/recordings/${recordingId}`;
|
||||||
|
if (secret) {
|
||||||
|
path += `?secret=${secret}`;
|
||||||
|
}
|
||||||
|
return this.getRequest<MeetRecordingInfo>(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
getRecordingMediaUrl(recordingId: string): string {
|
||||||
|
return `${this.API_PATH_PREFIX}/recordings/${recordingId}/media`;
|
||||||
|
}
|
||||||
|
|
||||||
startRecording(roomId: string): Promise<MeetRecordingInfo> {
|
startRecording(roomId: string): Promise<MeetRecordingInfo> {
|
||||||
return this.postRequest(`${this.INTERNAL_API_PATH_PREFIX}/recordings`, { roomId });
|
return this.postRequest(`${this.INTERNAL_API_PATH_PREFIX}/recordings`, { roomId });
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user