summaryrefslogtreecommitdiff
path: root/mail/cyrus-imapd312/files
diff options
context:
space:
mode:
Diffstat (limited to 'mail/cyrus-imapd312/files')
-rw-r--r--mail/cyrus-imapd312/files/cyrus-imapd-man.conf.in1
-rw-r--r--mail/cyrus-imapd312/files/imapd.conf372
-rw-r--r--mail/cyrus-imapd312/files/imapd.in32
-rw-r--r--mail/cyrus-imapd312/files/patch-Makefile.in11
-rw-r--r--mail/cyrus-imapd312/files/patch-configure22
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__http_client.h11
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__httpd.c25
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__httpd.h11
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__jmap_calendar.c29
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__jmap_mail_submission.c11
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__jmap_mailbox.c11
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__notify.c48
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__relocate_by_id.c10
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__tls.c14
-rw-r--r--mail/cyrus-imapd312/files/patch-imap__xapian_wrap.cpp14
-rw-r--r--mail/cyrus-imapd312/files/patch-lib__cyr_qsort_r.c19
-rw-r--r--mail/cyrus-imapd312/files/patch-lib__imapoptions20
-rw-r--r--mail/cyrus-imapd312/files/patch-lib__libcyr_cfg.c13
-rw-r--r--mail/cyrus-imapd312/files/patch-notifyd__notifyd.c44
-rw-r--r--mail/cyrus-imapd312/files/patch-tools__mkimap36
-rw-r--r--mail/cyrus-imapd312/files/pkg-deinstall.in40
-rw-r--r--mail/cyrus-imapd312/files/pkg-install.in41
-rw-r--r--mail/cyrus-imapd312/files/pkg-message.in10
23 files changed, 845 insertions, 0 deletions
diff --git a/mail/cyrus-imapd312/files/cyrus-imapd-man.conf.in b/mail/cyrus-imapd312/files/cyrus-imapd-man.conf.in
new file mode 100644
index 000000000000..b7ba70fcce77
--- /dev/null
+++ b/mail/cyrus-imapd312/files/cyrus-imapd-man.conf.in
@@ -0,0 +1 @@
+MANPATH %%PREFIX%%/cyrus/man
diff --git a/mail/cyrus-imapd312/files/imapd.conf b/mail/cyrus-imapd312/files/imapd.conf
new file mode 100644
index 000000000000..2ba85ce1d63e
--- /dev/null
+++ b/mail/cyrus-imapd312/files/imapd.conf
@@ -0,0 +1,372 @@
+# Sample configurations file for Cyrus IMAPd
+# Most lines in this file are commented; in this case the default is used.
+# The commented lines (usually) contain the default value
+
+# The pathname of the IMAP configuration directory
+#
+configdirectory: /var/imap
+
+# The partition name used by default for new mailboxes
+#
+#defaultpartition: default
+
+# The directory for the different partitions
+#
+partition-default: /var/spool/imap
+
+# Use the UNIX separator character '/' for delimiting levels of
+# mailbox hierarchy. The default is to use the netnews separator
+# character '.'.
+#unixhierarchysep: yes
+
+# Use the alternate IMAP namespace, where personal folders reside at
+# the same level in the hierarchy as INBOX.
+#
+#altnamespace: yes
+
+# If using the alternate IMAP namespace, the prefix for the other
+# users namespace. The hierarchy delimiter will be automatically
+# appended.
+#
+#userprefix: Other Users
+
+# If using the alternate IMAP namespace, the prefix for the shared
+# namespace. The hierarchy delimiter will be automatically appended.
+#
+#sharedprefix: Shared Folders
+
+# The umask value used by various Cyrus IMAP programs
+#
+#umask: 077
+
+# This is the hostname visible in the greeting messages of the POP,
+# IMAP and LMTP daemons. If it is unset, then the result returned from
+# gethostname(2) is used.
+#
+#servername: <result returned by gethostname(2)>
+
+# Whether to allow anonymous logins
+#
+#allowanonymouslogin: no
+
+# Allow the use of cleartext passwords on the wire.
+#
+#allowplaintext: yes
+
+# The percent of quota utilization over which the server generates
+# warnings.
+#
+#quotawarn: 90
+
+# The length of the IMAP server's inactivity autologout timer, in minutes.
+# The minimum value is 30, the default.
+#
+#timeout: 30
+
+# The interval (in seconds) for polling the mailbox for changes while
+# running the IDLE command. This option is used when idled can not be
+# contacted or when polling is used exclusively. The minimum value is
+# 1. A value of 0 will disable polling (and disable IDLE if polling
+# is the only method available).
+#
+#imapidlepoll: 60
+
+# If enabled, the server responds to an ID command with a parameter
+# list containing: version, vendor, support-url, os, os-version,
+# command, arguments, environment. Otherwise the server returns NIL.
+#
+#imapidresponse: yes
+
+# Set the length of the POP server's inactivity autologout timer, in
+# minutes. The minimum value is 10, the default.
+#
+#poptimeout: 10
+
+# Set the minimum amount of time the server forces users to wait between
+# successive POP logins, in minutes. The default is 0.
+#
+#popminpoll: 0
+
+# The number of days advertised as being the minimum a message may be
+# left on the POP server before it is deleted (via the CAPA command,
+# defined in the POP3 Extension Mechanism, which some clients may
+# support). "NEVER", the default, may be specified with a negative
+# number. The Cyrus POP3 server never deletes mail, no matter what
+# the value of this parameter is. However, if a site implements a
+# less liberal policy, it needs to change this parameter accordingly.
+#
+#popexpiretime: 0
+
+# The list of userids with administrative rights. Separate each userid
+# with a space. We recommend that administrator userids be separate from
+# standard userids. Sites using Kerberos authentication may use separate
+# "admin" instances.
+#
+#admins: <none>
+
+# A list of users and groups that are allowed to proxy for other
+# users, seperated by spaces. Any user listed in this will be allowed
+# to login for any other user: use with caution.
+#
+#proxyservers: <none>
+
+# The Access Control List (ACL) placed on a newly-created (non-user)
+# mailbox that does not have a parent mailbox.
+#
+#defaultacl: anyone lrs
+
+# The pathname of the news spool directory. Only used if the partition-news
+# configuration option is set.
+#
+#newsspool: <no default>
+
+# Prefix to be prepended to newsgroup names to make the corresponding IMAP
+# mailbox names.
+#
+#newsprefix: <none>
+
+# If set to a value of zero or higher, users have their INBOX folders
+# created upon a successful login event or upon lmtpd(8) message
+# delivery if autocreate_post is enabled, provided their INBOX did
+# not yet already exist.
+#
+# The user's quota is set to the value if it is greater than zero,
+# otherwise the user has unlimited quota.
+#
+# Note that quota is specified in kilobytes.
+#
+#autocreate_quota: -1
+
+# Include notations in the protocol telemetry logs indicating the number
+# of seconds since the last command or response.
+#
+#logtimestamps: no
+
+# Number of seconds to pause after a successful plaintext login. For systems
+# that support strong authentication, this permits users to perceive a cost
+# of using plaintext passwords.
+#
+#plaintextloginpause: 0
+
+# The pathname of srvtab file containing the server's private key.
+# This option is passed to the SASL library and overrides its default
+# setting.
+#
+#srvtab: /etc/srvtab
+
+# The list of remote realms whose users may log in using cross-realm
+# authentications. Seperate each realm name by a space. This option is
+# only used when the server is compiled with Kerberos authentication.
+#
+#loginrealms: <none>
+
+# If enabled, any authentication identity which has a rights on a user's
+# INBOX may log in as that user. This option is only used when the server
+# is compiled with Kerberos authentication.
+#
+#loginuseacl: no
+
+# If enabled, lmtpd attempts to only write one copy of a message per
+# partition and create hard links, resulting in a potentially large
+# disk savings.
+#
+#singleinstancestore: yes
+
+# If enabled, lmtpd will suppress delivery of a message to a mailbox
+# if a message with the same message-id (or resent-message-id) is
+# recorded as having already been delivered to the mailbox. Records
+# the mailbox and message-id/resent-message-id of all successful
+# deliveries.
+#
+#duplicatesuppression: yes
+
+# If enabled, lmtpd rejects messages with 8-bit characters in the
+# headers. Otherwise, 8-bit characters are changed to `X'. (A proper
+# soultion to non-ASCII characters in headers is offered by RFC 2047
+# and its predecessors.)
+#
+#reject8bit: no
+
+# Maximum incoming LMTP message size. If set, lmtpd will reject
+# messages larger than maxmessagesize bytes. The default is to allow
+# messages of any size.
+#
+#maxmessagesize: <unlimited>
+
+# Userid used to deliver messages to shared folders. For example, if
+# set to "bb", email sent to "bb+shared.blah" would be delivered to
+# the "shared.blah" folder. By default, an email address of
+# "+shared.blah" would be used.
+#postuser: <none>
+
+# If enabled at compile time, this specifies a URL to reply when
+# Netscape asks the server where the mail administration HTTP server
+# is. The default is a site at CMU with a hopefully informative
+# message; administrators should set this to a local resource with
+# some information of greater use.
+#
+#netscapeurl: http://andrew2.andrew.cmu.edu/cyrus/imapd/netscapeadmin.html
+
+# Notifyd(8) method to use for "MAIL" notifications. If not set,
+# "MAIL" notifications are disabled.
+#
+#mailnotifier: <no default>
+
+# Notifyd(8) method to use for "SIEVE" notifications. If not set,
+# "SIEVE" notifications are disabled.
+#
+# This method is only used when no method is specified in the script.
+#
+#sievenotifier: <no default>
+
+# If enabled, lmtpd will look for Sieve scripts in user's home
+# directories: ~user/.sieve.
+#
+sieveusehomedir: false
+
+# If sieveusehomedir is false, this directory is searched for Sieve scripts.
+# The active Sieve script is s called "default", placed in the users sieve
+# sieve directory (ie. /var/imap/sieve/u/user).
+#
+sievedir: /var/imap/sieve
+
+# The pathname of the sendmail executable. Sieve uses sendmail for
+# sending rejections, redirects and vaca- tion responses.
+#
+#sendmail: /usr/sbin/sendmail
+
+# Username that is used as the 'From' address in rejection MDNs
+# produced by sieve.
+#
+#postmaster: postmaster
+
+# If enabled, the partitions will also be hashed, in addition to the hashing
+# done on configuration directories. This is recommended if one partition has
+# a very bushy mailbox tree.
+#
+#hashimapspool: false
+
+# Maximum size (in kilobytes) any sieve script can be, enforced at
+# submission by timsieved(8).
+#
+#sieve_maxscriptsize: 32
+
+# Maximum number of sieve scripts any user may have, enforced at
+# submission by timsieved(8).
+#
+#sieve_maxscripts: 5
+
+# The cyrusdb backend to use for mailbox annotations.
+# Allowed values: skiplist, twoskip
+#
+#annotation_db: twoskip
+
+# The cyrusdb backend to use for the duplicate delivery suppression
+# and sieve.
+# Allowed values: skiplist, sql, twoskip
+#
+#duplicate_db: twoskip
+
+# The cyrusdb backend to use for the mailbox list.
+# Allowed values: skiplist, twoskip
+#
+#mboxlist_db: twoskip
+
+# The cyrusdb backend to use for the pts cache.
+# Allowed values: skiplist, twoskip
+#
+#ptscache_db: twoskip
+
+# The cyrusdb backend to use for the seen state.
+# Allowed values: flat, skiplist, twoskip
+#
+#seenstate_db: twoskip
+
+# The cyrusdb backend to use for the imap status cache.
+# Allowed values: skiplist, sql, twoskip
+#
+#statuscache_db: twoskip
+
+# The cyrusdb backend to use for the subscriptions list.
+# Allowed values: flat, skiplist, twoskip
+#
+#subscription_db: flat
+
+# Maximum SSF (security strength factor) that the server will allow a
+# client to negotiate.
+#
+#sasl_maximum_layer: 256
+
+# The minimum SSF that the server will allow a client to negotiate. A
+# value of 1 requires integrity protection; any higher value requires
+# some amount of encryption.
+#
+#sasl_minimum_layer: 0
+
+# The mechanism used by the server to verify plaintext passwords. Possible
+# values include "auxprop" or "saslauthd"
+#
+sasl_pwcheck_method: auxprop
+
+# If enabled, the SASL library will automatically create authentication
+# secrets when given a plaintext password. See the SASL documentation.
+#
+#sasl_auto_transition: no
+
+# Whitespace separated list of mechanisms to allow (e.g. 'plain otp').
+# Used to restrict the mechanisms to a subset of the installed
+# plugins. The default is all available.
+#
+#sasl_mech_list: cram-md5 digest-md5
+
+# Location of the opiekeys file
+#
+#sasl_opiekeys: /etc/opiekeys
+
+# File containing the global certificate used for ALL services (imap,
+# pop3, lmtp).
+#
+#tls_server_cert: <none>
+
+# File containing the private key belonging to the global server
+# certificate.
+#
+#tls_server_key: <none>
+
+# File containing one or more Certificate Authority (CA) certificates.
+#
+#tls_client_ca_file: <none>
+
+# Path to directory with certificates of CAs.
+#
+#tls_client_ca_dir: <none>
+
+# The cyrusdb backend to use for the TLS cache.
+# Allowed values: skiplist, sql, twoskip
+#
+#tls_sessions_db: twoskip
+
+# The length of time (in minutes) that a TLS session will be cached
+# for later reuse. The maximum value is 1440 (24 hours), the default.
+# A value of 0 will disable session caching.
+#
+#tls_session_timeout: 1440
+
+# The right that a user needs to delete a mailbox.
+#
+#deleteright: c
+
+# Unix domain socket that lmtpd listens on, used by deliver(8).
+#
+#lmtpsocket: /var/imap/socket/lmtp
+
+# Unix domain socket that idled listens on.
+#
+#idlesocket: /var/imap/socket/idle
+
+# Unix domain socket that the new mail notification daemon listens on.
+#
+#notifysocket: /var/imap/socket/notify
+
+#
+# EOF
diff --git a/mail/cyrus-imapd312/files/imapd.in b/mail/cyrus-imapd312/files/imapd.in
new file mode 100644
index 000000000000..1fda8d76f980
--- /dev/null
+++ b/mail/cyrus-imapd312/files/imapd.in
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+# Start or stop cyrus-imapd
+
+# PROVIDE: cyrus_imapd imap
+# REQUIRE: DAEMON
+# BEFORE: mail
+# KEYWORD: shutdown
+
+# Add the following line to /etc/rc.conf to enable Cyrus IMAP:
+#
+# cyrus_imapd_enable="YES"
+
+. /etc/rc.subr
+
+: ${cyrus_imapd_enable="NO"}
+
+name="cyrus_imapd"
+rcvar=cyrus_imapd_enable
+pidfile="/var/run/cyrus-master.pid"
+command="%%PREFIX%%/cyrus/libexec/master"
+command_args="-d -p ${pidfile}"
+required_files="%%PREFIX%%/etc/cyrus.conf %%PREFIX%%/etc/imapd.conf"
+stop_postcmd="cyrus_imapd_poststop"
+extra_commands="reload"
+
+cyrus_imapd_poststop() {
+ /bin/rm -f ${pidfile}
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/mail/cyrus-imapd312/files/patch-Makefile.in b/mail/cyrus-imapd312/files/patch-Makefile.in
new file mode 100644
index 000000000000..d75330d83038
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-Makefile.in
@@ -0,0 +1,11 @@
+--- Makefile.in.orig 2025-01-22 02:01:14 UTC
++++ Makefile.in
+@@ -2829,7 +2829,7 @@ LD_BASIC_ADD = lib/libcyrus.la lib/libcyrus_min.la ${L
+ # MD5 algorithms, without needing SSL. Currently we have no way of
+ # minimally linking such code.
+ LD_BASIC_ADD = lib/libcyrus.la lib/libcyrus_min.la ${LIBS} \
+- ${LIB_SASL} $(SSL_LIBS) $(GCOV_LIBS)
++ ${LIB_SASL} $(SSL_LIBS) $(GCOV_LIBS) -lm
+
+
+ # UTILITY is the libraries that utility programs which use Cyrus'
diff --git a/mail/cyrus-imapd312/files/patch-configure b/mail/cyrus-imapd312/files/patch-configure
new file mode 100644
index 000000000000..4d3deee12dcf
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-configure
@@ -0,0 +1,22 @@
+Index: configure
+diff -u configure.orig configure
+--- configure.orig 2010-10-18 21:36:00.000000000 +0900
++++ configure 2010-10-18 23:50:45.966557478 +0900
+@@ -9501,7 +9501,7 @@
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+-LIBS="-lgssapi ${GSSAPIBASE_LIBS} -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err ${LIB_SOCKET} $LIBS"
++LIBS="-lgssapi ${GSSAPIBASE_LIBS} -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err ${LIB_SOCKET} -lhx509 $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+
+@@ -9803,7 +9803,7 @@
+ GSSAPIBASE_STATIC_LIBS="$GSSAPIBASE_LIBS $gssapi_dir/libgssapi_krb5.a $gssapi_dir/libkrb5.a $gssapi_dir/libk5crypto.a $gssapi_dir/libcom_err.a ${K5SUPSTATIC}"
+ elif test "$gss_impl" = "heimdal"; then
+ CPPFLAGS="$CPPFLAGS -DKRB5_HEIMDAL"
+- GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err"
++ GSSAPIBASE_LIBS="$GSSAPIBASE_LIBS -lgssapi -lkrb5 -lasn1 -lroken ${LIB_CRYPT} ${LIB_DES} -lcom_err -lhx509"
+ GSSAPIBASE_STATIC_LIBS="$GSSAPIBASE_STATIC_LIBS $gssapi_dir/libgssapi.a $gssapi_dir/libkrb5.a $gssapi_dir/libasn1.a $gssapi_dir/libroken.a $gssapi_dir/libcom_err.a ${LIB_CRYPT}"
+ elif test "$gss_impl" = "cybersafe03"; then
+ # Version of CyberSafe with two libraries
diff --git a/mail/cyrus-imapd312/files/patch-imap__http_client.h b/mail/cyrus-imapd312/files/patch-imap__http_client.h
new file mode 100644
index 000000000000..113854e9913d
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__http_client.h
@@ -0,0 +1,11 @@
+--- imap/http_client.h.orig 2016-04-11 02:02:11 UTC
++++ imap/http_client.h
+@@ -57,7 +57,7 @@ struct body_t {
+ unsigned char framing; /* Message framing */
+ unsigned char te; /* Transfer-Encoding */
+ unsigned max; /* Max allowed len */
+- ulong len; /* Content-Length */
++ unsigned long len; /* Content-Length */
+ struct buf payload; /* Payload */
+ };
+
diff --git a/mail/cyrus-imapd312/files/patch-imap__httpd.c b/mail/cyrus-imapd312/files/patch-imap__httpd.c
new file mode 100644
index 000000000000..efec7547cc68
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__httpd.c
@@ -0,0 +1,25 @@
+--- imap/httpd.c.orig 2025-06-27 04:15:42 UTC
++++ imap/httpd.c
+@@ -1286,7 +1286,22 @@ static int tls_init(int client_auth, struct buf *serve
+
+ static int tls_init(int client_auth, struct buf *serverinfo)
+ {
++#ifdef OPENSSL_FULL_VERSION_STR
+ buf_printf(serverinfo, " OpenSSL/%s", OPENSSL_FULL_VERSION_STR);
++#else
++ unsigned long version = OPENSSL_VERSION_NUMBER;
++ unsigned int status = version & 0x0f; version >>= 4;
++ unsigned int patch = version & 0xff; version >>= 8;
++ unsigned int fix = version & 0xff; version >>= 8;
++ unsigned int minor = version & 0xff; version >>= 8;
++ unsigned int major = version & 0xff;
++
++ buf_printf(serverinfo, " OpenSSL/%u.%u.%u", major, minor, fix);
++
++ if (status == 0) buf_appendcstr(serverinfo, "-dev");
++ else if (status < 15) buf_printf(serverinfo, "-beta%u", status);
++ else if (patch) buf_putc(serverinfo, patch + 'a' - 1);
++#endif
+
+ if (!tls_enabled()) return HTTP_UNAVAILABLE;
+
diff --git a/mail/cyrus-imapd312/files/patch-imap__httpd.h b/mail/cyrus-imapd312/files/patch-imap__httpd.h
new file mode 100644
index 000000000000..f50f66fc0cdb
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__httpd.h
@@ -0,0 +1,11 @@
+--- imap/httpd.h.orig 2016-04-11 02:02:11 UTC
++++ imap/httpd.h
+@@ -264,7 +264,7 @@ struct patch_doc_t {
+
+ /* Meta-data for response body (payload & representation headers) */
+ struct resp_body_t {
+- ulong len; /* Content-Length */
++ unsigned long len; /* Content-Length */
+ struct range *range; /* Content-Range */
+ const char *fname; /* Content-Dispo */
+ unsigned char enc; /* Content-Encoding */
diff --git a/mail/cyrus-imapd312/files/patch-imap__jmap_calendar.c b/mail/cyrus-imapd312/files/patch-imap__jmap_calendar.c
new file mode 100644
index 000000000000..d5eb4d5e34dc
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__jmap_calendar.c
@@ -0,0 +1,29 @@
+--- imap/jmap_calendar.c.orig 2024-03-18 02:20:35 UTC
++++ imap/jmap_calendar.c
+@@ -6962,7 +6962,7 @@ static int eventquery_textsearch_run(jmap_req_t *req,
+ if (!expandrecur) {
+ struct eventquery_cmp_rock rock = { sort, nsort };
+ cyr_qsort_r(matches->data, matches->count, sizeof(void*),
+- (int(*)(const void*, const void*, void*))eventquery_cmp, &rock);
++ (int(*)QSORT_R_COMPAR_ARGS(const void*, const void*, void*))eventquery_cmp, &rock);
+ }
+
+ r = 0;
+@@ -9591,7 +9591,7 @@ static void principal_getavailability(jmap_req_t *req,
+ * different “busyStatus” properties the server MUST choose the value in
+ * the following order: confirmed > unavailable > tentative. */
+ cyr_qsort_r(busyperiods->data, busyperiods->count, sizeof(struct busyperiod),
+- (int(*)(const void*, const void*, void*))busyperiod_cmp, NULL);
++ (int(*)QSORT_R_COMPAR_ARGS(const void*, const void*, void*))busyperiod_cmp, NULL);
+ int count = dynarray_size(busyperiods) ? 1 : 0;
+ int i;
+ for (i = 1; i < dynarray_size(busyperiods); i++) {
+@@ -9907,7 +9907,7 @@ static void notifsearch_run(const char *userid,
+ if (search->sort) {
+ cyr_qsort_r(entries->data, entries->count,
+ sizeof(struct notifsearch_entry),
+- (int(*)(const void*, const void*, void*))search->sort,
++ (int(*)QSORT_R_COMPAR_ARGS(const void*, const void*, void*))search->sort,
+ search->sortrock);
+ }
+
diff --git a/mail/cyrus-imapd312/files/patch-imap__jmap_mail_submission.c b/mail/cyrus-imapd312/files/patch-imap__jmap_mail_submission.c
new file mode 100644
index 000000000000..56b26563b6b2
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__jmap_mail_submission.c
@@ -0,0 +1,11 @@
+--- imap/jmap_mail_submission.c.orig 2023-03-01 02:54:30 UTC
++++ imap/jmap_mail_submission.c
+@@ -229,7 +229,7 @@ static int _emailsubmission_address_parse(json_t *addr
+ if (holduntil) {
+ if (!strcasecmp(key, "HOLDFOR")) {
+ char *endptr = (char *) val;
+- ulong interval = val ? strtoul(val, &endptr, 10) : ULONG_MAX;
++ unsigned long interval = val ? strtoul(val, &endptr, 10) : ULONG_MAX;
+ time_t now = time(0);
+
+ if (endptr == val || *endptr != '\0' ||
diff --git a/mail/cyrus-imapd312/files/patch-imap__jmap_mailbox.c b/mail/cyrus-imapd312/files/patch-imap__jmap_mailbox.c
new file mode 100644
index 000000000000..ad097332221e
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__jmap_mailbox.c
@@ -0,0 +1,11 @@
+--- imap/jmap_mailbox.c.orig 2024-03-18 02:20:35 UTC
++++ imap/jmap_mailbox.c
+@@ -1327,7 +1327,7 @@ static int _mboxquery_run(mboxquery_t *query, const mb
+
+ /* Apply comparators */
+ cyr_qsort_r(query->result.data, query->result.count, sizeof(void*),
+- (int(*)(const void*, const void*, void*)) _mboxquery_compar, query);
++ (int(*)QSORT_R_COMPAR_ARGS(const void*, const void*, void*)) _mboxquery_compar, query);
+
+ /* Build in-memory tree */
+ hash_table recs_by_parentid = HASH_TABLE_INITIALIZER;
diff --git a/mail/cyrus-imapd312/files/patch-imap__notify.c b/mail/cyrus-imapd312/files/patch-imap__notify.c
new file mode 100644
index 000000000000..e093378fc10d
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__notify.c
@@ -0,0 +1,48 @@
+--- imap/notify.c.orig 2021-05-10 04:34:24 UTC
++++ imap/notify.c
+@@ -49,6 +49,9 @@
+ #include <syslog.h>
+ #include <sys/mman.h>
+ #include <sys/types.h>
++#if defined(__FreeBSD__)
++#include <sys/sysctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <sys/un.h>
+@@ -209,6 +212,27 @@ EXPORTED void notify(const char *method,
+ FNAME_NOTIFY_SOCK, sizeof(sun_data.sun_path));
+ }
+
++#if defined(__FreeBSD__)
++ size_t maxsockbuf;
++ size_t len = sizeof(maxsockbuf);
++ r = sysctlbyname("kern.ipc.maxsockbuf", &maxsockbuf, &len, NULL, 0);
++ if (r == 0) {
++ bufsiz = MIN(maxsockbuf, NOTIFY_MAXSIZE);
++ } else {
++ syslog(LOG_WARNING,
++ "NOTIFY(%s): unable to sysctlbyname(kern.ipc.maxsockbuf): %m",
++ loginfo);
++ bufsiz = NOTIFY_MAXSIZE;
++ }
++
++ optlen = sizeof(bufsiz);
++ r = setsockopt(soc, SOL_SOCKET, SO_SNDBUF, &bufsiz, optlen);
++ if (r == -1) {
++ syslog(LOG_WARNING,
++ "NOTIFY(%s): unable to setsockopt(SO_SNDBUF) on socket: %m",
++ loginfo);
++ }
++#else
+ /* Get send buffer size */
+ optlen = sizeof(bufsiz);
+ r = getsockopt(soc, SOL_SOCKET, SO_SNDBUF, &bufsiz, &optlen);
+@@ -221,6 +245,7 @@ EXPORTED void notify(const char *method,
+
+ /* Use minimum of 1/10 of send buffer size (-overhead) NOTIFY_MAXSIZE */
+ bufsiz = MIN(bufsiz / 10 - 32, NOTIFY_MAXSIZE);
++#endif
+
+ /*
+ * build request of the form:
diff --git a/mail/cyrus-imapd312/files/patch-imap__relocate_by_id.c b/mail/cyrus-imapd312/files/patch-imap__relocate_by_id.c
new file mode 100644
index 000000000000..e9c771c10420
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__relocate_by_id.c
@@ -0,0 +1,10 @@
+--- imap/relocate_by_id.c.orig 2023-02-27 02:08:04 UTC
++++ imap/relocate_by_id.c
+@@ -46,6 +46,7 @@
+ #include <unistd.h>
+ #endif
+ #include <getopt.h>
++#include <libgen.h>
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <errno.h>
diff --git a/mail/cyrus-imapd312/files/patch-imap__tls.c b/mail/cyrus-imapd312/files/patch-imap__tls.c
new file mode 100644
index 000000000000..2d9b8d36b1df
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__tls.c
@@ -0,0 +1,14 @@
+--- imap/tls.c.orig 2024-03-13 02:47:44 UTC
++++ imap/tls.c
+@@ -257,7 +257,11 @@ static DH *get_dh1024(void)
+ dh = DH_new();
+ if (!dh) return NULL;
+
++#if defined(LIBRESSL_VERSION_NUMBER)
++ p = BN_get_rfc2409_prime_1024(NULL);
++#else
+ p = get_rfc2409_prime_1024(NULL);
++#endif
+ BN_dec2bn(&g, "2");
+
+ if (DH_set0_pqg(dh, p, NULL, g))
diff --git a/mail/cyrus-imapd312/files/patch-imap__xapian_wrap.cpp b/mail/cyrus-imapd312/files/patch-imap__xapian_wrap.cpp
new file mode 100644
index 000000000000..3a7eaaace548
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-imap__xapian_wrap.cpp
@@ -0,0 +1,14 @@
+--- imap/xapian_wrap.cpp.orig 2022-02-23 00:13:21 UTC
++++ imap/xapian_wrap.cpp
+@@ -32,7 +32,11 @@ extern "C" {
+ #include <xapian.h>
+
+ #ifdef HAVE_CLD2
++#ifdef __FreeBSD__
++#include <cld/public/compact_lang_det.h>
++#else
+ #include <cld2/public/compact_lang_det.h>
++#endif
+ #endif
+
+ // from global.h
diff --git a/mail/cyrus-imapd312/files/patch-lib__cyr_qsort_r.c b/mail/cyrus-imapd312/files/patch-lib__cyr_qsort_r.c
new file mode 100644
index 000000000000..536076a6a530
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-lib__cyr_qsort_r.c
@@ -0,0 +1,19 @@
+--- lib/cyr_qsort_r.c.orig 2019-12-04 02:17:01 UTC
++++ lib/cyr_qsort_r.c
+@@ -18,14 +18,14 @@ EXPORTED void cyr_qsort_r(void *base, size_t nmemb, si
+ // NOTE: this is kinda ugly, but it's OK if you're not multithreaded
+
+ static void *qsort_r_thunk;
+-static int (*qsort_r_compar)(const void *, const void *, void *);
++static int (*qsort_r_compar)QSORT_R_COMPAR_ARGS(const void *, const void *, void *);
+ static int qsort_r_compar_func(const void *a, const void *b)
+ {
+ return qsort_r_compar(a, b, qsort_r_thunk);
+ }
+
+ EXPORTED void cyr_qsort_r(void *base, size_t nmemb, size_t size,
+- int (*compar)(const void *, const void *, void *),
++ int (*compar)QSORT_R_COMPAR_ARGS(const void *, const void *, void *),
+ void *thunk)
+ {
+ qsort_r_thunk = thunk;
diff --git a/mail/cyrus-imapd312/files/patch-lib__imapoptions b/mail/cyrus-imapd312/files/patch-lib__imapoptions
new file mode 100644
index 000000000000..6fd98f52abd1
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-lib__imapoptions
@@ -0,0 +1,20 @@
+--- lib/imapoptions.orig 2020-02-06 22:38:20 UTC
++++ lib/imapoptions
+@@ -2230,7 +2230,7 @@ If all partitions are over that limit, this feature is
+ { "seenstate_db", "twoskip", STRINGLIST("flat", "skiplist", "twoskip", "zeroskip"), "3.1.6" }
+ /* The cyrusdb backend to use for the seen state. */
+
+-{ "sendmail", "/usr/lib/sendmail", STRING, "2.3.17" }
++{ "sendmail", "/usr/sbin/sendmail", STRING, "2.3.17" }
+ /* The pathname of the sendmail executable. Sieve invokes sendmail
+ for sending rejections, redirects and vacation responses. */
+
+@@ -2363,7 +2363,7 @@ product version in the capabilities
+ For backward compatibility, if no unit is specified, seconds is
+ assumed. */
+
+-{ "sievedir", "/usr/sieve", STRING, "2.3.17" }
++{ "sievedir", "/var/imap/sieve", STRING, "2.3.17" }
+ /* If sieveusehomedir is false, this directory is searched for Sieve
+ scripts. */
+
diff --git a/mail/cyrus-imapd312/files/patch-lib__libcyr_cfg.c b/mail/cyrus-imapd312/files/patch-lib__libcyr_cfg.c
new file mode 100644
index 000000000000..5cbb64001209
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-lib__libcyr_cfg.c
@@ -0,0 +1,13 @@
+Index: lib/libcyr_cfg.c
+diff -u -p lib/libcyr_cfg.c.orig lib/libcyr_cfg.c
+--- lib/libcyr_cfg.c.orig Wed Mar 10 00:05:58 2004
++++ lib/libcyr_cfg.c Fri Feb 25 00:06:44 2005
+@@ -52,7 +52,7 @@
+ #include "libcyr_cfg.h"
+ #include "cyrusdb.h"
+
+-#if defined(__GNUC__) && __GNUC__ > 1
++#if defined(__GNUC__) && __GNUC__ > 1 && !defined(__INTEL_COMPILER)
+ /* We can use the GCC union constructor extension */
+ #define CFGVAL(t,v) (union cyrus_config_value)((t)(v))
+ #else
diff --git a/mail/cyrus-imapd312/files/patch-notifyd__notifyd.c b/mail/cyrus-imapd312/files/patch-notifyd__notifyd.c
new file mode 100644
index 000000000000..0719b98c13f6
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-notifyd__notifyd.c
@@ -0,0 +1,44 @@
+--- notifyd/notifyd.c.orig 2021-05-05 03:21:59 UTC
++++ notifyd/notifyd.c
+@@ -50,6 +50,9 @@
+ #include <sysexits.h>
+ #include <syslog.h>
+ #include <sys/types.h>
++#if defined(__FreeBSD__)
++#include <sys/sysctl.h>
++#endif
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <sys/un.h>
+@@ -111,6 +114,23 @@ static int do_notify(void)
+ unsigned bufsiz;
+ socklen_t optlen;
+
++#if defined(__FreeBSD__)
++ size_t maxsockbuf;
++ size_t len = sizeof(maxsockbuf);
++ r = sysctlbyname("kern.ipc.maxsockbuf", &maxsockbuf, &len, NULL, 0);
++ if (r == 0) {
++ bufsiz = MIN(maxsockbuf, NOTIFY_MAXSIZE);
++ } else {
++ syslog(LOG_WARNING, "unable to sysctlbyname(kern.ipc.maxsockbuf): %m");
++ bufsiz = NOTIFY_MAXSIZE;
++ }
++
++ optlen = sizeof(bufsiz);
++ r = setsockopt(soc, SOL_SOCKET, SO_RCVBUF, &bufsiz, optlen);
++ if (r == -1) {
++ syslog(LOG_WARNING, "unable to setsockopt(SO_RCVBUF) on notify socket: %m");
++ }
++#else
+ /* Get receive buffer size */
+ optlen = sizeof(bufsiz);
+ r = getsockopt(soc, SOL_SOCKET, SO_RCVBUF, &bufsiz, &optlen);
+@@ -121,6 +141,7 @@ static int do_notify(void)
+
+ /* Use minimum of 1/10 of receive buffer size (-overhead) NOTIFY_MAXSIZE */
+ bufsiz = MIN(bufsiz / 10 - 32, NOTIFY_MAXSIZE);
++#endif
+
+ while (1) {
+ method = class = priority = user = mailbox = message = reply = NULL;
diff --git a/mail/cyrus-imapd312/files/patch-tools__mkimap b/mail/cyrus-imapd312/files/patch-tools__mkimap
new file mode 100644
index 000000000000..e0cb5fe46ae7
--- /dev/null
+++ b/mail/cyrus-imapd312/files/patch-tools__mkimap
@@ -0,0 +1,36 @@
+--- tools/mkimap.orig 2022-10-06 22:58:05 UTC
++++ tools/mkimap
+@@ -75,6 +75,9 @@ sub read_conf {
+
+ $imapdconf = shift || "/etc/imapd.conf";
+
++$cyrus_user = $ENV{CYRUS_USER} || "%%CYRUS_USER%%";
++$cyrus_group = $ENV{CYRUS_GROUP} || "%%CYRUS_GROUP%%";
++
+ push @configs, $imapdconf;
+
+ while ($conf = shift @configs) {
+@@ -87,6 +90,7 @@ $d = $confdir;
+
+ print "configuring $d...\n";
+
++mkdir $d, 0755;
+ chdir $d or die "couldn't change to $d";
+
+ mkdir "proc", 0755 || warn "can't create $d/proc: $!";
+@@ -97,12 +101,15 @@ mkdir "msg", 0755 || warn "can't create $d/msg: $!";
+ mkdir "ptclient", 0755 || warn "can't create $d/ptclient: $!";
+ mkdir "sync", 0755 || warn "can't create $d/sync: $!";
+
++system "/usr/sbin/chown -R $cyrus_user:$cyrus_group .";
++
+ while ($part = shift @parts) {
+ print "creating $part...\n";
+ mkdir $part, 0755 || warn "can't create $part: $!";
+ chdir $part or die "couldn't change to partition $part";
+ mkdir "stage.", 0755 || warn "can't create $part/stage.: $!";
+ mkdir "sync.", 0755 || warn "can't create $part/sync.: $!";
++ system "/usr/sbin/chown -R $cyrus_user:$cyrus_group $part";
+ }
+
+ print "done\n";
diff --git a/mail/cyrus-imapd312/files/pkg-deinstall.in b/mail/cyrus-imapd312/files/pkg-deinstall.in
new file mode 100644
index 000000000000..2e933163aba4
--- /dev/null
+++ b/mail/cyrus-imapd312/files/pkg-deinstall.in
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Created by: hetzels@westbend.net
+
+#set -vx
+
+PKG_BATCH=${BATCH:=NO}
+CYRUS_USER=${CYRUS_USER:=%%CYRUS_USER%%}
+
+#
+# Modify the 'cyrus' user created from the cyrus-sasl port
+#
+
+modify_cyrus_user() {
+ USER=${CYRUS_USER}
+ PW=/usr/sbin/pw
+ if [ -x "${PKG_ROOTDIR}/usr/sbin/nologin" ]; then
+ shell=/usr/sbin/nologin
+ elif [ -x "${PKG_ROOTDIR}/sbin/nologin" ]; then
+ shell=/sbin/nologin
+ else
+ shell=/nonexistent
+ fi
+ uhome=/nonexistent
+
+ if ! ${PW} -R "${PKG_ROOTDIR}" mod user ${USER} -d "${uhome}" -s "${shell}"; then
+ echo "*** Failed to update user \`${USER}'."
+ else
+ echo "*** Updated user \`${USER}'."
+ fi
+}
+
+case $2 in
+ DEINSTALL)
+ ;;
+ POST-DEINSTALL)
+ modify_cyrus_user
+ ;;
+
+esac
diff --git a/mail/cyrus-imapd312/files/pkg-install.in b/mail/cyrus-imapd312/files/pkg-install.in
new file mode 100644
index 000000000000..2b7e9053c677
--- /dev/null
+++ b/mail/cyrus-imapd312/files/pkg-install.in
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+#set -vx
+
+PKG_BATCH=${BATCH:=NO}
+PKG_PREFIX=${PKG_PREFIX:=%%PREFIX%%}
+CYRUS_USER=${CYRUS_USER:=%%CYRUS_USER%%}
+
+#
+# Modify the 'cyrus' user created from the cyrus-sasl port
+#
+
+modify_cyrus_user() {
+ USER=${CYRUS_USER}
+ PW=/usr/sbin/pw
+ shell=/bin/csh
+ uhome=${PKG_PREFIX}/cyrus
+
+ if ! ${PW} -R "${PKG_ROOTDIR}" mod user ${USER} -d "${uhome}" -s "${shell}"; then
+ echo "*** Failed to update user \`${USER}'."
+ else
+ echo "*** Updated user \`${USER}'."
+ fi
+}
+
+case $2 in
+ PRE-INSTALL)
+ ;;
+
+ POST-INSTALL)
+ modify_cyrus_user
+ if grep 'sieve' /etc/services; then
+ echo
+ else
+ echo
+ echo "** Please add an entry for the sieve protocol (4190/tcp)"
+ echo " to /etc/services"
+ echo
+ fi
+ ;;
+esac
diff --git a/mail/cyrus-imapd312/files/pkg-message.in b/mail/cyrus-imapd312/files/pkg-message.in
new file mode 100644
index 000000000000..70a4a9f76a97
--- /dev/null
+++ b/mail/cyrus-imapd312/files/pkg-message.in
@@ -0,0 +1,10 @@
+[
+{ type: install
+ message: <<EOM
+To setup mail spool, modify %%PREFIX%%/etc/imapd.conf appropriately,
+then run %%PREFIX%%/cyrus/sbin/mkimap.
+To run Cyrus IMAPd from startup, add cyrus_imapd_enable="YES" in your
+/etc/rc.conf.
+EOM
+}
+]