lib/Odin.pm, mason/pastebin/dhandler: Apply a size limit on pastes.
[odin-cgi] / mason / pastebin / dhandler
index 7f6ea24..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
@@ -22,7 +29,8 @@
              $m->print($old{content});
            } else {
              $edit = $Odin::COOKIE{"odin-handoff.$tag"};
-             $m->comp("%show", tag => $tag, edit => $edit, %old);
+             $m->comp("%show", tag => $tag,
+                      honc => $honc, edit => $edit // $honc, %old);
            }
          } else {
            if ($op eq "del") {
            } else {
              set_handoff_cookie $tag, $edit;
              my $editp = Odin::update_pastebin $tag, $edit, %props;
-             if ($editp) { $m->redirect("$Odin::PASTEBIN/$tag"); }
-             else { $m->comp("%edit", tag => $tag, edit => $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>