X-Git-Url: https://jasonwoof.com/gitweb/?p=wfpl.git;a=blobdiff_plain;f=upload.php;h=b21af6ffc1d0c9daee027cb1e9c92e9d8f292c6f;hp=f52f0cfe3887ce89cc3a2f294567b96e0c976bde;hb=HEAD;hpb=423f31ad0add74bbb6066d3c9f760ad0a5580cda diff --git a/upload.php b/upload.php index f52f0cf..b21af6f 100644 --- a/upload.php +++ b/upload.php @@ -1,19 +1,9 @@ . +# This program is in the public domain within the United States. Additionally, +# we waive copyright and related rights in the work worldwide through the CC0 +# 1.0 Universal public domain dedication, which can be found at +# http://creativecommons.org/publicdomain/zero/1.0/ # This file contains functions to accept files being uplodad with the -# -# -# +# +# +# # # # ####### @@ -90,11 +80,44 @@ function upload_max_filesize() { } } +# return the extension this path should have WITHOUT the period +function path_or_mime_to_ext($path, $mime = 'text/plain', $default = 'txt') { + $last_dot = strrpos($path, '.'); + if($last_dot === false || $last_dot === 0 || $last_dot === (strlen($path) - 1)) { + # no extension + if(isset($GLOBALS['mime_to_ext'][$mime])) { + return $GLOBALS['mime_to_ext'][$mime]; + } else { + return $default; + } + } else { + $ext = strtolower(substr($path, $last_dot + 1)); + if(isset($GLOBALS['ext_to_ext'][$ext])) { + return $GLOBALS['ext_to_ext'][$ext]; + } + return $ext; + } +} + +# Add or fix extension on path +# This just does string manipulation (ie doesn't move/open/etc any files.) +# Mime type used to generate extension ONLY IF it doesn't have one already. +function path_fix_ext($path, $mime = 'text/plain', $default_ext = '.txt') { + $last_dot = strrpos($path, '.'); + if($last_dot === false || $last_dot === 0) { # no extension + $path .= '.' . path_or_mime_to_ext($path, $mime, $default_ext); + } else { + $basename = substr($path, 0, $last_dot + 1); # keep dot + $path = $basename . path_or_mime_to_ext($path, $mime, $default_ext); + } + + return $path; +} # pass in the client's path that came from an html tag # # mime time used to generate extension ONLY IF it doesn't have one already. -function generate_filename($path, $mime = 'text/plain') { +function generate_filename($path, $mime = 'text/plain', $default_ext = '.txt') { # lower case $filename = strtolower($path); @@ -111,32 +134,23 @@ function generate_filename($path, $mime = 'text/plain') { } # replace symbols with underscores - $filename = ereg_replace('[^a-z0-9_.]', '_', $filename); - - # remove dots from the beginning (no invisible files) - $filename = ereg_replace('^\.*', '', $filename); + $filename = preg_replace('|[^a-z0-9_.]|', '_', $filename); + # limit length if(strlen($filename > 80)) { $filename = substr($filename, -80); } - # fix extension - $last_dot = strrpos($filename, '.'); - if($last_dot === false) { - #no extension - if(isset($GLOBALS['mime_to_ext'][$mime])) { - $filename .= '.' . $GLOBALS['mime_to_ext'][$mime]; - } else { - $filename .= '.bin'; - } - } else { - $basename = substr($filename, 0, $last_dot); - $ext = substr($filename, $last_dot + 1); - if(isset($GLOBALS['ext_to_ext'][$ext])) { - $ext .= $GLOBALS['ext_to_ext'][$ext]; - } - $filename = $basename . '.' . $ext; + # remove dots from the beginning (no invisible files) + $filename = preg_replace('|^\.*|', '', $filename); + + # make sure there's something before the extension + if ($filename == '') { + return '_'; } + + $filename = path_fix_ext($filename, $mime, $default_ext); + return $filename; } @@ -152,7 +166,7 @@ function generate_filename($path, $mime = 'text/plain') { # the client's name appended. Otherwise $path will be used as the filename # exactly as is, even if extensions differ between the client's name and $path. # -# where user uploads "c:\foo\Bar baz.PDF" at +# where user uploads "c:\foo\Bar baz.PDF" at # save_uploaded_file('in', 'uploaded_pdfs/'); yeilds: # "uploaded_pdfs/bar_baz.pdf" # save_uploaded_file('in', 'uploaded_pdfs/prefix.'); yeilds: @@ -181,8 +195,8 @@ function save_uploaded_file($key, $path) { # standard places (like /usr/bin or /usr/local bin) and PHP's PATH environment # variable is not set appropriately. function path_to($prog, $or_die = true) { - $prog = ereg_replace('[^a-zA-Z0-9_.-]', '', $prog); - $prog = ereg_replace('^[-.]*', '', $prog); + $prog = preg_replace('|[^a-z0-9_.-]|i', '', $prog); + $prog = preg_replace('|^[-.]*|', '', $prog); if($prog == '') { die('Invalid argument to path_to()'); } @@ -224,7 +238,7 @@ function gif_to_png($filename, $new_filename = 'just change extension') { $new_filename .= '.png'; } - imagemagick_convert($filename, $new_filename, "$convert -colorspace RGB", 'GIF to PNG conversion'); + imagemagick_convert($filename.'[0]', $new_filename, "-colorspace sRGB", 'GIF to PNG conversion'); unlink($filename); return $new_filename; @@ -258,7 +272,7 @@ function make_thumbnail($filename, $max_width = '70', $max_height = '70') { function exec_or_die($command, $doing_what) { exec($command, $dummy, $ret); if($ret != 0) { - $base = basename(ereg_replace(' .*', '', $command)); + $base = basename(preg_replace('| .*|', '', $command)); die("$doing_what failed. $base called exit($ret)"); } } @@ -280,7 +294,7 @@ function imagemagick_mogrify($in_filename, $args, $doing_what = "Image conversio } function format_int_70($str) { - $str = ereg_replace('[^0-9]', '', $str); + $str = preg_replace('|[^0-9]|', '', $str); if($str == '') { $str = '70'; } @@ -331,7 +345,7 @@ function image_w_h_or_die($filename) { # Like save_uploaded_file() (above) except that it converts all images to PNG -# or JPEG, converts to RGB colorspace, and optionally scales and/or creates a +# or JPEG, converts to sRGB colorspace, and optionally scales and/or creates a # thumbnail. And, if $path ends with a period, the correct extension will be # appended. # @@ -352,7 +366,7 @@ function image_w_h_or_die($filename) { # and names, call convert_uploaded_image(). function save_uploaded_image($key, $path, $image_width = 0, $image_height = 0, $thumbnail_width = 0, $thumbnail_height = 0) { $image_w_h_thumb_w_h = convert_uploaded_image($key, $path, $image_width, $image_height, $thumbnail_width, $thumbnail_height); - return ereg_replace(' .*', '', $image_w_h_thumb_w_h); + return preg_replace('| .*|', '', $image_w_h_thumb_w_h); } function ext_to_web_image_ext($in) { @@ -392,11 +406,11 @@ function convert_uploaded_image($key, $path, $image_width = 0, $image_height = 0 $filename = $path; } - $convert_params = '-colorspace RGB'; + $convert_params = '-colorspace sRGB -auto-orient'; if($image_width > 0 && $image_height > 0) { $convert_params .= " -geometry ${image_width}x$image_height"; } - imagemagick_convert($tmp_filename, $filename, $convert_params); + imagemagick_convert($tmp_filename.'[0]', $filename, $convert_params); unlink($tmp_filename); list($w, $h) = image_w_h_or_die($filename); $ret = "$filename $w $h";