#!/bin/ksh # www->gopher # Make your SDF gopherspace visible inside your SDF webspace # Copyright (c) 2010 Claudio Calvelli <intercal at sdf>; # see below for information about copying, redistributing, etc. # Please include the word GOPHER in the subject if sending email, so # it doesn't get deleted as spam by mistake # To install: copy into your webspace (make sure you make it executable # and the name ends in ".cgi"); access the corresponding URL and make # sure it works; link to it. For example, if installed as "gopher.cgi" # at the top of your webspace, it will be accessible as # http://(your username).freeshell.org/gopher.cgi # the script handles subdirectories in your gopher space automatically; # however they must contain a "gophermap" file (it would be easy to modify # this so it does not need a "gophermap", however I don't need it so # I haven't - subject to the conditions below, feel free to make the # necessary changes). # Permission is hereby granted to use, misuse, modify, distribute, break, # fix again, etcetera, this software, provided that the following conditions # are met: # 1. Redistributions of this software must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. As the software is a shel script, it is normally not possible to # distribute it in binary (non human readable) form; however, if # such binary distribution is possible, it must reproduce the above # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. # 3. Neither the name of the Author nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. if [ "$HTTP_HOST" = '' ] then echo 3 echo "3 You appear to be accessing this via gopher. This is a" echo "3 www to gopher gateway, and you do not need it." exit 0 fi path="$PATH_INFO" case "$path" in */.*|.*) echo "Status: 403 Forbidden" echo "Content-Type: text/plain" echo echo "Sorry, you do not have permission to access that" exit 0 ;; esac user="`whoami`" full_path="/ftp/pub/users/$user/$path" if [ -x "$full_path" ] then case "$path" in *.cgi) exec "$full_path" ;; esac fi if [ -f "$full_path" ] then echo "Status: 200 OK" echo "Content-Type: text/plain" echo cat "$full_path" exit 0 fi if ! [ -d "$full_path" ] then echo "Status: 404 Not found" echo "Content-Type: text/plain" echo echo "Sorry, the path you requested was not found" exit 0 fi case "$path" in */) ;; *) echo 'Status: 301 Moved permanently' echo 'Content-Type: text/html; charset=iso-8859-1' echo "Location: http://$HTTP_HOST$REQUEST_URI/" echo '' echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">' echo '<html><head>' echo '<title>301 Moved Permanently</title>' echo '</head><body>' echo '<h1>Moved Permanently</h1>' echo '<p>The document has moved' echo '<a href="http://'"$HTTP_HOST$REQUEST_URI/"'">here</a>.</p>' echo '</body></html>' exit 0 ;; esac echo "Status: 200 OK" echo "Content-Type: text/html" echo echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"' echo ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">' echo '<head>' echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' echo "<title>Index of $path</title>" echo '</head>' echo '<body>' echo '<p>' export IFS=' ' dq='"' while read name file host port do if [ "$host" != '' ] then [ "$port" = '' ] || port=":$port" type="`echo "$name" | dd bs=1 count=1 2>/dev/null`" echo "<a href=${dq}gopher://$host$port/$type$file$dq>${name#?}</a> (gopher link, may not work in your browser)<br />" else if [ "$file" = '' ] then [ "$name" = '' ] && name=' ' echo "$name<br />" else case "$name" in 1*) echo "<a href=$dq$base$file$dq>${name#1}/</a><br />" ;; *) echo "<a href=$dq$base$file$dq>${name#?}</a><br />" ;; esac fi fi done < "$full_path/gophermap" echo '</p>' echo '</body>' echo '</html>'