# HG changeset patch # User HIROSE Yuuji # Date 1590071620 -32400 # Node ID 4461d596150dfb0deecc52bd727cb21a3582adcc # Parent 4ebe5184a3e3a5a6a80767ede95f05f5ab3e4268 HEADS UP: session storing schema changed, which allows multi sessions diff -r 4ebe5184a3e3 -r 4461d596150d s4-funcs.sh --- a/s4-funcs.sh Thu May 21 12:08:27 2020 +0900 +++ b/s4-funcs.sh Thu May 21 23:33:40 2020 +0900 @@ -658,13 +658,25 @@ query "select gecos from gecoses where name=$u;" ) setpar() { + # 2020/5/14 Add dirty code to cache essential params + case "$1" in + user) _user="$v"; err SETPARRRRR:user=$v ;; + skey) _skey="$v"; err SETPARRRRR:skey=$v ;; + esac query "replace into par values('$session', '$1', '$2', \"$3\");" } replpar() { query "update par set val=\"$3\" where sessid='$session' and var='$1' and type='$2';" } getpar() { - val=`query "select val from par where var='$1' and sessid='$session' $2;"` + # err GETPAR=$1, _user=$_user + val="" + case "$1" in # Dirty cache mechanism for high-load average + user) val=$_user + err GETPAR____USER=$val;; + skey) val=$_skey; err SKEY=$val ;; + esac + val=${val:-`query "select val from par where var='$1' and sessid='$session' $2;"`} ## err getpar/val1: "val=[$val]" if [ -z "$val" ]; then val=`query "select val from cookie where var='$1' and sessid='$session' $2;"` @@ -681,7 +693,26 @@ ## err getpar/ret: "val=[$val]" echo "$val" } - +setskey() { + # For quick response...(?) + query "REPLACE INTO $sesstb VALUES('$1', '$2', datetime('now', 'localtime', '$timeout'));" +} +chkskey() { + # $1=sesskey, $user=LoginUserName + test -z "$1" && return 1 + rowid=`query "SELECT rowid FROM $sesstb WHERE user='$user' AND skey = '$1';"` || return 2 + err CHKskey:rowid=$rowid + if [ -n "$rowid" ]; then + query "UPDATE $sesstb SET expire=datetime('now', 'localtime', '$timeout') WHERE rowid=$rowid;" # Errors can be ignored + return 0 + fi + return 1 +} +resetskey() { + if [ -n "$_user" ]; then + query "DELETE FROM $sesstb WHERE user='$_user';" + fi +} getpartype() { query "select type from par where var='$1' and sessid='$session' $2;" } @@ -1157,6 +1188,10 @@ for kv in `echo $HTTP_COOKIE|sed 's/[;, ]/ /g'`; do k="${kv%%=*}" v="`echo ${kv#*=}|nkf -Ww -mQ|sed -e 's/\"/\"\"/g'`" + case "$k" in + user) _user="$v"; ;; ## err FromCookie:user=$_user ;; + skey) _skey="$v"; ;; ## err FromCookie:skey=$_skey ;; + esac query "replace into cookie values('$session', '$k', 'string', \"$v\");" done } @@ -1290,10 +1325,10 @@ checkauth() { user=`getpar user` skc=`getpar skey` # from cookie - [ -z "$user" ] && return 3 - skey="`getpwfield $user skey`" - if [ -n "$skey" ]; then - if [ x"$skey" = x"$skc" ]; then + [ -z "$user" ] && return 2 + ##skey="`getpwfield $user skey`" + if [ -n "$skc" ]; then + if chkskey "$skc"; then return 0 fi fi @@ -1312,7 +1347,7 @@ # putheader; echo; echo user=$user, db=$dbpswd, enc=$encpswd if pwcheck "$pswd"; then newsession=`genrandom 50` - if dbsetbyid user "$user" skey "$newsession" && + if setskey "$user" "$newsession" && dbsetbyid user "$user" login "`date '+%F %T'`"; then gencookie "user=$user" "skey=$newsession" return 0 @@ -1324,6 +1359,7 @@ } showlogin() { args=`echo $myargs|tr ' ' '+'` + test -z "$args" && resetskey s4name=${S4NAME:-s4} ( sed '/^