return result;
}
+/* for LIST response with a given message */
+static CURLcode pop3_state_list_single_resp(struct connectdata *conn,
+ int pop3code,
+ pop3state instate)
+{
+ CURLcode result = CURLE_OK;
+ struct SessionHandle *data = conn->data;
+ (void)instate; /* no use for this yet */
+
+ if(pop3code != 'O') {
+ failf(data, "Invalid message. %c", pop3code);
+ result = CURLE_REMOTE_FILE_NOT_FOUND;
+ }
+
+ state(conn, POP3_STOP);
+ return result;
+}
+
/* start the DO phase for RETR */
static CURLcode pop3_retr(struct connectdata *conn)
{
if(result)
return result;
- state(conn, POP3_LIST);
+ if (strlen(pop3c->mailbox))
+ state(conn, POP3_LIST_SINGLE);
+ else
+ state(conn, POP3_LIST);
return result;
}
result = pop3_state_list_resp(conn, pop3code, pop3c->state);
break;
+ case POP3_LIST_SINGLE:
+ result = pop3_state_list_single_resp(conn, pop3code, pop3c->state);
+ break;
+
case POP3_QUIT:
/* fallthrough, just stop! */
default:
/* If mailbox is empty, then assume user wants listing for mail IDs,
* otherwise, attempt to retrieve the mail-id stored in mailbox
*/
- if (strlen(pop3c->mailbox))
+ if (strlen(pop3c->mailbox) && !conn->data->set.ftp_list_only)
result = pop3_retr(conn);
else
result = pop3_list(conn);
POP3_PASS,
POP3_STARTTLS,
POP3_LIST,
+ POP3_LIST_SINGLE,
POP3_RETR,
POP3_QUIT,
POP3_LAST /* never used */
# per line.
# Lines starting with '#' letters are treated as comments.
564
+811
test313 test1115 test578 test579 test1116 test1200 test1201 test1202 \
test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \
test1303 test320 test321 test322 test323 test324 test1121 test581 test580 \
- test1304 test1305 test1306 test1307 test582 test583
+ test1304 test1305 test1306 test1307 test582 test583 test808 test809 \
+ test810 test811
filecheck:
@mkdir test-place; \
--- /dev/null
+<testcase>
+<info>
+<keywords>
+POP3
+LIST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY LIST +OK 808 100
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+pop3
+</server>
+ <name>
+POP3 LIST one message
+ </name>
+ <command>
+pop3://%HOSTIP:%POP3PORT/808 -l -u user:secret
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER user\r
+PASS secret\r
+LIST 808\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
--- /dev/null
+<testcase>
+<info>
+<keywords>
+POP3
+LIST
+FAILURE
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY LIST -ERR no such message
+</servercmd>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+pop3
+</server>
+ <name>
+POP3 LIST invalid message
+ </name>
+ <command>
+pop3://%HOSTIP:%POP3PORT/809 -l -u user:secret
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<errorcode>
+78
+</errorcode>
+<protocol>
+USER user\r
+PASS secret\r
+LIST 809\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
--- /dev/null
+<testcase>
+<info>
+<keywords>
+POP3
+LIST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+# When doing LIST, we get the default list output hard-coded in the test
+# POP3 server
+<datacheck>
+1 100\r
+2 4294967400\r
+4 200\r
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+pop3
+</server>
+ <name>
+POP3 LIST messages
+ </name>
+ <command>
+pop3://%HOSTIP:%POP3PORT/ -u user:secret
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER user\r
+PASS secret\r
+LIST \r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
--- /dev/null
+<testcase>
+<info>
+<keywords>
+POP3
+LIST
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<servercmd>
+REPLY LIST +OK but no messages\r\n.
+</servercmd>
+<datacheck>
+</datacheck>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+pop3
+</server>
+ <name>
+POP3 LIST no messages available
+ </name>
+ <command>
+pop3://%HOSTIP:%POP3PORT/ -u user:secret
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER user\r
+PASS secret\r
+LIST \r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
elsif($proto eq 'pop3') {
%commandfunc = (
'RETR' => \&RETR_pop3,
+ 'LIST' => \&LIST_pop3,
);
%displaytext = (
'USER' => '+OK We are happy you popped in!',
return 0;
}
+sub LIST_pop3 {
+
+# this is a built-in fake-message list
+my @pop3list=(
+"1 100\r\n",
+"2 4294967400\r\n", # > 4 GB
+"4 200\r\n", # Note that message 3 is a simulated "deleted" message
+);
+
+ logmsg "retrieve a message list\n";
+
+ sendcontrol "+OK Listing starts\r\n";
+
+ for my $d (@pop3list) {
+ sendcontrol $d;
+ }
+
+ # end with the magic 5-byte end of listing marker
+ sendcontrol "\r\n.\r\n";
+
+ return 0;
+}
+
################
################ FTP commands
################