Fix images size limit

pull/707/head
Chocobozzz 2018-06-22 15:42:55 +02:00
parent c4082b8b4e
commit 0c237b19fd
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
9 changed files with 59 additions and 39 deletions

View File

@ -50,6 +50,10 @@ export class MyAccountSettingsComponent implements OnInit {
changeAvatar () {
const avatarfile = this.avatarfileInput.nativeElement.files[ 0 ]
if (avatarfile.size > this.maxAvatarSize) {
this.notificationsService.error('Error', 'This image is too large.')
return
}
const formData = new FormData()
formData.append('avatarfile', avatarfile)
@ -59,7 +63,7 @@ export class MyAccountSettingsComponent implements OnInit {
data => {
this.notificationsService.success(this.i18n('Success'), this.i18n('Avatar changed.'))
this.user.account.avatar = data.avatar
this.user.updateAccountAvatar(data.avatar)
},
err => this.notificationsService.error(this.i18n('Error'), err.message)

View File

@ -9,6 +9,7 @@ import {
import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type'
import { Actor } from '@app/shared/actor/actor.model'
import { Account } from '@app/shared/account/account.model'
import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
export type UserConstructorHash = {
id: number,
@ -84,6 +85,12 @@ export class User implements UserServerModel {
this.updateComputedAttributes()
}
updateAccountAvatar (newAccountAvatar: Avatar) {
this.account.avatar = newAccountAvatar
this.updateComputedAttributes()
}
private updateComputedAttributes () {
this.accountAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.account)
}

View File

@ -2,6 +2,8 @@ import { Component, forwardRef, Input } from '@angular/core'
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'
import { ServerService } from '@app/core'
import { NotificationsService } from 'angular2-notifications'
import { I18n } from '@ngx-translate/i18n-polyfill'
@Component({
selector: 'my-video-image',
@ -27,7 +29,9 @@ export class VideoImageComponent implements ControlValueAccessor {
constructor (
private sanitizer: DomSanitizer,
private serverService: ServerService
private serverService: ServerService,
private notificationsService: NotificationsService,
private i18n: I18n
) {}
get videoImageExtensions () {
@ -42,6 +46,11 @@ export class VideoImageComponent implements ControlValueAccessor {
if (event.target.files && event.target.files.length) {
const [ file ] = event.target.files
if (file.size > this.maxVideoImageSize) {
this.notificationsService.error(this.i18n('Error'), this.i18n('This image is too large.'))
return
}
this.file = file
this.propagateChange(this.file)
this.updatePreview()

View File

@ -45,6 +45,7 @@ function isFileValid (
files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
mimeTypeRegex: string,
field: string,
maxSize: number,
optional = false
) {
// Should have files
@ -61,6 +62,9 @@ function isFileValid (
const file = fileArray[ 0 ]
if (!file || !file.originalname) return false
// Check size
if (maxSize && file.size > maxSize) return false
return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype)
}

View File

@ -2,7 +2,6 @@ import 'express-validator'
import * as validator from 'validator'
import { UserRole } from '../../../shared'
import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES } from '../../initializers'
import { exists, isFileValid } from './misc'
import { values } from 'lodash'
@ -52,7 +51,7 @@ const avatarMimeTypes = CONSTRAINTS_FIELDS.ACTORS.AVATAR.EXTNAME
.join('|')
const avatarMimeTypesRegex = `image/(${avatarMimeTypes})`
function isAvatarFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
return isFileValid(files, avatarMimeTypesRegex, 'avatarfile')
return isFileValid(files, avatarMimeTypesRegex, 'avatarfile', CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max)
}
// ---------------------------------------------------------------------------

View File

@ -86,7 +86,7 @@ const videoFileTypes = Object.keys(VIDEO_MIMETYPE_EXT).map(m => `(${m})`)
const videoFileTypesRegex = videoFileTypes.join('|')
function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
return isFileValid(files, videoFileTypesRegex, 'videofile')
return isFileValid(files, videoFileTypesRegex, 'videofile', null)
}
const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
@ -95,7 +95,7 @@ const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
const videoImageTypesRegex = `image/(${videoImageTypes})`
function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
return isFileValid(files, videoImageTypesRegex, field, true)
return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
}
function isVideoPrivacyValid (value: number) {

View File

@ -118,7 +118,7 @@ const usersUpdateMeValidator = [
const usersUpdateMyAvatarValidator = [
body('avatarfile').custom((value, { req }) => isAvatarFile(req.files)).withMessage(
'This file is not supported. Please, make sure it is of the following type : '
'This file is not supported or too large. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.ACTORS.AVATAR.EXTNAME.join(', ')
),
@ -127,14 +127,6 @@ const usersUpdateMyAvatarValidator = [
if (areValidationErrors(req, res)) return
const imageFile = req.files['avatarfile'][0] as Express.Multer.File
if (imageFile.size > CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max) {
res.status(400)
.send({ error: `The size of the avatar is too big (>${CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max}).` })
.end()
return
}
return next()
}
]

View File

@ -38,18 +38,21 @@ import { authenticate } from '../oauth'
import { areValidationErrors } from './utils'
const videosAddValidator = [
body('videofile').custom((value, { req }) => isVideoFile(req.files)).withMessage(
'This file is not supported. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.EXTNAME.join(', ')
),
body('thumbnailfile').custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
'This thumbnail file is not supported. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('previewfile').custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
'This preview file is not supported. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('videofile')
.custom((value, { req }) => isVideoFile(req.files)).withMessage(
'This file is not supported or too large. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.EXTNAME.join(', ')
),
body('thumbnailfile')
.custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
'This thumbnail file is not supported or too large. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('previewfile')
.custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
'This preview file is not supported or too large. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('name').custom(isVideoNameValid).withMessage('Should have a valid name'),
body('category')
.optional()
@ -147,14 +150,16 @@ const videosAddValidator = [
const videosUpdateValidator = [
param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
body('thumbnailfile').custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
'This thumbnail file is not supported. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('previewfile').custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
'This preview file is not supported. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('thumbnailfile')
.custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
'This thumbnail file is not supported or too large. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('previewfile')
.custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
'This preview file is not supported or too large. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
),
body('name')
.optional()
.custom(isVideoNameValid).withMessage('Should have a valid name'),

View File

@ -326,7 +326,7 @@ describe('Test videos API validator', function () {
const fields = baseCorrectParams
const attaches = {
'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png'),
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@ -336,7 +336,7 @@ describe('Test videos API validator', function () {
const fields = baseCorrectParams
const attaches = {
'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png'),
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@ -346,7 +346,7 @@ describe('Test videos API validator', function () {
const fields = baseCorrectParams
const attaches = {
'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png'),
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@ -356,7 +356,7 @@ describe('Test videos API validator', function () {
const fields = baseCorrectParams
const attaches = {
'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png'),
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })