mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-27 00:56:20 +00:00
96d4a3ecf7
Due to historical reasons, the code is in subfolder "1". With SVN removal, we place the code back and remove the annoying "1" folder.
126 lines
2.9 KiB
Bash
126 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Fake POP3 server
|
|
# By Marcus Bointon <phpmailer@synchromedia.co.uk>
|
|
# Based on code by 'Frater' found at http://www.linuxquestions.org/questions/programming-9/fake-pop3-server-to-capture-pop3-passwords-933733
|
|
# Does not actually serve any mail, but supports commands sufficient to test POP-before SMTP
|
|
# Can be run directly from a shell like this:
|
|
# mkfifo fifo; nc -l 1100 <fifo |./fakepopserver.sh >fifo; rm fifo
|
|
# It will accept any user name and will return a positive response for the password 'test'
|
|
|
|
# Licensed under the GNU Lesser General Public License: http://www.gnu.org/copyleft/lesser.html
|
|
|
|
# Enable debug output
|
|
#set -xv
|
|
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
|
|
|
|
LOGFOLDER=/tmp
|
|
|
|
LOGFILE=${LOGFOLDER}/fakepop.log
|
|
|
|
LOGGING=1
|
|
DEBUG=1
|
|
TIMEOUT=60
|
|
|
|
POP_USER=
|
|
POP_PASSWRD=test
|
|
|
|
LINES=1
|
|
BREAK=0
|
|
|
|
write_log () {
|
|
if [ ${LINES} -eq 1 ] ; then
|
|
echo '---' >>${LOGFILE}
|
|
fi
|
|
let LINES+=1
|
|
[ ${LOGGING} = 0 ] || echo -e "`date '+%b %d %H:%M'` pop3 $*" >>${LOGFILE}
|
|
}
|
|
|
|
ANSWER="+OK Fake POP3 Service Ready"
|
|
|
|
while [ ${BREAK} -eq 0 ] ; do
|
|
echo -en "${ANSWER}\r\n"
|
|
|
|
REPLY=""
|
|
|
|
#Input appears in $REPLY
|
|
read -t ${TIMEOUT}
|
|
|
|
ANSWER="+OK "
|
|
COMMAND=""
|
|
ARGS=""
|
|
TIMEOUT=30
|
|
|
|
if [ "$REPLY" ] ; then
|
|
write_log "RAW input: '`echo "${REPLY}" | tr -cd '[ -~]'`'"
|
|
|
|
COMMAND="`echo "${REPLY}" | awk '{print $1}' | tr -cd '\40-\176' | tr 'a-z' 'A-Z'`"
|
|
ARGS="`echo "${REPLY}" | tr -cd '\40-\176' | awk '{for(i=2;i<=NF;i++){printf "%s ", $i};printf "\n"}' | sed 's/ $//'`"
|
|
|
|
write_log "Command: \"${COMMAND}\""
|
|
write_log "Arguments: \"${ARGS}\""
|
|
|
|
case "$COMMAND" in
|
|
QUIT)
|
|
break
|
|
;;
|
|
USER)
|
|
if [ -n "${ARGS}" ] ; then
|
|
POP_USER="${ARGS}"
|
|
ANSWER="+OK Please send PASS command"
|
|
fi
|
|
;;
|
|
AUTH)
|
|
ANSWER="+OK \r\n."
|
|
;;
|
|
CAPA)
|
|
ANSWER="+OK Capabilities include\r\nUSER\r\nCAPA\r\n."
|
|
;;
|
|
PASS)
|
|
if [ "${POP_PASSWRD}" == "${ARGS}" ] ; then
|
|
ANSWER="+OK Logged in."
|
|
AUTH=1
|
|
else
|
|
ANSWER="-ERR Login failed."
|
|
fi
|
|
;;
|
|
LIST)
|
|
if [ "${AUTH}" = 0 ] ; then
|
|
ANSWER="-ERR Not authenticated"
|
|
else
|
|
if [ -z "${ARGS}" ] ; then
|
|
ANSWER="+OK No messages, really\r\n."
|
|
else
|
|
ANSWER="-ERR No messages, no list, no status"
|
|
fi
|
|
fi
|
|
;;
|
|
RSET)
|
|
ANSWER="+OK Resetting or whatever\r\n."
|
|
;;
|
|
LAST)
|
|
if [ "${AUTH}" = 0 ] ; then
|
|
ANSWER="-ERR Not authenticated"
|
|
else
|
|
ANSWER="+OK 0"
|
|
fi
|
|
;;
|
|
STAT)
|
|
if [ "${AUTH}" = 0 ] ; then
|
|
ANSWER="-ERR Not authenticated"
|
|
else
|
|
ANSWER="+OK 0 0"
|
|
fi
|
|
;;
|
|
NOOP)
|
|
ANSWER="+OK Hang on, doing nothing"
|
|
;;
|
|
esac
|
|
else
|
|
echo "+OK Connection timed out"
|
|
break
|
|
fi
|
|
done
|
|
|
|
echo "+OK Bye!\r\n"
|