From 7571815018f8baa24659942645032c99e031ec75 Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Wed, 10 Jun 2015 16:51:41 -0700 Subject: [PATCH] Restrict uploaded image size --- .../markdown_image_controller.coffee | 62 ++++++++++++++++--- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/src/coffee/controllers/markdown_image_controller.coffee b/src/coffee/controllers/markdown_image_controller.coffee index 9b1fdd2f7..504437f81 100644 --- a/src/coffee/controllers/markdown_image_controller.coffee +++ b/src/coffee/controllers/markdown_image_controller.coffee @@ -5,6 +5,7 @@ Copyright (c) 2015 by Redwood Labs All rights reserved. ### +$ = require 'jquery' _ = require 'underscore' BaseController = require './base_controller' {Duration} = require '../constants' @@ -14,11 +15,17 @@ MarkdownImage = require '../models/markdown_image' module.exports = class MarkdownImageController extends BaseController + MAX_FILE_SIZE = 750 * 1024 + MAX_HEIGHT = 600 + MAX_WIDTH = 740 + constructor: (options={})-> if not options.model? then throw new Error 'options.model is required' options.templateName = 'markdown_image' super + @_errorMessage = null + # Event Methods ################################################################################ onButtonClicked: -> @@ -29,8 +36,14 @@ module.exports = class MarkdownImageController extends BaseController file = @$input.prop('files')[0] + if file.size > MAX_FILE_SIZE + logger.warning "The choosen file, #{file.name}, is too large: #{file.size}" + @errorMessage = "Choose a file less than #{MAX_FILE_SIZE / 1024}kB" + return + reader = @_reader = new FileReader reader.abort = false + reader.onload = => if reader.abort logger.info "aborted reading #{file.name}" @@ -38,20 +51,50 @@ module.exports = class MarkdownImageController extends BaseController @_reader = null - index = reader.result.indexOf ',' - meta = reader.result.substring 0, index - encodedData = reader.result.substring index + 1 + $image = $("") + $image.load => + if $image[0].naturalHeight > MAX_HEIGHT + logger.warning "The choosen file, #{file.name}, is too tall: #{$image[0].naturalHeight}" + @errorMessage = "Choose an image less than #{MAX_HEIGHT}px tall" + return + if $image[0].naturalWidth > MAX_WIDTH + logger.warning "The choosen file, #{file.name}, is too wide: #{$image[0].naturalWidth}" + @errorMessage = "Choose an image less than #{MAX_WIDTH}px wide" + return - match = meta.match /data:(.*);(.*)/ - mimeType = match[1] - encoding = match[2] + index = reader.result.indexOf ',' + meta = reader.result.substring 0, index + encodedData = reader.result.substring index + 1 - @model.encodedData = encodedData - logger.info "loaded #{encodedData.length} bytes from #{file.name} as #{mimeType}" + match = meta.match /data:(.*);(.*)/ + mimeType = match[1] + encoding = match[2] + + @model.encodedData = encodedData + logger.info "loaded #{encodedData.length} bytes from #{file.name} as #{mimeType}" + @errorMessage = null logger.info "starting to read local file: #{file.name}" reader.readAsDataURL file + # Property Methods ############################################################################# + + getErrorMessage: -> + return @_errorMessage + + setErrorMessage: (newErrorMessage)-> + oldErrorMessage = @_errorMessage + return if newErrorMessage is oldErrorMessage + + @_errorMessage = newErrorMessage + @trigger Event.change + ':errorMessage', this, oldErrorMessage, newErrorMessage + @trigger Event.change, this + + @tryRefresh() + + Object.defineProperties @prototype, + errorMessage: { get:@prototype.getErrorMessage, set:@prototype.setErrorMessage } + # BaseController Overrides ##################################################################### onDidRender: -> @@ -89,6 +132,9 @@ module.exports = class MarkdownImageController extends BaseController if @model.status is MarkdownImage.Status.empty @$errorMessage.html 'please choose an image' @$errorContainer.show duration:Duration.normal + else if @errorMessage? + @$errorMessage.html @errorMessage + @$errorContainer.show duration:Duration.normal else @$errorContainer.hide duration:Duration.normal