diff options
Diffstat (limited to 'server/helpers')
-rw-r--r-- | server/helpers/core-utils.ts | 18 | ||||
-rw-r--r-- | server/helpers/custom-validators/activitypub/videos.ts | 12 |
2 files changed, 29 insertions, 1 deletions
diff --git a/server/helpers/core-utils.ts b/server/helpers/core-utils.ts index 65f18d644..a3dfe27b5 100644 --- a/server/helpers/core-utils.ts +++ b/server/helpers/core-utils.ts | |||
@@ -12,6 +12,7 @@ import { isAbsolute, join } from 'path' | |||
12 | import * as pem from 'pem' | 12 | import * as pem from 'pem' |
13 | import * as rimraf from 'rimraf' | 13 | import * as rimraf from 'rimraf' |
14 | import { URL } from 'url' | 14 | import { URL } from 'url' |
15 | import { truncate } from 'lodash' | ||
15 | 16 | ||
16 | function sanitizeUrl (url: string) { | 17 | function sanitizeUrl (url: string) { |
17 | const urlObject = new URL(url) | 18 | const urlObject = new URL(url) |
@@ -78,6 +79,22 @@ function buildPath (path: string) { | |||
78 | return join(root(), path) | 79 | return join(root(), path) |
79 | } | 80 | } |
80 | 81 | ||
82 | // Consistent with .length, lodash truncate function is not | ||
83 | function peertubeTruncate (str: string, maxLength: number) { | ||
84 | const options = { | ||
85 | length: maxLength | ||
86 | } | ||
87 | const truncatedStr = truncate(str, options) | ||
88 | |||
89 | // The truncated string is okay, we can return it | ||
90 | if (truncatedStr.length <= maxLength) return truncatedStr | ||
91 | |||
92 | // Lodash takes into account all UTF characters, whereas String.prototype.length does not: some characters have a length of 2 | ||
93 | // We always use the .length so we need to truncate more if needed | ||
94 | options.length -= truncatedStr.length - maxLength | ||
95 | return truncate(str, options) | ||
96 | } | ||
97 | |||
81 | function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { | 98 | function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { |
82 | return function promisified (): Promise<A> { | 99 | return function promisified (): Promise<A> { |
83 | return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => { | 100 | return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => { |
@@ -145,6 +162,7 @@ export { | |||
145 | sanitizeUrl, | 162 | sanitizeUrl, |
146 | sanitizeHost, | 163 | sanitizeHost, |
147 | buildPath, | 164 | buildPath, |
165 | peertubeTruncate, | ||
148 | 166 | ||
149 | promisify0, | 167 | promisify0, |
150 | promisify1, | 168 | promisify1, |
diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts index 10588423a..3af587a32 100644 --- a/server/helpers/custom-validators/activitypub/videos.ts +++ b/server/helpers/custom-validators/activitypub/videos.ts | |||
@@ -1,5 +1,6 @@ | |||
1 | import * as validator from 'validator' | 1 | import * as validator from 'validator' |
2 | import { ACTIVITY_PUB } from '../../../initializers' | 2 | import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers' |
3 | import { peertubeTruncate } from '../../core-utils' | ||
3 | import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc' | 4 | import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc' |
4 | import { | 5 | import { |
5 | isVideoAbuseReasonValid, | 6 | isVideoAbuseReasonValid, |
@@ -56,6 +57,7 @@ function isVideoTorrentObjectValid (video: any) { | |||
56 | isBooleanValid(video.commentsEnabled) && | 57 | isBooleanValid(video.commentsEnabled) && |
57 | isDateValid(video.published) && | 58 | isDateValid(video.published) && |
58 | isDateValid(video.updated) && | 59 | isDateValid(video.updated) && |
60 | setTruncatedContent(video) && | ||
59 | (!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) && | 61 | (!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) && |
60 | isRemoteVideoIconValid(video.icon) && | 62 | isRemoteVideoIconValid(video.icon) && |
61 | setValidRemoteVideoUrls(video) && | 63 | setValidRemoteVideoUrls(video) && |
@@ -111,6 +113,14 @@ function setValidRemoteVideoUrls (video: any) { | |||
111 | return true | 113 | return true |
112 | } | 114 | } |
113 | 115 | ||
116 | function setTruncatedContent (video: any) { | ||
117 | if (video.content) { | ||
118 | video.content = peertubeTruncate(video.content, CONSTRAINTS_FIELDS.VIDEOS.TRUNCATED_DESCRIPTION.max) | ||
119 | } | ||
120 | |||
121 | return true | ||
122 | } | ||
123 | |||
114 | function isRemoteVideoUrlValid (url: any) { | 124 | function isRemoteVideoUrlValid (url: any) { |
115 | return url.type === 'Link' && | 125 | return url.type === 'Link' && |
116 | ( | 126 | ( |