X-Git-Url: http://git.plutz.net/?p=cgilite;a=blobdiff_plain;f=session.sh;h=8ed8d8808e0655cc8b89c6ce7bb0df318b0b571f;hp=3f3839ae8b167975a5e5231582509c5484d1f025;hb=506e2f9f146c13919e65a9bbbd844391b96bbe9d;hpb=41bcab02ff4b11d22a2624e7afabc50e9c33ae2f diff --git a/session.sh b/session.sh index 3f3839a..8ed8d88 100755 --- a/session.sh +++ b/session.sh @@ -5,7 +5,7 @@ include_session="$0" server_key(){ IDFILE="${IDFILE:-${_DATA:-.}/serverkey}" - if ! grep -m1 -xE '.{512}' "$IDFILE"; then + if [ "$(stat -c %s "$IDFILE")" -ne 512 ] || ! cat "$IDFILE"; then dd count=1 bs=512 if=/dev/urandom \ | tee "$IDFILE" fi 2>&- @@ -22,8 +22,8 @@ slopecode(){ } randomid(){ - dd bs=12 count=1 if=/dev/urandom \ - | slopecode 2>&- + dd bs=12 count=1 if=/dev/urandom 2>&- \ + | slopecode } timeid(){ @@ -35,11 +35,20 @@ timeid(){ $((d / 256 % 256)) \ $((d % 256)) )" - dd bs=8 count=1 if=/dev/urandom - } | slopecode 2>&- + dd bs=8 count=1 if=/dev/urandom 2>&- + } | slopecode } -checkid(){ grep -m 1 -xE '[0-9a-zA-Z:_]{16}'; } +checkid(){ grep -m 1 -xE '[0-9a-zA-Z:=]{16}'; } + +transid(){ + # transaction ID to modify a given file + local file="$1" + { stat -c %F%i%n%N%s%Y "$file" 2>&- + printf %s "$SESSION_ID" + server_key + } | sha256sum | cut -d\ -f1 +} update_session(){ local session sid time sig serverkey checksig @@ -53,7 +62,11 @@ update_session(){ checksig="${checksig%% *}" d=$(date +%s) - if [ "$checksig" != "$sig" -o "$time" -lt "$d" ] 2>&-; then + if ! [ "$checksig" = "$sig" \ + -a "$time" -ge "$d" \ + -a "$(printf %s "$sid" |checkid)" ] 2>&- + then + debug Setting up new session sid="$(randomid)" fi @@ -64,5 +77,5 @@ update_session(){ } SESSION_ID="$(update_session)" -SET_COOKIE 0 "session=$SESSION_ID" HttpOnly +SET_COOKIE 0 session="$SESSION_ID" Path=/ SameSite=Strict HttpOnly SESSION_ID="${SESSION_ID%%-*}"