#!/bin/sh
-# Copyright 2016 - 2018 Paul Hänsch
+# Copyright 2016 - 2019 Paul Hänsch
#
# This file is part of cgilite.
#
# Parse the allowable date formats from Section 3.3.1 of
# https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
HEADER If-Modified-Since \
- | sed -r 's;^[^ ]+, ([0-9]{2}) (...) ([0-9]{4}) (..:..:..) GMT$;\3-\2-\1 \4;;
+ | sed -E 's;^[^ ]+, ([0-9]{2}) (...) ([0-9]{4}) (..:..:..) GMT$;\3-\2-\1 \4;;
s;^[^ ]+, ([0-9]{2})-(...)-([789][0-9]) (..:..:..) GMT$;19\3-\2-\1 \4;;
s;^[^ ]+, ([0-9]{2})-(...)-([0-6][0-9]) (..:..:..) GMT$;20\3-\2-\1 \4;;
s;^[^ ]+ (...) ([0-9]{2}) (..:..:..) ([0-9]{4})$;\4-\1-\2 \3;;
| xargs -r0 date +%s -ud 2>&-
)"
- range="$(HEADER Range |sed -nr 's;^bytes=([0-9]+-[0-9]*|-[0-9]+)$;\1;p;q;')"
+ range="$(HEADER Range |sed -nE 's;^bytes=([0-9]+-[0-9]*|-[0-9]+)$;\1;p;q;')"
case "$range" in
*-) range="${range}$((file_size - 1))";;
-*) [ ${range#-} -le $file_size ] \
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
checksig="${checksig%% *}"
d=$(date +%s)
- if [ "$checksig" != "$sig" \
- -o "$time" -lt "$d" \
- -o ! "$(printf %s "$sid" |checkid)" ] 2>&-
+ if ! [ "$checksig" = "$sig" \
+ -a "$time" -ge "$d" \
+ -a "$(printf %s "$sid" |checkid)" ] 2>&-
then
debug Setting up new session
sid="$(randomid)"
#!/bin/sh
-# Copyright 2018 Paul Hänsch
+# Copyright 2018, 2019 Paul Hänsch
#
# This is a file format helper, part of CGIlite.
#
STRING(){
{ [ $# -eq 0 ] && cat || printf %s "$*"; } \
- | sed -r ':X; $!{N;bX;}'"$STRING"
+ | sed -E ':X; $!{N;bX;}'"$STRING"
}
UNSTRING='
'
UNSTRING(){
{ [ $# -eq 0 ] && cat || printf %s "$*"; } \
- | sed -r "$UNSTRING"
+ | sed -E "$UNSTRING"
}