]> git.sesse.net Git - pr0n/blobdiff - perl/Sesse/pr0n/Index.pm
Escape titles and dates on their way out of the HTML. It _shouldn't_ be
[pr0n] / perl / Sesse / pr0n / Index.pm
index 335dcd2566fbc00e47c6f04963d2b73a94f3a691..ca02b75003ed4bb54f04d801978ed1e7da8072f1 100644 (file)
@@ -23,7 +23,7 @@ sub handler {
        }
 
        # Internal? (Ugly?) 
-       if ($r->get_server_name =~ /internal/) {
+       if ($r->get_server_name =~ /internal/ || $r->get_server_name =~ /skoyen\.bilder\.knatten\.com/) {
                my $user = Sesse::pr0n::Common::check_access($r);
                if (!defined($user)) {
                        return Apache2::Const::OK;
@@ -34,16 +34,22 @@ sub handler {
        my %defsettings = (
                thumbxres => 80,
                thumbyres => 64,
-               xres => undef,
-               yres => undef,
+               xres => -1,
+               yres => -1,
                start => 1,
                num => -1,
                all => 1,
                infobox => 1,
                rot => 0,
                sel => 0,
+               fullscreen => 0,
        );
        
+       # Any NEF files => default to processing
+       my $ref = $dbh->selectrow_hashref('SELECT * FROM images WHERE event=? AND LOWER(filename) LIKE \'%.nef\' LIMIT 1',
+               undef, $event)
+               and $defsettings{'xres'} = $defsettings{'yres'} = undef;
+       
        # Reduce the front page load when in overload mode.
        if (Sesse::pr0n::Overload::is_in_overload($r)) {
                $defsettings{'num'} = 100;
@@ -51,7 +57,7 @@ sub handler {
                
        my %settings = %defsettings;
 
-       for my $s qw(thumbxres thumbyres xres yres start num all infobox rot sel) {
+       for my $s qw(thumbxres thumbyres xres yres start num all infobox rot sel fullscreen) {
                my $val = $apr->param($s);
                if (defined($val) && $val =~ /^(\d+)$/) {
                        $settings{$s} = $val;
@@ -76,12 +82,18 @@ sub handler {
                $num = undef;
        }
 
-       my $ref = $dbh->selectrow_hashref('SELECT * FROM events WHERE id=? AND vhost=?',
+       $ref = $dbh->selectrow_hashref('SELECT name,date,EXTRACT(EPOCH FROM last_update) AS last_update FROM events WHERE id=? AND vhost=?',
                undef, $event, $r->get_server_name)
                or error($r, "Could not find event $event", 404, "File not found");
 
-       my $name = $ref->{'name'};
-       my $date = $ref->{'date'};
+       my $date = HTML::Entities::encode_entities(Encode::decode_utf8($ref->{'date'}));
+       my $name = HTML::Entities::encode_entities(Encode::decode_utf8($ref->{'name'}));
+       $r->set_last_modified($ref->{'last_update'});
+                               
+       # If the client can use cache, do so
+       if ((my $rc = $r->meets_conditions) != Apache2::Const::OK) {
+               return $rc;
+       }
        
        # Count the number of selected images.
        $ref = $dbh->selectrow_hashref("SELECT COUNT(*) AS num_selected FROM images WHERE event=? AND selected=\'t\'", undef, $event);
@@ -91,7 +103,7 @@ sub handler {
        my $q;
        my $where = ($all == 0) ? ' AND selected=\'t\'' : '';
 
-       if (defined($start) && defined($num)) {
+       if (defined($start) && defined($num) && !$settings{'fullscreen'}) {
                $q = $dbh->prepare("SELECT *, (date - INTERVAL '6 hours')::date AS day FROM images WHERE event=? $where ORDER BY (date - INTERVAL '6 hours')::date,takenby,date,filename LIMIT $num OFFSET " . ($start-1))
                        or dberror($r, "prepare()");
        } else {
@@ -102,142 +114,169 @@ sub handler {
                or dberror($r, "image enumeration");
 
        # Print the page itself
-       Sesse::pr0n::Common::header($r, "$name [$event]");
-       Sesse::pr0n::Templates::print_template($r, "date", { date => $date });
-
-       if (Sesse::pr0n::Overload::is_in_overload($r)) {
-               Sesse::pr0n::Templates::print_template($r, "overloadmode");
-       }
-
-       print_thumbsize($r, $event, \%settings, \%defsettings);
-       print_viewres($r, $event, \%settings, \%defsettings);
-       print_pagelimit($r, $event, \%settings, \%defsettings);
-       print_infobox($r, $event, \%settings, \%defsettings);
-       print_nextprev($r, $event, \%settings, \%defsettings);
-       print_selected($r, $event, \%settings, \%defsettings) if ($num_selected > 0);
-
-       my $toclose = 0;
-       my $lastupl = "";
-       
-       # Print out all thumbnails
-       if ($rot == 1) {
-               $r->print("    <form method=\"post\" action=\"/rotate\">\n");
-       
+       if ($settings{'fullscreen'}) {
+               $r->content_type("text/html; charset=utf-8");
+               Sesse::pr0n::Templates::print_template($r, "fullscreen-header", { title => "$name [$event]" });
                while (my $ref = $q->fetchrow_hashref()) {
-                       my $imgsz = "";
-                       my $takenby = $ref->{'takenby'};
-                       if (defined($ref->{'day'})) {
-                                $takenby .= ", " . $ref->{'day'};
-                       }
-
-                       if ($takenby ne $lastupl) {
-                               $lastupl = $takenby;
-                               Sesse::pr0n::Templates::print_template($r, "submittedby", { author => $lastupl });
-                       }
-                       if ($ref->{'width'} != -1 && $ref->{'height'} != -1) {
-                               my $width = $ref->{'width'};
-                               my $height = $ref->{'height'};
-                                       
-                               ($width, $height) = Sesse::pr0n::Common::scale_aspect($width, $height, $thumbxres, $thumbyres);
-                               $imgsz = " width=\"$width\" height=\"$height\"";
-                       }
-
-                       my $filename = $ref->{'filename'};
-                       my $uri = $filename;
-                       if (defined($xres) && defined($yres) && $xres != -1) {
-                               $uri = "${xres}x$yres/$infobox$filename";
-                       } elsif (defined($xres) && $xres == -1) {
-                               $uri = "original/$infobox$filename";
-                       }
-
-                       $r->print("    <p><a href=\"$uri\"><img src=\"${thumbxres}x${thumbyres}/$filename\" alt=\"\"$imgsz /></a>\n");
-                       $r->print("      90 <input type=\"checkbox\" name=\"rot-" .
-                               $ref->{'id'} . "-90\" />\n");
-                       $r->print("      180 <input type=\"checkbox\" name=\"rot-" .
-                               $ref->{'id'} . "-180\" />\n");
-                       $r->print("      270 <input type=\"checkbox\" name=\"rot-" .
-                               $ref->{'id'} . "-270\" />\n");
-                       $r->print("      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .
-                               "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Del <input type=\"checkbox\" name=\"del-" . $ref->{'id'} . "\" /></p>\n");
+                       $r->print("        \"" . $infobox . $ref->{'filename'} . "\",\n");
                }
-               $r->print("      <input type=\"submit\" value=\"Rotate\" />\n");
-               $r->print("    </form>\n");
-       } elsif ($sel == 1) {
-               $r->print("    <form method=\"post\" action=\"/select\">\n");
-               $r->print("      <input type=\"hidden\" name=\"event\" value=\"$event\" />\n");
-       
-               while (my $ref = $q->fetchrow_hashref()) {
-                       my $imgsz = "";
-                       my $takenby = $ref->{'takenby'};
-                       if (defined($ref->{'day'})) {
-                                $takenby .= ", " . $ref->{'day'};
-                       }
 
-                       if ($takenby ne $lastupl) {
-                               $lastupl = $takenby;
-                               Sesse::pr0n::Templates::print_template($r, "submittedby", { author => $lastupl });
-                       }
-                       if ($ref->{'width'} != -1 && $ref->{'height'} != -1) {
-                               my $width = $ref->{'width'};
-                               my $height = $ref->{'height'};
-                                       
-                               ($width, $height) = Sesse::pr0n::Common::scale_aspect($width, $height, $thumbxres, $thumbyres);
-                               $imgsz = " width=\"$width\" height=\"$height\"";
-                       }
+               my %settings_no_fullscreen = %settings;
+               $settings_no_fullscreen{'fullscreen'} = 0;
 
-                       my $filename = $ref->{'filename'};
-                       my $uri = $filename;
-                       if (defined($xres) && defined($yres) && $xres != -1) {
-                               $uri = "${xres}x$yres/$infobox$filename";
-                       } elsif (defined($xres) && $xres == -1) {
-                               $uri = "original/$infobox$filename";
-                       }
+               my $returnurl = "http://" . $r->get_server_name . "/" . $event . "/" .
+                       Sesse::pr0n::Common::get_query_string(\%settings_no_fullscreen, \%defsettings);
 
-                       my $selected = $ref->{'selected'} ? ' checked="checked"' : '';
+               # *whistle*
+               $returnurl =~ s/&amp;/&/g;
 
-                       $r->print("    <p><a href=\"$uri\"><img src=\"${thumbxres}x${thumbyres}/$filename\" alt=\"\"$imgsz /></a>\n");
-                       $r->print("      <input type=\"checkbox\" name=\"sel-" .
-                               $ref->{'id'} . "\"$selected /></p>\n");
-               }
-               $r->print("      <input type=\"submit\" value=\"Select\" />\n");
-               $r->print("    </form>\n");
+               Sesse::pr0n::Templates::print_template($r, "fullscreen-footer", {
+                       vhost => $r->get_server_name,
+                       event => $event,
+                       start => $settings{'start'} - 1,
+                       returnurl => $returnurl,
+                       sel => $settings{'sel'},
+               });
        } else {
-               while (my $ref = $q->fetchrow_hashref()) {
-                       my $imgsz = "";
-                       my $takenby = $ref->{'takenby'};
-                       if (defined($ref->{'day'})) {
-                                $takenby .= ", " . $ref->{'day'};
-                       }
+               Sesse::pr0n::Common::header($r, "$name [$event]");
+               Sesse::pr0n::Templates::print_template($r, "date", { date => $date });
+
+               if (Sesse::pr0n::Overload::is_in_overload($r)) {
+                       Sesse::pr0n::Templates::print_template($r, "overloadmode");
+               }
 
-                       if ($takenby ne $lastupl) {
-                               $r->print("    </p>\n\n") if ($lastupl ne "");
-                               $lastupl = $takenby;
-                               Sesse::pr0n::Templates::print_template($r, "submittedby", { author => $lastupl });
-                               $r->print("    <p>\n");
+               print_thumbsize($r, $event, \%settings, \%defsettings);
+               print_viewres($r, $event, \%settings, \%defsettings);
+               print_pagelimit($r, $event, \%settings, \%defsettings);
+               print_infobox($r, $event, \%settings, \%defsettings);
+               print_nextprev($r, $event, \%settings, \%defsettings);
+               print_selected($r, $event, \%settings, \%defsettings) if ($num_selected > 0);
+               print_fullscreen($r, $event, \%settings, \%defsettings);
+
+               my $toclose = 0;
+               my $lastupl = "";
+               
+               # Print out all thumbnails
+               if ($rot == 1) {
+                       $r->print("    <form method=\"post\" action=\"/rotate\">\n");
+                       $r->print("      <input type=\"hidden\" name=\"event\" value=\"$event\" />\n");
+               
+                       while (my $ref = $q->fetchrow_hashref()) {
+                               my $imgsz = "";
+                               my $takenby = $ref->{'takenby'};
+                               if (defined($ref->{'day'})) {
+                                        $takenby .= ", " . $ref->{'day'};
+                               }
+
+                               if ($takenby ne $lastupl) {
+                                       $lastupl = $takenby;
+                                       Sesse::pr0n::Templates::print_template($r, "submittedby", { author => $lastupl });
+                               }
+                               if ($ref->{'width'} != -1 && $ref->{'height'} != -1) {
+                                       my $width = $ref->{'width'};
+                                       my $height = $ref->{'height'};
+                                               
+                                       ($width, $height) = Sesse::pr0n::Common::scale_aspect($width, $height, $thumbxres, $thumbyres);
+                                       $imgsz = " width=\"$width\" height=\"$height\"";
+                               }
+
+                               my $filename = $ref->{'filename'};
+                               my $uri = $infobox . $filename;
+                               if (defined($xres) && defined($yres) && $xres != -1) {
+                                       $uri = "${xres}x$yres/$infobox$filename";
+                               } elsif (defined($xres) && $xres == -1) {
+                                       $uri = "original/$infobox$filename";
+                               }
+
+                               $r->print("    <p><a href=\"$uri\"><img src=\"${thumbxres}x${thumbyres}/$filename\" alt=\"\"$imgsz /></a>\n");
+                               $r->print("      90 <input type=\"checkbox\" name=\"rot-" .
+                                       $ref->{'id'} . "-90\" />\n");
+                               $r->print("      180 <input type=\"checkbox\" name=\"rot-" .
+                                       $ref->{'id'} . "-180\" />\n");
+                               $r->print("      270 <input type=\"checkbox\" name=\"rot-" .
+                                       $ref->{'id'} . "-270\" />\n");
+                               $r->print("      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .
+                                       "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Del <input type=\"checkbox\" name=\"del-" . $ref->{'id'} . "\" /></p>\n");
                        }
-                       if ($ref->{'width'} != -1 && $ref->{'height'} != -1) {
-                               my $width = $ref->{'width'};
-                               my $height = $ref->{'height'};
-                                       
-                               ($width, $height) = Sesse::pr0n::Common::scale_aspect($width, $height, $thumbxres, $thumbyres);
-                               $imgsz = " width=\"$width\" height=\"$height\"";
+                       $r->print("      <input type=\"submit\" value=\"Rotate\" />\n");
+                       $r->print("    </form>\n");
+               } elsif ($sel == 1) {
+                       $r->print("    <form method=\"post\" action=\"/select\">\n");
+                       $r->print("      <input type=\"hidden\" name=\"event\" value=\"$event\" />\n");
+               
+                       while (my $ref = $q->fetchrow_hashref()) {
+                               my $imgsz = "";
+                               my $takenby = $ref->{'takenby'};
+                               if (defined($ref->{'day'})) {
+                                        $takenby .= ", " . $ref->{'day'};
+                               }
+
+                               if ($takenby ne $lastupl) {
+                                       $lastupl = $takenby;
+                                       Sesse::pr0n::Templates::print_template($r, "submittedby", { author => $lastupl });
+                               }
+                               if ($ref->{'width'} != -1 && $ref->{'height'} != -1) {
+                                       my $width = $ref->{'width'};
+                                       my $height = $ref->{'height'};
+                                               
+                                       ($width, $height) = Sesse::pr0n::Common::scale_aspect($width, $height, $thumbxres, $thumbyres);
+                                       $imgsz = " width=\"$width\" height=\"$height\"";
+                               }
+
+                               my $filename = $ref->{'filename'};
+                               my $uri = $infobox . $filename;
+                               if (defined($xres) && defined($yres) && $xres != -1) {
+                                       $uri = "${xres}x$yres/$infobox$filename";
+                               } elsif (defined($xres) && $xres == -1) {
+                                       $uri = "original/$infobox$filename";
+                               }
+
+                               my $selected = $ref->{'selected'} ? ' checked="checked"' : '';
+
+                               $r->print("    <p><a href=\"$uri\"><img src=\"${thumbxres}x${thumbyres}/$filename\" alt=\"\"$imgsz /></a>\n");
+                               $r->print("      <input type=\"checkbox\" name=\"sel-" .
+                                       $ref->{'id'} . "\"$selected /></p>\n");
                        }
-
-                       my $filename = $ref->{'filename'};
-                       my $uri = $filename;
-                       if (defined($xres) && defined($yres) && $xres != -1) {
-                               $uri = "${xres}x$yres/$infobox$filename";
-                       } elsif (defined($xres) && $xres == -1) {
-                               $uri = "original/$infobox$filename";
+                       $r->print("      <input type=\"submit\" value=\"Select\" />\n");
+                       $r->print("    </form>\n");
+               } else {
+                       while (my $ref = $q->fetchrow_hashref()) {
+                               my $imgsz = "";
+                               my $takenby = $ref->{'takenby'};
+                               if (defined($ref->{'day'})) {
+                                        $takenby .= ", " . $ref->{'day'};
+                               }
+
+                               if ($takenby ne $lastupl) {
+                                       $r->print("    </p>\n\n") if ($lastupl ne "");
+                                       $lastupl = $takenby;
+                                       Sesse::pr0n::Templates::print_template($r, "submittedby", { author => $lastupl });
+                                       $r->print("    <p>\n");
+                               }
+                               if ($ref->{'width'} != -1 && $ref->{'height'} != -1) {
+                                       my $width = $ref->{'width'};
+                                       my $height = $ref->{'height'};
+                                               
+                                       ($width, $height) = Sesse::pr0n::Common::scale_aspect($width, $height, $thumbxres, $thumbyres);
+                                       $imgsz = " width=\"$width\" height=\"$height\"";
+                               }
+
+                               my $filename = $ref->{'filename'};
+                               my $uri = $infobox . $filename;
+                               if (defined($xres) && defined($yres) && $xres != -1) {
+                                       $uri = "${xres}x$yres/$infobox$filename";
+                               } elsif (defined($xres) && $xres == -1) {
+                                       $uri = "original/$infobox$filename";
+                               }
+                               
+                               $r->print("      <a href=\"$uri\"><img src=\"${thumbxres}x${thumbyres}/$filename\" alt=\"\"$imgsz /></a>\n");
                        }
-                       
-                       $r->print("      <a href=\"$uri\"><img src=\"${thumbxres}x${thumbyres}/$filename\" alt=\"\"$imgsz /></a>\n");
+                       $r->print("    </p>\n");
                }
-               $r->print("    </p>\n");
-       }
 
-       print_nextprev($r, $event, \%settings, \%defsettings);
-       Sesse::pr0n::Common::footer($r);
+               print_nextprev($r, $event, \%settings, \%defsettings);
+               Sesse::pr0n::Common::footer($r);
+       }
 
        return Apache2::Const::OK;
 }
@@ -410,7 +449,8 @@ sub print_nextprev {
                my %newsettings = %$settings;
                $newsettings{'start'} = $newstart;
                chomp (my $title = Sesse::pr0n::Templates::fetch_template($r, 'prevpage'));
-               Sesse::pr0n::Common::print_link($r, "$title ($newstart-$newend)\n", "/$event/", \%newsettings, $defsettings);
+               chomp (my $accesskey = Sesse::pr0n::Templates::fetch_template($r, 'prevaccesskey'));
+               Sesse::pr0n::Common::print_link($r, "$title ($newstart-$newend)\n", "/$event/", \%newsettings, $defsettings, $accesskey);
        }
 
        # This
@@ -428,7 +468,8 @@ sub print_nextprev {
                my %newsettings = %$settings;
                $newsettings{'start'} = $newstart;
                chomp (my $title = Sesse::pr0n::Templates::fetch_template($r, 'nextpage'));
-               Sesse::pr0n::Common::print_link($r, "$title ($newstart-$newend)", "/$event/", \%newsettings, $defsettings);
+               chomp (my $accesskey = Sesse::pr0n::Templates::fetch_template($r, 'nextaccesskey'));
+               Sesse::pr0n::Common::print_link($r, "$title ($newstart-$newend)", "/$event/", \%newsettings, $defsettings, $accesskey);
        }
 
        $r->print("    </p>\n");
@@ -463,6 +504,19 @@ sub print_selected {
        
        $r->print('</p>');
 }
+
+sub print_fullscreen {
+       my ($r, $event, $settings, $defsettings) = @_;
+
+       chomp (my $title = Sesse::pr0n::Templates::fetch_template($r, 'fullscreen'));
+
+       my %newsettings = %$settings;
+       $newsettings{'fullscreen'} = 1;
+
+        $r->print("    <p>");
+       Sesse::pr0n::Common::print_link($r, $title, "/$event/", \%newsettings, $defsettings);
+       $r->print("</p>\n");
+}
        
 1;