chiark / gitweb /
mason/pastebin/%show: Don't flush FS buffers in `filter' child.
[odin-cgi] / mason / pastebin / dhandler
index 7014dcab4fd88e3b91cdcfc14f140187617e28cd..42c91283658dac4313354172c308c13e39d11662 100644 (file)
@@ -1,3 +1,27 @@
+%# -*-html-*-
+%#
+%# Pastebin creation webservice for Odin
+%#
+%# (c) 2015 Mark Wooding
+%#
+%#----- Licensing notice ----------------------------------------------------
+%#
+%# This file is part of the `odin.gg' service, `odin-cgi'.
+%#
+%# `odin-cgi' is free software; you can redistribute it and/or modify
+%# it under the terms of the GNU Affero General Public License as
+%# published by the Free Software Foundation; either version 3 of the
+%# License, or (at your option) any later version.
+%#
+%# `odin-cgi' is distributed in the hope that it will be useful,
+%# but WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%# GNU Affero General Public License for more details.
+%#
+%# You should have received a copy of the GNU Affero General Public
+%# License along with `odin-cgi'; if not, see
+%# <http://www.gnu.org/licenses/>.
+%#
 <%perl>
        my $tag = $m->dhandler_arg;
 
@@ -7,6 +31,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 +52,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 +87,7 @@
        $edit => undef
        $lang => undef
        $title => undef
+       $honc => undef
        $op => "edit"
 </%args>
 %#
@@ -64,8 +100,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>