X-Git-Url: https://git.sesse.net/?p=pr0n;a=blobdiff_plain;f=perl%2FSesse%2Fpr0n%2FCommon.pm;h=63190b14295aadc1d10df6d19d0480cd5e672eec;hp=ad905d1e5d6f03e6563d6512ecee8213e4d951f2;hb=060aaacf0d15a03ed7287cf81169f630a1a1f95b;hpb=e96ef46cf8ad5cb95c12abf6ee20ed95ae2f111c diff --git a/perl/Sesse/pr0n/Common.pm b/perl/Sesse/pr0n/Common.pm index ad905d1..63190b1 100644 --- a/perl/Sesse/pr0n/Common.pm +++ b/perl/Sesse/pr0n/Common.pm @@ -19,7 +19,7 @@ use DBD::Pg; use Image::Magick; use POSIX; use Digest::MD5; -use Digest::SHA1; +use Digest::SHA; use Digest::HMAC_SHA1; use MIME::Base64; use MIME::Types; @@ -39,7 +39,7 @@ BEGIN { require Sesse::pr0n::Config_local; }; - $VERSION = "v2.71"; + $VERSION = "v2.80"; @ISA = qw(Exporter); @EXPORT = qw(&error &dberror); %EXPORT_TAGS = qw(); @@ -211,7 +211,7 @@ sub get_base { my $r = shift; return $r->dir_config('ImageBase'); } - + sub get_disk_location { my ($r, $id) = @_; my $dir = POSIX::floor($id / 256); @@ -231,6 +231,23 @@ sub get_cache_location { } } +sub ensure_disk_location_exists { + my ($r, $id) = @_; + my $dir = POSIX::floor($id / 256); + + my $img_dir = get_base($r) . "/images/$dir/"; + if (! -d $img_dir) { + $r->log->info("Need to create new image directory $img_dir"); + mkdir($img_dir) or die "Couldn't create new image directory $img_dir"; + } + + my $cache_dir = get_base($r) . "/cache/$dir/"; + if (! -d $cache_dir) { + $r->log->info("Need to create new cache directory $cache_dir"); + mkdir($cache_dir) or die "Couldn't create new image directory $cache_dir"; + } +} + sub get_mipmap_location { my ($r, $id, $width, $height) = @_; my $dir = POSIX::floor($id / 256); @@ -291,6 +308,10 @@ sub update_image_info { # Tags my @tags = $exiftool->GetValue('Keywords', 'ValueConv'); + if (scalar @tags == 0) { + # This is XMP-dc:Subject, an RDF bag of tags. + @tags = $exiftool->GetValue('Subject', 'ValueConv'); + } $dbh->do('DELETE FROM tags WHERE image=?', undef, $id) or die "Couldn't delete old tag information in SQL: $!"; @@ -306,7 +327,7 @@ sub update_image_info { # update the last_picture cache as well (this should of course be done # via a trigger, but this is less complicated :-) ) - $dbh->do('UPDATE last_picture_cache SET last_picture=GREATEST(last_picture, ?) WHERE (vhost,event)=(SELECT vhost,event FROM images WHERE id=?)', + $dbh->do('UPDATE last_picture_cache SET last_picture=GREATEST(last_picture, ?),last_update=CURRENT_TIMESTAMP WHERE (vhost,event)=(SELECT vhost,event FROM images WHERE id=?)', undef, $datetime, $id) or die "Couldn't update last_picture in SQL: $!"; } @@ -346,11 +367,11 @@ sub output_401 { # proxies etc. are being used), and we use HMAC instead of simple # hashing simply because that's a better signing method. # - # NOTE: For some weird reason, Digest::HMAC_SHA1 doesn't like taking + # NOTE: For some weird reason, Digest::HMAC_SHA doesn't like taking # the output from time directly (it gives a different response), so we # forcefully stringify the argument. my $ts = time; - my $nonce = Digest::HMAC_SHA1->hmac_sha1_hex($ts . "", $Sesse::pr0n::Config::db_password); + my $nonce = Digest::HMAC_SHA->hmac_sha1_hex($ts . "", $Sesse::pr0n::Config::db_password); my $stale_nonce_text = ""; $stale_nonce_text = ", stale=\"true\"" if ($options{'StaleNonce'} // 0); @@ -372,7 +393,7 @@ sub check_basic_auth { my $ref = $dbh->selectrow_hashref('SELECT sha1password,digest_ha1_hex FROM users WHERE username=? AND vhost=?', undef, $user, $r->get_server_name); - if (!defined($ref) || $ref->{'sha1password'} ne Digest::SHA1::sha1_base64($pass)) { + if (!defined($ref) || $ref->{'sha1password'} ne Digest::SHA::sha1_base64($pass)) { $r->content_type('text/plain; charset=utf-8'); $r->log->warn("Authentication failed for $user/$takenby"); output_401($r); @@ -532,7 +553,8 @@ sub stat_image_from_id { } # Takes in an image ID and a set of resolutions, and returns (generates if needed) -# the smallest mipmap larger than the largest of them. +# the smallest mipmap larger than the largest of them, as well as the original image +# dimensions. sub make_mipmap { my ($r, $filename, $id, $dbwidth, $dbheight, $can_use_qscale, @res) = @_; my ($img, $mmimg, $width, $height); @@ -630,8 +652,10 @@ sub make_mipmap { if (!defined($img)) { $img = read_original_image($r, $filename, $id, $dbwidth, $dbheight, $can_use_qscale); + $width = $img->Get('columns'); + $height = $img->Get('rows'); } - return $img; + return ($img, $width, $height); } sub read_original_image { @@ -689,21 +713,14 @@ sub read_original_image { $img = (scalar @$magick > 1) ? $magick->[0] : $magick; } - my $width = $img->Get('columns'); - my $height = $img->Get('rows'); - - # Update the SQL database if it doesn't contain the required info - if (!defined($dbwidth) || !defined($dbheight)) { - $r->log->info("Updating width/height for $id: $width x $height"); - update_image_info($r, $id, $width, $height); - } - return $img; } sub ensure_cached { my ($r, $filename, $id, $dbwidth, $dbheight, $infobox, $xres, $yres, @otherres) = @_; + my ($new_dbwidth, $new_dbheight); + my $fname = get_disk_location($r, $id); if ($infobox ne 'box') { unless (defined($xres) && (!defined($dbwidth) || !defined($dbheight) || $xres < $dbwidth || $yres < $dbheight || $xres == -1)) { @@ -732,8 +749,8 @@ sub ensure_cached { # special-casing it. if (!defined($dbwidth) || !defined($dbheight)) { $img = read_original_image($r, $filename, $id, $dbwidth, $dbheight, 0); - $width = $img->Get('columns'); - $height = $img->Get('rows'); + $new_dbwidth = $width = $img->Get('columns'); + $new_dbheight = $height = $img->Get('rows'); @$img = (); } else { $img = Image::Magick->new; @@ -777,7 +794,8 @@ sub ensure_cached { $can_use_qscale = 1; } - my $img = make_mipmap($r, $filename, $id, $dbwidth, $dbheight, $can_use_qscale, $xres, $yres, @otherres); + my $img; + ($img, $new_dbwidth, $new_dbheight) = make_mipmap($r, $filename, $id, $dbwidth, $dbheight, $can_use_qscale, $xres, $yres, @otherres); while (defined($xres) && defined($yres)) { my ($nxres, $nyres) = (shift @otherres, shift @otherres); @@ -844,6 +862,13 @@ sub ensure_cached { } } } + + # Update the SQL database if it doesn't contain the required info + if (!defined($dbwidth) && defined($new_dbwidth)) { + $r->log->info("Updating width/height for $id: $new_dbwidth x $new_dbheight"); + update_image_info($r, $id, $new_dbwidth, $new_dbheight); + } + return ($cachename, 'image/jpeg'); } @@ -1096,8 +1121,6 @@ sub purge_cache { } $regex .= "(\\?.*)?\$"; $r->headers_out->{'X-Pr0n-Purge'} = $regex; - - $r->log->info($r->headers_out->{'X-Pr0n-Purge'}); } # Find a list of all cache URLs for a given image, given what we have on disk.