aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'server/helpers')
-rw-r--r--server/helpers/core-utils.ts18
-rw-r--r--server/helpers/custom-validators/activitypub/videos.ts12
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'
12import * as pem from 'pem' 12import * as pem from 'pem'
13import * as rimraf from 'rimraf' 13import * as rimraf from 'rimraf'
14import { URL } from 'url' 14import { URL } from 'url'
15import { truncate } from 'lodash'
15 16
16function sanitizeUrl (url: string) { 17function 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
83function 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
81function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { 98function 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 @@
1import * as validator from 'validator' 1import * as validator from 'validator'
2import { ACTIVITY_PUB } from '../../../initializers' 2import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
3import { peertubeTruncate } from '../../core-utils'
3import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc' 4import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc'
4import { 5import {
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
116function 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
114function isRemoteVideoUrlValid (url: any) { 124function isRemoteVideoUrlValid (url: any) {
115 return url.type === 'Link' && 125 return url.type === 'Link' &&
116 ( 126 (