]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Error if importing a torrent with multiple files
authorChocobozzz <me@florianbigard.com>
Tue, 11 May 2021 12:56:00 +0000 (14:56 +0200)
committerChocobozzz <me@florianbigard.com>
Tue, 11 May 2021 12:56:30 +0000 (14:56 +0200)
client/src/app/+videos/+video-edit/video-add-components/video-import-torrent.component.ts
server/controllers/api/videos/import.ts
server/middlewares/validators/videos/video-imports.ts
shared/models/server/server-error-code.enum.ts

index 3aae24732e5d33063e0d621f690e735c7d6594eb..23bd5ef767be221f1786ba050cd1d1c138f744c1 100644 (file)
@@ -5,7 +5,7 @@ import { scrollToTop } from '@app/helpers'
 import { FormValidatorService } from '@app/shared/shared-forms'
 import { VideoCaptionService, VideoEdit, VideoImportService, VideoService } from '@app/shared/shared-main'
 import { LoadingBarService } from '@ngx-loading-bar/core'
-import { VideoPrivacy, VideoUpdate } from '@shared/models'
+import { ServerErrorCode, VideoPrivacy, VideoUpdate } from '@shared/models'
 import { hydrateFormFromVideo } from '../shared/video-edit-utils'
 import { VideoSend } from './video-send'
 
@@ -113,7 +113,13 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Af
         this.loadingBar.useRef().complete()
         this.isImportingVideo = false
         this.firstStepError.emit()
-        this.notifier.error(err.message)
+
+        let message = err.message
+        if (err.body?.code === ServerErrorCode.INCORRECT_FILES_IN_TORRENT) {
+          message = $localize`Torrents with only 1 file are supported.`
+        }
+
+        this.notifier.error(message)
       }
     )
   }
index 37fd42b90b871e6509742a0beacd84974e35380d..4ed58f97856619b21e5dff8b02bd21abca3dffd5 100644 (file)
@@ -16,13 +16,13 @@ import {
   MVideoWithBlacklistLight
 } from '@server/types/models'
 import { MVideoImport, MVideoImportFormattable } from '@server/types/models/video/video-import'
-import { VideoImportCreate, VideoImportState, VideoPrivacy, VideoState } from '../../../../shared'
+import { ServerErrorCode, VideoImportCreate, VideoImportState, VideoPrivacy, VideoState } from '../../../../shared'
 import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
 import { ThumbnailType } from '../../../../shared/models/videos/thumbnail.type'
 import { auditLoggerFactory, getAuditIdFromRes, VideoImportAuditView } from '../../../helpers/audit-logger'
 import { moveAndProcessCaptionFile } from '../../../helpers/captions-utils'
 import { isArray } from '../../../helpers/custom-validators/misc'
-import { createReqFiles } from '../../../helpers/express-utils'
+import { cleanUpReqFiles, createReqFiles } from '../../../helpers/express-utils'
 import { logger } from '../../../helpers/logger'
 import { getSecureTorrentName } from '../../../helpers/utils'
 import { YoutubeDL, YoutubeDLInfo } from '../../../helpers/youtube-dl'
@@ -86,13 +86,23 @@ async function addTorrentImport (req: express.Request, res: express.Response, to
 
     // Rename the torrent to a secured name
     const newTorrentPath = join(CONFIG.STORAGE.TORRENTS_DIR, getSecureTorrentName(torrentName))
-    await move(torrentfile.path, newTorrentPath)
+    await move(torrentfile.path, newTorrentPath, { overwrite: true })
     torrentfile.path = newTorrentPath
 
     const buf = await readFile(torrentfile.path)
-    const parsedTorrent = parseTorrent(buf)
+    const parsedTorrent = parseTorrent(buf) as parseTorrent.Instance
 
-    videoName = isArray(parsedTorrent.name) ? parsedTorrent.name[0] : parsedTorrent.name as string
+    if (parsedTorrent.files.length !== 1) {
+      cleanUpReqFiles(req)
+
+      return res.status(HttpStatusCode.BAD_REQUEST_400)
+        .json({
+          code: ServerErrorCode.INCORRECT_FILES_IN_TORRENT,
+          error: 'Torrents with only 1 file are supported.'
+        })
+    }
+
+    videoName = isArray(parsedTorrent.name) ? parsedTorrent.name[0] : parsedTorrent.name
   } else {
     magnetUri = body.magnetUri
 
index c53af38613e7bc068ccf8fe76666e34d86900f70..d0643ff26e8935648913643ef5c0b5a9330a25f7 100644 (file)
@@ -47,14 +47,12 @@ const videoImportAddValidator = getCommonVideoEditAttributes().concat([
       cleanUpReqFiles(req)
       return res.status(HttpStatusCode.CONFLICT_409)
         .json({ error: 'HTTP import is not enabled on this instance.' })
-        .end()
     }
 
     if (CONFIG.IMPORT.VIDEOS.TORRENT.ENABLED !== true && (req.body.magnetUri || torrentFile)) {
       cleanUpReqFiles(req)
       return res.status(HttpStatusCode.CONFLICT_409)
                 .json({ error: 'Torrent/magnet URI import is not enabled on this instance.' })
-                .end()
     }
 
     if (!await doesVideoChannelOfAccountExist(req.body.channelId, user, res)) return cleanUpReqFiles(req)
@@ -65,7 +63,6 @@ const videoImportAddValidator = getCommonVideoEditAttributes().concat([
 
       return res.status(HttpStatusCode.BAD_REQUEST_400)
         .json({ error: 'Should have a magnetUri or a targetUrl or a torrent file.' })
-        .end()
     }
 
     if (!await isImportAccepted(req, res)) return cleanUpReqFiles(req)
index c02b0e6c78e7312b89044867f9e38e6a656a9d1f..d17d958be227f6280f9e9999238f561b8c6b70a1 100644 (file)
@@ -2,4 +2,5 @@ export const enum ServerErrorCode {
   DOES_NOT_RESPECT_FOLLOW_CONSTRAINTS = 1,
   MAX_INSTANCE_LIVES_LIMIT_REACHED = 2,
   MAX_USER_LIVES_LIMIT_REACHED = 3,
+  INCORRECT_FILES_IN_TORRENT = 4
 }