From 3b749d034d316a0f5b29683929153a3fbc04e947 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sun, 18 Nov 2018 20:30:00 +0100 Subject: [PATCH] functions for logging and session handling --- logging.sh | 29 +++++++++++++++++++++++ session.sh | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100755 logging.sh create mode 100755 session.sh diff --git a/logging.sh b/logging.sh new file mode 100755 index 0000000..f10ea4c --- /dev/null +++ b/logging.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# LOGLEVEL 1: Crash condition +# LOGLEVEL 2: Unexpected condition +# LOGLEVEL 3: Failed action (i.e. due to config error) +# LOGLEVEL 4: Debug + +[ -n "$include_logging" ] && return 0 +include_logging="$0" + +LOGLEVEL="${LOGLEVEL:-3}" +LOGFILE="${LOGFILE:-/dev/stderr}" + +logmsg(){ + if [ "${1:-3}" -le "$LOGLEVEL" ]; then + [ "$#" -gt 1 ] \ + && printf %s\\n "$*" >>"${LOGFILE}" \ + || tee -a "${LOGFILE}" + fi +} + + +die(){ + [ "$#" -gt 0 ] && logmsg 1 "$@" + exit 1 +} +panic(){ logmsg 2 "$@"; } +error(){ logmsg 3 "$@"; } +debug(){ logmsg 4 "$@"; } diff --git a/session.sh b/session.sh new file mode 100755 index 0000000..2769328 --- /dev/null +++ b/session.sh @@ -0,0 +1,68 @@ +#!/bin/sh + +[ -n "$include_session" ] && return 0 +include_session="$0" + +server_key(){ + IDFILE="${IDFILE:-${_DATA:-.}/serverkey}" + if ! grep -m1 -xE '.{512}' "$IDFILE"; then + dd count=1 bs=512 if=/dev/urandom \ + | tee "$IDFILE" + fi 2>&- +} + +slopecode(){ + # 6-Bit Code that retains sort order of input data, while beeing safe to use + # in ascii transmissions, unix file names, HTTP URLs, and HTML attributes + + uuencode -m - | sed ' + 1d;$d; + y;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/;0123456789:=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz; + ' +} + +randomid(){ + dd bs=12 count=1 if=/dev/urandom \ + | slopecode 2>&- +} + +timeid(){ + d=$(($(date +%s) % 4294967296)) + { printf "$( + printf \\%o \ + $((d / 16777216 % 256)) \ + $((d / 65536 % 256)) \ + $((d / 256 % 256)) \ + $((d % 256)) + )" + dd bs=8 count=1 if=/dev/urandom + } | slopecode 2>&- +} + +checkid(){ grep -m 1 -xE '[0-9a-zA-Z:_]{16}'; } + +update_session(){ + local session sid time sig serverkey checksig + + IFS=- read -r sid time sig <<-END + $(COOKIE session) + END + serverkey="$(server_key)" + + checksig="$(printf %s "$sid" "$time" "$serverkey" | sha256sum)" + checksig="${checksig%% *}" + d=$(date +%s) + + if [ "$checksig" != "$sig" -o "$time" -lt "$d" ] 2>&-; then + sid="$(randomid)" + fi + + time=$(( $(date +%s) + 7200 )) + sig="$(printf %s "$sid" "$time" "$serverkey" |sha256sum)" + sig="${sig%% *}" + printf %s\\n "${sid}-${time}-${sig}" +} + +SESSION_ID="$(update_session)" +SET_COOKIE 0 "session=$SESSION_ID" +SESSION_ID="${SESSION_ID%%-*}" -- 2.39.2