Various changes:

- New generic http_redirect function, and two shortcuts for 303: post_redirect and 301: perm_redirect
- Allow get_lib_file to take a default value, and change where master_template is set.
- Fix bugs in auth code and properly trim ^M from post data.
- Other cosmetic/minor improvements.
This commit is contained in:
uriel 2009-01-25 13:56:53 +01:00
parent 6b8aa06dbb
commit b25406c592
2 changed files with 33 additions and 23 deletions

View File

@ -9,13 +9,15 @@ fn dprintvars { { for(v in $*) { echo -n $v^'#'^$#$v^'=' $$v '; ' }; echo } >[1
fn escape_html { sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g' $* } fn escape_html { sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g' $* }
fn perm_redirect { fn http_redirect {
echo 'Status: 301 Moved Permanantly echo 'Status: '^$2^'
Location: '^$1^' Location: '^$1^'
' '
exit exit
} }
fn perm_redirect { http_redirect $1 '301 Moved Permanantly' }
fn post_redirect { http_redirect $1 '303 See Other' }
fn static_file { fn static_file {
echo 'Content-Type: '`{select_mime $1} echo 'Content-Type: '`{select_mime $1}
@ -33,7 +35,7 @@ fn load_post_args {
ifs='=' { pair=`{echo -n $pair} } ifs='=' { pair=`{echo -n $pair} }
n='post_arg_'^`{echo $pair(1)|tr -cd 'a-zA-Z0-9_'} n='post_arg_'^`{echo $pair(1)|tr -cd 'a-zA-Z0-9_'}
post_args=( $post_args $n ) post_args=( $post_args $n )
$n=`{echo -n $pair(2) | urldecode} ifs=() { $n=`{echo -n $pair(2)|urldecode|tr -d ' '} }
} }
pair=() pair=()
} }
@ -171,6 +173,19 @@ fn ll_add {
############################################## ##############################################
# Werc-specific functions # Werc-specific functions
fn get_lib_file {
if(! ~ $#sitedir 0 && test -f $sitedir/_werc/lib/$1)
echo -n $sitedir/_werc/lib/$1
if not if(! ~ $#masterSite 0 && test -f $sitesdir/$masterSite/_werc/lib/$1)
echo -n $sitesdir/$masterSite/_werc/lib/$1
if not if(test -f lib/$1)
echo -n lib/$1
if not if(~ $#* 2)
echo -n $2
if not
status='Can''t find lib file: '$1
}
fn template { awk -f bin/template.awk $* | rc $rcargs } fn template { awk -f bin/template.awk $* | rc $rcargs }
# Auth code # Auth code
@ -185,10 +200,14 @@ fn login_user {
# Check loggin status, if called with group arg we check membership too # Check loggin status, if called with group arg we check membership too
fn check_user { fn check_user {
if(! get_user) get_user
_status='Not logged in:' $status _status=$status
if not if(! ~ $#* 0 && ! grep -s '^'^$logged_user^'$' etc/groups/$*) if(! ~ $#_status 0 )
_status=User $logged_user not in groups $* _status=(Not logged in: $"_status)
if not if(! ~ $#* 0 && ! grep -s '^'^$logged_user^'$' etc/groups/$*) {
dprint NOT IN GROUP
_status=(User $logged_user not in groups $*)
}
status=$_status status=$_status
} }
@ -223,11 +242,11 @@ fn auth_user {
pfile='etc/users/'^$"user_name^'/password' pfile='etc/users/'^$"user_name^'/password'
if(~ $#user_name 0 || ~ $#user_password 0) if(~ $#user_name 0 || ~ $#user_password 0)
status='Auth: missing user name or pass: '^$"user_name^' / '^$"user_password status=('Auth: missing user name or pass: '^$"user_name^' / '^$"user_password)
if not if(! test -f $pfile) if not if(! test -f $pfile)
status='Auth: cant find '^$pfile status=('Auth: cant find '^$pfile)
if not if(! ~ $user_password `{cat $pfile}) if not if(! ~ $user_password `{cat $pfile})
status='Auth: Pass '$user_password' doesnt match '^`{cat $pfile} status=('Auth: Pass '$user_password' doesnt match '^`{cat $pfile})
if not { if not {
logged_user=$user_name logged_user=$user_name
logged_password=$user_password logged_password=$user_password

View File

@ -4,15 +4,6 @@ cd ..
forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]' forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]'
fn get_lib_file {
if(test -f $sitedir/_werc/lib/$1)
echo -n $sitedir/_werc/lib/$1
if not if(! ~ $#masterSite 0 && test -f $sitesdir/$masterSite/_werc/lib/$1)
echo -n $sitesdir/$masterSite/_werc/lib/$1
if not if(test -f lib/$1)
echo -n lib/$1
}
# Expected input: ls -F style, $sitedir/path/to/files/ # Expected input: ls -F style, $sitedir/path/to/files/
# <ls -F+x><symlink hack><Useless?><hiden files > # <ls -F+x><symlink hack><Useless?><hiden files >
dirfilter='s/\*$//; s,/+\./+,/,g; s,^\./,,; /\/[._][^\/]/d; /'^$forbidden_uri_chars^'/d; /^\/(robots|sitemap)\.txt$|\/index\.(md|html|txt|tpl)$/d; /_werc\/?$/d; ' dirfilter='s/\*$//; s,/+\./+,/,g; s,^\./,,; /\/[._][^\/]/d; /'^$forbidden_uri_chars^'/d; /^\/(robots|sitemap)\.txt$|\/index\.(md|html|txt|tpl)$/d; /_werc\/?$/d; '
@ -132,19 +123,19 @@ fn run_handler { $*(1) $*(2-) }
path=(. $PLAN9/bin ./bin/ /bin/ /usr/bin) path=(. $PLAN9/bin ./bin/ /bin/ /usr/bin)
headers=lib/headers.tpl headers=lib/headers.tpl
master_template=default_master.tpl
res_tail='</body></html>' res_tail='</body></html>'
ll_add handlers_bar_left nav_tree ll_add handlers_bar_left nav_tree
werc_apps=( apps/* ) werc_apps=( apps/* )
werc_root=`{pwd} werc_root=`{pwd}
sitesdir=sites
for(i in siteTitle siteSubTitle pageTitle extraHeaders) for(i in siteTitle siteSubTitle pageTitle extraHeaders)
$i = '' $i = ''
# TODO: Per-req variables should move after initrc loading. # TODO: Per-req variables should move after initrc loading.
site=$SERVER_NAME site=$SERVER_NAME
base_url=http://$site/ base_url=http://$site/
sitesdir=sites
sitedir=$sitesdir/$site sitedir=$sitesdir/$site
master_template=`{get_lib_file default_master.tpl}
current_date_time=`{date} current_date_time=`{date}
. ./etc/initrc . ./etc/initrc
@ -219,7 +210,7 @@ if not
setup_handlers setup_handlers
if(! ~ $#debug 0) if(! ~ $#debug 0)
dprint ' '$"SERVER_NAME^$"REQUEST_URI' - '$"HTTP_USER_AGENT' - '$"REQUEST_METHOD' - '$"handler_body_main dprint ' '$"SERVER_NAME^$"REQUEST_URI' - '$"HTTP_USER_AGENT' - '$"REQUEST_METHOD' - '$"handler_body_main - $"master_template
template $headers `{get_lib_file $master_template} | awk_buffer template $headers $master_template | awk_buffer
echo $res_tail echo $res_tail