diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/controllers/api/videos/index.ts | 8 | ||||
-rw-r--r-- | server/helpers/custom-validators/activitypub/videos.ts | 6 | ||||
-rw-r--r-- | server/helpers/custom-validators/videos.ts | 9 | ||||
-rw-r--r-- | server/lib/activitypub/process/misc.ts | 21 | ||||
-rw-r--r-- | server/models/video/video.ts | 26 | ||||
-rw-r--r-- | server/tests/api/multiple-servers.ts | 46 | ||||
-rw-r--r-- | server/tests/api/single-server.ts | 37 |
7 files changed, 94 insertions, 59 deletions
diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts index 0f71a7f7f..63de662a7 100644 --- a/server/controllers/api/videos/index.ts +++ b/server/controllers/api/videos/index.ts | |||
@@ -280,7 +280,7 @@ async function updateVideo (req: express.Request, res: express.Response) { | |||
280 | if (videoInfoToUpdate.licence !== undefined) videoInstance.set('licence', videoInfoToUpdate.licence) | 280 | if (videoInfoToUpdate.licence !== undefined) videoInstance.set('licence', videoInfoToUpdate.licence) |
281 | if (videoInfoToUpdate.language !== undefined) videoInstance.set('language', videoInfoToUpdate.language) | 281 | if (videoInfoToUpdate.language !== undefined) videoInstance.set('language', videoInfoToUpdate.language) |
282 | if (videoInfoToUpdate.nsfw !== undefined) videoInstance.set('nsfw', videoInfoToUpdate.nsfw) | 282 | if (videoInfoToUpdate.nsfw !== undefined) videoInstance.set('nsfw', videoInfoToUpdate.nsfw) |
283 | if (videoInfoToUpdate.privacy !== undefined) videoInstance.set('privacy', videoInfoToUpdate.privacy) | 283 | if (videoInfoToUpdate.privacy !== undefined) videoInstance.set('privacy', parseInt(videoInfoToUpdate.privacy.toString(), 10)) |
284 | if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description) | 284 | if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description) |
285 | 285 | ||
286 | const videoInstanceUpdated = await videoInstance.save(sequelizeOptions) | 286 | const videoInstanceUpdated = await videoInstance.save(sequelizeOptions) |
@@ -298,9 +298,9 @@ async function updateVideo (req: express.Request, res: express.Response) { | |||
298 | } | 298 | } |
299 | 299 | ||
300 | // Video is not private anymore, send a create action to remote servers | 300 | // Video is not private anymore, send a create action to remote servers |
301 | if (wasPrivateVideo === true && videoInstance.privacy !== VideoPrivacy.PRIVATE) { | 301 | if (wasPrivateVideo === true && videoInstanceUpdated.privacy !== VideoPrivacy.PRIVATE) { |
302 | await sendAddVideo(videoInstance, t) | 302 | await sendAddVideo(videoInstanceUpdated, t) |
303 | await shareVideoByServer(videoInstance, t) | 303 | await shareVideoByServer(videoInstanceUpdated, t) |
304 | } | 304 | } |
305 | }) | 305 | }) |
306 | 306 | ||
diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts index 12c672fd2..2ed2988f5 100644 --- a/server/helpers/custom-validators/activitypub/videos.ts +++ b/server/helpers/custom-validators/activitypub/videos.ts | |||
@@ -49,14 +49,14 @@ function isVideoTorrentObjectValid (video: any) { | |||
49 | isActivityPubVideoDurationValid(video.duration) && | 49 | isActivityPubVideoDurationValid(video.duration) && |
50 | isUUIDValid(video.uuid) && | 50 | isUUIDValid(video.uuid) && |
51 | setValidRemoteTags(video) && | 51 | setValidRemoteTags(video) && |
52 | isRemoteIdentifierValid(video.category) && | 52 | (!video.category || isRemoteIdentifierValid(video.category)) && |
53 | isRemoteIdentifierValid(video.licence) && | 53 | (!video.licence || isRemoteIdentifierValid(video.licence)) && |
54 | (!video.language || isRemoteIdentifierValid(video.language)) && | 54 | (!video.language || isRemoteIdentifierValid(video.language)) && |
55 | isVideoViewsValid(video.views) && | 55 | isVideoViewsValid(video.views) && |
56 | isVideoNSFWValid(video.nsfw) && | 56 | isVideoNSFWValid(video.nsfw) && |
57 | isDateValid(video.published) && | 57 | isDateValid(video.published) && |
58 | isDateValid(video.updated) && | 58 | isDateValid(video.updated) && |
59 | isRemoteVideoContentValid(video.mediaType, video.content) && | 59 | (!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) && |
60 | isRemoteVideoIconValid(video.icon) && | 60 | isRemoteVideoIconValid(video.icon) && |
61 | setValidRemoteVideoUrls(video) && | 61 | setValidRemoteVideoUrls(video) && |
62 | video.url.length !== 0 | 62 | video.url.length !== 0 |
diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts index f13178c54..4fc460699 100644 --- a/server/helpers/custom-validators/videos.ts +++ b/server/helpers/custom-validators/videos.ts | |||
@@ -9,16 +9,17 @@ import { VIDEO_PRIVACIES } from '../../initializers/constants' | |||
9 | import { database as db } from '../../initializers/database' | 9 | import { database as db } from '../../initializers/database' |
10 | import { VideoInstance } from '../../models/video/video-interface' | 10 | import { VideoInstance } from '../../models/video/video-interface' |
11 | import { exists, isArray } from './misc' | 11 | import { exists, isArray } from './misc' |
12 | import isInt = require('validator/lib/isInt') | ||
12 | 13 | ||
13 | const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS | 14 | const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS |
14 | const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES | 15 | const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES |
15 | 16 | ||
16 | function isVideoCategoryValid (value: number) { | 17 | function isVideoCategoryValid (value: number) { |
17 | return VIDEO_CATEGORIES[value] !== undefined | 18 | return value === null || VIDEO_CATEGORIES[value] !== undefined |
18 | } | 19 | } |
19 | 20 | ||
20 | function isVideoLicenceValid (value: number) { | 21 | function isVideoLicenceValid (value: number) { |
21 | return VIDEO_LICENCES[value] !== undefined | 22 | return value === null || VIDEO_LICENCES[value] !== undefined |
22 | } | 23 | } |
23 | 24 | ||
24 | function isVideoLanguageValid (value: number) { | 25 | function isVideoLanguageValid (value: number) { |
@@ -38,7 +39,7 @@ function isVideoTruncatedDescriptionValid (value: string) { | |||
38 | } | 39 | } |
39 | 40 | ||
40 | function isVideoDescriptionValid (value: string) { | 41 | function isVideoDescriptionValid (value: string) { |
41 | return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION) | 42 | return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION)) |
42 | } | 43 | } |
43 | 44 | ||
44 | function isVideoNameValid (value: string) { | 45 | function isVideoNameValid (value: string) { |
@@ -84,7 +85,7 @@ function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | | |||
84 | } | 85 | } |
85 | 86 | ||
86 | function isVideoPrivacyValid (value: string) { | 87 | function isVideoPrivacyValid (value: string) { |
87 | return VIDEO_PRIVACIES[value] !== undefined | 88 | return validator.isInt(value + '') && VIDEO_PRIVACIES[value] !== undefined |
88 | } | 89 | } |
89 | 90 | ||
90 | function isVideoFileInfoHashValid (value: string) { | 91 | function isVideoFileInfoHashValid (value: string) { |
diff --git a/server/lib/activitypub/process/misc.ts b/server/lib/activitypub/process/misc.ts index f20e588ab..0baa22c26 100644 --- a/server/lib/activitypub/process/misc.ts +++ b/server/lib/activitypub/process/misc.ts | |||
@@ -41,15 +41,30 @@ async function videoActivityObjectToDBAttributes ( | |||
41 | language = parseInt(videoObject.language.identifier, 10) | 41 | language = parseInt(videoObject.language.identifier, 10) |
42 | } | 42 | } |
43 | 43 | ||
44 | let category = null | ||
45 | if (videoObject.category) { | ||
46 | category = parseInt(videoObject.category.identifier, 10) | ||
47 | } | ||
48 | |||
49 | let licence = null | ||
50 | if (videoObject.licence) { | ||
51 | licence = parseInt(videoObject.licence.identifier, 10) | ||
52 | } | ||
53 | |||
54 | let description = null | ||
55 | if (videoObject.content) { | ||
56 | description = videoObject.content | ||
57 | } | ||
58 | |||
44 | const videoData: VideoAttributes = { | 59 | const videoData: VideoAttributes = { |
45 | name: videoObject.name, | 60 | name: videoObject.name, |
46 | uuid: videoObject.uuid, | 61 | uuid: videoObject.uuid, |
47 | url: videoObject.id, | 62 | url: videoObject.id, |
48 | category: parseInt(videoObject.category.identifier, 10), | 63 | category, |
49 | licence: parseInt(videoObject.licence.identifier, 10), | 64 | licence, |
50 | language, | 65 | language, |
66 | description, | ||
51 | nsfw: videoObject.nsfw, | 67 | nsfw: videoObject.nsfw, |
52 | description: videoObject.content, | ||
53 | channelId: videoChannel.id, | 68 | channelId: videoChannel.id, |
54 | duration: parseInt(duration, 10), | 69 | duration: parseInt(duration, 10), |
55 | createdAt: new Date(videoObject.published), | 70 | createdAt: new Date(videoObject.published), |
diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 8b1eb1f96..d46fdeebe 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts | |||
@@ -564,6 +564,22 @@ toActivityPubObject = function (this: VideoInstance) { | |||
564 | } | 564 | } |
565 | } | 565 | } |
566 | 566 | ||
567 | let category | ||
568 | if (this.category) { | ||
569 | category = { | ||
570 | identifier: this.category + '', | ||
571 | name: this.getCategoryLabel() | ||
572 | } | ||
573 | } | ||
574 | |||
575 | let licence | ||
576 | if (this.licence) { | ||
577 | licence = { | ||
578 | identifier: this.licence + '', | ||
579 | name: this.getLicenceLabel() | ||
580 | } | ||
581 | } | ||
582 | |||
567 | let likesObject | 583 | let likesObject |
568 | let dislikesObject | 584 | let dislikesObject |
569 | 585 | ||
@@ -635,14 +651,8 @@ toActivityPubObject = function (this: VideoInstance) { | |||
635 | duration: 'PT' + this.duration + 'S', | 651 | duration: 'PT' + this.duration + 'S', |
636 | uuid: this.uuid, | 652 | uuid: this.uuid, |
637 | tag, | 653 | tag, |
638 | category: { | 654 | category, |
639 | identifier: this.category + '', | 655 | licence, |
640 | name: this.getCategoryLabel() | ||
641 | }, | ||
642 | licence: { | ||
643 | identifier: this.licence + '', | ||
644 | name: this.getLicenceLabel() | ||
645 | }, | ||
646 | language, | 656 | language, |
647 | views: this.views, | 657 | views: this.views, |
648 | nsfw: this.nsfw, | 658 | nsfw: this.nsfw, |
diff --git a/server/tests/api/multiple-servers.ts b/server/tests/api/multiple-servers.ts index c7f19f261..c9f74cc8c 100644 --- a/server/tests/api/multiple-servers.ts +++ b/server/tests/api/multiple-servers.ts | |||
@@ -2,6 +2,8 @@ | |||
2 | 2 | ||
3 | import 'mocha' | 3 | import 'mocha' |
4 | import * as chai from 'chai' | 4 | import * as chai from 'chai' |
5 | import { join } from "path" | ||
6 | import * as request from 'supertest' | ||
5 | 7 | ||
6 | import { | 8 | import { |
7 | dateIsValid, | 9 | dateIsValid, |
@@ -707,6 +709,50 @@ describe('Test multiple servers', function () { | |||
707 | }) | 709 | }) |
708 | }) | 710 | }) |
709 | 711 | ||
712 | describe('With minimum parameters', function () { | ||
713 | it('Should upload and propagate the video', async function () { | ||
714 | this.timeout(50000) | ||
715 | |||
716 | const path = '/api/v1/videos/upload' | ||
717 | |||
718 | const req = request(servers[1].url) | ||
719 | .post(path) | ||
720 | .set('Accept', 'application/json') | ||
721 | .set('Authorization', 'Bearer ' + servers[1].accessToken) | ||
722 | .field('name', 'minimum parameters') | ||
723 | .field('privacy', '1') | ||
724 | .field('nsfw', 'false') | ||
725 | .field('channelId', '1') | ||
726 | |||
727 | const filePath = join(__dirname, '..', 'api', 'fixtures', 'video_short.webm') | ||
728 | |||
729 | await req.attach('videofile', filePath) | ||
730 | .expect(200) | ||
731 | |||
732 | await wait(25000) | ||
733 | |||
734 | for (const server of servers) { | ||
735 | const res = await getVideosList(server.url) | ||
736 | const video = res.body.data.find(v => v.name === 'minimum parameters') | ||
737 | |||
738 | expect(video.name).to.equal('minimum parameters') | ||
739 | expect(video.category).to.equal(null) | ||
740 | expect(video.categoryLabel).to.equal('Misc') | ||
741 | expect(video.licence).to.equal(null) | ||
742 | expect(video.licenceLabel).to.equal('Unknown') | ||
743 | expect(video.language).to.equal(null) | ||
744 | expect(video.languageLabel).to.equal('Unknown') | ||
745 | expect(video.nsfw).to.not.be.ok | ||
746 | expect(video.description).to.equal(null) | ||
747 | expect(video.serverHost).to.equal('localhost:9002') | ||
748 | expect(video.accountName).to.equal('root') | ||
749 | expect(video.tags).to.deep.equal([ ]) | ||
750 | expect(dateIsValid(video.createdAt)).to.be.true | ||
751 | expect(dateIsValid(video.updatedAt)).to.be.true | ||
752 | } | ||
753 | }) | ||
754 | }) | ||
755 | |||
710 | after(async function () { | 756 | after(async function () { |
711 | killallServers(servers) | 757 | killallServers(servers) |
712 | 758 | ||
diff --git a/server/tests/api/single-server.ts b/server/tests/api/single-server.ts index e99955ef4..91460c7ae 100644 --- a/server/tests/api/single-server.ts +++ b/server/tests/api/single-server.ts | |||
@@ -694,43 +694,6 @@ describe('Test a single server', function () { | |||
694 | expect(video.dislikes).to.equal(1) | 694 | expect(video.dislikes).to.equal(1) |
695 | }) | 695 | }) |
696 | 696 | ||
697 | it('Should upload a video with minimum parameters', async function () { | ||
698 | const path = '/api/v1/videos/upload' | ||
699 | |||
700 | const req = request(server.url) | ||
701 | .post(path) | ||
702 | .set('Accept', 'application/json') | ||
703 | .set('Authorization', 'Bearer ' + server.accessToken) | ||
704 | .field('name', 'minimum parameters') | ||
705 | .field('privacy', '1') | ||
706 | .field('nsfw', 'false') | ||
707 | .field('channelId', '1') | ||
708 | |||
709 | const filePath = join(__dirname, '..', 'api', 'fixtures', 'video_short.webm') | ||
710 | |||
711 | await req.attach('videofile', filePath) | ||
712 | .expect(200) | ||
713 | |||
714 | const res = await getVideosList(server.url) | ||
715 | const video = res.body.data.find(v => v.name === 'minimum parameters') | ||
716 | |||
717 | expect(video.name).to.equal('minimum parameters') | ||
718 | expect(video.category).to.equal(null) | ||
719 | expect(video.categoryLabel).to.equal('Misc') | ||
720 | expect(video.licence).to.equal(null) | ||
721 | expect(video.licenceLabel).to.equal('Unknown') | ||
722 | expect(video.language).to.equal(null) | ||
723 | expect(video.languageLabel).to.equal('Unknown') | ||
724 | expect(video.nsfw).to.not.be.ok | ||
725 | expect(video.description).to.equal(null) | ||
726 | expect(video.serverHost).to.equal('localhost:9001') | ||
727 | expect(video.accountName).to.equal('root') | ||
728 | expect(video.isLocal).to.be.true | ||
729 | expect(video.tags).to.deep.equal([ ]) | ||
730 | expect(dateIsValid(video.createdAt)).to.be.true | ||
731 | expect(dateIsValid(video.updatedAt)).to.be.true | ||
732 | }) | ||
733 | |||
734 | after(async function () { | 697 | after(async function () { |
735 | killallServers([ server ]) | 698 | killallServers([ server ]) |
736 | 699 | ||