lib/Odin.pm, mason/pastebin/dhandler: Apply a size limit on pastes.
[odin-cgi] / mason / pastebin / dhandler
index 7014dca..8583981 100644 (file)
@@ -7,6 +7,13 @@
            -path => "$Odin::PASTEBIN_PATH/", %attr;
        }
 
+       sub hasuff ($) {
+         my ($edit) = @_;
+         return $Odin::COOKIE{"odin-cookie-probe"} ? "" : "?honc=$edit";
+       }
+
+       Odin::bake_cookie $r, "odin-cookie-probe=t";
+
        my %props = (
          lang => $lang, title => $title,
          content => Odin::tidy_pastebin_content $content
@@ -21,8 +28,9 @@
              $r->content_type("text/plain; charset=utf8");
              $m->print($old{content});
            } else {
-             $m->comp("%show", tag => $tag, %old,
-                      edit => $Odin::COOKIE{"odin-handoff.$tag"});
+             $edit = $Odin::COOKIE{"odin-handoff.$tag"};
+             $m->comp("%show", tag => $tag,
+                      honc => $honc, edit => $edit // $honc, %old);
            }
          } else {
            if ($op eq "del") {
              set_handoff_cookie $tag, "nil", -max_age => 5;
              $m->redirect("$Odin::PASTEBIN/");
            } else {
-             my $editp = Odin::update_pastebin $tag, $edit, %props;
              set_handoff_cookie $tag, $edit;
-             if ($editp) { $m->redirect("$Odin::PASTEBIN/$tag"); }
-             else { $m->comp("%edit", tag => $tag, edit => $edit, %props); }
+             my $editp = Odin::update_pastebin $tag, $edit, %props;
+             if ($editp) {
+               $m->redirect("$Odin::PASTEBIN/$tag" . hasuff $edit);
+             } else {
+               $m->comp("%edit", tag => $tag, edit => $edit, %props);
+             }
            }
          }
        } elsif (defined $content) {
          ($tag, $edit) = Odin::new_pastebin %props;
          set_handoff_cookie $tag, $edit;
-         $m->redirect("$Odin::PASTEBIN/$tag");
+         $m->redirect("$Odin::PASTEBIN/$tag" . hasuff $edit);
        } else {
          Odin::path_info($r) =~ m:/$:
            or $m->redirect("$Odin::PASTEBIN/", 301);
@@ -52,6 +63,7 @@
        $edit => undef
        $lang => undef
        $title => undef
+       $honc => undef
        $op => "edit"
 </%args>
 %#
@@ -64,8 +76,17 @@ tag &lsquo;<% $tag %>&rsquo; not found
 </%args>
 </%def>
 %#
+<%def .badpaste>
+<&| SELF:error, status => 400 &>\
+invalid paste content
+</&>
+<%args>
+       $tag
+</%args>
+</%def>
+%#
 <%def .badhash>
-<&| SELF:error, status => 404 &>\
+<&| SELF:error, status => 403 &>\
 incorrect edit key
 </&>
 <%args>