Uploaded image for project: 'James Server'
  1. James Server
  2. JAMES-2884

Update JMAP implementation to conform to RFC 8620/8621

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • None
    • JMAP
    • None

    Description

      Historically, James is an early adopter for the JMAP specification, and a first partial implementation was conducted when JMAP was just a draft. IETF draft undergo radical changes and the community could not keep this implementation up to date with the spec changes.

      As off summer 2019, JMAP core (RFC 8620) and JMAP mail (RFC 8621) had been officially published (will not change anymore). Thus we should implement these new specifications.

      Point of attention: part of the community actively rely on the actual 'draft' implementation of JMAP existing in James. We should ensure no changes is done to that 'draft' protocol is done while implementing the new one.

      The proposed approach is to keep the current implementation under the `jmap-draft` name, and implement step by step a `jmap` compliant implementation, that will be exposed on a separate port. No modification in `jmap-draft` integration test should be counducted.

      This will allow existing `jmap-draft` clients to smoothly transition to `jmap`, then trigger the classic "deprecation-then-removal" process.

      For now, as a first implementation step, we will only support `jmap` on top of memory-guice (ease testing, speed of development). To ensure a `storage-compliant` behavior of newly introduced storage APIs, we should use persistent datastructures (like the one in vavr) and always deep-copy objects at the storage boundaries.

      Attachments

        1.
        Refactoring jmap-draft to be reactive with reactor-netty Sub-task Closed RenĂ© Cordier  
        2.
        Implement jmap protocol POJO and serialization Sub-task Closed Antoine Duprat  
        3.
        Session pojo and serialization Sub-task Closed Antoine Duprat  
        4.
        mailboxes/get POJO and serialization Sub-task Resolved Unassigned  
        5.
        Implement a JMAP meta project to redirect towards the correct JMAP implementation Sub-task Closed Unassigned  
        6.
        Backport from jmap-draft to jmap CORS, auth mechanisms and user & mailbox provisioning Sub-task Closed Unassigned  
        7.
        Implement echo method Sub-task Closed Antoine Duprat  
        8.
        Implement session object Sub-task Closed Antoine Duprat  
        9.
        Port to jmap mailboxes/get Sub-task Closed Unassigned  
        10.
        mailboxes/get with extensions filtering Sub-task Closed Unassigned  
        11.
        Implement level error-handling protocol Sub-task Closed Antoine Duprat  
        12.
        mailboxes/get with properties filtering Sub-task Closed Unassigned  
        13.
        [Documentation] Website doc update and annotated RFCs Sub-task Closed Unassigned  
        14.
        Email/Query Allow filter by date Sub-task Closed Antoine Duprat  
        15.
        Email/Query expose allowed sort in accountCapabilities Sub-task Closed Unassigned  
        16.
        Should not be able to create a mailbox using an invalid accountId in the request body Sub-task Closed Antoine Duprat  
        17.
        Should not be able to create a mailbox using an invalid accountId in the request body Sub-task Closed Antoine Duprat  
        18.
        Email/Query documentation Sub-task Closed Unassigned  
        19.
        Email/Query handle unsupported parameters Sub-task Closed Unassigned  
        20.
        Email/Query Pagination 1 - handle pagination with position Sub-task Closed Antoine Duprat  
        21.
        Email/Query implement Limits Sub-task Closed Antoine Duprat  
        22.
        Email/get specific parsed headers Sub-task Closed Unassigned  
        23.
        Email/Query filter by keywords Sub-task Closed Antoine Duprat  
        24.
        Implement Email/query - unlock single request INBOX content loading Sub-task Closed Antoine Duprat  
        25.
        Email/query Allow filtering by mailbox Sub-task Closed Antoine Duprat  
        26.
        Email/query Support sort by ReceivedAt Sub-task Closed Unassigned  
        27.
        Implement JMAP downloads Sub-task Closed Antoine Duprat  
        28.
        JMAP Email/get specific unparsed header Sub-task Closed Unassigned  
        29.
        JMAP Email/query Allow listing email Sub-task Closed Antoine Duprat  
        30.
        JMAP Email/get Unparsed headers Sub-task Closed Unassigned  
        31.
        Email/get 14. bodyStructure property Sub-task Closed Antoine Duprat  
        32.
        Email/get 1. Metadata Sub-task Closed Unassigned  
        33.
        Add capability mandatory checks regarding jmap core and mail Sub-task Closed Unassigned  
        34.
        JMAP Vacation/set implementation Sub-task Closed Unassigned  
        35.
        JMAP RFC-8621 : Back-reference resolution Sub-task Closed Antoine Duprat  
        36.
        VacationResponse/get implementation Sub-task Closed Unassigned  
        37.
        Sharee should not be able to modify mailbox rights Sub-task Closed Unassigned  
        38.
        Mailbox/set update: name implementation Sub-task Closed Unassigned  
        39.
        Mailbox/set delete: onDestroyRemoveEmails argument implementation Sub-task Closed Unassigned  
        40.
        Mailbox/set creation: simple implementation Sub-task Closed Unassigned  
        41.
        Mailbox/set: reusing creationId Sub-task Closed Antoine Duprat  
        42.
        Mailbox/set delete: simple implementation Sub-task Closed Unassigned  
        43.
        Mailbox/set creation: parentId handling Sub-task Closed Unassigned  
        44.
        [Specification] Write down James JMAP extensions Sub-task Closed Unassigned  
        45.
        JMAP authentication rework Sub-task Closed Unassigned  
        46.
        [JMAP] Method level error handling Sub-task Closed Unassigned  
        47.
        Configure session hardcoded prefixes Sub-task Closed Unassigned  
        48.
        Integration tests for GET endpoint to retrieve the Session object Sub-task Closed Unassigned  
        49.
        Port to jmap mailboxes/get (all) Sub-task Resolved Unassigned  
        50.
        Implement session object Sub-task Closed Unassigned  
        51.
        Session pojo and serialization Sub-task Closed Unassigned  
        52.
        Implement level error-handling protocol Sub-task Closed Unassigned  
        53.
        Implement echo method Sub-task Closed Unassigned  
        54.
        Email/Query support combination of filters with the FilterOperator (AND, OR, NOT) Sub-task Closed Antoine Duprat  
        55.
        Email/query Allow filtering by body Sub-task Closed Unassigned  
        56.
        Email/query Allow filtering by text Sub-task Closed Antoine Duprat  
        57.
        Invalid mailbox filters don't return error in new JMAP Sub-task Closed Unassigned  
        58.
        Email/query & client Id Resolution Sub-task Closed Benoit Tellier  
        59.
        Email/set: Destroy email Sub-task Closed Antoine Duprat  
        60.
        Update Email Keywords/part1: reset Sub-task Closed Antoine Duprat  
        61.
        Update Email Keywords: partial update Sub-task Closed Antoine Duprat  
        62.
        Email/set update mailboxIds 1. Reset Sub-task Closed Antoine Duprat  
        63.
        Email/set update mailboxIds 2. Partial update Sub-task Closed Antoine Duprat  
        64.
        Email/query sort by size/from/to/subject Sub-task Closed Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 20m
        65.
        Email/get 6. Specific unparsed header :all Sub-task Reopened Antoine Duprat  
        66.
        Email/get 15. EmailBodyPart individual headers Sub-task Open Antoine Duprat  
        67.
        Email/Query sort by hasKeyword Sub-task Open Antoine Duprat  
        68.
        [JMAP] Send: EmailSubmission/create (user email) Sub-task Closed Unassigned  
        69.
        Upload: Attachment Sub-task Closed Benoit Tellier  
        70.
        Saving Draft: convenience header & empty body Sub-task Closed Antoine Duprat  
        71.
        JMAP Saving draft: specify html body Sub-task Closed Antoine Duprat  
        72.
        Email/set create position multipart/alternative for text/html body Sub-task Closed Unassigned  
        73.
        Email/set create should return blobId, threadId, size Sub-task Closed Unassigned  
        74.
        Email/query reject Filter object with both FilterOperator and FilterCondition Sub-task Closed Unassigned  
        75.
        Implement Identity/get Sub-task Closed Unassigned  
        76.
        Support JMAP HTTP PUSH Sub-task Closed Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 10m
        77.
        Implement a MailboxChangeRepository Sub-task Closed Unassigned  
        78.
        Implement a JMAP MailboxChangeListener Sub-task Closed Unassigned  
        79.
        Implement Mailbox/changes method and related contract tests Sub-task Closed Unassigned  
        80.
        Implement CassandraMailboxChangeRepository Sub-task Closed Unassigned  
        81.
        Mailbox/get should handle state property Sub-task Closed Unassigned  
        82.
        Mailbox/set should handle oldState & newState Sub-task Closed Unassigned  
        83.
        Mailbox/changes updatedProperties handling Sub-task Closed Unassigned  
        84.
        Implement MemoryEmailChangeRepository Sub-task Closed Unassigned  
        85.
        Implement CassandraEmailChangeRepository Sub-task Closed Unassigned  
        86.
        MailboxChangeListener needs to handle EmailChange events Sub-task Closed Unassigned  
        87.
        Implement Email/changes method and related contract tests Sub-task Closed Unassigned  
        88.
        Email/get should handle state property Sub-task Closed Unassigned  
        89.
        Email/set should handle oldState & newState Sub-task Closed Unassigned  
        90.
        Mailbox/changes should handle delegated mailbox Sub-task Closed Unassigned  
        91.
        Mailbox/changes do not take isSubscribe changes into account Sub-task Open Antoine Duprat  
        92.
        Adapt MailboxChangesMethodContract for stability against distributed environment Sub-task Closed Unassigned  
        93.
        JMAP Mailbox/set is unable to set role Sub-task Open Antoine Duprat  
        94.
        JMAP RFC-8620 SSE transport should manage Last-Event-Id Sub-task Open Antoine Duprat  
        95.
        Implement Email/import Sub-task Closed Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 50m
        96.
        Implement Email/parse Sub-task Open Antoine Duprat  
        97.
        Implement Identity/set Sub-task Open Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 13h 50m
        98.
        Implement Identity/changes Sub-task Open Antoine Duprat  
        99.
        Email/set create bodyStructure support Sub-task Open Antoine Duprat  
        100.
        Email/set create should support attached messages Sub-task Closed Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 20m
        101.
        Email/set create should support several mailboxes Sub-task Open Antoine Duprat  
        102.
        JMAP PushSubscription (web hooks) is not implemented Sub-task Closed Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 46h 20m
        103.
        Spec compliance: Blob/copy Sub-task Open Antoine Duprat  
        104.
        Spec compliance: Email/copy Sub-task Open Antoine Duprat  
        105.
        Write a naive spec compliant SearchSnipset/get method Sub-task Open Antoine Duprat  
        106.
        Implement EmailSubmission storage (/get /set update+destroy /changes) Sub-task Open Antoine Duprat  
        107.
        JMAP uploaded blobs are never deleted Sub-task Closed Benoit Tellier

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 7h 40m
        108.
        Mailbox sortOrder property cannot be updated Sub-task Open Antoine Duprat  
        109.
        Complete the implementation of Mailbox/query Sub-task Open Antoine Duprat  
        110.
        Identity/get should accept the ids property Sub-task Closed Antoine Duprat  
        111.
        Better implement sessionState Sub-task Open Antoine Duprat  
        112.
        EmailSubmission envelope address fields should accept empty object Sub-task Open Antoine Duprat  
        113.
        Naive /queryChanges implementations Sub-task Open Antoine Duprat  
        114.
        Enforce session advertised limits Sub-task Open Antoine Duprat  
        115.
        Fail with cannotCalculateChanges when a single change exceed maxChanges Sub-task Closed Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 1h 50m
        116.
        Email/* should handle quota exceptions Sub-task Closed Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 20m
        117.
        BackReference should allow pointing to specific array elements Sub-task Open Antoine Duprat

        100%

        Original Estimate - Not Specified Original Estimate - Not Specified
        Time Spent - 2h 40m

        Activity

          People

            btellier Benoit Tellier
            cketti cketti
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:

              Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 78.5h
                78.5h