Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7adc5e5 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #1939 from k9mail/GH-1936_add_support_for_delimiter_value_nil

Add support for delimiter value NIL in LIST responses
parents a56f12f1 d3310b56
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -194,8 +194,7 @@ class ImapResponseParser {
        expect(' ');
        parseList(response, '(', ')');
        expect(' ');
        //TODO: Add support for NIL
        String delimiter = parseQuoted();
        String delimiter = parseQuotedOrNil();
        response.add(delimiter);
        expect(' ');
        String name = parseString();
@@ -418,6 +417,22 @@ class ImapResponseParser {
        throw new IOException("parseQuoted(): end of stream reached");
    }

    private String parseQuotedOrNil() throws IOException {
        int peek = inputStream.peek();
        if (peek == '"') {
            return parseQuoted();
        } else {
            parseNil();
            return null;
        }
    }
    
    private void parseNil() throws IOException {
        expect('N');
        expect('I');
        expect('L');
    }

    private String readStringUntil(char end) throws IOException {
        StringBuilder sb = new StringBuilder();

+4 −2
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import android.support.annotation.Nullable;

import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase;

class ListResponse {
@@ -52,9 +54,8 @@ class ListResponse {
            return null;
        }

        //TODO: Add support for NIL. Needs modifications in ImapResponseParser
        String hierarchyDelimiter = response.getString(2);
        if (hierarchyDelimiter.length() != 1) {
        if (hierarchyDelimiter != null && hierarchyDelimiter.length() != 1) {
            return null;
        }

@@ -93,6 +94,7 @@ class ListResponse {
        return false;
    }

    @Nullable
    public String getHierarchyDelimiter() {
        return hierarchyDelimiter;
    }
+14 −0
Original line number Diff line number Diff line
@@ -397,6 +397,20 @@ public class ImapResponseParserTest {
        assertEquals("TAG", responseTwo.getTag());
    }

    @Test
    public void readResponse_withListResponseContainingNil() throws Exception {
        ImapResponseParser parser = createParser("* LIST (\\NoInferiors) NIL INBOX\r\n");

        ImapResponse response = parser.readResponse();

        assertEquals(4, response.size());
        assertEquals("LIST", response.get(0));
        assertEquals(1, response.getList(1).size());
        assertEquals("\\NoInferiors", response.getList(1).getString(0));
        assertEquals(null, response.get(2));
        assertEquals("INBOX", response.get(3));
    }

    @Test
    public void readResponse_withListAsFirstToken_shouldThrow() throws Exception {
        ImapResponseParser parser = createParser("* [1 2] 3\r\n");
+3 −1
Original line number Diff line number Diff line
@@ -20,15 +20,17 @@ public class ListResponseTest {
                createImapResponse("* LIST () \"/\" blurdybloop"),
                createImapResponse("* LIST (\\Noselect) \"/\" foo"),
                createImapResponse("* LIST () \"/\" foo/bar"),
                createImapResponse("* LIST (\\NoInferiors) NIL INBOX"),
                createImapResponse("X OK LIST completed")
        );

        List<ListResponse> result = ListResponse.parseList(responses);

        assertEquals(3, result.size());
        assertEquals(4, result.size());
        assertListResponseEquals(noAttributes(), "/", "blurdybloop", result.get(0));
        assertListResponseEquals(singletonList("\\Noselect"), "/", "foo", result.get(1));
        assertListResponseEquals(noAttributes(), "/", "foo/bar", result.get(2));
        assertListResponseEquals(singletonList("\\NoInferiors"), null, "INBOX", result.get(3));
    }

    @Test