X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=index.cgi;h=b2d95504b86e1c5b0184a9e73564137c1ad13a1e;hb=b1c4dcda3d4905135be48101c14d1459daaea05a;hp=cdfaa82dd40f1c8d84688153d1f1facaeae8b3bb;hpb=2516370bb6cf090e03e99e54eab243330971247e;p=vpaste diff --git a/index.cgi b/index.cgi index cdfaa82..b2d9550 100755 --- a/index.cgi +++ b/index.cgi @@ -12,7 +12,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# Remove url codings form stdin +# Remove url codings from stdin function get_modeline { modeline=$( echo "$QUERY_STRING" | @@ -25,13 +25,14 @@ function get_modeline { # Extract an uploaded file from standard input # $1 is the boundary delimiter for the file function cut_file { - awk " - /--$1/ {st=1}; - st==2 {print \$0}; - /$1--/ {st=0}; - /^\\r$/ && st==1 {st=2}; - " | head -c -2 + 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 } # Print out a generic header @@ -40,13 +41,31 @@ function header { echo } +# 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 + 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 @@ -62,17 +81,21 @@ function do_print { sed "1a$(get_modeline)" "$input" > "$tmp" # - I have some plugins in ~/.vim - # - Run ex in screen to trick it into thinking that it - # has a real terminal, not that we also have to set + # - Run ex in a pty to trick it into thinking that it + # has a real terminal, note that we also have to set # term=xterm-256color in vimrc HOME=/home/andy \ - screen -D -m ex -u vimrc \ + /home/andy/bin/pty 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/ //g' \ + '+%s/\r//g' \ '+TOhtml' \ "+sav! $output" \ '+qall!' \ - "$tmp" + "$tmp" /dev/null 2>&1 header text/html cat "$output" @@ -86,40 +109,76 @@ function do_print { # Upload handler function do_upload { + text=$(cut_file "$1") + if [ -z "$text" ]; then + header text/plain + echo "No text pasted" + exit + fi output="$(mktemp db/XXXXX)" - uri="$SCRIPT_URI$(basename "$output")${QUERY_STRING:+"?"}" - (get_modeline; cut_file "$1") > "$output" - echo "Status: 302 Found" - echo "Location: $uri" - header text/plain - echo "$uri" + uri="$url$(basename "$output")${QUERY_STRING:+"?"}" + + # 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{72,files}/syntax/ /home/andy/.vim/after/syntax/ | - sed -n 's/.vim$//p' | sort | uniq + 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 ) -uploads=$(ls -t db | head -n 5 | sed "s!^!$SCRIPT_URI!") +uploads=$(ls -t db | head -n 5) header text/html cat - < + + -
- -
+
+ - + +
-

NAME

-

vpaste: Vim enabled pastebin

+

vpaste: Vim based pastebin

SYNOPSIS

+
 vpaste file [option=value,..]
 <command> | vpaste [option=value,..]
-
-
 <command> | curl -F 'x=<-' $SCRIPT_URI[?option=value,..]
+
+
 <command> | curl -F 'x=<-' $url[?option=value,..]
+
+
 :map vp :exec "w !vpaste ft=".&ft<CR>
+
 :vmap vp <ESC>:exec "'<,'>w !vpaste ft=".&ft<CR>
+

DESCRIPTION

Add ?[option[=value],..] to make your text a rainbow.

@@ -159,31 +223,53 @@ cat - <See :help modeline for more information +

BUGS

+ +

SOURCE

LATEST UPLOADS

- + +

list all

+

sample all

EOF } # Main -pathinfo="${SCRIPT_URL/*vpaste\/}" +url="http://$HTTP_HOST${REQUEST_URI/\?*}" +pathinfo="${REQUEST_URI/*\/}" +pathinfo="${pathinfo/\?*}" -if [ "$pathinfo" ]; then +if [ "$pathinfo" = ls ]; then + do_cmd ls +elif [ "$pathinfo" = head ]; then + do_cmd head +elif [ "$pathinfo" ]; then do_print "$pathinfo" elif [ "$CONTENT_TYPE" ]; then - do_upload ${CONTENT_TYPE/*boundary\=/} + do_upload "${CONTENT_TYPE/*boundary\=/}" else do_help fi