From 4d8bbe4850da183bd71757745b6b89e1175660b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicklas=20Av=C3=A9n?= Date: Tue, 31 Jul 2018 13:12:18 +0200 Subject: [PATCH] imap: change from "FETCH" to "UID FETCH" ... and add "MAILINDEX". As described in #2789, this is a suggested solution. Changing UID=xx to actually get mail with UID xx and add "MAILINDEX" to get a mail with a special index in the mail box (old behavior). So MAILINDEX=1 gives the first non deleted mail in the mail box. Fixes #2789 Closes #2815 --- docs/libcurl/opts/CURLOPT_URL.3 | 5 ++- lib/imap.c | 63 ++++++++++++++++++++++----------- lib/imap.h | 1 + tests/data/Makefile.inc | 2 +- tests/data/test1321 | 2 +- tests/data/test1420 | 4 +-- tests/data/test1552 | 2 +- tests/data/test800 | 2 +- tests/data/test801 | 4 +-- tests/data/test802 | 2 +- tests/data/test803 | 2 +- tests/data/test804 | 2 +- tests/data/test819 | 2 +- tests/data/test820 | 2 +- tests/data/test821 | 2 +- tests/data/test822 | 2 +- tests/data/test823 | 2 +- tests/data/test824 | 2 +- tests/data/test825 | 2 +- tests/data/test826 | 2 +- tests/data/test827 | 2 +- tests/data/test828 | 2 +- tests/data/test830 | 2 +- tests/data/test831 | 2 +- tests/data/test832 | 2 +- tests/data/test833 | 2 +- tests/data/test834 | 2 +- tests/data/test835 | 2 +- tests/data/test836 | 2 +- tests/data/test837 | 2 +- tests/data/test838 | 2 +- tests/data/test839 | 2 +- tests/data/test840 | 2 +- tests/data/test842 | 2 +- tests/data/test843 | 2 +- tests/data/test844 | 2 +- tests/data/test845 | 2 +- tests/data/test846 | 2 +- tests/data/test847 | 49 +++++++++++++++++++++++++ tests/ftpserver.pl | 8 ++++- 40 files changed, 140 insertions(+), 60 deletions(-) create mode 100644 tests/data/test847 diff --git a/docs/libcurl/opts/CURLOPT_URL.3 b/docs/libcurl/opts/CURLOPT_URL.3 index 52ff9c6d76fb9e..60308cbceea82a 100644 --- a/docs/libcurl/opts/CURLOPT_URL.3 +++ b/docs/libcurl/opts/CURLOPT_URL.3 @@ -187,7 +187,10 @@ imap://user:password@mail.example.com/INBOX - Performs a folder list on the user's inbox imap://user:password@mail.example.com/INBOX/;UID=1 - Selects the user's inbox -and fetches message 1 +and fetches message with uid = 1 + +imap://user:password@mail.example.com/INBOX/;MAILINDEX=1 - Selects the user's inbox +and fetches the first message in the mail box imap://user:password@mail.example.com/INBOX;UIDVALIDITY=50/;UID=2 - Selects the user's inbox, checks the UIDVALIDITY of the mailbox is 50 and fetches diff --git a/lib/imap.c b/lib/imap.c index 942fe7d1efc4e7..4a9c01ae7536bd 100644 --- a/lib/imap.c +++ b/lib/imap.c @@ -421,7 +421,6 @@ static CURLcode imap_perform_capability(struct connectdata *conn) { CURLcode result = CURLE_OK; struct imap_conn *imapc = &conn->proto.imapc; - imapc->sasl.authmechs = SASL_AUTH_NONE; /* No known auth. mechanisms yet */ imapc->sasl.authused = SASL_AUTH_NONE; /* Clear the auth. mechanism used */ imapc->tls_supported = FALSE; /* Clear the TLS capability */ @@ -683,24 +682,37 @@ static CURLcode imap_perform_fetch(struct connectdata *conn) { CURLcode result = CURLE_OK; struct IMAP *imap = conn->data->req.protop; - /* Check we have a UID */ - if(!imap->uid) { - failf(conn->data, "Cannot FETCH without a UID."); - return CURLE_URL_MALFORMAT; + if(imap->uid) { + + /* Send the FETCH command */ + if(imap->partial) + result = imap_sendf(conn, "UID FETCH %s BODY[%s]<%s>", + imap->uid, + imap->section ? imap->section : "", + imap->partial); + else + result = imap_sendf(conn, "UID FETCH %s BODY[%s]", + imap->uid, + imap->section ? imap->section : ""); + } + else if(imap->mindex) { + + /* Send the FETCH command */ + if(imap->partial) + result = imap_sendf(conn, "FETCH %s BODY[%s]<%s>", + imap->mindex, + imap->section ? imap->section : "", + imap->partial); + else + result = imap_sendf(conn, "FETCH %s BODY[%s]", + imap->mindex, + imap->section ? imap->section : ""); + } + else { + failf(conn->data, "Cannot FETCH without a UID."); + return CURLE_URL_MALFORMAT; } - - /* Send the FETCH command */ - if(imap->partial) - result = imap_sendf(conn, "FETCH %s BODY[%s]<%s>", - imap->uid, - imap->section ? imap->section : "", - imap->partial); - else - result = imap_sendf(conn, "FETCH %s BODY[%s]", - imap->uid, - imap->section ? imap->section : ""); - if(!result) state(conn, IMAP_FETCH); @@ -1464,9 +1476,10 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status, result = status; /* use the already set error code */ } else if(!data->set.connect_only && !imap->custom && - (imap->uid || data->set.upload || + (imap->uid || imap->mindex || data->set.upload || data->set.mimepost.kind != MIMEKIND_NONE)) { /* Handle responses after FETCH or APPEND transfer has finished */ + if(!data->set.upload && data->set.mimepost.kind == MIMEKIND_NONE) state(conn, IMAP_FETCH_FINAL); else { @@ -1490,6 +1503,7 @@ static CURLcode imap_done(struct connectdata *conn, CURLcode status, Curl_safefree(imap->mailbox); Curl_safefree(imap->uidvalidity); Curl_safefree(imap->uid); + Curl_safefree(imap->mindex); Curl_safefree(imap->section); Curl_safefree(imap->partial); Curl_safefree(imap->query); @@ -1543,14 +1557,14 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected, else if(imap->custom && (selected || !imap->mailbox)) /* Custom command using the same mailbox or no mailbox */ result = imap_perform_list(conn); - else if(!imap->custom && selected && imap->uid) + else if(!imap->custom && selected && (imap->uid || imap->mindex)) /* FETCH from the same mailbox */ result = imap_perform_fetch(conn); else if(!imap->custom && selected && imap->query) /* SEARCH the current mailbox */ result = imap_perform_search(conn); else if(imap->mailbox && !selected && - (imap->custom || imap->uid || imap->query)) + (imap->custom || imap->uid || imap->mindex || imap->query)) /* SELECT the mailbox */ result = imap_perform_select(conn); else @@ -2016,6 +2030,13 @@ static CURLcode imap_parse_url_path(struct connectdata *conn) imap->uid = value; value = NULL; } + else if(strcasecompare(name, "MAILINDEX") && !imap->mindex) { + if(valuelen > 0 && value[valuelen - 1] == '/') + value[valuelen - 1] = '\0'; + + imap->mindex = value; + value = NULL; + } else if(strcasecompare(name, "SECTION") && !imap->section) { if(valuelen > 0 && value[valuelen - 1] == '/') value[valuelen - 1] = '\0'; @@ -2043,7 +2064,7 @@ static CURLcode imap_parse_url_path(struct connectdata *conn) /* Does the URL contain a query parameter? Only valid when we have a mailbox and no UID as per RFC-5092 */ - if(imap->mailbox && !imap->uid && *ptr == '?') { + if(imap->mailbox && !imap->uid && !imap->mindex && *ptr == '?') { /* Find the length of the query parameter */ begin = ++ptr; while(imap_is_bchar(*ptr)) diff --git a/lib/imap.h b/lib/imap.h index 9fc4ff5a3daa31..0efcfd293cc77a 100644 --- a/lib/imap.h +++ b/lib/imap.h @@ -58,6 +58,7 @@ struct IMAP { char *mailbox; /* Mailbox to select */ char *uidvalidity; /* UIDVALIDITY to check in select */ char *uid; /* Message UID to fetch */ + char *mindex; /* Index in mail box of mail to fetch */ char *section; /* Message SECTION to fetch */ char *partial; /* Message PARTIAL to fetch */ char *query; /* Query to search for */ diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 0980ff0032737e..aa0b03e3cdcb15 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -93,7 +93,7 @@ test809 test810 test811 test812 test813 test814 test815 test816 test817 \ test818 test819 test820 test821 test822 test823 test824 test825 test826 \ test827 test828 test829 test830 test831 test832 test833 test834 test835 \ test836 test837 test838 test839 test840 test841 test842 test843 test844 \ -test845 test846 \ +test845 test846 test847 \ \ test850 test851 test852 test853 test854 test855 test856 test857 test858 \ test859 test860 test861 test862 test863 test864 test865 test866 test867 \ diff --git a/tests/data/test1321 b/tests/data/test1321 index ee1b47857f488c..72a52c9357d109 100644 --- a/tests/data/test1321 +++ b/tests/data/test1321 @@ -51,7 +51,7 @@ http IMAP FETCH tunneled through HTTP proxy -'imap://imap.1321:%IMAPPORT/1321/;UID=1' -u user:secret -p -x %HOSTIP:%PROXYPORT +'imap://imap.1321:%IMAPPORT/1321/;MAILINDEX=1' -u user:secret -p -x %HOSTIP:%PROXYPORT diff --git a/tests/data/test1420 b/tests/data/test1420 index a5e1c5214194f8..081ac6bbb6b1db 100644 --- a/tests/data/test1420 +++ b/tests/data/test1420 @@ -36,7 +36,7 @@ imap SSL_CERT_FILE= -'imap://%HOSTIP:%IMAPPORT/1420/;UID=1' -u user:secret --libcurl log/test1420.c +'imap://%HOSTIP:%IMAPPORT/1420/;MAILINDEX=1' -u user:secret --libcurl log/test1420.c @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) hnd = curl_easy_init(); curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L); - curl_easy_setopt(hnd, CURLOPT_URL, "imap://%HOSTIP:%IMAPPORT/1420/;UID=1"); + curl_easy_setopt(hnd, CURLOPT_URL, "imap://%HOSTIP:%IMAPPORT/1420/;MAILINDEX=1"); curl_easy_setopt(hnd, CURLOPT_USERPWD, "user:secret"); curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L); diff --git a/tests/data/test1552 b/tests/data/test1552 index c5b1b57284c110..48e55cb514c194 100644 --- a/tests/data/test1552 +++ b/tests/data/test1552 @@ -39,7 +39,7 @@ IMAP multi transfer error without curl_multi_remove_handle lib1552 -'imap://%HOSTIP:%IMAPPORT/1552/;UID=1' +'imap://%HOSTIP:%IMAPPORT/1552/;MAILINDEX=1' diff --git a/tests/data/test800 b/tests/data/test800 index 360206b43d7947..6b74da90fec210 100644 --- a/tests/data/test800 +++ b/tests/data/test800 @@ -31,7 +31,7 @@ imap IMAP FETCH message -'imap://%HOSTIP:%IMAPPORT/800/;UID=1' -u '"user:sec"ret{' +'imap://%HOSTIP:%IMAPPORT/800/;MAILINDEX=1' -u '"user:sec"ret{' diff --git a/tests/data/test801 b/tests/data/test801 index 0012d3e4d2d11c..90766f79fd115d 100644 --- a/tests/data/test801 +++ b/tests/data/test801 @@ -25,10 +25,10 @@ body imap -IMAP FETCH message by UID and SECTION +IMAP FETCH message by MAILINDEX and SECTION -'imap://%HOSTIP:%IMAPPORT/801/;UID=123/;SECTION=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/801/;MAILINDEX=123/;SECTION=1' -u user:secret diff --git a/tests/data/test802 b/tests/data/test802 index 17349a89a8f29b..19206a75da1251 100644 --- a/tests/data/test802 +++ b/tests/data/test802 @@ -29,7 +29,7 @@ imap IMAP SELECT UIDVALIDITY Success -'imap://%HOSTIP:%IMAPPORT/802;UIDVALIDITY=3857529045/;UID=123/;SECTION=TEXT' -u user:secret +'imap://%HOSTIP:%IMAPPORT/802;UIDVALIDITY=3857529045/;MAILINDEX=123/;SECTION=TEXT' -u user:secret diff --git a/tests/data/test803 b/tests/data/test803 index 5b8cc9eb6419c0..834e4211d20079 100644 --- a/tests/data/test803 +++ b/tests/data/test803 @@ -24,7 +24,7 @@ imap IMAP SELECT UIDVALIDITY Failure -'imap://%HOSTIP:%IMAPPORT/803;UIDVALIDITY=12345/;UID=123' -u user:secret +'imap://%HOSTIP:%IMAPPORT/803;UIDVALIDITY=12345/;MAILINDEX=123' -u user:secret diff --git a/tests/data/test804 b/tests/data/test804 index c6dfccf4a9dab9..90635c22cc4832 100644 --- a/tests/data/test804 +++ b/tests/data/test804 @@ -28,7 +28,7 @@ imap IMAP doesn't perform SELECT if re-using the same mailbox -'imap://%HOSTIP:%IMAPPORT/804/;UID=123/;SECTION=1' 'imap://%HOSTIP:%IMAPPORT/804/;UID=456/;SECTION=2.3' -u user:secret +'imap://%HOSTIP:%IMAPPORT/804/;MAILINDEX=123/;SECTION=1' 'imap://%HOSTIP:%IMAPPORT/804/;MAILINDEX=456/;SECTION=2.3' -u user:secret diff --git a/tests/data/test819 b/tests/data/test819 index d0aa47ba549f3b..b88e350559eb97 100644 --- a/tests/data/test819 +++ b/tests/data/test819 @@ -37,7 +37,7 @@ imap IMAP plain authentication -'imap://%HOSTIP:%IMAPPORT/819/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/819/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test820 b/tests/data/test820 index f638f1cb63355e..0fe9bf2d691452 100644 --- a/tests/data/test820 +++ b/tests/data/test820 @@ -37,7 +37,7 @@ imap IMAP login authentication -'imap://%HOSTIP:%IMAPPORT/820/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/820/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test821 b/tests/data/test821 index aee373b9a36dbe..6c511c1ef32170 100644 --- a/tests/data/test821 +++ b/tests/data/test821 @@ -40,7 +40,7 @@ crypto IMAP CRAM-MD5 authentication -'imap://%HOSTIP:%IMAPPORT/821/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/821/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test822 b/tests/data/test822 index a6c0407e6000d0..60f0cf1d39aa9e 100644 --- a/tests/data/test822 +++ b/tests/data/test822 @@ -48,7 +48,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -'imap://%HOSTIP:%IMAPPORT/822/;UID=1' -u testuser:testpass +'imap://%HOSTIP:%IMAPPORT/822/;MAILINDEX=1' -u testuser:testpass chkhostname curlhost diff --git a/tests/data/test823 b/tests/data/test823 index 25c59ec608e3a4..32bd9d18978970 100644 --- a/tests/data/test823 +++ b/tests/data/test823 @@ -43,7 +43,7 @@ crypto IMAP DIGEST-MD5 authentication -'imap://%HOSTIP:%IMAPPORT/823/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/823/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test824 b/tests/data/test824 index e646eec7644d78..96c8e87b9999e1 100644 --- a/tests/data/test824 +++ b/tests/data/test824 @@ -37,7 +37,7 @@ imap IMAP OAuth 2.0 (XOAUTH2) authentication -'imap://%HOSTIP:%IMAPPORT/824/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM +'imap://%HOSTIP:%IMAPPORT/824/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM diff --git a/tests/data/test825 b/tests/data/test825 index 6532b3ace7ef53..b489e95de6683d 100644 --- a/tests/data/test825 +++ b/tests/data/test825 @@ -38,7 +38,7 @@ imap IMAP plain authentication with initial response -'imap://%HOSTIP:%IMAPPORT/825/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/825/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test826 b/tests/data/test826 index 0f9282945f2a3c..a1125e2f40ce97 100644 --- a/tests/data/test826 +++ b/tests/data/test826 @@ -38,7 +38,7 @@ imap IMAP login authentication with initial response -'imap://%HOSTIP:%IMAPPORT/826/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/826/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test827 b/tests/data/test827 index 5005271e1590ac..1329ed2378993d 100644 --- a/tests/data/test827 +++ b/tests/data/test827 @@ -49,7 +49,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -'imap://%HOSTIP:%IMAPPORT/827/;UID=1' -u testuser:testpass +'imap://%HOSTIP:%IMAPPORT/827/;MAILINDEX=1' -u testuser:testpass chkhostname curlhost diff --git a/tests/data/test828 b/tests/data/test828 index c86516a60e8201..912aeff3d805f1 100644 --- a/tests/data/test828 +++ b/tests/data/test828 @@ -38,7 +38,7 @@ imap IMAP OAuth 2.0 (XOAUTH2) authentication with initial response -'imap://%HOSTIP:%IMAPPORT/828/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM +'imap://%HOSTIP:%IMAPPORT/828/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM diff --git a/tests/data/test830 b/tests/data/test830 index 5803bb11ed60d9..c7812b7944813f 100644 --- a/tests/data/test830 +++ b/tests/data/test830 @@ -33,7 +33,7 @@ crypto IMAP CRAM-MD5 graceful cancellation -'imap://%HOSTIP:%IMAPPORT/830/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/830/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test831 b/tests/data/test831 index 8bff7eac0ff863..fdcae29c145c0f 100644 --- a/tests/data/test831 +++ b/tests/data/test831 @@ -40,7 +40,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -'imap://%HOSTIP:%IMAPPORT/831/;UID=1' -u testuser:testpass +'imap://%HOSTIP:%IMAPPORT/831/;MAILINDEX=1' -u testuser:testpass chkhostname curlhost diff --git a/tests/data/test832 b/tests/data/test832 index 044edb1926f9cd..360654ab032218 100644 --- a/tests/data/test832 +++ b/tests/data/test832 @@ -35,7 +35,7 @@ crypto IMAP DIGEST-MD5 graceful cancellation -'imap://%HOSTIP:%IMAPPORT/832/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/832/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test833 b/tests/data/test833 index b5fa03f9e078c2..dc8214b8ec80c1 100644 --- a/tests/data/test833 +++ b/tests/data/test833 @@ -44,7 +44,7 @@ crypto IMAP CRAM-MD5 authentication with SASL downgrade -'imap://%HOSTIP:%IMAPPORT/833/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/833/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test834 b/tests/data/test834 index 17101ddfcf90ca..fc131773b68f01 100644 --- a/tests/data/test834 +++ b/tests/data/test834 @@ -51,7 +51,7 @@ CURL_GETHOSTNAME=curlhost LD_PRELOAD=%PWD/libtest/.libs/libhostname.so -'imap://%HOSTIP:%IMAPPORT/834/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/834/;MAILINDEX=1' -u user:secret chkhostname curlhost diff --git a/tests/data/test835 b/tests/data/test835 index 34f28b71b20de6..400233c0cb5c49 100644 --- a/tests/data/test835 +++ b/tests/data/test835 @@ -46,7 +46,7 @@ crypto IMAP DIGEST-MD5 authentication with SASL downgrade -'imap://%HOSTIP:%IMAPPORT/835/;UID=1' -u user:secret +'imap://%HOSTIP:%IMAPPORT/835/;MAILINDEX=1' -u user:secret diff --git a/tests/data/test836 b/tests/data/test836 index 035d48ffe8aba8..9478042ed97444 100644 --- a/tests/data/test836 +++ b/tests/data/test836 @@ -36,7 +36,7 @@ imap IMAP multiple connection authentication -'imap://%HOSTIP:%IMAPPORT/836/;UID=1' -u user.one:secret -: 'imap://%HOSTIP:%IMAPPORT/836/;UID=2' -u user.two:secret +'imap://%HOSTIP:%IMAPPORT/836/;MAILINDEX=1' -u user.one:secret -: 'imap://%HOSTIP:%IMAPPORT/836/;UID=2' -u user.two:secret diff --git a/tests/data/test837 b/tests/data/test837 index d5974634e62505..032726681a6287 100644 --- a/tests/data/test837 +++ b/tests/data/test837 @@ -37,7 +37,7 @@ imap IMAP external authentication -'imap://user;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/837/;UID=1' +'imap://user;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/837/;MAILINDEX=1' diff --git a/tests/data/test838 b/tests/data/test838 index da2d28d050160f..f5378fb4009fbc 100644 --- a/tests/data/test838 +++ b/tests/data/test838 @@ -37,7 +37,7 @@ imap IMAP external authentication without credentials -'imap://;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/838/;UID=1' +'imap://;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/838/;MAILINDEX=1' diff --git a/tests/data/test839 b/tests/data/test839 index 2a544c1cfcf826..508fb8e5723ddb 100644 --- a/tests/data/test839 +++ b/tests/data/test839 @@ -38,7 +38,7 @@ imap IMAP external authentication with initial response -'imap://user;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/839/;UID=1' +'imap://user;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/839/;MAILINDEX=1' diff --git a/tests/data/test840 b/tests/data/test840 index eaf1aeea4a1c07..1e85af396b2930 100644 --- a/tests/data/test840 +++ b/tests/data/test840 @@ -38,7 +38,7 @@ imap IMAP external authentication with initial response without credentials -'imap://;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/840/;UID=1' +'imap://;AUTH=EXTERNAL@%HOSTIP:%IMAPPORT/840/;MAILINDEX=1' diff --git a/tests/data/test842 b/tests/data/test842 index d5aabbca82a99d..e86abd430faadd 100644 --- a/tests/data/test842 +++ b/tests/data/test842 @@ -38,7 +38,7 @@ imap IMAP OAuth 2.0 (OAUTHBEARER) authentication -'imap://%HOSTIP:%IMAPPORT/842/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM +'imap://%HOSTIP:%IMAPPORT/842/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM # The protocol section doesn't support ways of specifying the raw data in the # base64 encoded message so we must assert this diff --git a/tests/data/test843 b/tests/data/test843 index a1c31a4549b04c..e286fd93fc5f88 100644 --- a/tests/data/test843 +++ b/tests/data/test843 @@ -39,7 +39,7 @@ imap IMAP OAuth 2.0 (OAUTHBEARER) authentication with initial response -'imap://%HOSTIP:%IMAPPORT/843/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM +'imap://%HOSTIP:%IMAPPORT/843/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM # The protocol section doesn't support ways of specifying the raw data in the # base64 encoded message so we must assert this diff --git a/tests/data/test844 b/tests/data/test844 index 055a9d2f4ab5f1..2cdb265fa3fc50 100644 --- a/tests/data/test844 +++ b/tests/data/test844 @@ -30,7 +30,7 @@ imap IMAP OAuth 2.0 (OAUTHBEARER) failure as continuation -'imap://%HOSTIP:%IMAPPORT/844/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM +'imap://%HOSTIP:%IMAPPORT/844/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM # The protocol section doesn't support ways of specifying the raw data in the # base64 encoded message so we must assert this diff --git a/tests/data/test845 b/tests/data/test845 index e23b3d69e83311..d8b55748853644 100644 --- a/tests/data/test845 +++ b/tests/data/test845 @@ -31,7 +31,7 @@ imap IMAP OAuth 2.0 (OAUTHBEARER) failure as continuation with initial response -'imap://%HOSTIP:%IMAPPORT/845/;UID=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM +'imap://%HOSTIP:%IMAPPORT/845/;MAILINDEX=1' -u user --oauth2-bearer mF_9.B5f-4.1JqM # The protocol section doesn't support ways of specifying the raw data in the # base64 encoded message so we must assert this diff --git a/tests/data/test846 b/tests/data/test846 index b363ffd18a9a54..8d4d3c5fcf6ba0 100644 --- a/tests/data/test846 +++ b/tests/data/test846 @@ -33,7 +33,7 @@ imap IMAP PREAUTH response -'imap://%HOSTIP:%IMAPPORT/846/;UID=1' -u notused:still-provided +'imap://%HOSTIP:%IMAPPORT/846/;MAILINDEX=1' -u notused:still-provided diff --git a/tests/data/test847 b/tests/data/test847 new file mode 100644 index 00000000000000..d4c10433299f5e --- /dev/null +++ b/tests/data/test847 @@ -0,0 +1,49 @@ + + + +IMAP +Clear Text +FETCH + + + +# +# Server-side + + +From: me@somewhere +To: fake@nowhere + +body + +-- + yours sincerely + + + +# +# Client-side + + +imap + + +IMAP FETCH message + + +'imap://%HOSTIP:%IMAPPORT/847/;UID=1' -u '"user:sec"ret{' + + + +# +# Verify data after the test has been "shot" + + +A001 CAPABILITY +A002 LOGIN "\"user" "sec\"ret{" +A003 SELECT 847 +A004 UID FETCH 1 BODY[] +A005 LOGOUT + + + diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index 97f7b8ea5ead66..d401be24ca65f9 100755 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -1560,7 +1560,13 @@ sub UID_imap { if ($selected eq "") { sendcontrol "$cmdid BAD Command received in Invalid state\r\n"; } - elsif (($command ne "COPY") && ($command ne "FETCH") && + elsif (substr($command, 0, 5) eq "FETCH"){ + my $func = $commandfunc{"FETCH"}; + if($func) { + &$func($args, $command); + } + } + elsif (($command ne "COPY") && ($command ne "STORE") && ($command ne "SEARCH")) { sendcontrol "$cmdid BAD Command Argument\r\n"; }