diff --git a/Makefile.in b/Makefile.in index 956d84b..401f62d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3940,22 +3940,22 @@ lib/libcyrus.la: $(lib_libcyrus_la_OBJECTS) $(lib_libcyrus_la_DEPENDENCIES) $(EXTRA_lib_libcyrus_la_DEPENDENCIES) lib/$(am__dirstamp) $(AM_V_CCLD)$(lib_libcyrus_la_LINK) -rpath $(libdir) $(lib_libcyrus_la_OBJECTS) $(lib_libcyrus_la_LIBADD) $(LIBS) -lib/strerror.$(OBJEXT): lib/$(am__dirstamp) -lib/strerror.lo: lib/$(am__dirstamp) lib/memmove.$(OBJEXT): lib/$(am__dirstamp) lib/memmove.lo: lib/$(am__dirstamp) -lib/posix_fadvise.$(OBJEXT): lib/$(am__dirstamp) -lib/posix_fadvise.lo: lib/$(am__dirstamp) -lib/ftruncate.$(OBJEXT): lib/$(am__dirstamp) -lib/ftruncate.lo: lib/$(am__dirstamp) lib/memmem.$(OBJEXT): lib/$(am__dirstamp) lib/memmem.lo: lib/$(am__dirstamp) lib/strsep.$(OBJEXT): lib/$(am__dirstamp) lib/strsep.lo: lib/$(am__dirstamp) +lib/posix_fadvise.$(OBJEXT): lib/$(am__dirstamp) +lib/posix_fadvise.lo: lib/$(am__dirstamp) +lib/getdtablesize.$(OBJEXT): lib/$(am__dirstamp) +lib/getdtablesize.lo: lib/$(am__dirstamp) lib/memrchr.$(OBJEXT): lib/$(am__dirstamp) lib/memrchr.lo: lib/$(am__dirstamp) -lib/getdtablesize.$(OBJEXT): lib/$(am__dirstamp) -lib/getdtablesize.lo: lib/$(am__dirstamp) +lib/ftruncate.$(OBJEXT): lib/$(am__dirstamp) +lib/ftruncate.lo: lib/$(am__dirstamp) +lib/strerror.$(OBJEXT): lib/$(am__dirstamp) +lib/strerror.lo: lib/$(am__dirstamp) lib/strcasecmp.$(OBJEXT): lib/$(am__dirstamp) lib/strcasecmp.lo: lib/$(am__dirstamp) lib/lib_libcyrus_min_la-arrayu64.lo: lib/$(am__dirstamp) \ diff --git a/VERSION b/VERSION index b41455c..b3972fc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.8.0-beta1 +3.8.0-beta2 diff --git a/cassandane/Cassandane/Cyrus/Caldav.pm b/cassandane/Cassandane/Cyrus/Caldav.pm index 67e947a..6c658ae 100644 --- a/cassandane/Cassandane/Cyrus/Caldav.pm +++ b/cassandane/Cassandane/Cyrus/Caldav.pm @@ -5620,4 +5620,37 @@ '', 'HTTP/1.1 404 Not Found'); } +sub test_conditional_delete_collection + :needs_component_httpd +{ + my ($self) = @_; + + my $caldav = $self->{caldav}; + + my $calid = $caldav->NewCalendar({name => 'foo'}); + $self->assert_not_null($calid); + + my $res = $caldav->GetCalendar($calid); + $self->assert_not_null($res); + my $synctoken = $res->{syncToken}; + + xlog $self, "Try to delete collection with bogus state token"; + $res = $caldav->ua->request('DELETE', $caldav->request_url($calid), { + headers => { + 'Authorization' => $caldav->auth_header(), + 'If' => '()' + } + }); + $self->assert_str_equals('412', $res->{status}); + + xlog $self, "Delete collection with bogus sync token"; + $res = $caldav->ua->request('DELETE', $caldav->request_url($calid), { + headers => { + 'Authorization' => $caldav->auth_header(), + 'If' => "(<$synctoken>)" + } + }); + $self->assert_str_equals('204', $res->{status}); +} + 1; diff --git a/cassandane/Cassandane/Cyrus/Deny.pm b/cassandane/Cassandane/Cyrus/Deny.pm index de88a98..4451deb 100644 --- a/cassandane/Cassandane/Cyrus/Deny.pm +++ b/cassandane/Cassandane/Cyrus/Deny.pm @@ -118,7 +118,7 @@ my $store = $svc->create_store(username => $case->{user}); if ($case->{can_login}) { - xlog $self, "Expecting this to succeeed"; + xlog $self, "Expecting this to succeed"; my $talk = $store->get_client(); my $r = $talk->status('inbox', [ 'messages' ]); $self->assert_deep_equals({ messages => 0 }, $r); diff --git a/cassandane/Cassandane/Cyrus/Idle.pm b/cassandane/Cassandane/Cyrus/Idle.pm index b8f3570..aed64d0 100644 --- a/cassandane/Cassandane/Cyrus/Idle.pm +++ b/cassandane/Cassandane/Cyrus/Idle.pm @@ -322,7 +322,7 @@ $self->assert_null($talk->get_response_code('alert')); xlog $self, "Write some text to the shutdown file"; - my $admin_store = $svc->create_store(folder => 'user.casssandane', + my $admin_store = $svc->create_store(folder => 'user.cassandane', username => 'admin'); my $shut_message = "The Mayans were right"; $admin_store->get_client()->setmetadata("", diff --git a/cassandane/Cassandane/Cyrus/MurderDAV.pm b/cassandane/Cassandane/Cyrus/MurderDAV.pm new file mode 100644 index 0000000..eede5ee --- /dev/null +++ b/cassandane/Cassandane/Cyrus/MurderDAV.pm @@ -0,0 +1,238 @@ +#!/usr/bin/perl +# +# Copyright (c) 2011-2013 FastMail Pty Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The name "Fastmail Pty Ltd" must not be used to +# endorse or promote products derived from this software without +# prior written permission. For permission or any legal +# details, please contact +# FastMail Pty Ltd +# PO Box 234 +# Collins St West 8007 +# Victoria +# Australia +# +# 4. Redistributions of any form whatsoever must retain the following +# acknowledgment: +# "This product includes software developed by Fastmail Pty. Ltd." +# +# FASTMAIL PTY LTD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL OPERA SOFTWARE AUSTRALIA BE LIABLE FOR ANY SPECIAL, INDIRECT +# OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF +# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. +# + +package Cassandane::Cyrus::MurderDAV; +use strict; +use warnings; +use URI; +use Data::Dumper; + +use lib '.'; +use base qw(Cassandane::Cyrus::TestCase); +use Cassandane::Util::Log; +use Cassandane::Instance; + +$Data::Dumper::Sortkeys = 1; + +sub new +{ + my ($class, @args) = @_; + + my $config = Cassandane::Config->default()->clone(); + $config->set('conversations' => 'yes'); + $config->set_bits('httpmodules', 'caldav', 'carddav'); + + return $class->SUPER::new({ + config => $config, + httpmurder => 1, + jmap => 1, + adminstore => 1 + }, @args); +} + +sub set_up +{ + my ($self) = @_; + $self->SUPER::set_up(); +} + +sub tear_down +{ + my ($self) = @_; + $self->SUPER::tear_down(); +} + +sub test_aaa_setup + :needs_component_murder +{ + my ($self) = @_; + + # does everything set up and tear down cleanly? + $self->assert(1); +} + +# XXX This can't pass because we don't support multiple murder services +# XXX at once, but renaming out the "bogus" and running it, and it failing, +# XXX proves the infrastructure to prevent requesting both works. +sub bogustest_aaa_imapdav_setup + :needs_component_murder + :IMAPMurder +{ + my ($self) = @_; + + # does everything set up and tear down cleanly? + $self->assert(1); +} + +sub test_frontend_commands + :needs_component_murder :needs_component_httpd :min_version_3_5 +{ + my ($self) = @_; + my $result; + + my $frontend_svc = $self->{frontend}->get_service("http"); + my $frontend_host = $frontend_svc->host(); + my $frontend_port = $frontend_svc->port(); + my $proxy_re = qr{ + \b + ( localhost | $frontend_host ) + : $frontend_port + \b + }x; + + my $frontend_caldav = Net::CalDAVTalk->new( + user => 'cassandane', + password => 'pass', + host => $frontend_host, + port => $frontend_port, + scheme => 'http', + url => "http://$frontend_host:$frontend_port" + ); + + my $CALDAV = "urn:ietf:params:xml:ns:caldav"; + my $CARDDAV = "urn:ietf:params:xml:ns:carddav"; + my $xml = < + + + + + + +EOF + + xlog $self, "Get current-user-principal"; + my $url = $frontend_caldav->GetCurrentUserPrincipal(); + $self->assert_not_null($url); + + # Copied from Net::DAVTalk::SetURL + my (undef, undef, undef, $cur_princ) = + $url =~ m{^http(s)?://([^/:]+)(?::(\d+))?(.*)?}; + + xlog $self, "PROPFIND for home-sets"; + my $res = $frontend_caldav->Request('PROPFIND', $cur_princ, + $xml, 'Content-Type' => 'text/xml'); + + my $propstat = $res->{'{DAV:}response'}[0]{'{DAV:}propstat'}[0]; + my $props = $propstat->{'{DAV:}prop'}; + $self->assert_str_equals('HTTP/1.1 200 OK', + $propstat->{'{DAV:}status'}{content}); + my $cal_home = $props->{"{$CALDAV}calendar-home-set"}{'{DAV:}href'}{content}; + my $card_home = + $props->{"{$CARDDAV}addressbook-home-set"}{'{DAV:}href'}{content}; + $self->assert_not_null($cal_home); + $self->assert_not_null($card_home); + + xlog $self, "Create new calendar"; + $frontend_caldav->SetURL($cal_home); + my $calid1 = $frontend_caldav->NewCalendar({name => 'foo'}); + $self->assert_not_null($calid1); + + xlog $self, "Change calendar name"; + my $newid = $frontend_caldav->UpdateCalendar({ id => $calid1, + name => 'bar'}); + $self->assert_str_equals($calid1, $newid); + + xlog $self, "Create new event"; + my $eventid1 = $frontend_caldav->NewEvent($calid1, { + timeZone => 'Etc/UTC', + start => '2015-01-01T12:00:00', + duration => 'PT1H', + title => 'waterfall', + }); + $self->assert_not_null($eventid1); + + xlog $self, "GET event"; + $res = $frontend_caldav->Request('GET', $cal_home . $eventid1); + $self->assert_matches(qr/SUMMARY:waterfall/, $res->{content}); + + xlog $self, "Get calendars"; + $res = $frontend_caldav->GetCalendars(); + $self->assert_num_equals(2, scalar @{$res}); + + my $sync1; + my $sync2;; + my $calid2; + if ($res->[0]{id} eq $calid1) { + $sync1 = $res->[0]{syncToken}; + $sync2 = $res->[1]{syncToken}; + $calid2 = $res->[1]{id}; + } + else { + $sync1 = $res->[1]{syncToken}; + $sync2 = $res->[0]{syncToken}; + $calid2 = $res->[0]{id}; + } + $self->assert_not_null($calid1); + $self->assert_not_null($sync1); + $self->assert_not_null($sync2); + + xlog $self, "Move event"; + my $eventid2 = $frontend_caldav->MoveEvent($eventid1, $calid2); + $self->assert_not_null($eventid2); + + xlog $self, "Sync Calendars"; + my ($adds, $removes, $errors) = + $frontend_caldav->SyncEvents($calid1, syncToken => $sync1); + $self->assert_num_equals(0, scalar @{$adds}); + $self->assert_num_equals(1, scalar @{$removes}); + $self->assert_str_equals($removes->[0], + $frontend_caldav->fullpath($eventid1)); + + ($adds, $removes, $errors) = + $frontend_caldav->SyncEvents($calid2, syncToken => $sync2); + $self->assert_num_equals(1, scalar @{$adds}); + $self->assert_str_equals($adds->[0]{href}, + $frontend_caldav->fullpath($eventid2)); + $self->assert_str_equals('waterfall', $adds->[0]{title}); + $self->assert_num_equals(0, scalar @{$removes}); + + xlog $self, "Delete event"; + $res = $frontend_caldav->DeleteEvent($eventid2); + $self->assert_num_equals(1, $res); + + xlog $self, "Delete calendar"; + $frontend_caldav->DeleteCalendar($calid1); + $res = $frontend_caldav->GetCalendar($calid1); + $self->assert_null($res); + + # XXX test other commands +} + +1; diff --git a/cassandane/Cassandane/Cyrus/MurderIMAP.pm b/cassandane/Cassandane/Cyrus/MurderIMAP.pm index 371a074..bbb147a 100644 --- a/cassandane/Cassandane/Cyrus/MurderIMAP.pm +++ b/cassandane/Cassandane/Cyrus/MurderIMAP.pm @@ -111,10 +111,13 @@ $result = $frontend->getmetadata('INBOX', '/shared/vendor/cmu/cyrus-imapd/size'); $self->assert_not_null($result); + $self->assert(exists $result->{'INBOX'}{'/shared/vendor/cmu/cyrus-imapd/size'}); $self->assert_str_equals('ok', $frontend->get_last_completion_response()); $result = $frontend->getmetadata('(INBOX INBOX.newfolder)', '/shared/vendor/cmu/cyrus-imapd/size'); $self->assert_not_null($result); + $self->assert(exists $result->{'INBOX'}{'/shared/vendor/cmu/cyrus-imapd/size'}); + $self->assert(exists $result->{'INBOX.newfolder'}{'/shared/vendor/cmu/cyrus-imapd/size'}); $self->assert_str_equals('ok', $frontend->get_last_completion_response()); # XXX test other commands diff --git a/cassandane/Cassandane/Cyrus/Sieve.pm b/cassandane/Cassandane/Cyrus/Sieve.pm index 3c61ea1..e7d3d7a 100644 --- a/cassandane/Cassandane/Cyrus/Sieve.pm +++ b/cassandane/Cassandane/Cyrus/Sieve.pm @@ -6895,4 +6895,31 @@ $self->check_messages({ 1 => $msg }, check_guid => 0); } +sub test_redirect_address_with_phrase + :needs_component_sieve +{ + my ($self) = @_; + + xlog $self, "Install a script"; + $self->{instance}->install_sieve_script(<"; +EOF + ); + + xlog $self, "Deliver a message"; + my $msg = $self->{gen}->generate(subject => "Message 1"); + $self->{instance}->deliver($msg); + + # Verify that message was redirected (no RCPT TO error) + if ($self->{instance}->{have_syslog_replacement}) { + my @lines = $self->{instance}->getsyslog(); + $self->assert_does_not_match(qr/RCPT TO: code=553 text=5.1.1/, "@lines"); + } + + xlog $self, "Make sure that message is NOT in INBOX (due to runtime error)"; + my $talk = $self->{store}->get_client(); + $talk->select("INBOX"); + $self->assert_num_equals(0, $talk->get_response_code('exists')); +} + 1; diff --git a/cassandane/Cassandane/Net/SMTPServer.pm b/cassandane/Cassandane/Net/SMTPServer.pm index 6be5bb9..0bb3d41 100644 --- a/cassandane/Cassandane/Net/SMTPServer.pm +++ b/cassandane/Cassandane/Net/SMTPServer.pm @@ -74,7 +74,7 @@ $Self->{_rcpt_to_count}++; if ($Self->{_rcpt_to_count} > 10) { $Self->send_client_resp(550, "5.5.3 Too many recipients"); - } elsif ($To =~ /\@fail\.to\.deliver$/i) { + } elsif ($To =~ /[<>]/ || $To =~ /\@fail\.to\.deliver$/i) { $Self->send_client_resp(553, "5.1.1 Bad destination mailbox address"); $Self->mylog("SMTP: 553 5.1.1"); } else { diff --git a/configure b/configure index dc3de4d..5a5c24e 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for cyrus-imapd 3.8.0-beta1. +# Generated by GNU Autoconf 2.69 for cyrus-imapd 3.8.0-beta2. # # Report bugs to . # @@ -650,8 +650,8 @@ # Identity of this package. PACKAGE_NAME='cyrus-imapd' PACKAGE_TARNAME='cyrus-imapd' -PACKAGE_VERSION='3.8.0-beta1' -PACKAGE_STRING='cyrus-imapd 3.8.0-beta1' +PACKAGE_VERSION='3.8.0-beta2' +PACKAGE_STRING='cyrus-imapd 3.8.0-beta2' PACKAGE_BUGREPORT='https://github.com/cyrusimap/cyrus-imapd/issues' PACKAGE_URL='https://www.cyrusimap.org' @@ -1701,7 +1701,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures cyrus-imapd 3.8.0-beta1 to adapt to many kinds of systems. +\`configure' configures cyrus-imapd 3.8.0-beta2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1773,7 +1773,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of cyrus-imapd 3.8.0-beta1:";; + short | recursive ) echo "Configuration of cyrus-imapd 3.8.0-beta2:";; esac cat <<\_ACEOF @@ -2042,7 +2042,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -cyrus-imapd configure 3.8.0-beta1 +cyrus-imapd configure 3.8.0-beta2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2818,7 +2818,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by cyrus-imapd $as_me 3.8.0-beta1, which was +It was created by cyrus-imapd $as_me 3.8.0-beta2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3318,9 +3318,9 @@ ENABLE_STATIC="$enable_static" -CYRUS_IMAPD_SERIES=`echo 3.8.0-beta1 | cut -d- -f1 | cut -d. -f1-2` -CYRUS_IMAPD_REVISION=`echo 3.8.0-beta1 | cut -d- -f1 | cut -d. -f3` -CYRUS_IMAPD_PATCH=`echo 3.8.0-beta1 | cut -d- -f2-` +CYRUS_IMAPD_SERIES=`echo 3.8.0-beta2 | cut -d- -f1 | cut -d. -f1-2` +CYRUS_IMAPD_REVISION=`echo 3.8.0-beta2 | cut -d- -f1 | cut -d. -f3` +CYRUS_IMAPD_PATCH=`echo 3.8.0-beta2 | cut -d- -f2-` @@ -3927,7 +3927,7 @@ # Define the identity of the package. PACKAGE='cyrus-imapd' - VERSION='3.8.0-beta1' + VERSION='3.8.0-beta2' cat >>confdefs.h <<_ACEOF @@ -28780,7 +28780,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by cyrus-imapd $as_me 3.8.0-beta1, which was +This file was extended by cyrus-imapd $as_me 3.8.0-beta2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -28851,7 +28851,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -cyrus-imapd config.status 3.8.0-beta1 +cyrus-imapd config.status 3.8.0-beta2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/doc/html/.buildinfo b/doc/html/.buildinfo index af3828f..199ba44 100644 --- a/doc/html/.buildinfo +++ b/doc/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 651f05555fd14765b9e311ebdb8c9e90 +config: 20ee97462595bcc1ef447be5ca4b64c6 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/html/_sources/imap/download/release-notes/3.8/x/3.8.0-beta1.rst.txt b/doc/html/_sources/imap/download/release-notes/3.8/x/3.8.0-beta1.rst.txt index 9596c05..57235f4 100644 --- a/doc/html/_sources/imap/download/release-notes/3.8/x/3.8.0-beta1.rst.txt +++ b/doc/html/_sources/imap/download/release-notes/3.8/x/3.8.0-beta1.rst.txt @@ -35,12 +35,12 @@ after it has been sent. * Maps JMAP CalendarEvent privacy to the newly introduced iCalendar X-JMAP-PRIVACY property rather than CLASS. See - :ref:`upgrade_3.8.0-beta1_jmap_caldav_changes` in the upgrade instructions. + :ref:`upgrade_3.8.0_jmap_caldav_changes` in the upgrade instructions. * Improves error handling and reporting from :cyrusman:`mbexamine(8)`. If you have custom tooling that calls mbexamine, it may need updating. * Sieve: Remove support for creating scripts with the deprecated ``imapflags`` capability and ``mark`` / ``unmark`` actions. See - :ref:`upgrade_3.8.0-beta1_sieve_changes` in the upgrade instructions. + :ref:`upgrade_3.8.0_sieve_changes` in the upgrade instructions. * Lock ordering fixes should result in fewer "resource deadlock avoided" errors diff --git a/doc/html/_sources/imap/download/release-notes/3.8/x/3.8.0-beta2.rst.txt b/doc/html/_sources/imap/download/release-notes/3.8/x/3.8.0-beta2.rst.txt new file mode 100644 index 0000000..5ed34eb --- /dev/null +++ b/doc/html/_sources/imap/download/release-notes/3.8/x/3.8.0-beta2.rst.txt @@ -0,0 +1,115 @@ +:tocdepth: 3 + +==================================== +Cyrus IMAP 3.8.0-beta2 Release Notes +==================================== + +Download from GitHub: + + * https://github.com/cyrusimap/cyrus-imapd/releases/download/cyrus-imapd-3.8.0-beta2/cyrus-imapd-3.8.0-beta2.tar.gz + * https://github.com/cyrusimap/cyrus-imapd/releases/download/cyrus-imapd-3.8.0-beta2/cyrus-imapd-3.8.0-beta2.tar.gz.sig + +.. _relnotes-3.8.0-beta2_changes: + +Major changes since the 3.6 series +================================== + +* Adds the ability for replication to stage message uploads to the + archive partition rather than the spool partition. +* Adds long-options support to various command line tools +* Adds a new BYTESIZE smart type for imapoptions that set sizes +* Removes empty lines from :cyrusman:`cyr_expire(8)` verbose output. If you + parse this output with external tools, those may need updating to match. +* Adds a module to ptloader which speaks HTTP. See the "pts_module" and + "httppts_uri" options in :cyrusman:`imapd.conf(5)`. +* Adds support for IMAP Multimailbox Search (:rfc:`7377`). +* Adds support for IMAP Saved Search Results (:rfc:`5182`). +* Advertise support for IMAP URL-PARTIAL (:rfc:`5550`). +* Implements the JMAP calendars specification + (:draft:`draft-ietf-jmap-calendars`). See the "jmap_guesstz_fname" option + in :cyrusman:`imapd.conf(5)`. +* Adds support for a new read-only ``\Scheduled`` mailbox that contains + emails created via JMAP EmailSubmission/set that are to be sent + at a later date/time. Also extends the JMAP EmailSubmission object + with optional instructions for moving the message into another mailbox + after it has been sent. +* Maps JMAP CalendarEvent privacy to the newly introduced iCalendar + X-JMAP-PRIVACY property rather than CLASS. See + :ref:`upgrade_3.8.0_jmap_caldav_changes` in the upgrade instructions. +* Improves error handling and reporting from :cyrusman:`mbexamine(8)`. If you + have custom tooling that calls mbexamine, it may need updating. +* Sieve: Remove support for creating scripts with the deprecated + ``imapflags`` capability and ``mark`` / ``unmark`` actions. See + :ref:`upgrade_3.8.0_sieve_changes` in the upgrade instructions. +* Lock ordering fixes should result in fewer "resource deadlock avoided" + errors + +.. _relnotes_3.8.0-beta2_storage_changes: + +Storage changes +=============== + +* None so far + +Updates to default configuration +================================ + +The :cyrusman:`cyr_info(8)` `conf`, `conf-all` and `conf-default` subcommands +accept an `-s ` argument to highlight :cyrusman:`imapd.conf(5)` +options that are new or whose behaviour has changed since the specified +version. We recommend using this when evaluating a new Cyrus version to +check which configuration options you will need to examine and maybe set or +change during the process. + +* Adds a new BYTESIZE smart type for imapoptions that set sizes. This allows + sizes to be specified in "B", "KB", "MB", "GB" for better readability. + + These :cyrusman:`imapd.conf(5)` options are changed in some way: + + * archive_maxsize + * autocreate_quota + * autocreatequota + * backup_compact_minsize + * backup_compact_maxsize + * event_content_size + * icalendar_max_size + * jmap_preview_length + * jmap_max_size_upload + * jmap_max_size_blob_set + * jmap_max_size_request + * jmap_mail_max_size_attachments_per_email + * maxmessagesize + * maxquoted + * maxword + * quotawarn -> quotawarnpercent + * quotawarnkb -> quotawarnsize + * search_maxsize + * sieve_maxscriptsize + * vcard_max_size + * webdav_attachments_max_binary_attach_size + + This feature is transparent over upgrade and downgrade, provided the + imapd.conf remains unchanged. + + Admins may update their imapd.conf to take advantage of the readability of + the new smart type, but after doing so will no longer be able to downgrade + to a version without this feature (unless they also revert their + imapd.conf). + +Security fixes +============== + +* None so far + +Significant bugfixes +==================== + +* Fixed :issue:`4380`: XFER to newer backends now assumes at least the current + mailbox version, rather than the oldest supported mailbox version. +* Fixed :issue:`3771`: Special-Use annotations lost on XFER +* Fixed :issue:`4187`: :cyrusman:`ctl_mboxlist(8)` can now detect and report + broken UUID mailboxes. Thanks Matthias Hunstock. +* Fixed :issue:`4383`: rolling :cyrusman:`squatter(8)` only compacted its index + databases at shutdown +* Fixed :issue:`4439`: GETMETADATA wasn't proxied correctly to murder backends. + Thanks Stéphane GAUBERT. diff --git a/doc/html/_sources/imap/download/upgrade.rst.txt b/doc/html/_sources/imap/download/upgrade.rst.txt index cb07e5f..8153623 100644 --- a/doc/html/_sources/imap/download/upgrade.rst.txt +++ b/doc/html/_sources/imap/download/upgrade.rst.txt @@ -82,7 +82,7 @@ necessary for upgrade: Cyrus recognises the old style storage and will convert to the new style automatically as necessary. -.. _upgrade_3.8.0-beta1_jmap_caldav_changes: +.. _upgrade_3.8.0_jmap_caldav_changes: JMAP/CalDAV changes ################### @@ -107,7 +107,7 @@ dav.db - followed by calling `dav_reconstruct` for that user -.. _upgrade_3.8.0-beta1_sieve_changes: +.. _upgrade_3.8.0_sieve_changes: Sieve changes ############# diff --git a/doc/html/_sources/imap/reference/manpages/systemcommands/masssievec.rst.txt b/doc/html/_sources/imap/reference/manpages/systemcommands/masssievec.rst.txt index e4f6de0..968484f 100644 --- a/doc/html/_sources/imap/reference/manpages/systemcommands/masssievec.rst.txt +++ b/doc/html/_sources/imap/reference/manpages/systemcommands/masssievec.rst.txt @@ -30,7 +30,7 @@ .. option:: imapd.conf - Provide an alternate impad.conf. If not specified, uses ``/etc/imapd.conf``. + Provide an alternate imapd.conf. If not specified, uses ``/etc/imapd.conf``. See Also ======== diff --git a/doc/html/_static/documentation_options.js b/doc/html/_static/documentation_options.js index 941b145..0897490 100644 --- a/doc/html/_static/documentation_options.js +++ b/doc/html/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '3.8.0-beta1', + VERSION: '3.8.0-beta2', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/doc/html/contribute.html b/doc/html/contribute.html index 5e228ce..7cdeb73 100644 --- a/doc/html/contribute.html +++ b/doc/html/contribute.html @@ -8,7 +8,7 @@ - We need your help — Cyrus IMAP 3.8.0-beta1 documentation + We need your help — Cyrus IMAP 3.8.0-beta2 documentation @@ -37,7 +37,7 @@ - + @@ -767,7 +767,7 @@
    -
  • Docs v3.8.0-beta1 »
  • +
  • Docs v3.8.0-beta2 »
  • Developers »
  • @@ -832,7 +832,7 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/html/imap/download/release-notes/3.9/index.html b/doc/html/imap/download/release-notes/3.9/index.html index bd172d5..f4f8480 100644 --- a/doc/html/imap/download/release-notes/3.9/index.html +++ b/doc/html/imap/download/release-notes/3.9/index.html @@ -8,7 +8,7 @@ - Cyrus IMAP 3.9 Tags — Cyrus IMAP 3.8.0-beta1 documentation + Cyrus IMAP 3.9 Tags — Cyrus IMAP 3.8.0-beta2 documentation @@ -37,7 +37,7 @@ - + @@ -764,7 +764,7 @@
      -
    • Docs v3.8.0-beta1 »
    • +
    • Docs v3.8.0-beta2 »
    • Cyrus IMAP 3.9 Tags
    • @@ -825,7 +825,7 @@