]> Pileus Git - vpaste/blobdiff - index.cgi
Fix broken pipe message
[vpaste] / index.cgi
index 60978b2c211b3dcfd1ac81a7e83a12f12a701dd0..aacc8751cd754ef7f0562586a87c2f5e33117437 100755 (executable)
--- a/index.cgi
+++ b/index.cgi
@@ -47,7 +47,13 @@ function cut_file {
 # Print out a generic header
 function header {
        echo "Content-Type: $1; charset=UTF-8"
-       echo
+       if [[ "$HTTP_ACCEPT_ENCODING" == *'gzip'* ]]; then
+               echo "Content-Encoding: gzip"
+               echo
+               exec 1> >(gzip)
+       else
+               echo
+       fi
 }
 
 # Print plain message and exit
@@ -64,17 +70,31 @@ function message {
 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
                ;;
+       head)
+               awk -v 'rows=4' -v 'cols=60' '
+                       FNR==1      { gsub(/.*\//, "", FILENAME);
+                                     print FILENAME
+                                     print "-----" }
+                       FNR==1,/^$/ { next }
+                       /\S/        { i++; printf "%."cols"s\n", $0 }
+                       i>=rows     { nextfile  }
+                       ENDFILE     { i=0; print ""  }
+               ' $(ls -t db/*)
+               ;;
+       stat)
+               ls -l --time-style='+%Y %m' db |
+               awk -v 'hdr=Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec' '
+                       BEGIN { printf "%64s\n", hdr }
+                       NR>1  { cnt[$6+0][$7+0]++ }
+                       END   { for (y in cnt) {
+                                 printf "%4d", y
+                                 for (m=1; m<=12; m++)
+                                   printf "%5s", cnt[y][m]
+                                 printf "\n" } }'
+               ;;
        esac
 }
 
@@ -93,7 +113,8 @@ function do_print {
        # Check for raw paste
        if [[ "$QUERY_STRING" == 'raw'* ||
              "$REQUEST_URI"  != *'?'* &&
-             "$HTTP_ACCEPT"  != *'html'* ]]; then
+             ( "$input"       != 'db/'* ||
+               "$HTTP_ACCEPT" != *'html'* ) ]]; then
                header text/plain
                sed "$trim" "$input"
                exit
