From 5a122dddc5aab1b2ae1843411032d5f392bdd216 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 26 Oct 2022 16:23:39 +0200 Subject: Option to disable static files auth check/s3 proxy --- .../object-storage/video-static-file-privacy.ts | 166 ++++++++++++++------- .../tests/api/videos/video-static-file-privacy.ts | 33 ++++ 2 files changed, 148 insertions(+), 51 deletions(-) (limited to 'server/tests/api') diff --git a/server/tests/api/object-storage/video-static-file-privacy.ts b/server/tests/api/object-storage/video-static-file-privacy.ts index c6d7a1a2c..ed8855b3b 100644 --- a/server/tests/api/object-storage/video-static-file-privacy.ts +++ b/server/tests/api/object-storage/video-static-file-privacy.ts @@ -19,6 +19,12 @@ import { waitJobs } from '@shared/server-commands' +function extractFilenameFromUrl (url: string) { + const parts = basename(url).split(':') + + return parts[parts.length - 1] +} + describe('Object storage for video static file privacy', function () { // We need real world object storage to check ACL if (areScalewayObjectStorageTestsDisabled()) return @@ -26,75 +32,81 @@ describe('Object storage for video static file privacy', function () { let server: PeerTubeServer let userToken: string - before(async function () { - this.timeout(120000) + // --------------------------------------------------------------------------- - server = await createSingleServer(1, ObjectStorageCommand.getDefaultScalewayConfig(1)) - await setAccessTokensToServers([ server ]) - await setDefaultVideoChannel([ server ]) + async function checkPrivateVODFiles (uuid: string) { + const video = await server.videos.getWithToken({ id: uuid }) - await server.config.enableMinimumTranscoding() + for (const file of video.files) { + expectStartWith(file.fileUrl, server.url + '/object-storage-proxy/webseed/private/') - userToken = await server.users.generateUserAndToken('user1') - }) + await makeRawRequest({ url: file.fileUrl, token: server.accessToken, expectedStatus: HttpStatusCode.OK_200 }) + } - describe('VOD', function () { - let privateVideoUUID: string - let publicVideoUUID: string - let userPrivateVideoUUID: string + for (const file of getAllFiles(video)) { + const internalFileUrl = await server.sql.getInternalFileUrl(file.id) + expectStartWith(internalFileUrl, ObjectStorageCommand.getScalewayBaseUrl()) + await makeRawRequest({ url: internalFileUrl, token: server.accessToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 }) + } + + const hls = getHLS(video) + + if (hls) { + for (const url of [ hls.playlistUrl, hls.segmentsSha256Url ]) { + expectStartWith(url, server.url + '/object-storage-proxy/streaming-playlists/hls/private/') + } - async function checkPrivateFiles (uuid: string) { - const video = await server.videos.getWithToken({ id: uuid }) + await makeRawRequest({ url: hls.playlistUrl, token: server.accessToken, expectedStatus: HttpStatusCode.OK_200 }) + await makeRawRequest({ url: hls.segmentsSha256Url, token: server.accessToken, expectedStatus: HttpStatusCode.OK_200 }) - for (const file of video.files) { - expectStartWith(file.fileUrl, server.url + '/object-storage-proxy/webseed/private/') + for (const file of hls.files) { + expectStartWith(file.fileUrl, server.url + '/object-storage-proxy/streaming-playlists/hls/private/') await makeRawRequest({ url: file.fileUrl, token: server.accessToken, expectedStatus: HttpStatusCode.OK_200 }) } + } + } - for (const file of getAllFiles(video)) { - const internalFileUrl = await server.sql.getInternalFileUrl(file.id) - expectStartWith(internalFileUrl, ObjectStorageCommand.getScalewayBaseUrl()) - await makeRawRequest({ url: internalFileUrl, token: server.accessToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 }) - } + async function checkPublicVODFiles (uuid: string) { + const video = await server.videos.getWithToken({ id: uuid }) - const hls = getHLS(video) + for (const file of getAllFiles(video)) { + expectStartWith(file.fileUrl, ObjectStorageCommand.getScalewayBaseUrl()) - if (hls) { - for (const url of [ hls.playlistUrl, hls.segmentsSha256Url ]) { - expectStartWith(url, server.url + '/object-storage-proxy/streaming-playlists/hls/private/') - } + await makeRawRequest({ url: file.fileUrl, expectedStatus: HttpStatusCode.OK_200 }) + } - await makeRawRequest({ url: hls.playlistUrl, token: server.accessToken, expectedStatus: HttpStatusCode.OK_200 }) - await makeRawRequest({ url: hls.segmentsSha256Url, token: server.accessToken, expectedStatus: HttpStatusCode.OK_200 }) + const hls = getHLS(video) - for (const file of hls.files) { - expectStartWith(file.fileUrl, server.url + '/object-storage-proxy/streaming-playlists/hls/private/') + if (hls) { + expectStartWith(hls.playlistUrl, ObjectStorageCommand.getScalewayBaseUrl()) + expectStartWith(hls.segmentsSha256Url, ObjectStorageCommand.getScalewayBaseUrl()) - await makeRawRequest({ url: file.fileUrl, token: server.accessToken, expectedStatus: HttpStatusCode.OK_200 }) - } - } + await makeRawRequest({ url: hls.playlistUrl, expectedStatus: HttpStatusCode.OK_200 }) + await makeRawRequest({ url: hls.segmentsSha256Url, expectedStatus: HttpStatusCode.OK_200 }) } + } - async function checkPublicFiles (uuid: string) { - const video = await server.videos.getWithToken({ id: uuid }) + // --------------------------------------------------------------------------- - for (const file of getAllFiles(video)) { - expectStartWith(file.fileUrl, ObjectStorageCommand.getScalewayBaseUrl()) + before(async function () { + this.timeout(120000) - await makeRawRequest({ url: file.fileUrl, expectedStatus: HttpStatusCode.OK_200 }) - } + server = await createSingleServer(1, ObjectStorageCommand.getDefaultScalewayConfig({ serverNumber: 1 })) + await setAccessTokensToServers([ server ]) + await setDefaultVideoChannel([ server ]) - const hls = getHLS(video) + await server.config.enableMinimumTranscoding() - if (hls) { - expectStartWith(hls.playlistUrl, ObjectStorageCommand.getScalewayBaseUrl()) - expectStartWith(hls.segmentsSha256Url, ObjectStorageCommand.getScalewayBaseUrl()) + userToken = await server.users.generateUserAndToken('user1') + }) - await makeRawRequest({ url: hls.playlistUrl, expectedStatus: HttpStatusCode.OK_200 }) - await makeRawRequest({ url: hls.segmentsSha256Url, expectedStatus: HttpStatusCode.OK_200 }) - } - } + describe('VOD', function () { + let privateVideoUUID: string + let publicVideoUUID: string + let userPrivateVideoUUID: string + + // --------------------------------------------------------------------------- async function getSampleFileUrls (videoId: string) { const video = await server.videos.getWithToken({ id: videoId }) @@ -105,6 +117,8 @@ describe('Object storage for video static file privacy', function () { } } + // --------------------------------------------------------------------------- + it('Should upload a private video and have appropriate object storage ACL', async function () { this.timeout(60000) @@ -120,7 +134,7 @@ describe('Object storage for video static file privacy', function () { await waitJobs([ server ]) - await checkPrivateFiles(privateVideoUUID) + await checkPrivateVODFiles(privateVideoUUID) }) it('Should upload a public video and have appropriate object storage ACL', async function () { @@ -131,7 +145,7 @@ describe('Object storage for video static file privacy', function () { publicVideoUUID = uuid - await checkPublicFiles(publicVideoUUID) + await checkPublicVODFiles(publicVideoUUID) }) it('Should not get files without appropriate OAuth token', async function () { @@ -182,7 +196,7 @@ describe('Object storage for video static file privacy', function () { await server.videos.update({ id: publicVideoUUID, attributes: { privacy: VideoPrivacy.INTERNAL } }) - await checkPrivateFiles(publicVideoUUID) + await checkPrivateVODFiles(publicVideoUUID) }) it('Should update private video to public', async function () { @@ -190,7 +204,7 @@ describe('Object storage for video static file privacy', function () { await server.videos.update({ id: publicVideoUUID, attributes: { privacy: VideoPrivacy.PUBLIC } }) - await checkPublicFiles(publicVideoUUID) + await checkPublicVODFiles(publicVideoUUID) }) }) @@ -203,6 +217,8 @@ describe('Object storage for video static file privacy', function () { let unrelatedFileToken: string + // --------------------------------------------------------------------------- + async function checkLiveFiles (live: LiveVideo, liveId: string) { const ffmpegCommand = sendRTMPStream({ rtmpBaseUrl: live.rtmpUrl, streamKey: live.streamKey }) await server.live.waitUntilPublished({ videoId: liveId }) @@ -260,6 +276,8 @@ describe('Object storage for video static file privacy', function () { } } + // --------------------------------------------------------------------------- + before(async function () { await server.config.enableMinimumTranscoding() @@ -320,6 +338,52 @@ describe('Object storage for video static file privacy', function () { }) }) + describe('With private files proxy disabled and public ACL for private files', function () { + let videoUUID: string + + before(async function () { + this.timeout(240000) + + await server.kill() + + const config = ObjectStorageCommand.getDefaultScalewayConfig({ + serverNumber: server.internalServerNumber, + enablePrivateProxy: false, + privateACL: 'public-read' + }) + await server.run(config) + + const { uuid } = await server.videos.quickUpload({ name: 'video', privacy: VideoPrivacy.PRIVATE }) + videoUUID = uuid + + await waitJobs([ server ]) + }) + + it('Should display object storage path for a private video and be able to access them', async function () { + this.timeout(60000) + + await checkPublicVODFiles(videoUUID) + }) + + it('Should not be able to access object storage proxy', async function () { + const privateVideo = await server.videos.getWithToken({ id: videoUUID }) + const webtorrentFilename = extractFilenameFromUrl(privateVideo.files[0].fileUrl) + const hlsFilename = extractFilenameFromUrl(getHLS(privateVideo).files[0].fileUrl) + + await makeRawRequest({ + url: server.url + '/object-storage-proxy/webseed/private/' + webtorrentFilename, + token: server.accessToken, + expectedStatus: HttpStatusCode.BAD_REQUEST_400 + }) + + await makeRawRequest({ + url: server.url + '/object-storage-proxy/streaming-playlists/hls/private/' + videoUUID + '/' + hlsFilename, + token: server.accessToken, + expectedStatus: HttpStatusCode.BAD_REQUEST_400 + }) + }) + }) + after(async function () { this.timeout(60000) diff --git a/server/tests/api/videos/video-static-file-privacy.ts b/server/tests/api/videos/video-static-file-privacy.ts index bdbe85127..eaaed5aad 100644 --- a/server/tests/api/videos/video-static-file-privacy.ts +++ b/server/tests/api/videos/video-static-file-privacy.ts @@ -383,6 +383,39 @@ describe('Test video static file privacy', function () { }) }) + describe('With static file right check disabled', function () { + let videoUUID: string + + before(async function () { + this.timeout(240000) + + await server.kill() + + await server.run({ + static_files: { + private_files_require_auth: false + } + }) + + const { uuid } = await server.videos.quickUpload({ name: 'video', privacy: VideoPrivacy.INTERNAL }) + videoUUID = uuid + + await waitJobs([ server ]) + }) + + it('Should not check auth for private static files', async function () { + const video = await server.videos.getWithToken({ id: videoUUID }) + + for (const file of getAllFiles(video)) { + await makeRawRequest({ url: file.fileUrl, expectedStatus: HttpStatusCode.OK_200 }) + } + + const hls = video.streamingPlaylists[0] + await makeRawRequest({ url: hls.playlistUrl, expectedStatus: HttpStatusCode.OK_200 }) + await makeRawRequest({ url: hls.segmentsSha256Url, expectedStatus: HttpStatusCode.OK_200 }) + }) + }) + after(async function () { await cleanupTests([ server ]) }) -- cgit v1.2.3