changeset 697:4461d596150d

HEADS UP: session storing schema changed, which allows multi sessions
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 21 May 2020 23:33:40 +0900
parents 4ebe5184a3e3
children b036a06cad90
files s4-funcs.sh
diffstat 1 files changed, 43 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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 '/^<body/q' $layout/html.m4.html
     cat $layout/login.m4.html

yatex.org