<pre style='margin:0'>
Ken (kencu) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/2d5021a64c9c45753986a834565cc421afa86e1a">https://github.com/macports/macports-ports/commit/2d5021a64c9c45753986a834565cc421afa86e1a</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 2d5021a64c9 dovecot: apns variant bugfix and compiler error fix
</span>2d5021a64c9 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 2d5021a64c9c45753986a834565cc421afa86e1a
</span>Author: Steven Thomas Smith <s.t.smith@ieee.org>
AuthorDate: Fri Sep 18 21:41:54 2020 -0400
<span style='display:block; white-space:pre;color:#404040;'> dovecot: apns variant bugfix and compiler error fix
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> * apns variant's `devices` must be a file
</span><span style='display:block; white-space:pre;color:#404040;'> * Fix compiler error `error: implicit declaration of function 'i_gettimeofday' is invalid in C99`
</span>---
mail/dovecot/Portfile | 14 +-
mail/dovecot/files/dovecot-core-pushnotify.patch | 700 +++++++++++++++++++--
.../patch-src-lib-ioloop-notify-kqueue-c.diff | 10 +
3 files changed, 676 insertions(+), 48 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mail/dovecot/Portfile b/mail/dovecot/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 049c2dad74e..fae4923163e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mail/dovecot/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mail/dovecot/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,7 +5,7 @@ PortGroup github 1.0
</span>
github.setup dovecot core 2.3.11.3
name dovecot
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 1
</span> epoch 20060722
set core_version ${version}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -114,6 +114,7 @@ if {${name} eq ${subport}} {
</span>
patch.pre_args -p1
patchfiles patch-doc-example-config-conf.d-10-master.conf.diff \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ patch-src-lib-ioloop-notify-kqueue-c.diff \
</span> patch-src-master-master-settings.c.diff
post-patch {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -189,11 +190,16 @@ if {${name} eq ${subport}} {
</span> pre-destroot {
xinstall -m 0750 -d \
-o ${default_internal_user} -g ${default_login_user} \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${destroot}${prefix}/etc/${name}-apns \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${destroot}${prefix}/var/db/${name}-apns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ close [open ${destroot}${prefix}/var/db/${name}-apns/devices a]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ file attributes \
</span> ${destroot}${prefix}/var/db/${name}-apns/devices \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ${destroot}${prefix}/etc/${name}-apns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -permissions 0750 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ -owner ${default_internal_user} -group ${default_login_user}
</span> destroot.keepdirs-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ${destroot}${prefix}/var/db/${name}-apns/devices \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ${destroot}${prefix}/etc/${name}-apns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${destroot}${prefix}/etc/${name}-apns \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ${destroot}${prefix}/var/db/${name}-apns
</span> xinstall -m 0755 ${filespath}/pushnotify.pl \
${destroot}${prefix}/sbin
foreach cmd [list \
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mail/dovecot/files/dovecot-core-pushnotify.patch b/mail/dovecot/files/dovecot-core-pushnotify.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 6d33e9a4a6e..62a02a72a98 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mail/dovecot/files/dovecot-core-pushnotify.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mail/dovecot/files/dovecot-core-pushnotify.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,64 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff -Naur ./README.md ./README.md
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./README.md 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./README.md 2020-09-18 19:57:02.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,3 +1,53 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Apple Push Notification Service (APNS) Plugin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++=============================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++This branch of [dovecot/core](https://github.com/dovecot/core)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++includes a plugin for APNS. This is based on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[matthewpowell/pushnotify](https://github.com/matthewpowell/pushnotify),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[cullum/freebsd-ports](https://github.com/cullum/freebsd-ports/tree/master/mail),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++and this [post](https://www.c0ffee.net/blog/dovecot-push-notifications/).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++APNS use requires these steps:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++1. Acquire APNS Mail certificates from a (virtual) macOS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ High Sierra 10.13 and Server.app version 5.7. Export
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ the certificates from the Keychain into the file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ com.apple.servermgrd.apns.mail.p12 . **Note**: APNS Mail
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ certificate creation is deprecated on Server.app version 5.8+.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++2. Convert the APNS Mail certificates to PEM files:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ openssl pkcs12 -in com.apple.servermgrd.apns.mail.p12 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ -clcerts -nokeys | sed '/BEGIN CERTIFICATE/,$!d' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ > mail.crt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sudo install -m 0644 -o _dovecot -g _dovenull \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail.crt /opt/local/etc/dovecot-apns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ openssl pkcs12 -in com.apple.servermgrd.apns.mail.p12 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ -nodes -nocerts | sed '/BEGIN PRIVATE KEY/,$!d' \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ > mail.key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sudo install -m 0640 -o _dovecot -g _dovenull \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail.key /opt/local/etc/dovecot-apns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++3. Configure dovecot for APNS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /opt/local/etc/dovecot/conf.d/15-lda.conf:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ protocol lda { mail_plugins = $mail_plugins push_notify }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /opt/local/etc/dovecot/conf.d/90-apns.conf:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ aps_topic = com.apple.mail.XServer.<UUID>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ where the certificate's UUID is obtained from the command:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ openssl x509 -text -noout \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ -in /opt/local/etc/dovecot-apns/mail.crt \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ | grep -E -o 'com.apple.mail.XServer.[0-9a-f-]+'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++4. Launch the APNS daemon (macOS):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sudo launchctl load -w \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /Library/LaunchDaemons/org.macports.dovecot-apns.plist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++```
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Installation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ============
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> diff -Naur ./configure.ac ./configure.ac
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./configure.ac 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./configure.ac 2019-10-10 05:40:20.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -911,6 +911,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./configure.ac 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./configure.ac 2020-09-18 19:57:02.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -930,6 +930,7 @@
</span> src/plugins/notify/Makefile
src/plugins/notify-status/Makefile
src/plugins/push-notification/Makefile
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -9,9 +66,564 @@ diff -Naur ./configure.ac ./configure.ac
</span> src/plugins/pop3-migration/Makefile
src/plugins/quota/Makefile
src/plugins/quota-clone/Makefile
<span style='display:block; white-space:pre;background:#e0ffe0;'>+diff -Naur ./dovecot-core-pushnotify.patch ./dovecot-core-pushnotify.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./dovecot-core-pushnotify.patch 1969-12-31 19:00:00.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./dovecot-core-pushnotify.patch 2020-09-18 19:57:02.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,551 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./configure.ac ./configure.ac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./configure.ac 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./configure.ac 2019-10-10 05:40:20.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -911,6 +911,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ src/plugins/notify/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ src/plugins/notify-status/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ src/plugins/push-notification/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++src/plugins/push-notify/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ src/plugins/pop3-migration/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ src/plugins/quota/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ src/plugins/quota-clone/Makefile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/auth/auth-settings.c ./src/auth/auth-settings.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/auth/auth-settings.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/auth/auth-settings.c 2019-10-08 18:37:33.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -269,6 +269,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEFLIST(passdbs, "passdb", &auth_passdb_setting_parser_info),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEFLIST(userdbs, "userdb", &auth_userdb_setting_parser_info),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ DEF_NOPREFIX(SET_STR, aps_topic),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF_NOPREFIX(SET_STR, base_dir),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF_NOPREFIX(SET_BOOL, verbose_proctitle),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF_NOPREFIX(SET_UINT, first_valid_uid),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -331,6 +333,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .passdbs = ARRAY_INIT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .userdbs = ARRAY_INIT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ .aps_topic = "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .base_dir = PKG_RUNDIR,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .verbose_proctitle = FALSE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .first_valid_uid = 500,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/auth/auth-settings.h ./src/auth/auth-settings.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/auth/auth-settings.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/auth/auth-settings.h 2019-10-08 17:51:20.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -82,6 +82,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ARRAY(struct auth_passdb_settings *) passdbs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ARRAY(struct auth_userdb_settings *) userdbs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_topic;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *base_dir;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *ssl_client_ca_dir;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *ssl_client_ca_file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap/Makefile.am ./src/imap/Makefile.am
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap/Makefile.am 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap/Makefile.am 2019-10-08 20:40:24.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -64,6 +64,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmd-unselect.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmd-unsubscribe.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmd-urlfetch.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ cmd-x-apple-push-service.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmd-x-cancel.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmd-x-state.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap/cmd-x-apple-push-service.c ./src/imap/cmd-x-apple-push-service.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap/cmd-x-apple-push-service.c 1969-12-31 19:00:00.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap/cmd-x-apple-push-service.c 2019-10-10 06:22:12.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -0,0 +1,173 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++/*
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * Copyright (c) 2010-2011 Apple Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ *
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * are met:
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ *
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * 2. Redistributions in binary form must reproduce the above
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * copyright notice, this list of conditions and the following
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * disclaimer in the documentation and/or other materials provided
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * with the distribution.
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * 3. Neither the name of Apple Inc. ("Apple") nor the names of its
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * contributors may be used to endorse or promote products derived
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * from this software without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ *
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ * SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "imap-common.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "imap-id.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "str.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "home-expand.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "mail-user.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "imap-quote.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <sys/un.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <sys/socket.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#define APS_VERSION "1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++typedef struct msg_data_s {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ unsigned long msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ unsigned long pid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d1[128];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d2[512];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d3[512];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d4[512];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++} msg_data_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++/*
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ tag1 XAPPLEPUSHSERVICE "aps-version" "1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ "aps-account-id" "E8CD34AD-98D3-4489-A6BB-86B1D082FECE"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ "aps-device-token" "a66216ad1683d48b9933cdcc3b98a833ee1a968143f41ea494187da54715da66"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ "aps-subtopic" "com.apple.mobilemail"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++static void do_notify(const char *username, const char *aps_acct_id,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_dev_token, const char *aps_sub_topic)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *push_notify_path = "@PREFIX@/var/run/dovecot/push_notify";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ msg_data_t msg_data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ memset(&msg_data, 0, sizeof(struct msg_data_s));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ msg_data.msg = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ strncpy(msg_data.d1, username, sizeof(msg_data.d1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ strncpy(msg_data.d2, aps_acct_id, sizeof(msg_data.d2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ strncpy(msg_data.d3, aps_dev_token, sizeof(msg_data.d3));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ strncpy(msg_data.d4, aps_sub_topic, sizeof(msg_data.d4));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ int soc = socket( AF_UNIX, SOCK_DGRAM, 0 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( soc < 0 ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_warning( "open notify socket failed(%d): %m", soc );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ struct sockaddr_un sock_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ memset( &sock_addr, 0, sizeof(struct sockaddr_un));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ sock_addr.sun_family = AF_UNIX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ strncpy( sock_addr.sun_path, push_notify_path, sizeof(sock_addr.sun_path) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ socklen_t sock_len = sizeof(sock_addr.sun_family) + strlen(sock_addr.sun_path) + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ int rc = connect(soc, (struct sockaddr *) &sock_addr, sock_len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( rc < 0 ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_warning("connect to notify socket %s failed: %m",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ push_notify_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ close(soc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ rc = send(soc, (void *)&msg_data, sizeof(msg_data), 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( rc < 0 )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_warning("send to notify socket %s failed: %m",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ push_notify_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ close(soc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++static const char *aps_reply_generate (struct client_command_context *cmd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const struct imap_arg *args)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_topic = cmd->client->set->aps_topic;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_ver=NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_acct_id=NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_dev_token=NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_sub_topic=NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *key, *value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* must have a topic */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (aps_topic == NULL || *aps_topic == '\0')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* scarf off the aps keys/values */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ while (imap_arg_get_astring(&args[0], &key) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ imap_arg_get_astring(&args[1], &value)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (strcasecmp(key, "aps-version") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ aps_ver = t_strdup(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ else if (strcasecmp(key, "aps-account-id") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ aps_acct_id = t_strdup(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ else if (strcasecmp(key, "aps-device-token") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ aps_dev_token = t_strdup(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ else if (strcasecmp(key, "aps-subtopic") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ aps_sub_topic = t_strdup(value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ args += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* save notification settings */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( aps_ver && aps_acct_id && aps_dev_token && aps_sub_topic ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* subscribe to notification node */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ do_notify(cmd->client->user->username, aps_acct_id,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ aps_dev_token, aps_sub_topic);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* generate aps response */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ string_t *str = t_str_new(256);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ imap_append_quoted( str, "aps-version" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ str_append_c(str, ' ');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ imap_append_quoted( str, APS_VERSION );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ str_append_c(str, ' ');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ imap_append_quoted( str, "aps-topic" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ str_append_c(str, ' ');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ imap_append_quoted( str, aps_topic );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return str_c(str);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++bool cmd_x_apple_push_service(struct client_command_context *cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const struct imap_arg *args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (!client_read_args(cmd, 0, 0, &args))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *reply = aps_reply_generate(cmd, args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (reply != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ client_send_line(cmd->client,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ t_strdup_printf("* XAPPLEPUSHSERVICE %s",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ reply));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ client_send_tagline(cmd, "OK XAPPLEPUSHSERVICE completed.");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap/imap-client.c ./src/imap/imap-client.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap/imap-client.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap/imap-client.c 2019-10-08 20:42:59.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -182,6 +182,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ a chance of working */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ client_add_capability(client, "SEARCH=FUZZY");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (set->aps_topic != NULL && *set->aps_topic)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ str_append(client->capability_string, " XAPPLEPUSHSERVICE");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail_set = mail_user_set_get_storage_set(user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (mail_set->mailbox_list_index) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap/imap-commands.c ./src/imap/imap-commands.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap/imap-commands.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap/imap-commands.c 2019-10-08 20:15:39.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -76,6 +76,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { "UID SORT", cmd_sort, COMMAND_FLAG_BREAKS_SEQS },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { "UID THREAD", cmd_thread, COMMAND_FLAG_BREAKS_SEQS },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { "UNSELECT", cmd_unselect, COMMAND_FLAG_BREAKS_MAILBOX },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ { "XAPPLEPUSHSERVICE", cmd_x_apple_push_service, 0},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { "X-CANCEL", cmd_x_cancel, 0 },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { "X-STATE", cmd_x_state, COMMAND_FLAG_REQUIRES_SYNC },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { "XLIST", cmd_list, 0 },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap/imap-commands.h ./src/imap/imap-commands.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap/imap-commands.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap/imap-commands.h 2019-10-08 20:16:48.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -121,6 +121,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool cmd_uid_expunge(struct client_command_context *cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool cmd_move(struct client_command_context *cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool cmd_unselect(struct client_command_context *cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++bool cmd_x_apple_push_service(struct client_command_context *cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool cmd_x_cancel(struct client_command_context *cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool cmd_x_state(struct client_command_context *cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap/imap-settings.c ./src/imap/imap-settings.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap/imap-settings.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap/imap-settings.c 2019-10-08 17:57:36.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -73,6 +73,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_STR, imap_logout_format),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_STR, imap_id_send),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_STR, imap_id_log),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ DEF(SET_STR, aps_topic),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_ENUM, imap_fetch_failure),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_BOOL, imap_metadata),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_BOOL, imap_literal_minus),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -101,6 +102,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "body_count=%{fetch_body_count} body_bytes=%{fetch_body_bytes}",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_id_send = "name *",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_id_log = "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ .aps_topic = "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_fetch_failure = "disconnect-immediately:disconnect-after:no-after",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_metadata = FALSE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_literal_minus = FALSE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap/imap-settings.h ./src/imap/imap-settings.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap/imap-settings.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap/imap-settings.h 2019-10-08 17:48:14.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -31,6 +31,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *imap_logout_format;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *imap_id_send;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *imap_id_log;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_topic;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *imap_fetch_failure;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool imap_metadata;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool imap_literal_minus;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap-login/imap-login-client.c ./src/imap-login/imap-login-client.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap-login/imap-login-client.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap-login/imap-login-client.c 2019-10-11 08:28:49.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -117,6 +117,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str_append(cap_str, " STARTTLS");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (is_login_cmd_disabled(client))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ str_append(cap_str, " LOGINDISABLED");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (*imap_client->set->aps_topic)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ str_append(cap_str, " XAPPLEPUSHSERVICE");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ client_authenticate_get_capabilities(client, cap_str);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return str_c(cap_str);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap-login/imap-login-settings.c ./src/imap-login/imap-login-settings.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap-login/imap-login-settings.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap-login/imap-login-settings.c 2019-10-08 18:33:32.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -57,6 +57,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_STR, imap_capability),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_STR, imap_id_send),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_STR, imap_id_log),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ DEF(SET_STR, aps_topic),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_BOOL, imap_literal_minus),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DEF(SET_BOOL, imap_id_retain),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -67,6 +68,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_capability = "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_id_send = "name *",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_id_log = "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ .aps_topic = "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_literal_minus = FALSE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ .imap_id_retain = FALSE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/imap-login/imap-login-settings.h ./src/imap-login/imap-login-settings.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/imap-login/imap-login-settings.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/imap-login/imap-login-settings.h 2019-10-08 17:49:33.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -5,6 +5,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *imap_capability;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *imap_id_send;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *imap_id_log;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *aps_topic;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool imap_literal_minus;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool imap_id_retain;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/lib-lda/mail-deliver.c ./src/lib-lda/mail-deliver.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/lib-lda/mail-deliver.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/lib-lda/mail-deliver.c 2019-10-11 08:16:28.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -31,6 +31,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ deliver_mail_func_t *deliver_mail = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++deliver_hook_func_t *deliver_hook = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct mail_deliver_cache {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ bool filled;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -409,6 +410,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail_deliver_log(ctx, "saved mail to %s", mailbox_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pool_unref(&changes.pool);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (deliver_hook != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ deliver_hook(ctx, mailbox);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail_deliver_log(ctx, "save failed to %s: %s", mailbox_name,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail_storage_get_last_internal_error(*storage_r, &error));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -503,6 +507,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* success. message may or may not have been saved. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ret = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (!ret && deliver_hook)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ deliver_hook(ctx, ctx->rcpt_default_mailbox);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail_duplicate_db_deinit(&ctx->dup_db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ret < 0 && mail_deliver_is_tempfailed(ctx, *storage_r)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ muser->deliver_ctx = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/lib-lda/mail-deliver.h ./src/lib-lda/mail-deliver.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/lib-lda/mail-deliver.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/lib-lda/mail-deliver.h 2019-10-08 20:50:00.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -82,6 +82,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct mail_storage **storage_r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ extern deliver_mail_func_t *deliver_mail;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++typedef void deliver_hook_func_t(struct mail_deliver_context *ctx,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *mailbox);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++extern deliver_hook_func_t *deliver_hook;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const struct var_expand_table *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail_deliver_ctx_get_log_var_expand_table(struct mail_deliver_context *ctx,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/plugins/Makefile.am ./src/plugins/Makefile.am
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/plugins/Makefile.am 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/plugins/Makefile.am 2019-10-11 05:56:16.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -31,6 +31,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ notify \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ notify-status \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ push-notification \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ push-notify \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail-filter \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mail-log \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ $(MAIL_LUA) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/plugins/push-notify/Makefile.am ./src/plugins/push-notify/Makefile.am
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/plugins/push-notify/Makefile.am 1969-12-31 19:00:00.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/plugins/push-notify/Makefile.am 2019-10-11 08:48:43.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -0,0 +1,25 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++AM_CPPFLAGS = \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ -I$(top_srcdir)/src/lib \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ -I$(top_srcdir)/src/lib-lda \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ -I$(top_srcdir)/src/lib-mail \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ -I$(top_srcdir)/src/lib-smtp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ -I$(top_srcdir)/src/lib-storage
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++NOPLUGIN_LDFLAGS =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++lib20_push_notify_plugin_la_LDFLAGS = -module -avoid-version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++module_LTLIBRARIES = \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ lib20_push_notify_plugin.la
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++if DOVECOT_PLUGIN_DEPS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++notify_deps = ../notify/lib15_notify_plugin.la
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++lib20_push_notify_plugin_la_SOURCES = \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ push-notify-plugin.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++headers = \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ push-notify-plugin.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++pkginc_libdir = $(pkgincludedir)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++pkginc_lib_HEADERS = $(headers)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/plugins/push-notify/push-notify-plugin.c ./src/plugins/push-notify/push-notify-plugin.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/plugins/push-notify/push-notify-plugin.c 1969-12-31 19:00:00.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/plugins/push-notify/push-notify-plugin.c 2019-10-11 09:06:31.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -0,0 +1,102 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++/* Copyright (c) 2008-2011 Apple, inc. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "lib.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "mail-deliver.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "mail-namespace.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "message-address.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include "push-notify-plugin.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <sys/un.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <sys/socket.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#include <sys/unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++const char *push_notify_plugin_version = DOVECOT_ABI_VERSION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++static deliver_hook_func_t *next_deliver_mail;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++struct et_list *_et_list = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++struct message_info {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *subj;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++// -----------------------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++// push_notification ()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++push_notification(struct mail_deliver_context *ctx, const char *mailbox)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ int debug = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ int notify_sock = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *sock_path = "@PREFIX@/var/run/dovecot/push_notify";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ ssize_t rc = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ socklen_t sock_len = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ struct sockaddr_un sock_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ struct msg_data_s msg_data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (ctx->rcpt_user->mail_debug) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ debug = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_info( "push-notify: push notification enabled" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( strcasecmp(mailbox, "INBOX") != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_info( "push-notify: message saved to mailbox: %s, no notification sent", mailbox );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ notify_sock = socket( AF_UNIX, SOCK_DGRAM, 0 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( notify_sock < 0 ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* warn that connect failed but do not fail the plugin or message will not get delivered */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_warning( "push-notify: open socket: \"%s\" failed", sock_path );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ sock_addr.sun_family = AF_UNIX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ strncpy( sock_addr.sun_path, "@PREFIX@/var/run/dovecot/push_notify", sizeof(sock_addr.sun_path) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ sock_len = sizeof(sock_addr.sun_family) + strlen(sock_addr.sun_path) + 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ rc = connect(notify_sock, (struct sockaddr *) &sock_addr, sock_len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( rc < 0 ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* warn that connect failed but do not fail the plugin or message will not get delivered */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_warning( "push-notify: connect() to socket: \"%s\" failed: %m", sock_path );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ memset( &msg_data, 0, sizeof( msg_data ) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ msg_data.msg = 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ /* set user/account id */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( ctx->rcpt_user->username != NULL ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ strncpy( msg_data.d1, ctx->rcpt_user->username, sizeof(msg_data.d1) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (debug)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_info( "push-notify: notify: %s", msg_data.d1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ rc = send(notify_sock, (void *)&msg_data, sizeof(struct msg_data_s), 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if ( rc < 0 )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_warning( "push-notify: send() to socket: \"%s\" failed: %m", sock_path );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (debug)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ i_info("push-notify: data sent: %lu", rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ close(notify_sock);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++} // push_notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++static void push_notify_deliver(struct mail_deliver_context *ctx,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ const char *mailbox)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ push_notification(ctx, mailbox);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ if (next_deliver_mail != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ next_deliver_mail(ctx, mailbox);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++void push_notify_plugin_init (struct module *module ATTR_UNUSED)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ next_deliver_mail = deliver_hook;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ deliver_hook = push_notify_deliver;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++void push_notify_plugin_deinit (void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ deliver_hook = next_deliver_mail;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++diff -Naur ./src/plugins/push-notify/push-notify-plugin.h ./src/plugins/push-notify/push-notify-plugin.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++--- ./src/plugins/push-notify/push-notify-plugin.h 1969-12-31 19:00:00.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++++ ./src/plugins/push-notify/push-notify-plugin.h 2019-10-08 20:53:46.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@@ -0,0 +1,20 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++/* Copyright (c) 2008-2011 Apple, inc. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#ifndef __NOTIFY_PLUGIN_H__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#define __NOTIFY_PLUGIN_H__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++struct module;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++void push_notify_plugin_init(struct module *module);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++void push_notify_plugin_deinit(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++typedef struct msg_data_s {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ unsigned long msg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ unsigned long pid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d1[128];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d2[512];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d3[512];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++ char d4[512];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++} msg_data_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+++#endif
</span> diff -Naur ./src/auth/auth-settings.c ./src/auth/auth-settings.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/auth/auth-settings.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/auth/auth-settings.c 2019-10-08 18:37:33.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/auth/auth-settings.c 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/auth/auth-settings.c 2020-09-18 19:57:02.000000000 -0400
</span> @@ -269,6 +269,8 @@
DEFLIST(passdbs, "passdb", &auth_passdb_setting_parser_info),
DEFLIST(userdbs, "userdb", &auth_userdb_setting_parser_info),
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -31,8 +643,8 @@ diff -Naur ./src/auth/auth-settings.c ./src/auth/auth-settings.c
</span> .verbose_proctitle = FALSE,
.first_valid_uid = 500,
diff -Naur ./src/auth/auth-settings.h ./src/auth/auth-settings.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/auth/auth-settings.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/auth/auth-settings.h 2019-10-08 17:51:20.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/auth/auth-settings.h 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/auth/auth-settings.h 2020-09-18 19:57:02.000000000 -0400
</span> @@ -82,6 +82,8 @@
ARRAY(struct auth_passdb_settings *) passdbs;
ARRAY(struct auth_userdb_settings *) userdbs;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -43,8 +655,8 @@ diff -Naur ./src/auth/auth-settings.h ./src/auth/auth-settings.h
</span> const char *ssl_client_ca_dir;
const char *ssl_client_ca_file;
diff -Naur ./src/imap/Makefile.am ./src/imap/Makefile.am
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap/Makefile.am 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap/Makefile.am 2019-10-08 20:40:24.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap/Makefile.am 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap/Makefile.am 2020-09-18 19:57:02.000000000 -0400
</span> @@ -64,6 +64,7 @@
cmd-unselect.c \
cmd-unsubscribe.c \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -55,7 +667,7 @@ diff -Naur ./src/imap/Makefile.am ./src/imap/Makefile.am
</span>
diff -Naur ./src/imap/cmd-x-apple-push-service.c ./src/imap/cmd-x-apple-push-service.c
--- ./src/imap/cmd-x-apple-push-service.c 1969-12-31 19:00:00.000000000 -0500
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap/cmd-x-apple-push-service.c 2019-10-10 06:22:12.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap/cmd-x-apple-push-service.c 2020-09-18 19:57:02.000000000 -0400
</span> @@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2010-2011 Apple Inc. All rights reserved.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -231,9 +843,9 @@ diff -Naur ./src/imap/cmd-x-apple-push-service.c ./src/imap/cmd-x-apple-push-ser
</span> + return TRUE;
+}
diff -Naur ./src/imap/imap-client.c ./src/imap/imap-client.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap/imap-client.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap/imap-client.c 2019-10-08 20:42:59.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -182,6 +182,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap/imap-client.c 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap/imap-client.c 2020-09-18 19:57:02.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -181,6 +181,8 @@
</span> a chance of working */
client_add_capability(client, "SEARCH=FUZZY");
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -243,8 +855,8 @@ diff -Naur ./src/imap/imap-client.c ./src/imap/imap-client.c
</span> mail_set = mail_user_set_get_storage_set(user);
if (mail_set->mailbox_list_index) {
diff -Naur ./src/imap/imap-commands.c ./src/imap/imap-commands.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap/imap-commands.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap/imap-commands.c 2019-10-08 20:15:39.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap/imap-commands.c 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap/imap-commands.c 2020-09-18 19:57:02.000000000 -0400
</span> @@ -76,6 +76,7 @@
{ "UID SORT", cmd_sort, COMMAND_FLAG_BREAKS_SEQS },
{ "UID THREAD", cmd_thread, COMMAND_FLAG_BREAKS_SEQS },
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -254,8 +866,8 @@ diff -Naur ./src/imap/imap-commands.c ./src/imap/imap-commands.c
</span> { "X-STATE", cmd_x_state, COMMAND_FLAG_REQUIRES_SYNC },
{ "XLIST", cmd_list, 0 },
diff -Naur ./src/imap/imap-commands.h ./src/imap/imap-commands.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap/imap-commands.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap/imap-commands.h 2019-10-08 20:16:48.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap/imap-commands.h 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap/imap-commands.h 2020-09-18 19:57:02.000000000 -0400
</span> @@ -121,6 +121,7 @@
bool cmd_uid_expunge(struct client_command_context *cmd);
bool cmd_move(struct client_command_context *cmd);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -265,8 +877,8 @@ diff -Naur ./src/imap/imap-commands.h ./src/imap/imap-commands.h
</span> bool cmd_x_state(struct client_command_context *cmd);
diff -Naur ./src/imap/imap-settings.c ./src/imap/imap-settings.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap/imap-settings.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap/imap-settings.c 2019-10-08 17:57:36.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap/imap-settings.c 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap/imap-settings.c 2020-09-18 19:57:02.000000000 -0400
</span> @@ -73,6 +73,7 @@
DEF(SET_STR, imap_logout_format),
DEF(SET_STR, imap_id_send),
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -284,8 +896,8 @@ diff -Naur ./src/imap/imap-settings.c ./src/imap/imap-settings.c
</span> .imap_metadata = FALSE,
.imap_literal_minus = FALSE,
diff -Naur ./src/imap/imap-settings.h ./src/imap/imap-settings.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap/imap-settings.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap/imap-settings.h 2019-10-08 17:48:14.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap/imap-settings.h 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap/imap-settings.h 2020-09-18 19:57:02.000000000 -0400
</span> @@ -31,6 +31,7 @@
const char *imap_logout_format;
const char *imap_id_send;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -295,8 +907,8 @@ diff -Naur ./src/imap/imap-settings.h ./src/imap/imap-settings.h
</span> bool imap_metadata;
bool imap_literal_minus;
diff -Naur ./src/imap-login/imap-login-client.c ./src/imap-login/imap-login-client.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap-login/imap-login-client.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap-login/imap-login-client.c 2019-10-11 08:28:49.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap-login/imap-login-client.c 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap-login/imap-login-client.c 2020-09-18 19:57:02.000000000 -0400
</span> @@ -117,6 +117,8 @@
str_append(cap_str, " STARTTLS");
if (is_login_cmd_disabled(client))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -307,8 +919,8 @@ diff -Naur ./src/imap-login/imap-login-client.c ./src/imap-login/imap-login-clie
</span> client_authenticate_get_capabilities(client, cap_str);
return str_c(cap_str);
diff -Naur ./src/imap-login/imap-login-settings.c ./src/imap-login/imap-login-settings.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap-login/imap-login-settings.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap-login/imap-login-settings.c 2019-10-08 18:33:32.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap-login/imap-login-settings.c 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap-login/imap-login-settings.c 2020-09-18 19:57:02.000000000 -0400
</span> @@ -57,6 +57,7 @@
DEF(SET_STR, imap_capability),
DEF(SET_STR, imap_id_send),
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -326,8 +938,8 @@ diff -Naur ./src/imap-login/imap-login-settings.c ./src/imap-login/imap-login-se
</span> .imap_id_retain = FALSE,
};
diff -Naur ./src/imap-login/imap-login-settings.h ./src/imap-login/imap-login-settings.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/imap-login/imap-login-settings.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/imap-login/imap-login-settings.h 2019-10-08 17:49:33.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/imap-login/imap-login-settings.h 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/imap-login/imap-login-settings.h 2020-09-18 19:57:02.000000000 -0400
</span> @@ -5,6 +5,7 @@
const char *imap_capability;
const char *imap_id_send;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -337,17 +949,17 @@ diff -Naur ./src/imap-login/imap-login-settings.h ./src/imap-login/imap-login-se
</span> bool imap_id_retain;
};
diff -Naur ./src/lib-lda/mail-deliver.c ./src/lib-lda/mail-deliver.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/lib-lda/mail-deliver.c 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/lib-lda/mail-deliver.c 2019-10-11 08:16:28.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -31,6 +31,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/lib-lda/mail-deliver.c 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/lib-lda/mail-deliver.c 2020-09-18 19:57:02.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -35,6 +35,7 @@
</span> };
deliver_mail_func_t *deliver_mail = NULL;
+deliver_hook_func_t *deliver_hook = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- struct mail_deliver_cache {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- bool filled;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -409,6 +410,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct mail_deliver_mailbox {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ union mailbox_module_context module_ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -459,6 +460,9 @@
</span> }
mail_deliver_log(ctx, "saved mail to %s", mailbox_name);
pool_unref(&changes.pool);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -357,19 +969,19 @@ diff -Naur ./src/lib-lda/mail-deliver.c ./src/lib-lda/mail-deliver.c
</span> } else {
mail_deliver_log(ctx, "save failed to %s: %s", mailbox_name,
mail_storage_get_last_internal_error(*storage_r, &error));
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -503,6 +507,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -547,6 +551,8 @@
</span> /* success. message may or may not have been saved. */
ret = 0;
}
+ if (!ret && deliver_hook)
+ deliver_hook(ctx, ctx->rcpt_default_mailbox);
mail_duplicate_db_deinit(&ctx->dup_db);
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (ret < 0 && mail_deliver_is_tempfailed(ctx, *storage_r)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- muser->deliver_ctx = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (ret < 0 && mail_deliver_is_tempfailed(ctx, *storage_r))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -1;
</span> diff -Naur ./src/lib-lda/mail-deliver.h ./src/lib-lda/mail-deliver.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/lib-lda/mail-deliver.h 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/lib-lda/mail-deliver.h 2019-10-08 20:50:00.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -82,6 +82,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/lib-lda/mail-deliver.h 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/lib-lda/mail-deliver.h 2020-09-18 19:57:02.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,6 +140,9 @@
</span> struct mail_storage **storage_r);
extern deliver_mail_func_t *deliver_mail;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -380,8 +992,8 @@ diff -Naur ./src/lib-lda/mail-deliver.h ./src/lib-lda/mail-deliver.h
</span> const struct var_expand_table *
mail_deliver_ctx_get_log_var_expand_table(struct mail_deliver_context *ctx,
diff -Naur ./src/plugins/Makefile.am ./src/plugins/Makefile.am
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./src/plugins/Makefile.am 2019-07-23 03:14:10.000000000 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/plugins/Makefile.am 2019-10-11 05:56:16.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/plugins/Makefile.am 2020-09-18 20:09:11.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/plugins/Makefile.am 2020-09-18 19:57:02.000000000 -0400
</span> @@ -31,6 +31,7 @@
notify \
notify-status \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -392,7 +1004,7 @@ diff -Naur ./src/plugins/Makefile.am ./src/plugins/Makefile.am
</span> $(MAIL_LUA) \
diff -Naur ./src/plugins/push-notify/Makefile.am ./src/plugins/push-notify/Makefile.am
--- ./src/plugins/push-notify/Makefile.am 1969-12-31 19:00:00.000000000 -0500
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/plugins/push-notify/Makefile.am 2019-10-11 08:48:43.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/plugins/push-notify/Makefile.am 2020-09-18 19:57:02.000000000 -0400
</span> @@ -0,0 +1,25 @@
+AM_CPPFLAGS = \
+ -I$(top_srcdir)/src/lib \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -421,7 +1033,7 @@ diff -Naur ./src/plugins/push-notify/Makefile.am ./src/plugins/push-notify/Makef
</span> +pkginc_lib_HEADERS = $(headers)
diff -Naur ./src/plugins/push-notify/push-notify-plugin.c ./src/plugins/push-notify/push-notify-plugin.c
--- ./src/plugins/push-notify/push-notify-plugin.c 1969-12-31 19:00:00.000000000 -0500
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/plugins/push-notify/push-notify-plugin.c 2019-10-11 09:06:31.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/plugins/push-notify/push-notify-plugin.c 2020-09-18 19:57:02.000000000 -0400
</span> @@ -0,0 +1,102 @@
+/* Copyright (c) 2008-2011 Apple, inc. */
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -527,7 +1139,7 @@ diff -Naur ./src/plugins/push-notify/push-notify-plugin.c ./src/plugins/push-not
</span> +}
diff -Naur ./src/plugins/push-notify/push-notify-plugin.h ./src/plugins/push-notify/push-notify-plugin.h
--- ./src/plugins/push-notify/push-notify-plugin.h 1969-12-31 19:00:00.000000000 -0500
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./src/plugins/push-notify/push-notify-plugin.h 2019-10-08 20:53:46.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/plugins/push-notify/push-notify-plugin.h 2020-09-18 19:57:02.000000000 -0400
</span> @@ -0,0 +1,20 @@
+/* Copyright (c) 2008-2011 Apple, inc. */
+
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mail/dovecot/files/patch-src-lib-ioloop-notify-kqueue-c.diff b/mail/dovecot/files/patch-src-lib-ioloop-notify-kqueue-c.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..ff00735b926
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mail/dovecot/files/patch-src-lib-ioloop-notify-kqueue-c.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./src/lib/ioloop-notify-kqueue.c 2020-09-18 19:56:38.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./src/lib/ioloop-notify-kqueue.c 2020-09-18 20:54:36.000000000 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11,6 +11,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "ioloop-private.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "llist.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "time-util.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <sys/types.h>
</span></pre><pre style='margin:0'>
</pre>