use warnings;
use Sesse::pr0n::Common qw(error dberror);
-use Apache2::Request;
sub handler {
my $r = shift;
- my $apr = Apache2::Request->new($r);
my $dbh = Sesse::pr0n::Common::get_dbh();
my ($user, $takenby) = Sesse::pr0n::Common::check_access($r);
- if (!defined($user)) {
- return Apache2::Const::OK;
- }
+ return Sesse::pr0n::Common::generate_401($r) if (!defined($user));
+
+ # FIXME: People can rotate and delete across vhosts using this interface.
+ # We should add some sanity checks.
+
+ my @to_purge = ();
+
+ my $res = Plack::Response->new(200);
+ my $io = IO::String->new;
- Sesse::pr0n::Common::header($r, "Rotation/deletion results");
+ Sesse::pr0n::Common::header($r, $io, "Rotation/deletion results");
{
# Enable transactions and error raising temporarily
- local $dbh->{AutoCommit} = 0;
local $dbh->{RaiseError} = 1;
- my @params = $apr->param();
+ my @params = $r->param();
my $key;
for $key (@params) {
+ local $dbh->{AutoCommit} = 0;
+
# Rotation
- if ($key =~ /^rot-(\d+)-(90|180|270)$/ && $apr->param($key) eq 'on') {
+ if ($key =~ /^rot-(\d+)-(90|180|270)$/ && $r->param($key) eq 'on') {
my ($id, $rotval) = ($1,$2);
my $fname = Sesse::pr0n::Common::get_disk_location($r, $id);
+ push @to_purge, Sesse::pr0n::Common::get_all_cache_urls($r, $dbh, $id);
(my $tmpfname = $fname) =~ s/\.jpg$/-tmp.jpg/;
- system("/usr/bin/jpegtran -rotate $rotval -copy all < '$fname' > '$tmpfname' && mv '$tmpfname' '$fname'") == 0
- or error($r, "Rotation of $id [/usr/bin/jpegtran -rotate $rotval -copy all < '$fname' > '$tmpfname' && mv '$tmpfname' '$fname'] failed: $!.");
- $r->print(" <p>Rotated image ID `$id' by $rotval degrees.</p>\n");
+ system("/usr/bin/jpegtran -rotate $rotval -copy all < '$fname' > '$tmpfname' && /bin/mv '$tmpfname' '$fname'") == 0
+ or return error($r, "Rotation of $id [/usr/bin/jpegtran -rotate $rotval -copy all < '$fname' > '$tmpfname' && /bin/mv '$tmpfname' '$fname'] failed: $!.");
+ $io->print(" <p>Rotated image ID `$id' by $rotval degrees.</p>\n");
if ($rotval == 90 || $rotval == 270) {
my $q = $dbh->do('UPDATE images SET height=width,width=height WHERE id=?', undef, $id)
- or dberror($r, "Size clear of $id failed: $!");
+ or return dberror($r, "Size clear of $id failed");
+ $dbh->do('UPDATE last_picture_cache SET last_update=CURRENT_TIMESTAMP WHERE (vhost,event)=( SELECT vhost,event FROM images WHERE id=? )',
+ undef, $id)
+ or return dberror($r, "Cache invalidation at $id failed");
}
- } elsif ($key =~ /^del-(\d+)$/ && $apr->param($key) eq 'on') {
+ } elsif ($key =~ /^del-(\d+)$/ && $r->param($key) eq 'on') {
my $id = $1;
+ push @to_purge, Sesse::pr0n::Common::get_all_cache_urls($r, $dbh, $id);
{
eval {
- $dbh->do('UPDATE events SET last_update=CURRENT_TIMESTAMP WHERE event=( SELECT event FROM images WHERE id=? )',
+ $dbh->do('UPDATE last_picture_cache SET last_update=CURRENT_TIMESTAMP WHERE (vhost,event)=( SELECT vhost,event FROM images WHERE id=? )',
undef, $id);
$dbh->do('INSERT INTO deleted_images SELECT * FROM images WHERE id=?',
- undef, $id);
+ undef, $id);
+ $dbh->do('DELETE FROM exif_info WHERE image=?',
+ undef, $id);
$dbh->do('DELETE FROM images WHERE id=?',
- undef, $id);
+ undef, $id);
};
if ($@) {
# Some error occurred, rollback and bomb out
$dbh->rollback;
- dberror($r, "Transaction aborted because $@");
+ return dberror($r, "Transaction aborted because $@");
}
}
- $r->print(" <p>Deleted image `$id'.</p>\n");
+ $io->print(" <p>Deleted image `$id'.</p>\n");
}
}
}
+
+ my $event = $r->param('event');
+ $dbh->do('UPDATE last_picture_cache SET last_update=CURRENT_TIMESTAMP WHERE vhost=? AND event=?', undef, Sesse::pr0n::Common::get_server_name($r), $event)
+ or return dberror($r, "Cache invalidation failed");
- Sesse::pr0n::Common::footer($r);
+ push @to_purge, "/$event/";
+ push @to_purge, "/+all/";
+ Sesse::pr0n::Common::purge_cache($r, $res, @to_purge);
- return Apache2::Const::OK;
+ Sesse::pr0n::Common::footer($r, $io);
+ $io->setpos(0);
+ $res->body($io);
+ return $res;
}
1;