Message store events notification

Sébastien Michel sebastien.michel at atos.net
Tue Nov 22 13:41:11 EST 2011


Hi,
Below an update of my work to support out-band event notification in
Cyrus based on RFC 5423.
All event types together with their parameters defined in the RFC are
fully supported. Implementation is done to avoid any I/O overhead.

1) event types
MessageAppend, MessageNew
 - parameters: mailboxID
 - optional parameters: bodyStructure, messageContent, messages,
messageSize, modseq, service, timestamp, uidnext, vnd.cmu.midset,
vnd.cmu.newMessages
 - comment: One notification is send per message. Several
notifications in case of IMAP MULTIAPPEND

MessageExpire
 - parameters: mailboxID, uidset
 - optional parameters: messages, modseq, service, timestamp, uidnext,
vnd.cmu.midset, vnd.cmu.newMessages
 - comment: modseq may be included if referring to a specific message.
uidset if referring to a set of messages

MessageExpunge
 - parameters: mailboxID, uidset
 - optional parameters: messages, modseq, service, timestamp, uidnext,
vnd.cmu.midset, vnd.cmu.newMessages
 - comment: modseq may be included if referring to a specific message.
uidset if referring to a set of messages

QuotaExceed, QuotaWithin
 - parameters: diskQuota, diskUsed, mailboxID, maxMessages, messages
 - optional parameters: service, timestamp
 - comment: include diskQuota and diskUsed if quota STORAGE exceed.
maxMessages and messages if quota MESSAGE exceed. I don't support
quota ANNOTSTORAGE, however we could define proprietary parameters for
that like vnd.cmu.annotationQuota and vnd.cmu.annotationUsed.

QuotaChange
 - parameters: diskQuota, mailboxID, maxMessages
 - optional parameters: diskUsed, messages, service, timestamp
 - comment: diskQuota and maxMessages may be included together
depending the SETQUOTA arguments. QuotaExceed, QuotaWithin and
QuotaChange are not enabled by default.

MessageRead, MessageTrash
 - parameters: mailboxID, uidset
 - optional parameters: messages, modseq, service, timestamp, uidnext,
vnd.cmu.midset, vnd.cmu.newMessages
 - comment: MessageRead and MessageTrash replace FlagsSet for \Seen
and \Deleted flags. MessageRead notification is also send on IMAP
FETCH.

FlagsSet, FlagsClear
 - parameters: mailboxID, uidset, flagNames
 - optional parameters: messages, modseq, service, timestamp, uidnext,
vnd.cmu.midset, vnd.cmu.newMessages
 - comment: support +FLAGS, -FLAGS and FLAGS arguments to IMAP STORE.
May send FLagsSet and FlagsClear for FLAGS. May also send MessageTrash
and MessageRead depending the flags in argument.

Login, Logout
 - parameters: serverDomain, serverPort, user
 - optional parameters: timestamp, service, clientIP, clientPort
 - comment: Login and Logout are not enabled by default

MailboxCreate, MailboxDelete
 - parameters: mailboxID
 - optional parameters: service, timestamp

MailboxRename
 - parameters: mailboxID, oldMailboxID
 - optional parameters: service, timestamp

MailboxSubscribe, MailboxUnSubscribe
 - parameters: mailboxID, user
 - optional parameters: service, timestamp

and additional vnd.cmu.MessageCopy.
 - parameters: mailboxID, oldMailboxID, vnd.cmu.oldUidset, uidset
 - optional parameters: messages, modseq, service, timestamp, uidnext,
vnd.cmu.midset, vnd.cmu.newMessages
 - comment: modseq may be included if referring to a specific message.
uidset if referring to a set of messages

2) configuration
The setting is lighter than our current code in Cyrus 2.3 with I hope
good defaults :
- eventnotifier (NULL) :
        Notifyd(8) method to use for "EVENT" notifications which are
based on the RFC 5423.  If not set, "EVENT" notifications are
disabled.

- event_groups ("message mailbox") :
        Space-separated list of groups of related events to turn on
notification: message", "quota", "flags", "access", "mailbox"

- event_extra_params ("timestamp") :
        Space-separated list of extra parameters to add to any
appropriated event : "bodyStructure", "clientAddress", "diskUsed",
"flagNames", "messageContent", "messageSize", "messages", "modseq",
"service", "timestamp", "uidnext", "vnd.cmu.host", "vnd.cmu.midset",
"vnd.cmu.newMessages"

- event_exclude_flags (NULL) :
        Don't send event notification for given IMAP flag(s)

- event_exclude_folders (NULL) :
        Don't send event notification for given folder(s). Set ALL for
any folder

