summaryrefslogtreecommitdiff
path: root/bin/werclib.rc
diff options
context:
space:
mode:
Diffstat (limited to 'bin/werclib.rc')
-rwxr-xr-xbin/werclib.rc393
1 files changed, 393 insertions, 0 deletions
diff --git a/bin/werclib.rc b/bin/werclib.rc
new file mode 100755
index 0000000..bcebf91
--- /dev/null
+++ b/bin/werclib.rc
@@ -0,0 +1,393 @@
+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 }
+
+# Auth code
+# TODO: check http://cookies.lcs.mit.edu/pubs/webauth:tr.pdf
+allowed_user_chars='[a-zA-Z0-9_]'
+# Cookie format: WERC_USER: name:timestamp:hash(name.timestamp.password)
+# login_user can't be used from a template because it sets a cookie
+fn login_user {
+ # Note: we set the cookie even if it is already there.
+ if(get_user $*)
+ set_cookie werc_user $"logged_user^':0:'^$"logged_password
+}
+
+# Check login status, if called with group arg we check membership too
+fn check_user {
+ get_user
+ g=($* admin)
+ _status=$status
+ if(! ~ $"_status '')
+ _status=(Not logged in: $"_status)
+ if not if(! ~ $#* 0 && ! ~ $logged_user $* && ! grep -s '^'^$logged_user^'$' $werc_root/etc/users/$g/members >[2]/dev/null)
+ _status=(User $logged_user not in: $*)
+ status=$_status
+}
+
+# If not logged in, try to get user login info from POST or from cookie
+fn get_user {
+ if(~ $#logged_user 0) {
+ if(~ $#* 2) {
+ user_name=$1
+ user_password=$2
+ }
+ if not if(~ $REQUEST_METHOD POST)
+ get_post_args user_name user_password
+
+ if(~ $#user_name 0) {
+ ifs=':' { cu=`{ifs=$difs {get_cookie werc_user} | tr -d $NEW_LINE} }
+ if(! ~ $#cu 0) {
+ user_name=$cu(1)
+ user_password=$cu(3)
+ }
+ }
+ auth_user $user_name $user_password
+ }
+ if not
+ status=()
+}
+
+# Check if user_name and user_password represent a valid user account
+# If valid, 'log in' by setting logged_user
+fn auth_user {
+ user_name=$1
+ user_password=$2
+
+ pfile=$werc_root/etc/users/$"user_name/password
+ if(~ $#user_name 0 || ~ $#user_password 0)
+ status=('Auth: missing user name or pass: '^$"user_name^' / '^$"user_password)
+ if not if(! test -f $pfile)
+ status=('Auth: cant find '^$pfile)
+ if not if(! test -s $pfile || ! ~ $user_password `{cat $pfile})
+ status=('Auth: Pass '$user_password' doesnt match '^`{cat $pfile})
+ if not {
+ logged_user=$user_name
+ logged_password=$user_password
+ dprint Auth: success
+ status=()
+ }
+}
+
+fn user_controls {
+ echo User: $"logged_user
+}
+
+
+# .md '(meta-)data' extract
+fn get_md_file_attr {
+ sed -n '/^\* '$2': /p; /^\* '$2': /q; /^$/q' < $1
+}
+
+
+# File title extraction
+fn get_md_title {
+ #sed 's/^(................................................................[^ ]*).*$/\1/g; 1q' < $1
+ sed -n -e '1N; /^.*\n===*$/N; /.*\n===*\n *$/!b' -e 's/\n==*\n//p' < $1
+}
+
+fn get_html_title {
+ t=`{sed -n '32q; s/^.*<[Tt][Ii][Tt][Ll][Ee]> *([^<]+) *(<\/[Tt][Ii][Tt][Ll][Ee]>.*)?$/\1/p' < $1}
+
+ # As a backup we might want to pick the first 'non-tag' text in the file with:
+ if(~ $"t '')
+ t=`{sed -n -e 's/^(<[^>]+>)*([^<]+).*/\2/p; 32q' < $1 | sed 1q}
+
+ echo $t
+}
+
+fn get_file_title {
+ if (~ $1 *.md)
+ get_md_title $1
+ if not if(~ $1 *.html)
+ get_html_title $1
+ if not if(~ $1 */) {
+ if(test -f $1/index.md)
+ get_md_title $1/index.md
+ if not if(test -f $1/index.html)
+ get_html_title $1/index.html
+ }
+}
+
+fn ndate {
+ if(~ $#* 7)
+ date=$*(2-)
+ if not
+ date=`{date}
+ switch($date(2)){
+ case Jan; mo=01
+ case Feb; mo=02
+ case Mar; mo=03
+ case Apr; mo=04
+ case May; mo=05
+ case Jun; mo=06
+ case Jul; mo=07
+ case Aug; mo=08
+ case Sep; mo=09
+ case Oct; mo=10
+ case Nov; mo=11
+ case Dec; mo=12
+ }
+ switch($date(3)){
+ case [0-9]
+ da=0^$date(3)
+ case *
+ da=$date(3)
+ }
+ switch($date(5)){
+ case A; tz=+0100
+ case ADT; tz=-0300
+ case AFT; tz=+430
+ case AKDT; tz=-0800
+ case AKST; tz=-0900
+ case ALMT; tz=+0600
+ case AMST; tz=-0300
+ case AMT; tz=-0400
+ case ANAST; tz=+1200
+ case ANAT; tz=+1200
+ case AQTT; tz=+0500
+ case ART; tz=-0300
+ case AST; tz=-0400
+ case AZOST; tz=+0000
+ case AZOT; tz=-0100
+ case AZST; tz=+0500
+ case AZT; tz=+0400
+ case B; tz=+0200
+ case BNT; tz=+0800
+ case BOT; tz=-0400
+ case BRST; tz=-0200
+ case BRT; tz=-0300
+ case BST; tz=+0100
+ case BTT; tz=+0600
+ case C; tz=+0300
+ case CAST; tz=+0800
+ case CAT; tz=+0200
+ case CCT; tz=+0630
+ case CDT; tz=-0500
+ case CEST; tz=+0200
+ case CET; tz=+0100
+ case CHADT; tz=+1345
+ case CHAST; tz=+1245
+ case CKT; tz=-1000
+ case CLST; tz=-0300
+ case CLT; tz=-0400
+ case COT; tz=-0500
+ case CST; tz=-0600
+ case CVT; tz=-0100
+ case CXT; tz=+0700
+ case ChST; tz=+1000
+ case D; tz=+0400
+ case DAVT; tz=+0700
+ case E; tz=+0500
+ case EASST; tz=-0500
+ case EAST; tz=-0600
+ case EAT; tz=+0300
+ case ECT; tz=-0500
+ case EDT; tz=-0400
+ case EEST; tz=+0300
+ case EET; tz=+0200
+ case EGST; tz=+0000
+ case EGT; tz=-0100
+ case EST; tz=-0500
+ case ET; tz=-0500
+ case F; tz=+0600
+ case FJST; tz=+1300
+ case FJT; tz=+1200
+ case FKST; tz=-0300
+ case FKT; tz=-0400
+ case FNT; tz=-0200
+ case G; tz=+0700
+ case GALT; tz=-0600
+ case GAMT; tz=-0900
+ case GET; tz=+0400
+ case GFT; tz=-0300
+ case GILT; tz=+1200
+ case GMT; tz=+0000
+ case GST; tz=+0400
+ case GYT; tz=-0400
+ case H; tz=+0800
+ case HAA; tz=-0300
+ case HAC; tz=-0500
+ case HADT; tz=-0900
+ case HAE; tz=-0400
+ case HAP; tz=-0700
+ case HAR; tz=-0600
+ case HAST; tz=-1000
+ case HAT; tz=-0230
+ case HAY; tz=-0800
+ case HKT; tz=+0800
+ case HLV; tz=-0430
+ case HNA; tz=-0400
+ case HNC; tz=-0600
+ case HNE; tz=-0500
+ case HNP; tz=-0800
+ case HNR; tz=-0700
+ case HNT; tz=-0330
+ case HNY; tz=-0900
+ case HOVT; tz=+0700
+ case I; tz=+0900
+ case ICT; tz=+0700
+ case IDT; tz=+0300
+ case IOT; tz=+0600
+ case IRDT; tz=+0430
+ case IRKST; tz=+0900
+ case IRKT; tz=+0800
+ case IRST; tz=+0330
+ case IST; tz=+0200
+ case JST; tz=+0900
+ case K; tz=+1000
+ case KGT; tz=+0600
+ case KRAST; tz=+0800
+ case KRAT; tz=+0700
+ case KST; tz=+0900
+ case KUYT; tz=+0400
+ case L; tz=+1100
+ case LHDT; tz=+1100
+ case LHST; tz=+1030
+ case LINT; tz=+1400
+ case M; tz=+1200
+ case MAGST; tz=+1200
+ case MAGT; tz=+1100
+ case MART; tz=-0930
+ case MAWT; tz=+0500
+ case MDT; tz=-0600
+ case MHT; tz=+1200
+ case MMT; tz=+0630
+ case MSD; tz=+0400
+ case MSK; tz=+0300
+ case MST; tz=-0700
+ case MUT; tz=+0400
+ case MVT; tz=+0500
+ case MYT; tz=+0800
+ case N; tz=-0100
+ case NCT; tz=+1100
+ case NDT; tz=-0230
+ case NFT; tz=+1130
+ case NOVST; tz=+0700
+ case NOVT; tz=+0600
+ case NPT; tz=+0545
+ case NST; tz=-0330
+ case NUT; tz=-1100
+ case NZDT; tz=+1300
+ case NZST; tz=+1200
+ case O; tz=-0200
+ case OMSST; tz=+0700
+ case OMST; tz=+0600
+ case P; tz=-0300
+ case PDT; tz=-0700
+ case PET; tz=-0500
+ case PETST; tz=+1200
+ case PETT; tz=+1200
+ case PGT; tz=+1000
+ case PHOT; tz=+1300
+ case PHT; tz=+0800
+ case PKT; tz=+0500
+ case PMDT; tz=-0200
+ case PMST; tz=-0300
+ case PONT; tz=+1100
+ case PST; tz=-0800
+ case PT; tz=-0800
+ case PWT; tz=+0900
+ case PYST; tz=-0300
+ case PYT; tz=-0400
+ case Q; tz=-0400
+ case R; tz=-0500
+ case RET; tz=+0400
+ case S; tz=-0600
+ case SAMT; tz=+0400
+ case SAST; tz=+0200
+ case SBT; tz=+1100
+ case SCT; tz=+0400
+ case SGT; tz=+0800
+ case SRT; tz=-0300
+ case SST; tz=-1100
+ case T; tz=-0700
+ case TAHT; tz=-1000
+ case TFT; tz=+0500
+ case TJT; tz=+0500
+ case TKT; tz=-1000
+ case TLT; tz=+0900
+ case TMT; tz=+0500
+ case TVT; tz=+1200
+ case U; tz=-0800
+ case ULAT; tz=+0800
+ case UYST; tz=-0200
+ case UYT; tz=-0300
+ case UZT; tz=+0500
+ case V; tz=-0900
+ case VET; tz=-0430
+ case VLAST; tz=+1100
+ case VLAT; tz=+1000
+ case VUT; tz=+1100
+ case W; tz=-1000
+ case WAST; tz=+0200
+ case WAT; tz=+0100
+ case WDT; tz=+0900
+ case WEST; tz=+0100
+ case WET; tz=+0000
+ case WFT; tz=+1200
+ case WGST; tz=-0200
+ case WGT; tz=-0300
+ case WIB; tz=+0700
+ case WIT; tz=+0900
+ case WITA; tz=+0800
+ case WST; tz=+0800
+ case WT; tz=+0000
+ case X; tz=-1100
+ case Y; tz=-1200
+ case YAKST; tz=+1000
+ case YAKT; tz=+0900
+ case YAPT; tz=+1000
+ case YEKST; tz=+0600
+ case YEKT; tz=+0500
+ case Z; tz=+0000
+ }
+ switch($1){
+ case -a # rfc3339
+ tz=`{echo $tz | sed 's/00$/:00/'}
+ echo $date(6)^-$mo-$da^T^$date(4)^$tz
+ case -i # iso-8601 lite
+ echo $date(6)^-$mo-$da
+ case -m # rfc2822
+ echo $date(1)^, $da $date(2) $date(6) $date(4) $tz
+ case -t # iso-8601
+ echo $date(6)^-$mo-$da^T^$date(4)^$tz
+ }
+}
+
+##########################################################################
+##########################################################################
+#app_blog_methods = ( _post index.rss )
+#fn app_blog__post {
+# echo
+#}
+#
+#app_blog___default {
+# if (~ $blog)
+# call_app blogpost
+#}
+#
+## --
+#app_blogpost_methods = ( comment _edit )
+#
+#fn app_blogpost_comment {
+# call_app comments
+#}
+#
+## --
+#app_comments_methods = ( _post _edit )
+#
+#fn app_comments___default {
+#
+#}