X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=index.cgi;h=f1b8b15c0a99533fa6fcc59dde43912448c9f1ed;hb=48424c1f3911da6d417e3190623d68ee041daba7;hp=76915a726450c7f7cfa001e7dcb98140849d4619;hpb=6b783ffc5cc3ad1b49bc1d35ea4579b169f4bed7;p=vpaste diff --git a/index.cgi b/index.cgi index 76915a7..f1b8b15 100755 --- a/index.cgi +++ b/index.cgi @@ -1,21 +1,21 @@ #!/bin/bash -# Copyright (C) 2009 Andy Spencer +# Copyright (C) 2009-2011 Andy Spencer # -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# This program 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. # -# This program 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 General Public License for more details. +# This program 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. # Remove url codings from stdin function get_modeline { modeline=$( - echo "$QUERY_STRING" | + echo "$QUERY_STRING" | sed -e 's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g; s/[,&]/ /g' | xargs echo -e ) @@ -23,16 +23,25 @@ function get_modeline { } # Extract an uploaded file from standard input -# $1 is the boundary delimiter for the file +# $2 is the name of the input to extract function cut_file { - awk -v "bnd=$1" '{ - if ($0 == "--"bnd"\r") { st=1; } - if ($0 == "--"bnd"--\r") { st=0; } - if (st == 2) { print $0; } - if ($0 == "\r" && st == 1) { st=2; } - }' | head -c -2 | head -c $((128*1024)) - # Remove trailing ^M's that come with CGI - # Limit size to 128K + bnd="${CONTENT_TYPE/*boundary\=/}" + awk -v "want=$1" -v "bnd=$bnd" ' + BEGIN { RS="\r\n" } + + # reset based on boundaries + $0 == "--"bnd"" { st=1; next; } + $0 == "--"bnd"--" { st=0; next; } + $0 == "--"bnd"--\r" { st=0; next; } + + # search for wanted file + st == 1 && $0 ~ "^Content-Disposition:.* name=\""want"\"" { st=2; next; } + st == 1 && $0 == "" { st=9; next; } + + # wait for newline, then start printing + st == 2 && $0 == "" { st=3; next; } + st == 3 { print $0 } + ' | head -c $((128*1024)) # Limit size to 128K } # Print out a generic header @@ -41,13 +50,31 @@ function header { echo } -# Format a file for viewing +# List previous pastes +function do_cmd { +header text/plain +case "$1" in +head) + for i in $(ls -t db/*); do + basename $i + basename $i | sed 's/./-/g' + sed '1,/^$/d; /^\s*$/d' $i | sed -n '1,5s/\(.\{0,60\}\).*/\1/p' + echo + done + ;; +ls) + ls -t db | column + ;; +esac +} + +# Format a file for viewing function do_print { if [ -f "./$1" ]; then input="$1" elif [ -f "db/$1" ]; then input="db/$1" - trim='1d' # sed command to remove cruft + trim='1,/^$/d' # sed command to remove cruft else echo "Status: 404 Not Found" header text/plain @@ -60,7 +87,7 @@ function do_print { # Create a temp file with the provided modeline output="$(mktemp)" tmp="$(mktemp)" - sed "1a$(get_modeline)" "$input" > "$tmp" + sed "\$a$(get_modeline)" "$input" > "$tmp" # - I have some plugins in ~/.vim # - Run ex in screen to trick it into thinking that it @@ -68,19 +95,19 @@ function do_print { # term=xterm-256color in vimrc HOME=/home/andy \ screen -D -m ex -nXZ -i NONE -u vimrc \ - '+set bexpr= fde= fdt= fex= inde= inex= key= pa= pexpr' \ - '+set iconstring= ruf= stl= tal=' \ - "+set titlestring=$1\ -\ vpaste.net" \ - '+set noml' \ - '+2d|'$trim \ - '+%s/\r//g' \ - '+TOhtml' \ + '+sil! set fde= fdt= fex= inde= inex= key= pa= pexpr=' \ + '+sil! set iconstring= ruf= stl= tal=' \ + "+sil! set titlestring=$1\ -\ vpaste.net" \ + '+sil! set noml' \ + '+sil! $d|'$trim \ + '+sil! %s/\r//g' \ + '+sil! TOhtml' \ "+sav! $output" \ '+qall!' \ "$tmp" header text/html - cat "$output" + cat "$output" rm "$tmp" "$output" else header text/plain @@ -91,7 +118,14 @@ function do_print { # Upload handler function do_upload { - text=$(cut_file "$1") + body=$(cat -) + spam=$(echo -n "$body" | cut_file "ignoreme") + text=$(echo -n "$body" | cut_file "(text|x)") + if [ ! -z "$spam" ]; then + header text/plain + echo "Spam check.." + exit + fi if [ -z "$text" ]; then header text/plain echo "No text pasted" @@ -99,17 +133,38 @@ function do_upload { fi output="$(mktemp db/XXXXX)" uri="$url$(basename "$output")${QUERY_STRING:+"?"}" - (get_modeline; echo "$text") > "$output" - echo "Status: 302 Found" - echo "Location: $uri" - header text/plain - echo "$uri" + + # Format, spam check, and save message + ( + get_modeline + echo "Date: $(date -R)" + echo "From: $REMOTE_ADDR" + echo + echo "$text" + ) | HOME=/home/vpaste spamc -E > "$output" + + # Test for spam + if [ "$?" -ne 0 ]; then + # Report spam + header text/plain + echo "Your post has been marked as spam!" + echo "Spam test results are as folllows.. " + echo + cat "$output" + mv "$output" spam + else + # Redirect user + echo "Status: 302 Found" + echo "Location: $uri" + header text/plain + echo "$uri" + fi } # Default index page function do_help { filetypes=$( - ls /usr/share/vim/vim*/syntax/ /home/andy/.vim/after/syntax/ | + ls /usr/share/vim/vim*/syntax/ /home/andy/.vim/syntax/ | sed -n '/^\(syntax\|manual\|synload\|2html\|colortest\|hitest\).vim$/d; s/.vim$//p' | sort | uniq ) @@ -138,6 +193,7 @@ cat - <
+