Blame view

application/libs/PHPMailer/test/fakepopserver.sh 2.93 KB
8d65d0ce   andryeyev   init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  #!/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"