diff options
| author | hallgren <hallgren@chalmers.se> | 2011-10-12 17:03:54 +0000 |
|---|---|---|
| committer | hallgren <hallgren@chalmers.se> | 2011-10-12 17:03:54 +0000 |
| commit | 44d1a5a9f71b03d9aceeccd760a63fcdc45f8bad (patch) | |
| tree | d51076a708997d6f1af6ac0deefd535bbc25f804 /src/www/gfse/upload.cgi | |
| parent | 0aba45560d2033c37c3d2e876e6f3ef89e1554d6 (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.cgi | 252 |
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 |
