#!/usr/bin/perl use strict; use CGI::Carp qw(fatalsToBrowser); use DBI; use Digest::MD5; use File::MMagic; use CGI; use File::Slurp; use Data::Dumper; use Amazon::S3; use Digest::SHA1; use JSON #set the temporary directory here my $upload_dir = '/tmp/'; #maximum filesize goes here my $maxFileSize = 2.2 * 1024 * 1024; #aws credentials here my $aws_access_key_id = "AKIAIR53VPBXKJMXZIBA"; my $aws_secret_access_key = "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"; #SQL CONNECTIONS my $sql_username = "asdfus"; my $sql_dbname = "asdfus"; my $sql_passwd = "gTYgT&M6q"; my $db_tag = "shader"; my $time_now = time(); my $IN = new CGI; my $resp = {}; sub get_postdata{ return $IN->param('POSTDATA'); } #qq file is the default name for the file parameter when using qq upload. change if necessary sub get_filedata{ my $file = $IN->upload('qqfile'); if ($file){ return read_file( $file, binmode => ':raw' ) ; }else{ return } } sub get_filetype{ my $filedata = shift; my $mm = new File::MMagic; my $mtype = $mm->checktype_contents($filedata); if ($mtype =~ m@^image/(gif|png|jpeg)@gi){ return $1; }else{ return undef; } } sub make_photoblaster_directory{ return substr(Digest::SHA1->sha1_hex($time_now), 0, 2); } sub make_photoblaster_filename{ my $filename = $IN->param("filename") || sprintf("%s_%s", "im", $time_now); $filename =~ s/[^-a-zA-Z0-9]/-/g; $filename =~ s/-+/-/g; $filename =~ s/\....$//; $filename =~ s/^-//g; return $filename; } sub make_photoblaster_url{ my $photoblaster_directory = shift; my $filename = shift; return sprintf("http://i.asdf.us/im/%s/%s", $photoblaster_directory, $filename); } sub add_to_photoblaster_db{ my $pb_dir = shift; my $filename = shift; our $dbh = DBI->connect("DBI:mysql:$sql_dbname", $sql_username, $sql_passwd); unless($dbh){ return undef && print STDERR "Could not connect to database: $DBI::errstr"}; my $execute = $dbh->do( "INSERT INTO im_cmd ". "(date, name, dir, newfile, tag, remote_addr)". "VALUES(?,?,?,?,?,?);", undef, $time_now, $IN->param("username") || "", $pb_dir, $filename, $db_tag, $ENV{REMOTE_ADDR} || '127.0.0.1' ); return $execute; } sub write_to_file{ my $filepath = shift; my $filedata = shift; write_file( $filepath, {binmode => ':raw'}, $filedata ) or return undef; return 1; } sub test_gif_size{ my $filepath = shift; my $check_size = -s "$filepath"; print STDERR qq|Main filesize: $check_size Max Filesize: $maxFileSize nn|; return $check_size; } sub optimize_gif{ my $filepath = shift; my $tmpname = $filepath.".tmp"; #because system gives the unix exit code not system("gifsicle -O2 --colors=256 $filepath > $tmpname") or return undef; not system("mv -f $tmpname $filepath") or return undef; return 1; } sub upload_to_AmazonS3{ my $keyname = shift; my $value = shift; my $s3 = Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key } ); my $bucket = $s3->bucket("i.asdf.us"); $bucket->add_key( $keyname, $value, { content_type => 'image/gif', } ); return $bucket; } sub delete_file{ my $filepath = shift; unlink($filepath); } sub error{ my $message = shift; my $resp = { success => "false", error => $message }; print JSON->new->encode($resp); exit 1; } sub main{ print $IN->header(); my $filedata = get_postdata() || get_filedata() || read_file("/tmp/tt.gif", binmode=>":raw"); unless($filedata){ error("NO DATA RECIEVED") }; my $filetype = get_filetype($filedata); unless($filetype){ error("BAD FILE TYPE")}; my $photoblaster_directory = make_photoblaster_directory(); my $photoblaster_filename = sprintf("%s.%s", make_photoblaster_filename(), $filetype); my $filepath = $main::upload_dir . $photoblaster_filename; if ($filetype =~ /gif$/i){ unless(write_to_file($filepath, $filedata)){ error("UNABLE TO WRITE TO FILE"); } unless (optimize_gif($filepath)){ error("UNABLE TO OPTIMIZE GIF"); } my $filedata = read_file($filepath, binmode=>":raw"); } my $filesize = length($filedata); if ($filesize < 1) { error( "EMPTY FILE"); } elsif ($filesize > $maxFileSize) { error("FILE TOO LARGE"); } unless(upload_to_AmazonS3(sprintf("im/%s/%s", $photoblaster_directory, $photoblaster_filename), $filedata)){ error("UNABLE TO UPLOAD TO AMAZONS3"); }; delete_file($filepath); my $photoblaster_url = make_photoblaster_url($photoblaster_directory, $photoblaster_filename); unless(add_to_photoblaster_db($photoblaster_directory, $photoblaster_filename)){ print STDERR "problem adding value to db"; } my $resp = { success => "true", url => $photoblaster_url, filesize => $filesize }; print JSON->new->encode($resp); } main();