]> git.plutz.net Git - httpchat/blob - usernick.sh
hold session key in POST data
[httpchat] / usernick.sh
1 #!/bin/sh
2
3 UNAME_VALID='
4   # Remove trailing CR, which may have been added by browser
5   s;\r$;;;
6   # Collapse white spaces
7   s;[\r\t\n ]+; ;;
8   # Remove starting and trailing white spaces
9   s;^ ;;; s; $;;;
10   # Usernames starting with & # ? @ + will be invalid
11   /^[&#?@+]/d;
12   # Usernames containing a / will be invalid
13   /\//d;
14   # Usernames must be between 3 and 24 characters
15   /...+/!d; /.{25}/d;
16   # Usernames may not span multiple lines
17   q;'
18 username(){
19   { [ $# -eq 0 ] && cat || printf %s "$*"; } \
20   | sed -E ':X; $!{N;bX;}'"$UNAME_VALID"
21 }
22
23 nickname="$(COOKIE nick |username)"
24 if [ ! "$nickname" ]; then
25   nickname='?Guest'
26 elif [ ! -d "$_DATA/@$nickname" ]; then
27   nickname="?$nickname"
28 else
29   userclient="$(COOKIE user_client)"
30   secuid="$(cat "$_DATA/@$nickname/secuid")"
31   clientid="${userclient%%-*}"
32   clientid="${clientid}-$(printf '%s%s' "${clientid}" "${secuid}" |sha256sum)"
33   clientid="${clientid%% *}"
34   if [ "$clientid" = "$userclient" ]; then
35     nickname=" $nickname"
36     SET_COOKIE +"$((86400 * 365))" "user_client=${clientid}" HttpOnly
37     SET_COOKIE +"$((86400 * 365))" "nick=$(URL "${nickname}")"
38   else
39     nickname='?Guest'
40   fi
41 fi
42
43 case $(POST action) in
44   nick)
45     nick="$(POST nickname |username)"
46     if [ ! -d "$_DATA/@$nick" ]; then
47       SET_COOKIE +1209600 "nick=$(POST nickname |URL)"
48       REDIRECT "$(URL "/$LOCATION")"
49     else
50       # ToDo: Return Error Message
51       REDIRECT "$(URL "/$LOCATION")?settings#nick"
52     fi
53     ;;
54   register)
55     regnick="$(POST regnick |username)"
56     userdir="$_DATA/@${regnick}"
57     if [ "$regnick" ] && mkdir "$userdir"; then
58       secuid="$(randomid)"; clientid="$(randomid)"
59       printf %s\\n "$secuid" >"${userdir}/secuid"
60       clientid="${clientid}-$(printf '%s%s' "${clientid}" "${secuid}" |sha256sum |cut -d\  -f1)"
61       SET_COOKIE +"$((86400 * 365))" "user_client=${clientid}" HttpOnly
62       SET_COOKIE +"$((86400 * 365))" "nick=$(URL "${regnick}")"
63       REDIRECT "$(URL "/$LOCATION")"
64     else
65       # ToDo: Return Error Message
66       REDIRECT "$(URL "/$LOCATION")?settings#register"
67     fi
68     ;;
69 esac