Hello, > is there a public document specifying this
No explicit public specification; the closest we have are patches published against Dovecot (which was part of macOS Server, their discontinued server product). Other open-source mail server projects have used that as a specification to develop their own solutions: * https://github.com/freswa/dovecot-xaps-plugin * https://github.com/cyrusimap/cyrus-imapd/commit/a4470bf0f79de49030b3d66d2b385a1345c1a040 > we added exactly one year ago support for IMAP extension As you saw previously I am already doing this in my proof-of-concept, however I have a question as to which pattern the storage & APNS long-lived client should conform to. The IMAP extension & mailbox listeners (which James has established patterns for) are only *part* of the entire solution. I am very new to this project (and Java in general) so I would appreciate if someone with more experience could stub out a general layout of the classes I should implement and which base classes to inherit from for the storage & long-lived APNS client. I will check out that Firebase extension you linked but I'd appreciate any other help/opinions. > all code landing in ASF james needs t be ASFV2 I'm open to licensing this under whatever license - the PoC I linked to previously is licensed under whatever James is, I've copied the LICENSE file verbatim. > we can not rely on a proprietary custom external APSN bridge (external bridge > is OK to me though, if FOSS and easy to run...). T bridge I used in my PoC is FOSS (MIT-licensed), however I am looking to remove the dependency on it as I find its data storage model inadequate and unable to support mailbox delegation, therefore this mailing list thread on how to reimplement the full functionality within James itself. Regards. > On 7 Dec 2023, at 20:13, Benoit TELLIER <btell...@apache.org> wrote: > > Hello Andre. > > Thanks for letting me discover about this Apple feature. Out of curiosity, is > there a public document specifying this? If so could you share this link? > > Are you aware of other free and OpenSource mail servers implementing this? > > Second, we added exactly one year ago support for IMAP extension: > implementing support for XAPPLEPUSHSERVICE can thus always be done in an > extension. Here is an example of how to do so: > https://github.com/apache/james-project/tree/master/examples/custom-imap > > > > I speak for myself - this is not something I would contribute by myself for > pleasure > > > First question would be whether you'd be interested in including this in > > James core, or if this should remain a separate extension? > > If there is a publicly available specification and other FOSS mail server > implementation for this, I personnally could welcome such a effort as a > third party module that could be embedded into the IMAP stack. > Definitvely not in James core. > > > If interested in upstreaming, would you be able to outline a high-level > > overview of what the code should look like, especially where to put the > > APNS client? > > https://github.com/apache/james-project/tree/master/third-party/apsn-imap ? > > We coukld define core concepts there, apsn driver, storage api, imap module. > Then separate maven modules for token storage? > > Like > https://github.com/apache/james-project/tree/master/third-party/apsn-memory > https://github.com/apache/james-project/tree/master/third-party/apsn-cassandra > > Somebody willing to enable the extension in James would... > ...1 Drop the apsn-imap-xxxx jar on the classpath > ...2 Register the guice module into extensions.properties to select his > device store. > ...3 Register the APSN IMAP extension. > > > I want to know whether James has a way for extensions to attach arbitrary > > data to a mailbox > > James extension can store data. Talk speaking about this [1] and (old) code > example [2] > [1] https://www.youtube.com/watch?v=zr8qpNkL6U4&ab_channel=TheASF > [2] https://github.com/chibenwa/james-blacklist > > > Also, where to put the long-lived APNS client? > > Dedicated storage for the extension > > > Does James have an existing extension pattern that accounts for long-lived > > services like this? > > Yes as Tung mentionned with JMAP we did implement WebPush and a Linagora > specific firebase extension. > We also do have websockets and eventsource up and running with JMAP. > > > https://github.com/Rjevski/apache-james-xapsd-registration-extension > > So cool! > > Congrats! > > Definitly happy to welcome this in James (as third-party), and happy to see > you did succeed to set up an IMAP extension by yourself! > > Last question: all code landing in ASF james needs t be ASFV2 and we can not > rely on a proprietary custom external APSN bridge (external bridge is OK to > me though, if FOSS and easy to run...). > > Best regards, > > Benoit > > On 07/12/2023 10:33, Tran Tung wrote: >> Hello, >> >> I'm unable to answer all your questions. >> As I know, James doesn't have a backend repository to store data similar to >> your use case. >> At Linagora, we encountered a similar situation when implementing Firebase. >> Consequently, we opted to develop a dedicated repository for storage. >> If you want to reference the code, you can visit >> https://github.com/linagora/tmail-backend/tree/master/tmail-backend/jmap/extensions/src/main/java/com/linagora/tmail/james/jmap/firebase >> >> Hope that help you a bit >> >> >> On 07/12/2023 15:36, Andre Borie wrote: >>> Hello and hope everyone is well. I would like your help as to how best to >>> implement Apple Push notification support. >>> >>> For a bit of context, Apple iOS does not use IMAP IDLE - instead it uses a >>> proprietary IMAP command "XAPPLEPUSHSERVICE" combined with Apple's hosted >>> push notifications service "APNS". >>> >>> When an iOS device connects to a supported server advertising the >>> "XAPPLEPUSHSERVICE" capability, the device issues an XAPPLEPUSHSERVICE IMAP >>> command with the following contents: >>> >>> * account-id: opaque blob that must be quoted in subsequent notifications >>> * subtopic: APNS subtopic, must be used when sending subsequent >>> notifications >>> * device token: the APNS identifier of the device, must be used to send >>> subsequent notifications >>> * list of mailboxes: list of IMAP mailbox names (from the perspective of >>> the iOS IMAP client) to monitor and send notifications upon changes >>> >>> The IMAP server replies with an APNS topic (mostly static value, derived >>> from the certificate it uses to talk to APNS). Then, when changes occur in >>> the aforementioned mailboxes, the server must send a notification via APNS >>> (a persistent connection to an Apple server authenticated by a client >>> certificate) towards the aforementioned device token & subtopic, quoting >>> the account ID & client-facing mailbox name. The notification is relayed by >>> Apple to the target device which prompts it to wake up and fetch the new >>> messages via IMAP. >>> >>> This would require us to: >>> >>> * store (device_token, account_id, subtopic, client-specific IMAP mailbox >>> name) tuples against a given Mailbox >>> * react to mailbox events and enqueue notifications for each of the above >>> tuples >>> * maintain a persistent connection to APNS to dequeue & forward those >>> notifications to >>> >>> First question would be whether you'd be interested in including this in >>> James core, or if this should remain a separate extension? If included in >>> core, it would require James to be able to accept another keystore (with >>> the APNS certificate, created by a helper program) and be able to reload it >>> on the fly to enable zero-downtime certificate rotations. >>> >>> If interested in upstreaming, would you be able to outline a high-level >>> overview of what the code should look like, especially where to put the >>> APNS client? >>> >>> On the other hand, if it's better to keep it as an extension, I want to >>> know whether James has a way for extensions to attach arbitrary data to a >>> mailbox (so I can store the device tokens) without changing the storage >>> backends? Also, where to put the long-lived APNS client? Does James have an >>> existing extension pattern that accounts for long-lived services like this? >>> >>> For reference, I currently have a proof of concept extension at >>> https://github.com/Rjevski/apache-james-xapsd-registration-extension which >>> is an IMAP extension (implementing the custom command) and mailbox listener >>> - however, the storage of mailbox to device token mappings and APNS >>> communication is delegated to an external service called over HTTP. >>> >>> Regards. >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >>> For additional commands, e-mail: server-dev-h...@james.apache.org >>> >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >> For additional commands, e-mail: server-dev-h...@james.apache.org >> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org > For additional commands, e-mail: server-dev-h...@james.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org