Added support for LISTing a single POP3 message
Added tests for a number of POP3 LIST operations, including one that shows a curl problem when listing no messages, so is disabled.
This commit is contained in:
parent
409867e62b
commit
ef1c18b952
29
lib/pop3.c
29
lib/pop3.c
@ -436,6 +436,24 @@ static CURLcode pop3_state_list_resp(struct connectdata *conn,
|
|||||||
return result;
|
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 */
|
/* start the DO phase for RETR */
|
||||||
static CURLcode pop3_retr(struct connectdata *conn)
|
static CURLcode pop3_retr(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
@ -460,7 +478,10 @@ static CURLcode pop3_list(struct connectdata *conn)
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
state(conn, POP3_LIST);
|
if (strlen(pop3c->mailbox))
|
||||||
|
state(conn, POP3_LIST_SINGLE);
|
||||||
|
else
|
||||||
|
state(conn, POP3_LIST);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,6 +544,10 @@ static CURLcode pop3_statemach_act(struct connectdata *conn)
|
|||||||
result = pop3_state_list_resp(conn, pop3code, pop3c->state);
|
result = pop3_state_list_resp(conn, pop3code, pop3c->state);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case POP3_LIST_SINGLE:
|
||||||
|
result = pop3_state_list_single_resp(conn, pop3code, pop3c->state);
|
||||||
|
break;
|
||||||
|
|
||||||
case POP3_QUIT:
|
case POP3_QUIT:
|
||||||
/* fallthrough, just stop! */
|
/* fallthrough, just stop! */
|
||||||
default:
|
default:
|
||||||
@ -747,7 +772,7 @@ CURLcode pop3_perform(struct connectdata *conn,
|
|||||||
/* If mailbox is empty, then assume user wants listing for mail IDs,
|
/* If mailbox is empty, then assume user wants listing for mail IDs,
|
||||||
* otherwise, attempt to retrieve the mail-id stored in mailbox
|
* 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);
|
result = pop3_retr(conn);
|
||||||
else
|
else
|
||||||
result = pop3_list(conn);
|
result = pop3_list(conn);
|
||||||
|
@ -33,6 +33,7 @@ typedef enum {
|
|||||||
POP3_PASS,
|
POP3_PASS,
|
||||||
POP3_STARTTLS,
|
POP3_STARTTLS,
|
||||||
POP3_LIST,
|
POP3_LIST,
|
||||||
|
POP3_LIST_SINGLE,
|
||||||
POP3_RETR,
|
POP3_RETR,
|
||||||
POP3_QUIT,
|
POP3_QUIT,
|
||||||
POP3_LAST /* never used */
|
POP3_LAST /* never used */
|
||||||
|
@ -3,3 +3,4 @@
|
|||||||
# per line.
|
# per line.
|
||||||
# Lines starting with '#' letters are treated as comments.
|
# Lines starting with '#' letters are treated as comments.
|
||||||
564
|
564
|
||||||
|
811
|
||||||
|
@ -70,7 +70,8 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
|
|||||||
test313 test1115 test578 test579 test1116 test1200 test1201 test1202 \
|
test313 test1115 test578 test579 test1116 test1200 test1201 test1202 \
|
||||||
test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \
|
test1203 test1117 test1118 test1119 test1120 test1300 test1301 test1302 \
|
||||||
test1303 test320 test321 test322 test323 test324 test1121 test581 test580 \
|
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:
|
filecheck:
|
||||||
@mkdir test-place; \
|
@mkdir test-place; \
|
||||||
|
41
tests/data/test808
Normal file
41
tests/data/test808
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<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
|
||||||
|
PASS secret
|
||||||
|
LIST 808
|
||||||
|
QUIT
|
||||||
|
</protocol>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
45
tests/data/test809
Normal file
45
tests/data/test809
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<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
|
||||||
|
PASS secret
|
||||||
|
LIST 809
|
||||||
|
QUIT
|
||||||
|
</protocol>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
45
tests/data/test810
Normal file
45
tests/data/test810
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<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
|
||||||
|
2 4294967400
|
||||||
|
4 200
|
||||||
|
</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
|
||||||
|
PASS secret
|
||||||
|
LIST
|
||||||
|
QUIT
|
||||||
|
</protocol>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
43
tests/data/test811
Normal file
43
tests/data/test811
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<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
|
||||||
|
PASS secret
|
||||||
|
LIST
|
||||||
|
QUIT
|
||||||
|
</protocol>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
@ -392,6 +392,7 @@ sub protocolsetup {
|
|||||||
elsif($proto eq 'pop3') {
|
elsif($proto eq 'pop3') {
|
||||||
%commandfunc = (
|
%commandfunc = (
|
||||||
'RETR' => \&RETR_pop3,
|
'RETR' => \&RETR_pop3,
|
||||||
|
'LIST' => \&LIST_pop3,
|
||||||
);
|
);
|
||||||
%displaytext = (
|
%displaytext = (
|
||||||
'USER' => '+OK We are happy you popped in!',
|
'USER' => '+OK We are happy you popped in!',
|
||||||
@ -683,6 +684,29 @@ sub RETR_pop3 {
|
|||||||
return 0;
|
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
|
################ FTP commands
|
||||||
################
|
################
|
||||||
|
Loading…
x
Reference in New Issue
Block a user