@@ -132,7 +153,9 @@ function do_upload {
        body=$(cat -)
        spam=$(echo -n "$body" | cut_file "ignoreme")
        text=$(echo -n "$body" | cut_file "(text|x)")
+       bans=$(echo -n "$REMOTE_ADDR" | grep -f blacklist)
        [ ! -z "$spam" ] && message "Spam check.."
+       [ ! -z "$bans" ] && message "You have been banned"
        [   -z "$text" ] && message "No text pasted"
 
        # Format and save message
@@ -141,6 +164,7 @@ function do_upload {
                vim: $(get_modeline)
                Date: $(date -R)
                From: $REMOTE_ADDR
+               User-Agent: $HTTP_USER_AGENT
 
                $text
        EOF
@@ -159,9 +183,10 @@ function do_help {
                sed -n '/^\(syntax\|manual\|synload\|2html\|colortest\|hitest\).vim$/d; s/.vim$//p' |
                sort | uniq
        )
-       uploads=$(ls -t db | head -n 5)
+       uploads=$(ls -t db 2>/dev/null | head -n 5)
        filetype=$(get_param '^(ft|filet(y(pe?)?)?)$')
        vpaste='<a href="vpaste?ft=sh">vpaste</a>'
+       repo='https://lug.rose-hulman.edu/svn/misc/trunk/htdocs/vpaste/'
 
        header text/html
        cat <<-EOF
@@ -173,18 +198,20 @@ function do_help {
                        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
                        <meta name="description" content="vpaste: Vim based pastebin" />
                        <meta name="keywords" content="vpaste,paste,pastebin,vim" />
+                       <meta name="google-site-verification" content="OvHF73zD7osJ1VSq9rJxnMFlja36944ud6CiP_iXQnI" />
                        <style type="text/css">
                                *          { margin: 0;
                                             padding: 0; }
                                body       { margin: 4em 8em 4em 8em;
                                             font-family: sans-serif; }
+                               input      { padding: 2px 6px 3px 6px; }
                                /* Items */
                                textarea   { width: 100%;
                                             margin-bottom: 0.5em; }
                                .buttons   { float: left; }
                                .links     { float: right; }
-                               .links a   { text-decoration: none;
-                                            margin-left: 0.4em; }
+                               .links *   { text-decoration: none;
+                                            margin-left: 0.5em; }
                                .box       { display: none;
                                             clear: both;
                                             margin-top: 2.7em;
@@ -198,24 +225,33 @@ function do_help {
                                span       { font-family: monospace; }
                                .cmds dd   { font-family: monospace; }
                        </style>
-                       <script>
+                       <script type="text/javascript">
+                               //<![CDATA[
                                function show(id) {
-                                       boxes = document.getElementsByClassName('box');
-                                       for (i=0; i<boxes.length; i++) {
-                                               box = boxes[i]
+                                       var boxes = document.getElementsByClassName('box')
+                                       for (var i = 0; i < boxes.length; i++) {
+                                               var box = boxes[i]
                                                if (box.id == id && box.style.display != 'block')
                                                        box.style.display = 'block'
                                                else
                                                        box.style.display = "none"
                                        }
                                }
+                               function autoshow() {
+                                       var id  = document.location.toString().replace(/.*#/, '')
+                                       var box = document.getElementById(id)
+                                       if (box) box.style.display = "block"
+                               }
+                               //]]>
                        </script>
                </head>
 
-               <body>
+               <body onload="autoshow()">
                        <form id="form" method="post" action="" enctype="multipart/form-data">
-                               <input style="display:none" type="text" name="ignoreme" value="" />
-                               <textarea name="text" cols="80" rows="25"></textarea>
+                               <div>
+                                       <input style="display:none" type="text" name="ignoreme" value="" />
+                                       <textarea name="text" cols="80" rows="25"></textarea>
+                               </div>
                                <div class="buttons">
                                        <select onchange="document.getElementById('form').action =
                                                          document.location + '?ft=' + this.value;">
@@ -231,9 +267,10 @@ function do_help {
                                        <input type="submit" value="Paste" />
                                </div>
                                <div class="links">
-                                       <a href="javascript:show('usage'  )">Usage</a>
-                                       <a href="javascript:show('devel'  )">Development</a>
-                                       <a href="javascript:show('uploads')">Uploads</a>
+                                       <a href="">vpaste</a> <span>-</span>
+                                       <a href="#usage"   onclick="show('usage'  )">Usage</a>
+                                       <a href="#devel"   onclick="show('devel'  )">Development</a>
+                                       <a href="#uploads" onclick="show('uploads')">Uploads</a>
                                </div>
                        </form>
 
@@ -257,14 +294,16 @@ function do_help {
                                <p>Options specified when uploading are saved as defaults.</p>
 
                                <dl>
-                                       <dt>ft, filetype={filetype}</dt>
-                                       <dd>A filetype to use for highlighting, see above menu for supported types</dd>
-                                       <dt>fdm, foldmethod=(syntax|indent)</dt>
-                                       <dd>Turn on dynamic code folding</dd>
                                        <dt>bg, background={light|dark}</dt>
                                        <dd>Background color to use for the page</dd>
                                        <dt>et, expandtab</dt>
                                        <dd>Expand tabs to spaces</dd>
+                                       <dt>fdm, foldmethod=(syntax|indent)</dt>
+                                       <dd>Turn on dynamic code folding</dd>
+                                       <dt>ft, filetype={filetype}</dt>
+                                       <dd>A filetype to use for highlighting, see above menu for supported types</dd>
+                                       <dt>nu, number</dt>
+                                       <dd>Add line numbers</dd>
                                        <dt>ts, tabstop=[N]</dt>
                                        <dd>Number of spaces to use for tabs when <b>et</b> is set</dd>
                                        <dt>...</dt>
@@ -275,20 +314,25 @@ function do_help {
                        <div class="box" id="devel">
                                <h1>License</h1>
                                <p>Copyright © 2009-2012
-                                  Andy spencer &lt;andy753421@gmail.com&gt;</p>
-                               <p>See individual files for license</p>
+                                  Andy Spencer &lt;andy753421@gmail.com&gt;</p>
+                               <p>See individual files for licenses</p>
 
                                <h1>Source code</h1>
-                               <ul>
-                                       <li><a href="vpaste?ft=sh">vpaste</a></li>
-                                       <li><a href="index.cgi?ft=sh">index.cgi</a>
+                               <dl>
+                                       <dt>Client</dt>
+                                       <dd><a href="vpaste?ft=sh">vpaste</a></dd>
+                                       <dt>Server</dt>
+                                       <dd><a href="index.cgi?ft=sh">index.cgi</a>
                                            <a href="vimrc?ft=vim">vimrc</a>
                                            <a href="htaccess?ft=apache">htaccess</a>
                                            <a href="robots.txt?ft=robots">robots.txt</a>
-                                           <a href="sitemap.xml?ft=xml">sitemap.xml</a></li>
-                                       <li><a href="2html.patch?ft=diff">2html.patch</a></li>
-                                       <li><a href="https://lug.rose-hulman.edu/svn/misc/trunk/htdocs/vpaste/">Subversion</a></li>
-                               </ul>
+                                           <a href="sitemap.xml?ft=xml">sitemap.xml</a>
+                                           <a href="blacklist?raw">blacklist</a></dd>
+                                       <dt>Patches</dt>
+                                       <dd><a href="2html.patch?ft=diff">2html.patch</a></dd>
+                                       <dt>Subversion</dt>
+                                       <dd><a href="$repo">$repo</a></dd>
+                               </dl>
 
                                <h1>Bugs</h1>
                                <ul>
@@ -309,6 +353,7 @@ function do_help {
                                </ul>
                                <p><a href="ls">list all</a></p>
                                <p><a href="head">sample all</a></p>
+                               <p><a href="stat">statistics</a></p>
                        </div>
                </body>
        </html>
@@ -325,6 +370,8 @@ if [ "$pathinfo" = ls ]; then
        do_cmd ls
 elif [ "$pathinfo" = head ]; then
        do_cmd head
+elif [ "$pathinfo" = stat ]; then
+       do_cmd stat
 elif [ "$pathinfo" ]; then
        do_print "$pathinfo"
 elif [ "$CONTENT_TYPE" ]; then