moth/packages/p2/bin/p2console

117 lines
2.6 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /bin/sh
: ${BASE:=/var/lib/ctf/p2}
mkdir -p $BASE
if ! [ -f $BASE/salt ]; then
dd if=/dev/urandom count=1 | md5sum - > $BASE/salt
fi
clear
printf '\017'
read salt < $BASE/salt
esc () {
printf '%s' "$*" | sed 's/[^-0-9A-Za-z ]/_/g; s/ /+/g'
}
newteam () {
echo '== Team Creation =='
echo
echo -n 'What would you like your team to be called (3-12 chars)? '
read -r name
echo
namelen=$(printf "%s" "$name" | wc -c)
if [ $namelen -lt 3 ] || [ $namelen -gt 12 ]; then
echo 'Invalid name length'
return
fi
hash=$(printf '%s %s' "$salt" "$name" | md5sum | cut -b 1-8)
if [ -d $BASE/$hash ]; then
echo "That name is already in use. Try another one."
return
fi
mkdir $BASE/$hash
printf '%s' "$name" > $BASE/$hash/.name
cat <<EOD
Your team hash is $hash. Write that down somewhere and don't lose it.
If you forget your hash, you'll have to start over from the beginning
with a new team and everybody will laugh at you.
EOD
}
fini () {
echo
echo "Press [Enter] to clear the screen."
read
exit 0
}
echo -n 'Team hash ("new" to create a new team): '
read -r hash
echo
if [ -z "$hash" ]; then
exit 0
elif [ "$hash" = "new" ]; then
newteam
fini
elif ! [ -d $BASE/$hash ]; then
echo "No such team, fool."
echo "Is this when everybody laughs at you for forgetting your hash?"
fini
fi
clear
read -r name < $BASE/$hash/.name
printf 'Welcome back, %s.\n' "$name"
while true; do
printf "p2> "
read -r answer
case "$answer" in
\?|help)
cat <<EOD
 Help
----------------------------------------------------------
Type "quit" to leave the p2 shell.
Any other string is checked as an answer. If the answer
is correct, you are awarded points and the scoreboard will
update within 10 seconds. Check the puzzles overview to
see if your answer unlocked a new puzzle.
EOD
continue
;;
quit)
break
;;
esac
match=$(awk -v ans="$answer" '(substr($0, length($1)+2) == ans) { print substr(FILENAME, 6, length(FILENAME)-17) " " $1; }' /opt/*/answers.txt)
if [ -z "$match" ]; then
echo 'That is not a correct answer. Type "help" for help.'
continue
fi
cat=${match% *}
points=${match#* }
fn=$BASE/$hash/$cat.$points
if [ -f $fn ]; then
echo "You've already received points for this answer."
else
> $fn
echo "You get $points more points in the $cat category."
# run puzzles.cgi
# update scoreboard
fi
done