Hello Benoit,

> JIRA please!

Yes, it should be JIRA: https://issues.apache.org/jira/projects/JAMES/issues
.

> That's a classic trick to have optional mavven dependencies and address
several architectures at once ;-)

This is truly a trick that would help write the extension more simple while
using the extension modular also. Thank you for adding up for me!

Quan


Vào Th 6, 8 thg 12, 2023 vào lúc 17:18 Benoit TELLIER <btell...@apache.org>
đã viết:

> Hello,
>
>  > That is basically my idea on the topic. You can create a ticket at
> https://github.com/linagora/james-project/issues where we can discuss
> further details on implementing this if you want.
>
> JIRA please!
>
> https://issues.apache.org/jira/projects/JAMES/issues
>
>  > Also please do not hesitate to open a draft pull request so we can
> give you soon feedback.
>
> +1
>
> On a technical standpoint I mostly agree with pointers for Quan.
>
> Thinking more about it, we likely can make only a single extension with
> all storage implementations. And rely on advanced maven tricks for
> having just the right dependencies, while exposing a single maven module.
>
> The idea would be to, within a single APSN extension:
>
>   - Define a storage interface
>   - Define a standard junit 5 contract (with an interface
> APSNStoreContract)
>   - Implement a memory implementation of it (class MemoryAPSNStore
> implementd APSNStore) which passes the test (class MemoryAPSNStoreTest
> implements APSNStoreContract)
>   - Add provided dependency for cassandra, jpa storage backend. This
> mean we can compile with them but runtime deps will be provided by James
> server.
>   - We can then implement one JPAAPSNStore, CassandraAPSNStore and
> related tests
>   - We can write a guice module for each APSNSotre:
> MemoryAPSNStoreModule, JPAAPSNStoreModule, CassandraAPSNStoreModule
>
> Configuration of the storage backend can then be done by choosing the
> corresponding guice module within extensions.properties.
>
> That's a classic trick to have optional mavven dependencies and address
> several architectures at once ;-)
>
> Thoughts Quan?
>
> Best regards,
>
> On 08/12/2023 11:09, Quan tran hong wrote:
> > Hello Andre Borie,
> >
> > Your PoC work is very cool. I am happy that someone out there succeeded
> in
> > using our IMAP command extension mechanism.
> >
> >> 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.
> >
> > FYI, we (Linagora) developed the JMAP Firebase Cloud Messaging extension.
> > The idea is basically as same as yours:
> > - Exposing application API so users can register their notifications.
> >    In our case, it was JMAP FirebaseSubscription extension (
> >
> https://github.com/linagora/tmail-backend/blob/master/docs/modules/ROOT/pages/tmail-backend/jmap-extensions/pushWithFirebase.adoc
> ).
> > In your case it was the IMAP command extension.
> >    For storing and managing the subscriptions, we wrote an interface for
> the
> > storage API called `FirebaseSubscriptionRepository` (
> >
> https://github.com/linagora/tmail-backend/blob/master/tmail-backend/jmap/extensions/src/main/java/com/linagora/tmail/james/jmap/firebase/FirebaseSubscriptionRepository.java
> ).
> > The idea is that we can have multiple implementations for the storage API
> > e.g. memory one (mostly for test), Cassandra one (using Cassandra
> > database), Postgres one (using Postgres database)...
> > - Pushing the users's data change to the Push gateway using a listener.
> >    In our case it was `FirebasePushListener` (
> >
> https://github.com/linagora/tmail-backend/blob/master/tmail-backend/jmap/extensions/src/main/scala/com/linagora/tmail/james/jmap/firebase/FirebasePushListener.scala#L30
> ),
> > like your listener.
> >
> > I think your PoC is already good enough, the story is just about how to
> > contribute it to James in a proper way.
> >
> > As Benoit suggested, you can contribute your extension into a new module
> > let's say `apsn-imap`:
> >
> https://github.com/apache/james-project/tree/master/third-party/apsn-imap.
> > For the storage API, you can write a simple Java interface e.g.
> > `ApnsTokenRepository` in a child module:
> >
> https://github.com/apache/james-project/tree/master/third-party/apsn-imap/token-storage-api
> > Then you can implement a simple implementation for the storage using
> memory
> > in another child module:
> >
> https://github.com/apache/james-project/tree/master/third-party/apsn-imap/token-storage-memory
> .
> > Or whatever implementation you like IMO, other people who want to have a
> > Cassandra or Postgres implementation can just base on your
> > `ApnsTokenRepository` API.
> > After having the storage API, you can integrate your PushClient and the
> > listener.
> >
> > That is basically my idea on the topic. You can create a ticket at
> > https://github.com/linagora/james-project/issues
> > where we can discuss further details on implementing this if you want.
> Also
> > please do not hesitate to open a draft pull request so we can give you
> soon
> > feedback.
> >
> > Thanks for your enthusiasm.
> >
> > Regards,
> >
> > Quan
> >
> >
> >
> >
> >
> >
> > Vào Th 6, 8 thg 12, 2023 vào lúc 08:47 Andre
> Borie<h...@rjevski.io.invalid>
> > đã viết:
> >
> >> 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
> >>
> >>

Reply via email to