- event_content_inclusion_mode ("standard") :
        The mode in which message content may be included with
MessageAppend and MessageNew. "standard" mode is the default behavior
in which message is included up to a size with the notification. In
"message" mode, the message is included and may be truncated to a
size. In "header" mode, it includes headers truncated to a size. In
"body" mode, it includes body truncated to a size. In "headerbody"
mode, it includes full headers and body truncated to a size

- event_content_size (0) :
        Truncate the message content that may be included with
MessageAppend and MessageNew. Set 0 to include the entire message
itself

- event_timestamp_format ("iso8601") :
        Format event timestamp in ISO 8601 format or print the number
of seconds since the Epoch (UTC) both with fractions of second

3) message format
Notification format is JSON.
examples:
"{"event":"Login","timestamp":"2011-11-22T17:19:36.849Z","service":"imappublic","serverDomain":"127.0.0.3","serverPort":143,"clientIP":"127.0.0.1","clientPort":56197,"user":"testtmpuser"}"

"{"event":"MessageRead","timestamp":"2011-11-22T17:19:36.854Z","service":"imappublic","mailboxID":"imap:\/\/127.0.0.3\/user.testtmpuser;UIDVALIDITY=1321982376","messages":5,"vnd.cmu.newMessages":2,"uidnext":6,"uidset":"1
2","vnd.cmu.midset":"<cmu-lmtpd-3821-1321982376-0 at 127.0.0.3>
<cmu-lmtpd-3821-1321982376-1 at 127.0.0.3>"}"

 "{"event":"FlagsSet","timestamp":"2011-11-22T17:19:36.854Z","service":"imappublic","mailboxID":"imap:\/\/127.0.0.3\/user.testtmpuser;UIDVALIDITY=1321982376","messages":5,"vnd.cmu.newMessages":2,"uidnext":6,"uidset":"1
2","vnd.cmu.midset":"<cmu-lmtpd-3821-1321982376-0 at 127.0.0.3>
<cmu-lmtpd-3821-1321982376-1 at 127.0.0.3>","flagNames":"\\Draft"}"

 "{"event":"FlagsClear","timestamp":"2011-11-22T17:19:36.866Z","service":"imappublic","mailboxID":"imap:\/\/127.0.0.3\/user.testtmpuser;UIDVALIDITY=1321982376\/;UID=1","messages":5,"vnd.cmu.newMessages":3,"uidnext":6,"vnd.cmu.midset":"<cmu-lmtpd-3821-1321982376-0 at 127.0.0.3>","flagNames":"\\Seen","modseq":8}"

 "{"event":"MessageTrash","timestamp":"2011-11-22T17:19:36.866Z","service":"imappublic","mailboxID":"imap:\/\/127.0.0.3\/user.testtmpuser;UIDVALIDITY=1321982376\/;UID=1","messages":5,"vnd.cmu.newMessages":3,"uidnext":6,"vnd.cmu.midset":"<cmu-lmtpd-3821-1321982376-0 at 127.0.0.3>","modseq":8}"

"{"event":"MessageExpunge","timestamp":"2011-11-22T17:19:36.873Z","service":"imappublic","mailboxID":"imap:\/\/127.0.0.3\/user.testtmpuser;UIDVALIDITY=1321982376\/;UID=1","messages":4,"vnd.cmu.newMessages":2,"uidnext":6,"vnd.cmu.midset":"<cmu-lmtpd-3821-1321982376-0 at 127.0.0.3>","modseq":9}"
  "{"event":"Logout","timestamp":"2011-11-22T17:19:36.880Z","service":"imappublic","serverDomain":"127.0.0.3","serverPort":143,"user":"testtmpuser"}"


4) choices of design
- There is no event notification on internal cyrus behaviors :
rollback on mailbox creation, replication on cyrus slave, deletion of
delayed message, murder proxy, and so on.
- I wonder about the IMAP URL format of the messageID parameter. I
made use of cyrus' internal format. But I should rather use namespace
translation to get the external format.
I encounter some issues to access to namespace structure in some
places in the code (QuotaExceed in quota_db.c, MessageExpunge in
mailbox.c and so on). It may be centralized in mboxevent.c before
sending the event, but namespace dependencies are unknown here. Thus,
code to handle namespace should be rewritten :(
- I chose JSON as default format. It may not be the best choice to
implement in-band event notification like IMAP NOTIFY

I will write some documentation based on informations above.
I rebased the msgevent branch on current master :
https://github.com/worldline-messaging/cyrus-imapd/compare/msgevent

any comments or suggestions are welcome.

Thanks,
Sébastien

--
Atos Worldline


More information about the Cyrus-devel mailing list