summaryrefslogtreecommitdiff
path: root/src/www/gfse/upload.cgi
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2011-10-12 17:03:54 +0000
committerhallgren <hallgren@chalmers.se>2011-10-12 17:03:54 +0000
commit44d1a5a9f71b03d9aceeccd760a63fcdc45f8bad (patch)
treed51076a708997d6f1af6ac0deefd535bbc25f804 /src/www/gfse/upload.cgi
parent0aba45560d2033c37c3d2e876e6f3ef89e1554d6 (diff)
Improvements of "gf -server" mode and related setup
"gf -server" mode now contains everything needed to run the minibar and the grammar editor (including example-based grammar writing). The Setup.hs script installs the required files where gf -server can find them. These files have been moved to a new directory: src/www. The separate server program pgf-http is now obsolete.
Diffstat (limited to 'src/www/gfse/upload.cgi')
-rw-r--r--src/www/gfse/upload.cgi252
1 files changed, 252 insertions, 0 deletions
diff --git a/src/www/gfse/upload.cgi b/src/www/gfse/upload.cgi
new file mode 100644
index 000000000..87b868f53
--- /dev/null
+++ b/src/www/gfse/upload.cgi
@@ -0,0 +1,252 @@
+#!/bin/bash
+
+bin=/Users/hallgren/www/bin
+
+charset="UTF-8"
+AUTOHEADER=no
+
+. $bin/cgistart.sh
+export LC_CTYPE="UTF-8"
+style_url="editor.css"
+
+tmp="$documentRoot/tmp"
+
+make_dir() {
+ dir="$(mktemp -d "$tmp/gfse.XXXXXXXXXX")"
+# chmod a+rxw "$dir"
+ chmod a+rx "$dir"
+ cp "grammars.cgi" "$dir"
+}
+
+
+check_grammar() {
+ pagestart "Uploaded"
+# echo "$PATH_INFO"
+ chgrp everyone "$dir"
+ chmod g+ws "$dir"
+ umask 002
+# files=( $(Reg from-url | LC_CTYPE=sv_SE.ISO8859-1 ./save "$dir") )
+ files=( $(LC_CTYPE=sv_SE.ISO8859-1 ./save "$dir") )
+ gffiles=( )
+ otherfiles=( )
+ for f in ${files[*]} ; do
+ case "$f" in
+ *.gf) gffiles=( ${gffiles[*]} "$f" ) ;;
+ *) otherfiles=( ${otherfiles[*]} "$f" ) ;;
+ esac
+ done
+
+ if [ ${#otherfiles} -gt 0 -a -n "$PATH_INFO" ] ; then
+ echo "Use the following link for shared access to your grammars from multiple devices:"
+ begin ul
+ case "$SERVER_PORT" in
+ 80) port="" ;;
+ *) port=":$SERVER_PORT"
+ esac
+ parent="http://$SERVER_NAME$port${REQUEST_URI%/upload.cgi/tmp/gfse.*}"
+ cloudurl="$parent/share.html#${dir##*/}"
+ li; link "$cloudurl" "$cloudurl"
+ end
+ #begin dl
+ #dt ; echo "◂"; link "javascript:history.back()" "Back to Editor"
+ #end
+ fi
+
+ cd $dir
+ if [ ${#gffiles} -gt 0 ] ; then
+ begin pre
+ echo "gf -s -make ${gffiles[*]}"
+ if gf -s -make ${gffiles[*]} 2>&1 ; then
+ end
+ h3 OK
+ begin dl
+ [ -z "$minibar_url" ] || { dt; echo "▸"; link "$minibar_url?/tmp/${dir##*/}/" "Minibar"; }
+ [ -z "$transquiz_url" ] || { dt; echo "▸"; link "$transquiz_url?/tmp/${dir##*/}/" "Translation Quiz"; }
+ [ -z "$gfshell_url" ] || { dt; echo "▸"; link "$gfshell_url?dir=${dir##*/}" "GF Shell"; }
+ dt ; echo "◂"; link "javascript:history.back()" "Back to Editor"
+
+ end
+ sed=();
+ for pgf in *.pgf ; do
+ sed=("${sed[@]}" -e "s%$pgf%<a href=\"${dir##*/}/$pgf\">$pgf</a>%")
+ done
+ begin pre
+ ls -l *.pgf | sed "${sed[@]}"
+ end
+ else
+ end
+ begin h3 class=error_message; echo Error; end
+ for f in ${gffiles[*]} ; do
+ h4 "$f"
+ begin pre class=plain
+ cat -n "$f"
+ end
+ done
+ fi
+ fi
+ begin div class=footer
+ hr
+ date
+ end
+# begin pre ; env
+ endall
+}
+
+error400() {
+ echo "Status: 400"
+ pagestart "Error"
+ echo "What do you want?"
+ endall
+}
+
+error404() {
+ echo "Status: 404"
+ pagestart "Not found"
+ echo "Not found"
+ endall
+}
+
+if [ -z "$tmp" ] || ! [ -d "$tmp" ] ; then
+ pagestart "Error"
+ begin pre
+ echo "upload.cgi is not properly configured:"
+ if [ -z "$tmp" ] ; then
+ echo "cgiconfig.sh must define tmp"
+ elif [ ! -d "$tmp" ] || [ ! -w "$tmp" ] ; then
+ echo "$tmp must be a writeable directory"
+ fi
+ # cgiconfig.sh should define minibar & gfshell to allow grammars to be tested.
+ endall
+else
+case "$REQUEST_METHOD" in
+ POST)
+ case "$PATH_INFO" in
+ /tmp/gfse.*)
+ style_url="../../$style_url"
+ dir="$tmp/${PATH_INFO##*/}"
+ check_grammar
+ ;;
+ *)
+ make_dir
+ echo >&2 "Using temporary directory $dir"
+ check_grammar
+ rm -rf "$dir"
+ esac
+ ;;
+ GET)
+ case "$QUERY_STRING" in
+ dir) make_dir
+ ContentType="text/plain"
+ cgiheaders
+ echo_n "/tmp/${dir##*/}"
+ ;;
+ ls=*)
+ dir=$(qparse "$QUERY_STRING" ls)
+ case "$dir" in
+ /tmp/gfse.*) # shouldn't allow .. in path !!!
+ path="$documentRoot$dir"
+ if [ -d "$path" ] ; then
+ ContentType="text/plain; charset=$charset"
+ cgiheaders
+ cd "$path"
+ shopt -s nullglob
+ echo_n *-*.json
+ else
+ error404
+ fi
+ ;;
+ *) error400
+ esac
+ ;;
+ rmdir=*)
+ dir=$(qparse "$QUERY_STRING" rmdir)
+ case "$dir" in
+ /tmp/gfse.*) # shouldn't allow .. in path !!!
+ path="$documentRoot$dir"
+ if [ -d "$path" ] ; then
+ ContentType="text/plain; charset=$charset"
+ cgiheaders
+ if [ -h "$path" ] ; then
+ cd "$path"
+ cd ..
+ rm "$path"
+ else
+ cd "$path"
+ shopt -s nullglob
+ rm *.gf *.gfo *-*.json *.pgf grammars.cgi
+ cd ..
+ rmdir "$path"
+ fi
+ newdir=$(qparse "$QUERY_STRING" newdir)
+ case "$newdir" in
+ /tmp/gfse.*) # shouldn't allow .. in path !!!
+ newnode="${newdir##*/}"
+ oldnode="${path##*/}"
+ ln -s "$newnode" "$oldnode"
+ esac
+ else
+ error404
+ fi
+ ;;
+ *) error400
+ esac
+ ;;
+ download=*)
+ file=$(qparse "$QUERY_STRING" download)
+ case "$file" in
+ /tmp/gfse.*/*.json) # shouldn't allow .. in path !!!
+ path="$documentRoot$file"
+ if [ -r "$path" ] ; then
+ ContentType="text/javascript; charset=$charset"
+ cgiheaders
+ cat "$path"
+ else
+ error404
+ fi
+ ;;
+ *) error400
+ esac
+ ;;
+ rm=*)
+ file=$(qparse "$QUERY_STRING" rm)
+ case "$file" in
+ /tmp/gfse.*/*.json) # shouldn't allow .. in path !!!
+ path="$documentRoot$file"
+ if [ -r "$path" ] ; then
+ ContentType="text/javascript; charset=$charset"
+ cgiheaders
+ rm "$path"
+ else
+ error404
+ fi
+ ;;
+ *) error400
+ esac
+ ;;
+ cc=*)
+ # Just to check an expression for syntax errors
+ exp=$(qparse "$QUERY_STRING" cc)
+ ContentType="text/plain; charset=$charset"
+ cgiheaders
+ echo "cc $exp" | GF_RESTRICTED=True gf -run
+ ;;
+ "")
+ case "$PATH_INFO" in
+ /tmp/gfse.*/*.pgf)
+ path="$documentRoot$PATH_INFO"
+ if [ -r $path ] ; then
+ ContentType="application/binary"
+ cgiheaders
+ cat "$path"
+ else
+ error404
+ fi
+ ;;
+ *)
+ error400
+ esac
+ ;;
+ *) error400
+ esac
+esac
+fi