67 lines
963 B
Bash
Executable File
67 lines
963 B
Bash
Executable File
#! /bin/sh
|
|
|
|
set -e
|
|
|
|
usage()
|
|
{
|
|
echo "$0 <dir>"
|
|
}
|
|
|
|
if [ $# != 1 ]; then
|
|
usage >&2
|
|
exit 1
|
|
fi
|
|
|
|
DIR=$1
|
|
|
|
echo Username: >&2
|
|
read -r USER
|
|
|
|
DB="$DIR/db.json"
|
|
|
|
if jq '.users[].name' "$DB" | grep -q $USER
|
|
then
|
|
echo User $USER already in $DB >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo Password: >&2
|
|
read -r PWD
|
|
echo "Quota, in MiB (leave empty for unlimited quota):" >&2
|
|
read -r QUOTA
|
|
|
|
PWD=$(printf '%s' $PWD | xxd -p | tr -d '\n')
|
|
SALT=$(openssl rand 32 | xxd -p | tr -d '\n')
|
|
KEY=$(openssl rand 32 | xxd -p | tr -d '\n')
|
|
PWD=$(printf '%s%s' $SALT $PWD)
|
|
|
|
ROUNDS=1000
|
|
|
|
for i in $(seq $ROUNDS)
|
|
do
|
|
printf "\r%d/$ROUNDS" $i >&2
|
|
PWD=$(printf '%s' $PWD | xxd -p -r | sha256sum | cut -d' ' -f1)
|
|
done
|
|
|
|
echo >&2
|
|
TMP=$(mktemp)
|
|
|
|
cleanup()
|
|
{
|
|
rm -f $TMP
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
jq ".users += [
|
|
{
|
|
\"name\": \"$USER\",
|
|
\"password\": \"$PWD\",
|
|
\"salt\": \"$SALT\",
|
|
\"key\": \"$KEY\",
|
|
\"quota\": \"$QUOTA\"
|
|
}]" "$DB" > $TMP
|
|
|
|
mv $TMP "$DB"
|
|
mkdir "$DIR/user/$USER"
|