]> git.plutz.net Git - shellwiki/blob - auth/moinmoin.sh
remove debug message
[shellwiki] / auth / moinmoin.sh
1 #!/bin/sh
2
3 . "$_EXEC/cgilite/storage.sh"
4 . "$_EXEC/cgilite/session.sh"
5
6 MOIN_USERS="${MOIN_USERS:-/srv/moinwiki/data/user/}"
7 user_db="${user_db:-${_DATA}/users.db}"
8 USER_ACCOUNTEXPIRE="${USER_ACCOUNTEXPIRE:-$((86400 * 730))}"
9
10 user_emailexist() {
11   local email="$1"
12   grep -qxF "email=${email}" "${MOIN_USERS%/}"/*
13   return $?
14 }
15
16 user_nameexist() {
17   local name="$1"
18   grep -qxF "name=${name}" "${MOIN_USERS%/}"/*
19   return $?
20 }
21
22 user_login(){
23   local UID_    UNAME   STATUS  EMAIL   PWSALT  PWHASH  EXPIRE  DEVICES FUTUREUSE
24   local name="$(POST uname)" pw="$(POST pw)"
25   local uname="$(STRING "$name")"
26   local moinfile="$(grep -lxF "name=${name}" "${MOIN_USERS%/}"/*)"
27   local moinpw pyreturn
28
29   [ ! "$moinfile" ] && return 1  # no user record in MoinMoin
30
31   [ -f "$user_db" -a -r "$user_db" ] \
32   && while read -r UID_ UNAME   STATUS  EMAIL   PWSALT  PWHASH  EXPIRE  DEVICES FUTUREUSE; do
33     # Username already in main DB
34     [ "$UNAME" = "$uname" -o "$EMAIL" = "$uname" ] && return 1
35   done <"$user_db"
36
37   moinpw="$(grep -E '^enc_password=\{PASSLIB\}' "$moinfile")"
38   moinpw="${moinpw#"enc_password={PASSLIB}"}"
39
40   if python3 -c '
41 from passlib.hash import sha512_crypt
42 if sha512_crypt.verify(input(), input()):
43   exit(0)
44 else:
45   exit(1)
46 ' <<-EOF
47         ${pw}
48         ${moinpw}
49         EOF
50   then
51     EMAIL="$(grep -E '^email=' "$moinfile")" EMAIL="${EMAIL#email=}"
52     PWSALT="$(randomid)"
53     PWHASH="$(printf '%s\n%s\n' "$pw" "$PWSALT" |sha256sum)"
54     printf '%s  %s      %s      %s      %s      %s      %i      %s      %s\n' \
55            "$(timeid)" "$(STRING "$name")" "active" "$(STRING "$EMAIL")" \
56            "$PWSALT" "${PWHASH%% *}" \
57            "$((_DATE + USER_ACCOUNTEXPIRE))" "\\" "\\" \
58     >>"$user_db"
59     return 0
60   else
61     return 1
62   fi
63 }
64
65 uname="$(POST uname)" email="$(POST email)"
66
67 [ "$REQUEST_METHOD" = POST ] && case "$(POST action)" in
68   user_register):
69     # precede email/username check of default authenticator
70     if   [ "$USER_REQUIREEMAIL" = true ]; then
71       [ "$email" ] && user_emailexist "$email" \
72       && REDIRECT "${_BASE}${PATH_INFO}#ERROR_EMAIL_EXISTS"
73     elif [ "$USER_REQUIREEMAIL" != true ]; then
74       [ "$uname" ] && user_nameexist "$uname" \
75       && REDIRECT "${_BASE}${PATH_INFO}#ERROR_UNAME_EXISTS"
76     fi
77     ;;
78   user_invite):
79     # precede email check of default authenticator
80     [ "$email" ] && user_emailexist "$email" \
81     && REDIRECT "${_BASE}${PATH_INFO}#ERROR_EMAIL_EXISTS"
82     ;;
83   user_confirm):
84     # precede username check of default authenticator
85     [ "$uname" ] && user_nameexist "$uname" \
86     && REDIRECT "${_BASE}${PATH_INFO}#ERROR_UNAME_EXISTS"
87     ;;
88   user_login):
89     # verify password and write user record to db
90     user_login && debug "Set up new user record for \"$uname\"" \
91     ;;
92   user_logout|user_update|user_recover|user_disable)
93     # delegate to default authenticator
94     :;;
95 esac
96
97 unset uname email
98 unset UID_      UNAME   STATUS  EMAIL   PWSALT  PWHASH  EXPIRE  DEVICES FUTUREUSE
99
100 . "$_EXEC/auth/default.sh"