Blog

sabre/dav 3.2.2 released

We just released sabre/dav 3.2.2. This release fixes a regression introduced with sabre/dav 3.2.1 related to CardDAV synchronization.

At the very least Em Client was affected by this.

To upgrade sabre/http, make sure your composer.json requires "^3.2" for sabre/dav and run composer update.

Full changelog can be found on Github


sabre/dav 3.2.1 released

We just released sabre/dav 3.2.1. This release improves syncing large calendars when using SQLite and adds a new feature that allows CardDAV clients to use property-filters when requesting addressbooks (thanks @DeepDiver1975).

If you're a user of the zip distribution, this release also updates all the dependencies so you get a number of bug fixes and performance improvements from those too.

To upgrade sabre/http, make sure your composer.json requires "^3.2" for sabre/dav and run composer update.

Full changelog can be found on Github


sabre/http 4.2.2 released

Happy 2017!

We just released sabre/http 4.2.2. This release adds a workaround for several broken HTTP client implementations, that send invalid Content-Length headers.

This should improve general compatibility with no further side-effects.

To upgrade sabre/http, make sure your composer.json requires "^4.2" for sabre/http and run composer update.

Full changelog can be found on Github


sabre/uri 2.1.0 and 1.2.0 released

We just released sabre/uri 2.1.0 and 1.2.0. This release adds a new pure-php fallback parser for uris to work around two problems with PHP's parse_url(), which had trouble with uris that start with a scheme:/// (triple-slash) and relative uri containing an unencoded colon.

2.1.0 and 1.2.0 have an identical API, the only difference is that 2.1.0 uses strict PHP 7 typehints and 1.2.0 supports older PHP versions.

To upgrade sabre/uri, make sure your composer.json requires "^2.1" for sabre/uri and run composer update.

Full changelog can be found on Github


sabre/vobject 4.1.2 released

We just released sabre/vobject 4.1.2.

This release adds a few new features, and fixes several issues:

  1. Support for BYWEEKDAY and BYWEEKNO recurrences when FREQ=YEARLY.
  2. Support for more Windows and Outlook 365 timezone ID's.
  3. Fixing a problem with all-day events in the recurrence iterator.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


sabre/xml 2 released

We just released sabre/xml 2.0.0. Just like the major sabre/uri and sabre/event releases earlier, the main change is that we now require PHP 7 and use strict typing across the board.

For most people this upgrade should be seamless. The exception is if your own code already opted-in to strict typing and you were sending incorrect types to sabre/xml.


sabre/event 5 released

We just released sabre/event 5.0.0. This is only a month after the last major release, but it's for a good reason.

We've made a change in how coroutines work. Co-routines, which are based on generators were originally introduced in sabre/event for PHP 5.5.

At the time it was not possible for a PHP generator function to return anything like this:

function foo() {
    yield 1;
    return 2;
}

To work with this limitation in coroutines, we treated the last value that was passed with yield as the "returned value".

Since PHP 7 it is possible to use return and the PHP Generator object has a getReturn() method to access it.

We missed this in sabre/event 4, but it was quickly pointed out by Felix Becker.

Using return makes so much sense now we can, it was worth making a BC break for and releasing sabre/event 5 with the more sane behavior for PHP 7.

So today there's a sabre/event 5, and the only change is that if the previous example of the generator function is used in the coroutine system, it will now have 2 as its result instead of 1.


sabre/xml 1.5.0 released

We just released sabre/xml 1.5.0. This release puts the minimim PHP version at PHP 5.5.

This release fixes an infinite loop bug during parsing of some invalid XML documents, and contains an improvement in how we're dealing with the "context stack", thanks to the PHP 5.5 finally keyword. Upgrading is recommended.

Upgrade sabre/xml by running:

composer update sabre/xml

Full changelog can be found on Github


sabre/dav 2.1 End of life

sabre/dav 2.1 is now "end of life". This means that no more bugs will be fixed, including security bugs.

We've released one final release (2.1.11) with some last final tweaks, but you're strongly urged to upgrade to at least 3.0, and preferably 3.2.

For more information about the support schedule, and for upgrade instructions, check out the upgrading page.

Because this is the last release to use the (relatively unpopular) sabre/http 3.x package, this also marks sabre/http 3.x as EOL.


sabre/uri 2 released

We just released sabre/uri 2.0. The sole change in this package is that it now requires PHP 7 and has typehints where appropriate. Upgrading should be seamless.

Both 1.x and 2.x will be maintained and receive bugfixes.

To upgrade sabre/uri, make sure your composer.json requires "^2.0" for sabre/uri and run composer update.


sabre/event 4 released

We just released sabre/event 4.0.0.

This release requires PHP 7, and has the following new features:

  • PHP 7 typehints where they make sense, strict_types used everywhere.
  • Support for a new WildcardEmitter this Emitter has the same interface as the regular Emitter, but it allows you to listen for events such as updated:*, which would get triggered for any event that starts with updated:.
  • EventEmitter, EventEmitterTrait and EventEmitterInterface are renamed to Emitter, EmitterTrait and EmitterInterface.
  • Promises now correctly handle PHP 7 Trowable.
  • Promises must now be rejected by an object implementing Trowable. In the past it was possible to reject a Promise with any value (like Javascript), but unlike Javascript, you can't throw a string in PHP. I felt that this made the Promise a bit more predictable.

PHP 5.5

sabre/event 3 will continue to be supported. I don't suspect new bugs will appear there though, as it's a fairly simple package.

To upgrade sabre/event, make sure your composer.json requires "^4.0" for sabre/event.


Baïkal 0.4.6 released

We just released Baïkal 0.4.6. This release contains a fix that prevented some users froms syncing contacts, if they were using the SQLite backend.

Upgrading is recommended.

Read the upgrade instructions here. Full changelog can be found on Github


sabre/dav 3.2.0 released

We just released sabre/dav 3.2.0. This is a major new version, and we're very excited to bring you features we've been working on since last winter.

Highlights from this release:

  • Support for PSR-3 for logging.
  • Full support for PostgreSQL. We require version 9.5.
  • We're now supporting WebDAV resource sharing.
  • Calendar sharing now works out of the box!

If you're curious, there's a much larger list of features on the ChangeLog. If you are upgrading from an older version, be sure to take a look at the upgrade instructions, as we've made a few backwards compatibility breaks in order to support the new features.

To get started right away, you can find a zip on the releases page.


Changes to sharing in sabre/dav 3.2

We are currently working on sabre/dav 3.2. A first beta has been released. This release includes major changes to the sharing system.

If you are a user of sabre/dav and have never done any deep modifications to the sharing system, this simply means that from that version onward, there's a new calendar sharing feature.

To take advantage of that feature, you can just upgrade and then turn on the sharing plugin:

$server->addPlugin(new Sabre\DAV\Sharing\Plugin());

And to allow Apple clients and BusyCal to modify the list of who can access your calendar, add the following second plugin:

$server->addPlugin(new Sabre\CalDAV\SharingPlugin());

Now if you're completely new to this, you can stop reading this article right here. However, if you did stuff with sharing before, read on.

The old situation

Preliminary support for sharing was added to sabre/dav in version 1.7, which was released back in 2012. However, this release only ever shipped with the interfaces to allow an implementor to write a custom backend for this.

There were only a few people that have actually done that. This guide is for those people.

The specification we used back then were 2 apple proprietary specifications:

  1. caldav-sharing.
  2. caldav-notifications.

The internal sabre/dav API's match the terminology from those specifications. The API's allowed someone to write an implementation that allows a user to invite another user to their calendar. The others get the invitation and can accept or decline the invite.

New standardization effort

In 2014 the sabre/dav project and a couple of other vendors started on a new effort, with the following primary goals:

  1. Standardize the proprietary spec.
  2. Extend the specification to also allow CardDAV (addressbook) sharing to be implemented.

To do this, we've split the standard into 4 separate specifications:

  1. draft-pot-webdav-notifications.
  2. draft-pot-webdav-resource-sharing.
  3. draft-pot-caldav-sharing.
  4. And a future carddav sharing spec.

So in this process we're not only creating a separate CardDAV and CalDAV spec, but also adding a generic 'WebDAV sharing' spec that can be used by WebDAV file sharing systems, such as ownCloud.

On a high level the data-model is similar, but almost everywhere new XML documents have been defined that are more descriptive, more generic or just better for aesthetic reasons.

The state of sharing in sabre/dav 3.2

The first place where the new specifications will be integrated, is CalDAV. So 3.2 is also the first place where we actually ship a working implementation.

However, to do this properly, some big changes were made:

  1. The internal API is 100% rewritten. All the properties and classes use terminology matching the new specs and not the old specs.
  2. A lot of the code has been moved from the Sabre\CalDAV to the Sabre\DAV\Sharing namespace.

But, another thing is really important. The new sharing specification allows two workflows for sharing:

  1. Sharing with a notification system. In this approach you can invite someone to a share, and that person then gets an opportunity to accept, decline or ignore the invite.
  2. Instant sharing. In this workflow you invite someone, and then that person immediately has access to the share.

The old spec only has support for the first model, and this is true as well for the sabre/dav implementation.

However, in sabre/dav 3.2 we initially only support model #2. So if you require the notification system, you can't yet do an upgrade.

We think model #1 is probably more appropriate for public consumer systems, and #2 works better for systems supporting small teams.

Getting support for the old specifications

One drawback of using the new specs, is that old clients don't yet understand them. So we've added a plugin to handle this.

If you add the Sabre\CalDAV\SharingPlugin plugin, this plugin supports the old apple spec and automatically maps all incoming request to the new model.

This plugin can therefore only work if Sabre\DAV\Sharing\Plugin is also up and running.

The old and the new classes

This table gives you an idea of the old classes and interfaces, and which classes and interfaces you now need to look at for similar functionality.

Sabre\CalDAV\SharingPlugin

This class split in two:

  • Sabre\DAV\Sharing\Plugin
  • Sabre\CalDAV\SharingPlugin

Sabre\CalDAV\ISharableCalendar and `Sabre\CalDAV\ISharedCalendar

The old sabre/dav had two node types for shared calendars, one for the original and one for the shared instances.

The new sabre/dav combines this into a single Sabre\DAV\Sharing\ISharedNode. Which is used for 'all instances'.

However, there is still Sabre\CalDAV\ISharedCalendar which extends both Sabre\DAV\Sharing\ISharedNode and Sabre\CalDAV\ICalendar.

Sabre\CalDAV\SharedCalendar and Sabre\CalDAV\ShareableCalendar

Like the interfaces, the concrete classes also had two distinct nodes. In the new system, there is just Sabre\CalDAV\SharedCalendar.

Sabre\CalDAV\Notifications

This entire namespace must not be used in sabre/dav 3.2. It doesn't work and it will go away.

Sabre\CalDAV\Backend\SharingSupport

This interface still exists and still has the same goal, but it went through a number of structual changes. It also no longer requires Sabre\CalDAV\Backend\NotificationSupport as well.

The future

The plan is to implement the notifications engine again, but take a different approach than we originally did in old sabre/dav versions. The new system should be better separated from CalDAV and support notifications for different subsystems (CardDAV, CalDAV, etc).

We will also add support for CardDAV (addressbook) sharing soon.

Hopefully these releases will all be rolled out in 3.3 and 3.4 releases.

My advice for people that require the notification subsystem for now is to stick to 3.1 until we have a complete replacement. Some shifts will likely happen until we land on a design we're actually happy with.


sabre/dav 3.1.4 released

We just released sabre/dav 3.1.4.

This release improves CardDAV sync performance. For large addressbooks, the initial sync can be up to 50% faster.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


Upcoming changes to iCalendar and vCard validation in sabre/dav 3.2.

We are currently working on sabre/dav 3.2. A first beta has been released. This release will include some changes to validating iCalendar and vCard. These changes might impact you if you use the Card- and CalDAV systems, or if you are a developer for a Cal/CardDAV client.

In the past we've been pretty lenient in terms of what kind of data you can send the server. Originally the idea for this was to follow Postel's law, e.g.:

Be conservative in what you send, be liberal in what you accept

I actually believe that Postel's law and following it is not a good idea and will actually over time cause networks to become less and less compliant.

So starting 3.2 we are dialing up the strictness of the server. The component inside of sabre/dav responsible for parsing iCalendar and vCard has had a validation system for a while. sabre/dav now uses that system when you PUT a new iCalendar object or vCard.

The system is not yet 100% complete, so it will not yet throw errors on every invalid object, but over time we will make this more strict by adding new validation rules.

How it works

One of the biggest areas in validation is that we're now checking for properties that are required, and how many instances of properties may appear.

For example, in iCalendar the PRODID is required to appear in the top-level iCalendar object.

In that particular case, the system is actually able to repair the incoming object. It will simply add a default PRODID.

A request for this might look as follows:

PUT /calendars/user/calendar/new-object.ics
Content-Type: text/calendar

BEGIN:VCALENDAR
BEGIN:VEVENT
UID:foo-bar
DTSTAMP:20160523T181200Z
DTSTART:20160524T090000Z
SUMMARY:Meeting
END:VEVENT
END:VCALENDAR

Since PRODID is missing, sabre/dav will do the folowing:

  1. It will automatically add a PRODID
  2. It will no longer send back an ETag header after the request.
  3. It adds an X-Sabre-Ew-Gross header. This header is an indicator something was not right in the request, along with a description for a developer what was wrong with it.

The reason we're not returning an ETag is because we have to make modifications to the object. Not returning an ETag pretty much tells the client: you must do a GET request after your PUT to find out the current state of the object and the correct ETag. Fortunately, most clients do this correctly.

It also works well as a small punishment to a client. They are forced to do an extra HTTP request, so there is an incentive to fix the bug.

When we can't do a repair

There are many cases where we can't guess what the developer's intent was. For example: every VEVENT must have a DTSTART. If it didn't appear, we can't really just make one up.

For situations like that, we now always emit HTTP error 415 Unsupported Media Type, along with our X-Sabre-Ew-Gross header.

Requesting strict handling

There are also cases where a client developer does not want the server to automatically repair the object, and instead always do a hard failure when the server deems an object invalid. This might be especially handy during development.

To tell the server to always do hard failures, you can simply include the standard Prefer: handling=strict HTTP header in your PUT requests.

There are likely going to be compatibility problems

Because we are becoming more strict, it is likely that there are CalDAV and CardDAV clients that stop working, because they were sending us invalid data.

To deal with this, we are doing the following:

  1. We're testing popular clients to see if they have problems.
  2. If we run into those problems, we try to contact the developer of the client to see if they are able to fix it.
  3. If they are not fixing the problem, or if we determine that there will be many users stuck on an old version of their client, we will try to see if we can add an 'automatic repair' rule to the validation system.

The automatic repair will account for most, if not all client bugs, but if we do run into an issue with a client that will not behave correctly if we don't return an ETag, and the developer is unwilling to fix the problem (or enough users can't upgrade) we will consider a client-specific workaround, preferably based on the User-Agent.

However, we can't test every client on the face of the planet. So we're hoping developers and users of clients will test sabre/dav 3.2 with their software and report issues they run into.

Because we completely assume that we will run into new compatibility issues, and we also completely assume that not every client will be tested when the 3.2 release hits the floor, we recommend users of sabre/dav to test CalDAV/CardDAV clients they support before upgrading, or waiting a few point releases so the dust can settle.

Contact us

Are you running into a compatibility issue? Contact us via our Github issue tracker.


sabre/vobject 3.5.3 released

We just released sabre/vobject 3.5.3.

This release fixes a problem with recurring events that have overridden instances falling on the same day.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


sabre/dav 3.1.3 released

We just released sabre/dav 3.1.3. This release contains the following changes:

  • We now require libxml 2.7.0 in composer. We always needed this as a minumum version, but this was not correctly marked.
  • Fixed an issue in the MySQL table structure for calendars. There was not enough space to make a calendar to be able to hold events, todos and journals all at once.
  • Upgraded sabre/vobject, this will fix a number of scheduling-related bugs.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 4.1.1 released

We just released sabre/vobject 4.1.1.

This release fixes a number of bugs, especially in regards to validation. This should solve a number of issues for sabre/dav 3.2 which now uses the validation system for stricter checking input data.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


sabre/vobject 4.1.0 released

We just released sabre/vobject 4.1.0. This release is fully compatible with the 4.0.x series.

This release adds a Sabre\VObject\PHPUnitAssertions trait that, for now, contains a assertVObjectEqualsVObject() function. This functions works similar to PHPUnit's built-in assertXmlStringEqualsXmlString(), and can be used by implementors to check if two iCalendar objects or vCards are identical semantically.

It also contains a number of other fixes:

  • When doing recurrence expansion, the first event now also have a RECURRENCE-ID property.
  • Fixes a bug in processing iTip REPLYs to recurring events.
  • Better error messages and improved validation in a number of areas.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


sabre/dav 3.0.9 released

We just released sabre/dav 3.0.9. This release contains the following changes:

  • We now require libxml 2.7.0 in composer. We always needed this as a minumum version, but this was not correctly marked.
  • Fixed an issue in the MySQL table structure for calendars. There was not enough space to make a calendar to be able to hold events, todos and journals all at once.
  • Backported a workaround from 3.1 to make Windows 10 clients work.
  • Upgraded sabre/vobject.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.5.1 released

We just released sabre/vobject 3.5.1. This release contains a few small improvements:

  1. When expanding recurring events, RECURRENCE-ID is now correctly added, even for the first event.
  2. Several fixes in the iTip broker related to recurring events.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


CalDAV, CardDAV and WebDAV sharing

CalDAV/CardDAV sharing is something we've worked on for quite some time. Our goal is to have out of the box CalDAV sharing working in the next sabre/dav version

It's taking a long time to implement, because we're not just writing the code, we're also writing the standard.

These are the current drafts:

Today I wrote an article on my own blog about how it works and the current status. Read it here.

We'll be at CalConnect 36 in Hong Kong next month to discuss this more. If you're in the area and want to discuss calendaring or sabre/dav, drop us a line!


Baïkal 0.4.0 released

We just released Baïkal 0.4.0. This release contains a number of changes that should improve the system for a number of users. The 0.3.x range of releases had seen a number of stability problems, due to a relatively big sabre/dav upgrade.

I'm attributing the issues to growing pains. With the 0.4.0 release we hope that the most of the common issues are solved. This release contains the following changes:

  • SQlite users had issues syncing. This was due to a newly added feature (sync reports). Upgrading to 0.4.0 will repair your database schema and should make existing setups sync again.
  • The installation threw an error if you didn't have the Sqlite PDO PHP extension installed.
  • We added the "Property storage" plugin. This enables a range of features for clients, such as availability, default alarms and "me card".
  • We added the Scheduling plugin, which adds scheduling and free-busy. Enabling this should also solve a problem with iCal, which behaved badly without this plugin.
  • We removed the "admin locking" features. In the past it was possible to disable the Baïkal admin by removing the ENABLE_ADMIN file from the Specific/ folder. This feature is now no longer supported, and users should instead use their Webserver configuration to block access to the admin.

Read the upgrade instructions here. Full changelog can be found on Github


sabre/dav 3.1.2 released

We just released sabre/dav 3.1.2. This release contains the following changes:

  • A small issue with cleaning up sync logs after deleting addressbooks. This could potentially cause a CardDAV client to miss an update.
  • A fix for supporting non-seekable streams, for those that have custom IFile implementations with non-seekable streams.
  • Faster XML parsing and generating due to an update to sabre/xml.
  • Updates to the sqlite schema to make it more strict.
  • Better parsing of some RRULE properties.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 4.0.3 released

We just released sabre/vobject 4.0.3. This release contains the following changes:

  1. Added VCard::getByType(), to quickly get a vcard property with a specific value for TYPE.
  2. UNTIL and COUNT were not correctly encoded in the jCal format.
  3. RRULE now has more validation and repair rules.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


sabre/dav 3.0.8 released

We just released sabre/dav 3.0.8. This release contains the following changes:

  • A small issue with cleaning up sync logs after deleting addressbooks. This could potentially cause a carddav client to miss an update.
  • A fix for supporting non-seekable streams, for those that have custom IFile implementations with non-seekable streams.
  • Faster XML parsing and generating.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/xml 1.4.1 released

We just released sabre/xml 1.4.1. This release contains an improvement in parsing clark-notation strings. We now cache the result of these, which can result in significant speed-ups for large documents with lots of repeating xml element names.

Upgrade sabre/xml by running:

composer update sabre/xml

Full changelog can be found on Github


sabre/dav 2.1.10 released

We just released sabre/dav 2.1.10. This release fixes a small issue with cleaning up sync logs after deleting address books. This bug could in some rare circumstances cause clients to not see some changes for (unrelated) address books.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


Baïkal joins sabre.io

For a long time Baïkal has been one of the most popular implementations of sabre/dav. Baïkal fills one of the biggest gaps that out-of-the-box sabre/dav has: an easy to use installer and admin interface. It's the best choice if you're looking for a light-weight caldav/carddav server.

However, since a while development for this project has stagnated a little bit. The last release (0.2.7) was from January 2014. The result of this was that many users of Baïkal were on an older version of sabre/dav and there were quite a bit of open support tickets on Github.

A lot of this had to do with the development of Baïkal 2. This version was going to be a complete rewrite based on Symfony components and React. While much of the development focus had been on that new version, users of the existing system did not get all the attention they needed.

So we've had a talk with the lead maintainer for Baïkal (Jérôme Schneider from Netgusto), and proposed to bring Baïkal under the 'sabre.io' umbrella of projects. What this means in practice is that:

  • We're moving the existing website and documentation over from baikal-server.com to sabre.io.
  • We're now helping with support, and closed over a hundred tickets already.
  • We're taking over maintenance of Baikal 0.x, and today we're releasing 0.3.1.
  • Eventually we will release a 1.0 version of Baikal, unless Baikal 2 is ready first.

Baïkal 0.3.1

Baïkal 0.3.1 is now the recommended version of Baïkal. This release fixes the most reported issues with Baikal, and also:

  • Upgrades sabre/dav from version 1.8 to 3.1.
  • Supports PHP 7.
  • Makes the minimum PHP version 5.5.
  • Adds support for calendar/addressbook export.
  • Adds support for WebDAV-Sync.

Effective immediately, this is the only supported Baïkal version.

We will also continue to make fixes and improvements in this branch of development, as they come up.

Downloads are now distributed via Github. If you are upgrading from version 0.2.7, you can find the upgrade instructions here.

Relationship between Baïkal, Baïkal 2 & sabre/katana

For those following this project, you might also be aware that we've already had a project with very similar goals on sabre.io called katana. So with Baïkal, Baïkal 2 and sabre/katana combined, there are effectively three active projects that all overlap in the use-case they address.

We haven't fully decided yet what route to take with these. Eventually we would like to end up with a single active project that addresses this main use-case. So down the road we'll try to find some way to merge these projects and combine the best parts of all of them. Baïkal 2 in particular has a beautiful interface, and sabre/katana had strong benefits because its goal was to make it fully run as a javascript fat client, allowing it to be used for other sabre/dav implementations such as Owncloud, and even non-sabre/dav installations.

The biggest factor in development of the katana project is simply lack of funding, which means that we can't afford to spend time on it to bring it to a 1.0. This is not unlike Baïkal and Baïkal 2, which has for a large part been a "labor of love" by it's author Jérôme Schneider.

So what we at sabre.io and fruux commit to is:

  • Continuous maintenance and support for Baikal 0.x.
  • Eventually release this as Baikal 1.0.

As for sabre/katana and Baïkal 2... It's hard to make promises. They are done when they are done, and we'll keep a look at for companies interested in funding or sponsoring development of these. Also, we're looking for more maintainers / developers for these. If you're interested, drop us a line! Any level of experience welcome.


sabre/xml 1.4.0 released

We just released sabre/xml 1.4.0. This release fixes a number of problems related to serializing value objects, and in particular array properties.

We also introduced a BC break. Value objects with properties that are set to null or empty arrays are now skipped, as we feel that this is a more sane default. It could influence your xml output though, so if you use value objects, keep a close eye on if this affects you.

Update sabre/xml by running:

composer update sabre/xml

If that didn't update your sabre/xml, make sure you are requiring ^1.4.0 in your composer.json.

Full changelog can be found on Github


sabre/dav 3.1.1 released

We just released sabre/dav 3.1.1. This release fixes a regression that prevented the browser plugin from working for people using both CalDAV scheduling and delegation.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.1.9 released

We just released sabre/dav 2.1.9, which contains a fix to enable PHP 7 support. This release includes sabre/vobject 3.5.0 which was also fixed to support PHP 7.

For more information about this change and this decision read the vobject post.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 3.0.7 released

If you've been following this blog, you might have seen it coming. We just released sabre/dav 3.0.7. This release supports PHP 7.

For more information about this change and this decision read the vobject post from yesterday.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.4.9 and 3.5.0 release

In a reversal of an earlier statement, we're releasing a sabre/vobject 3.x version with PHP 7 support.

We just release two new versions of the sabre/vobject package; 3.4.9 and 3.5.0. 3.4.9 is identical to 3.4.8 but now explictly forbids being installed on PHP 7, via composer.json.

3.5.0 introduces two differences:

  1. PHP 7 is supported.
  2. Two classes have been renamed. Sabre\VObject\Property\Float is now Sabre\VObject\Property\FloatValue and Sabre\VObject\Property\Integer is now called Sabre\VObject\Property\IntegerValue.

For most people the new class names will have 0 effect on your code. Almost everyone should just be able to upgrade from 3.4.x to 3.5.0 without any modifications.

The reason we've done this is due to some external pressure of sabre/* users, who argued that it's not good that there's not a single sabre/vobject or sabre/dav package that supports both PHP 5.4 and PHP 7. Thankfully this change is small enough that it's relatively low impact.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.5.0, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "^3.5.0"

Because the difference is so minor, in the future we'll only maintain the 3.5 (and 4.0) branch of vobject, and effectively drop support for 3.4. If this concerns you, drop me a line as maybe we can help.

The 3.4.9 tag therefore mainly exist as an indicator to people who have a composer dependency targetting 3.4.* with composer and are attempting to use PHP7, or people who have a rather complex dependency tree.

Full changelog of this release can be found on Github.


sabre/vobject 4.0.2 release

We just released sabre/vobject 4.0.2.

This version fixes a regression introduced in 4.0.0. When parsing objects with a CHARSET parameter, in documents that do not support CHARSET, which is everything except vCard 2.1, the parser would throw an error for unrecognized values.

If you are parsing iCalendar or vCards, upgrading is highly recommended.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 4.0.2, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~4.0.2"

Full changelog of this release can be found on Github.


sabre/dav 3.1 released

We're a bit late to the party, but we finally have a PHP 7 compatible release for sabre/dav.

The master branch had PHP 7 support for a while. The original plan for 3.1 was to include CalDAV sharing support, but this has been taking longer than expected.

The result was that we have not had a stable PHP 7-compatible release. So instead of waiting until all the 3.1 features were ready, we've figured it's better to get 3.1 out as soon as possible and move the new features over to a future 3.2 release. So here it is, 6 months after the last major release!

Aside from PHP 7 support, there's a few other changes:

  • The minimum PHP version is now PHP 5.5.
  • We switched to vobject 4
  • We have support for "Calendar availability" in CalDAV. This feature allows users to specify what their work hours are (using compatible clients). This information will then be taken into consideration when generating freebusy responses.
  • Lots of memory improvements, stability fixes and better exception messaging.

Contrary to past 'major' releases, this should be fairly easy for people to upgrade to. The BC changes will only affect a very small group.

This release also marks the beginning of the 'life support' period for sabre/dav 3.0.x. We'll continue to do bugfixes for another 12 months.

Happy new year!


sabre/http 4.2.1 released

We just released sabre/http 4.2.1.

This release fixes an issue related to sending partial streams to http clients. This is used for for example when dealing with Range: requests.

Update sabre/http by running:

composer update sabre/http

Full changelog can be found on Github


sabre/http 4.2.0 released

We just released sabre/http 4.2.0.

This release is extremely minor. It just tells composer that it supports either sabre/event 2.0 or 3.0.

Update sabre/http by running:

composer update sabre/http

Full changelog can be found on Github


sabre/vobject 4.0.1 release

We just released sabre/vobject 4.0.1.

This version contains a small change related to iTIP messages. When we generate a CANCEL, message the object now contains a DTEND.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 4.0.1, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~4.0.1"

Full changelog of this release can be found on Github.


sabre/dav 3.0.6 released

We just released sabre/dav 3.0.6.

This release fixes a number of issues.

There were issues in the migrateto20.php upgrade script, and caching problems in the tree.

Updating is recommended.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.1.8 released

We just released sabre/dav 2.1.8

This release fixes several small problems related to caching and migrating from sabre/dav 2.0.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.4.8 release

We just released sabre/vobject 3.4.8.

This version contains a small change related to iTIP messages. When we generate a CANCEL, message the object now contains a DTEND.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.4.8, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.4"

Full changelog of this release can be found on Github.


sabre/xml 1.3 released

We just released sabre/xml 1.3. This release is a fairly big update from the 1.2 series. It's 100% backwards compatible, but adds a number of exciting features:

The biggest is support for a new Value Objects feature. This new feature makes it extremely easy to map between Simple PHP classes and XML elements.

Read more on the documentation page, or check out our Atom sample parser for a working example.

In addition to that:

  • It's now possible to specify custom serializers for specific PHP classes. This would allow you to for instance specify how a PHP DateTime object might be serialized, or in general separate your serializers from the classes they are serializing.
  • Added new deserializer functions for common XML patterns: keyValue, elements, repeatingElements, valueObject.
  • It's now possible to tell Sabre\Xml\Service::expect a list of possible expected XML root elements.
  • Lots of small bugfixes.
  • Major documentation updates.

The full changelog can be found on Github

Installing

Simply run:

composer require sabre/xml ^1.3.0


sabre/vobject 4 released

We just released sabre/vobject 4. This is a new major version, and comes with a number of new features and also BC breaking changes. The API is largely the same, but there are a few subtle differences.

New feature highlights

  • Support for PHP 7.
  • Requires PHP 5.5.
  • Support for xCal and xCard, which are XML representations of iCalendar and vCard.
  • Added a 'BirthdayCalendarGenerator'. Give it a list of vCards, and it will create an iCalendar object with birthdays.
  • Lots of speed and memory improvements.
  • Support for the new VAVAILABILITY iCalendar component.
  • Added a command-line utility to merge duplicate vcards.
  • Using DateTimeImmutable everywhere we used DateTime.
  • Denial of service-protection in the RecurrenceIterator.
  • Better RDATE support.

The full changelog can be found on Github

Installing

Simply run:

composer require sabre/vobject ^4.0

Updating

For more details about these changes and a detailed list of all backwards- compatbility breaking changes, read the upgrade document.


sabre/event 3 released

We just released sabre/event 3. This is a new major version, and comes with a number of new features and also BC breaking changes.

Changes

PHP version

This package now requires PHP 5.5. The 2.0 version of this package will continue to be maintained though if you need PHP 5.4 support.

Changes to Promises

We've overhauled the promise significantly to closely match the standard Ecmascript promise as close as possible.

To do this, we added the following functions:

Sabre\Event\Promise\all
Sabre\Event\Promise\race
Sabre\Event\Promise\resolve
Sabre\Event\Promise\reject

These are now straight up functions, and not static methods on the Promise object.

The following methods were added:

Sabre\Event\Promise::otherwise
Sabre\Event\Promise::wait

Wait makes a lot of sense for PHP so it was added as a core feature.

The following methods were deprecated:

Sabre\Event\Promise::all
Sabre\Event\Promise::error

Both will still work but will be removed in version 4.0.

error was renamed to otherwise. In javascript this function is actually called catch, but we can't use that name in PHP because it's a reserved keyword. Other projects such as ReactPHP and Guzzle have settled on the name otherwise, so we're following their example.

Another change is that promise now uses the Event Loop to trigger events. This means that events are now predictably asynchronously triggered, whereas before events might have triggered synchronously.

What generally means is that you might need to explictly call the wait() function on your promise to wait for it to resolve. Or you can call:

Sabre\Event\Loop\run();

See the Promise documentation for more information.

Coroutines

We've added support for coroutines using PHP 5.5 generators. For a great example check out the documentation.

Event loop

We added an implementation of an Event Loop, also sometimes known as the reactor pattern. This new system behaves similar to Javascript or ReactPHP's loop. The event loop can handle 'timed events' a.k.a. setTimeout() and setInterval() and support for events on IO streams strictly using stream_select() as the underlying engine. See the Loop documentation for more information.

Changelog

A full changelog can be found on Github


sabre/dav 3.0.5 released

We just released sabre/dav 3.0.5.

This release fixes an issue related to encoding URIs in responses to PROPFIND requests. This was causing issues for Cyberduck in particular, but we suspect that there might be others.

Updating is highly recommended.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 3.0.4 released

We just released sabre/dav 3.0.4

This releases contains the following fixes:

  • This release fixes an issue related to MOVE requests. If a MOVE request was going to overwrite an existing resource, but that move request was stopped by access control (or other plugins), the target resource would still be deleted.
  • It fixes incorrectly encoding PROPPATCH xml bodies in the client.
  • It also fixes deserializing errors in the client when properties were not found on the server.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.1.7 released

We just released sabre/dav 2.1.7

This release fixes an issue related to MOVE requests. If a MOVE request was going to overwrite an existing resource, but that move request was stopped by access control (or other plugins), the target resource would still be deleted.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.4.7 release

We just released sabre/vobject 3.4.7.

This version contains a small bugfix related to recurrence rules and querying.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.4.7, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.4"

Full changelog of this release can be found on Github.


sabre/http 4.1.0 released

We just released sabre/http 4.1.0

This release fixes an issue with concurrent asychnronous requests, and adds Sabre\HTTP\Auth\BearerAuth.

Update sabre/http by running:

composer update sabre/http

Full changelog can be found on Github


sabre/dav 2.0.9 released

We just released sabre/dav 2.0.9

This release fixes an issue related to MOVE requests. If a MOVE request was going to overwrite an existing resource, but that move request was stopped by access control (or other plugins), the target resource would still be deleted.

The zip release also updates sabre/vobject from version 3.3.5 to 3.4.6, which also fixes a number of bugs.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/xml 1.2.0 released

We just released sabre/xml 1.2.0

This release adds a new function to the Reader class: parseGetElements, which makes it slightly easier to parse xml documents with custom deserializers.

Update sabre/xml by running:

composer update sabre/xml

Full changelog can be found on Github


sabre/dav 3.0.3 released

We just released sabre/dav 3.0.3

This release fixes an issue that prevented HTTP Digest authentication to work with HEAD requests. If you use HTTP Digest authentication, updating is strongly recommended.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.4.6 release

We just released sabre/vobject 3.4.6.

This version contains a small bugfix related to recurrence rules and querying.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.4.6, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.4"

Full changelog of this release can be found on Github.


sabre/dav 3.0.2 released

We just released sabre/dav 3.0.2

This release fixes Windows Phone 8 compatibility with CalDAV, as well as a problem in the database migration script for pre-2.1 databases.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.1.6 released

We just released sabre/dav 2.1.6.

This release fixes Windows Phone 8 compatibility with CalDAV, as well as a problem in the database migration script for pre-2.1 databases.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.1.5 released

We just released sabre/dav 2.1.5.

This releases fixes a bug related to PROPFIND requests with Depth: infinity. This feature is turned off by default, so updating is only needed if you manually enabled it.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.0.8 released

We just released sabre/dav 2.0.8.

This releases fixes a bug related to PROPFIND requests with Depth: infinity. This feature is turned off by default, so updating is only needed if you manually enabled it.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 3.0.1 released

We just released sabre/dav 3.0.1.

This release fixes several small bugs. These bugs could allow for a minor corruption in some stored properties, and fixes an infinite loop, which could be exploited as a denial of service attack.

Updating is highly recommended.

Update sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/xml 1.1.0 release

We just released sabre/xml 1.1.0.

This version contains a bugfix that makes it better at detecting broken xml and throwing appropriate exceptions. This change also enables the use of RelaxNG or XSchema validation.

Upgrade sabre/xml by running:

composer update sabre/xml

If this didn't upgrade you to 1.1.0, make sure that your composer.json file has a line that looks like this:

"sabre/xml" : "~1.1"

Full changelog of this release can be found on Github.


sabre/dav 3.0 released

We just tagged and zipped the sabre/dav 3.0 release. This is only a year after the 2.0 release, but 6 years after the 1.0 release.

This means we needed 440% less time to release. If we continue to increase speed at this rate, it means we should get a 4.0 release in august, and somewhere in september we will average 1 major release per hour.

Lets hope that's not the case though, because writing these blogposts would get old rather quickly.

Anyway, back to the subject at hand:

New Features

Browser upgrades

The browser plugin has received a lot of subtle upgrades that should make it easier to use. We've removed some of the information that was not useful 99% of the time, and added the ability to create new principals in the browser.

Authentication system overhaul

The authentication system and backends got a new API, which allows for cleaner implementation in many cases, and also adds the ability to run multiple authentication backends cooperatively.

This allows the implementor to support HTTP Auth, as well as for example OAuth2, or any custom schemes.

Nearly all XML code got rewritten

Back in 2009 I first started experimenting with the idea of replacing all DOM code with code with PHP's XMLReader/XMLWriter.

Back then these api's were rather unstable and had a big number of problems. In 2012 I started again, and since then have been working on a separate sabre/dav branch to implement this.

After many hundreds of commits, it's finally done. The new xml system is based on a new sabre/xml library and has made the xml code a lot more legible and in some cases faster.

Furthermore, it will in the future allow us to make further optimizations that were not possible before, due to the fact that this new system can read and write XML from and to streams, whereas the DOM had no other option but to keep objects in memory (which would become in some instances absolutely massive).

MKCOL can now create new principals

If your backend has support for it, new principals can now be programmatically created.

Support for a "home"-like collection

We added a new collection type that can automatically create a "home" directory for every principal, protected by ACL rules.

Property storage can now store any complex XML property

Before, the property storage plugin was only able to store simple string values for custom XML properties. This has now been changed to allow any complex XML value to be stored, thanks to sabre/xml.

ChangeLog

A lot of smaller changes have been made since version 2.1. You can find more details in the ChangeLog. Read from 2.2.0-alpha1 onwards, as most changes have been made in the alpha versions.

Installation

As always, the zip can be found on the github releases page, but the recommended installation method is using composer:

composer require sabre/dav ~3.0.0

Upgrading

A few backwards compatibility breaks have been made in this release.

If you are running a standard server, it's likely that you only have to run the database upgrade script, but if you did any sort of customizations, chances are that you need to make changes in your code to keep stuff running.

Make a backup. and then head to the migration instructions for 3.0.

Drop a line on the mailing list if you run into any issues, or get in touch with us for our commercial support options.

Support status

Due to the 3.0 release, 2.1 now enters maintenance mode. This means that version 2.1 of sabre/dav will be actively maintained for the next 12 months.

More information about previous versions and their support status can be found on the upgrade page.

Thanks as always!!!


Deprecating sabre/dav 1.8

Our versioning scheme from sabre/dav dictates that we stop support for a version of a package, 12 months after the next major version was released.

In ideal circumstances this means you have the full 12 months to do the upgrade.

Today marks that date for sabre/dav 1.8, as well as sabre/vobject 2.

What this means

  • We will no longer do new releases for these versions.
  • We will no longer accept bug reports for these versions. We might make an exception for serious security issues.
  • We will no longer provide support information for people running on these versions.
  • It also marks the end of the last sabre/dav to support PHP 5.3.
  • However, we will still offer paid support for these versions, if you are truly stuck in the past.

Some stats

  • sabre/dav 1.8 was first released November 8th, 2012.
  • The biggest change was the switch to PHP namespaces from the old prefix-format.
  • There were a total of 12 releases, averaging 0.63 releases per month.


sabre/vobject 3.4.4 release

We just released sabre/vobject 3.4.4.

This version contains a small bugfix related to the iTip broker.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.4.4, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.4"

Full changelog of this release can be found on Github.


sabre/dav 2.1.4 released

We just released sabre/dav 2.1.4.

This release fixes 3 small bugs, and also updates all dependencies to their latest versions.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.0.7 released

We just released sabre/dav 2.0.7.

This releases fixes a small bug related to cleaning up data after deleting calendar events. This bug could cause some changes to now show up in people's calendars.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/xml 1.0.0 release

We just released sabre/xml 1.0.0

This version is identical to the earlier released 0.4.3. We figured it was good enough to be released as a true stable release, and the soon-to-be-released sabre/dav requires stable depdencies.

Upgrade sabre/xml by making sure your composer.json has ~1.0 as a version requirement, and then just run composer update.

Full changelog of this release can be found on Github.


sabre/http 4.0.0 release

We just released sabre/http 4.0.0

This version contains a few new features and some cleanups. We suspect that it will work as a drop-in replacement for nearly anyone.

New features:

  • Functions for content-negotiations
  • Support for parsing the HTTP Prefer header. (RFC7240)
  • Now integrates functions from sabre/uri.
  • Functions for parsing mime-type strings such as Content-Type.

Upgrade sabre/http by making sure your composer.json has ~4.0 as a version requirement, and then just run composer update.

Full changelog of this release can be found on Github.

While the API is compatible with 3.x, some functions have moved and the old ones are deprecated. Read more in the upgrade instructions.


sabre/vobject 3.4.3 release

We just released sabre/vobject 3.4.3.

This version contains a total of 5 bugfixes, related to recurrence rules, validation and dates.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.4, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.4"

Full changelog of this release can be found on Github.


A new XML library for PHP

Dealing with XML is annoying to many, and certainly us. We've tried many different approaches to make working with XML less frustrating, and we've finally landed on an approach that we're happy with.

We're launching sabre/xml to the public today. You can find a bit of an overview on this blog, or you can jump straight in the documentation.

This library is already integrated into the master branch of sabre/dav, which will be released as 2.2 soon. We rewrote almost all our XML handling code, and there was quite a bit! The next release has over 10.000 changed lines.

The next major version of sabre/vobject will also depend on it to support reading and writing xCal and xCard.


sabre/dav 2.1.3 released

We just released sabre/dav 2.1.3.

This release fixes a number of bugs, most of which are related to CalDAV scheduling. Upgrading is highly recommended.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.4.2 release

We just released sabre/vobject 3.4.2.

This version contains a bugfix in the iTip/scheduling system that prevented attendees from responding to certain invites.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.4, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.4"

Full changelog of this release can be found on Github.


sabre/vobject 3.4.0 release

We just released sabre/vobject 3.4.0. This release has a number of improvements and bugfixes.

  • Recurrence expansion and parsing is now a lot faster on big calendars. Our test iCalendar file was about 5MB large with an unusual high amount of recurrence rules. We got about a 1900% increase in speed. Most real-world calendars will not be as large, but should still benefit from this quite a bit.
  • We're now supporting parsing and validating VAVAILABILITY components, which is a new iCalendar component that may become an internet standard, but is currently still a draft. In the future we'll also add support for this in the freebusy generator, which will make it useful for sabre/dav users.
  • Updated to the latest timezone information.
  • Several other bugfixes.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.4, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.4"

Version 3.4.0 is 100% compatbile with vobject 3.3.*

Full changelog of this release can be found on Github.


A new URI handling library

We just released version 1.0.0 of a new URI library. This library solves a few common problems we've been having, or simply did not do well enough in the past.

The library is super light-weight and just provides 5 functions. We hope it's useful for other people aside from us, but we'll be adding this as a new dependency to sabre/xml, sabre/http, sabre/dav and in the future sabre/vobject, as they all do 'stuff' with URIs, and were not doing everything in the best way possible.

Check out the documentation if you'd like to learn more.


sabre/vobject 3.3.5 release

We just released sabre/vobject 3.3.5.

This release fixed a number of bugs, including:

  1. Bugs related to iTip and the SCHEDULE-STATUS property.
  2. The parser can now read files that contain a UTF-8 BOM.
  3. jCal serialization of floating DATE-TIME properties.
  4. A bug related to converting X-ABDATE to ANNIVERSARY in the vCardConverter.
  5. Two new modes for the validator, allowing you to validate vCards and iCalendar objects specifically in the context of CalDAV and CardDAV servers.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.3.5, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.3.5"

Full changelog can be found on Github.


sabre/dav 2.1.2 released

We just released sabre/dav 2.1.2.

This release fixes a problem with the migration script, which could cause scheduling not to work for events that were created before upgrading to 2.1.

It also fixes a bug that caused freebusy requests to fail for people with no calendars, and a small problem in the browser plugin.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.0.6 released

We just released sabre/dav 2.0.6.

This release ships with a few classes that make it easier to be compatible with both sabre/dav 2.0 and 2.1.

It also addresses an issue some people had with migration from 1.8.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 1.8.11 release

We just released sabre/dav 1.8.11.

This release ships with the sabre/vobject 2.1.6, which fixes some issues with parameter escaping. It also fixes a small issue in the DAV client.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/http 3.0.4 release

We just released sabre/http 3.0.4.

This release fixes a small bug that made it impossible to support multiple authentication schemes at the same time (for instance supporting both Basic and Digest at the same end-point).

Updating is only required for people that want to use this feature.

Upgrade sabre/http by running:

composer update sabre/http

If this didn't upgrade you to 3.0.4, make sure that your composer.json file has a line that looks like this:

"sabre/http" : "~3.0.4"

Full changelog can be found on Github.


New tutorial: Per-user directories

A commonly asked question on the mailing list, is:

How do I create private directories on a WebDAV server.

Doing this is not extremely obvious, and there are a few issues that people quickly run into.

We've added a new tutorial to our website explaining a 'simple way' of doing this, and also a more advanced way, using WebDAV-ACL.

Hopefully it's useful!


sabre/dav 2.1.1 release

We just released sabre/dav 2.1.1. Upgrading is highly recommended.

Two new bugs were found and fixed quickly after the 2.1 release two days ago, one related to the database migration process and one related to iMip.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/dav 2.1 released

We just released sabre/dav version 2.1. This release comes about 6 months after the last major release, so that's nicely on track!

New features

Scheduling

We finally have support for CalDAV Scheduling (rfc6638). Adding scheduling to your server means that you can invite attendees to your events, and have those invites automatically delivered to other calendars on the system.

CalDAV clients that support this will be able to show an invitation interface and allow attendees to accept or decline invitations, and have all of this processed on the server.

If you're inviting attendees that are not on the server, you can also optionally set-up an iMip (rfc6047) plugin. This will allow the server to send invitation emails on behalf of the user.

For more information, read the scheduling documentation.

vCard 4 support

In the past, the CardDAV plugin only supported vCard 3.0, which is the vCard version that's required for CardDAV and also what most clients use.

Since sabre/dav 2.1, the server also support vCard 4.0 (rfc6350). vCard 4.0 is a much more modern format, adds a lot of great features, and doesn't suffer from many of the problems vCard 3.0 had.

Now if a client stores either a vCard 3 or 4, these vCards will be stored as-is, but if a client requests either a vCard 3 or 4 (using content-negotation), we will automatically convert the vcard before sending it back to the client.

jCard support

It's now also possible for clients to request jCard (rfc7095). jCard is a JSON representation of vCard 4.0.

jCard is much easier to parse than vCard 4.0, so we also highly recommend client developers to start supporting this.

ChangeLog

A lot of smaller changes have been made since version 2.0. You can find more details in the ChangeLog. Read from 2.1.0-alpha1 onwards, as most changes have been made in the alpha versions.

Installation

As always, the zip can be found on the github releases page, but the recommended installation method is using composer:

composer require sabre/dav ~2.1.0

Upgrading

A few backwards compatibility breaks have been made in this release. Overall they should be pretty minor and easy to deal with.

If you are running a standard server, it's likely that you only have to run the database upgrade script, but if you did any sort of customizations, chances are that you need to make changes in your code to keep stuff running.

Make a backup. and then head to the migration instructions for 2.1.

Drop a line on the mailing list if you run into any issues, or get in touch with us for our commercial support options.

Support status

Due to the 2.1 release, 2.0 now enters maintenance mode. This means that version 2.0 of sabre/dav will be actively maintained for the next 12 months.

More information about previous versions and their support status can be found on the upgrade page.

Thank you!


sabre/vobject 3.3.4 release

We just released sabre/vobject 3.3.4.

This release adds:

  1. Converting ANNIVERSARY to X-ABDATE and X-ANNIVERSARY when converting between vCard 3.0 and 4.0.
  2. Reference-timezone support to the recurrence iterator, free-busy generator, and DATE-TIME and DATE properties for dealing with all-day events and floating times.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.3.4, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.3.4"

Full changelog can be found on Github.


sabre/dav 2.0.5 release

We just released sabre/dav 2.0.5. Upgrading is highly recommended.

This release has an important bugfix. If-Modified-Since was not handled correctly, as we were not sending back 304 statuses, but 200 instead.

This could lead clients to believe that their local cache was expired and the new resource being empty, which in turn makes data-loss a possibility.

In addition to that, the zip also ships with vobject 3.3.3, which solves a problem a lot of people have been having with timezone-related errors being spammed to the PHP error log. Note that this is a PHP bug, but we've provided a workaround.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/event 2.0.1 release

We just released sabre/event 2.0.1.

This release fixes two issues related to the EventEmitter::once() method, and brings its functionality up to par with EventEmitter::on().

Upgrade sabre/event by running:

composer update sabre/event

If this didn't upgrade you to 2.0.1, make sure that your composer.json file has a line that looks like this:

"sabre/event" : "~2.0.1"


sabre/vobject 3.3.3 release

We just released sabre/vobject 3.3.3.

This release has additional fixes and improvements for the iTip subsystem.

This release also works around a PHP bug that would otherwise spam your php error log file with 'invalid timezone' exceptions and has support for the "Line Islands Standard Time" timezone coming from Microsoft products.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.3.3, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.3.3"


sabre/http 3.0.0 release

We just released sabre/http 3.0.0.

We introduced several API breaking changes, so a major version change was warranted.

In particular, we modified the API to be closer to the draft version of psr/http.

psr/http is an upcoming standard for PHP development that should unify how we represent HTTP requests and responses in PHP.

There were several good ideas in this spec, in particular how HTTP headers are treated, especially when there are multiple headers with the same name, which is something sabre/http dealt poorly with (not at all).

Changes

  • Switched to a PSR-4 directory structure in lib/. This means all classes are now in lib/ instead of lib/Sabre/HTTP. This should not change a thing if you use the composer autoloader.
  • ::setHeaders() used to delete all previous http headers. This is no longer the case, new headers will simply be added to the existing ones.
  • Added ::getHeaderAsArray(). This method returns a single http header. If multiple headers with the same name were specified, each value will be an item in this array.
  • If you use ::getHeader(), and there were more than 1 http header with that name, we now concatenate all these headers with a comma (,).
  • ::addHeader() is new, and will preserve any existing header with that name. Instead, a second header will be added with the same name and a new value.
  • ::getHeaders() will now return each header value as an array.
  • The Client class now only follows redirects to HTTP and HTTPS urls.
  • Util::negotiate is deprecated, use Util::negotiateContentType instead.
  • The Client class can now follow redirects, even if the open_basedir setting is turned on.

Upgrading

If you are using sabre/http solely through sabredav, don't upgrade yet unless you are using the latest development version. If you use sabre/http independently, ensure that the relevant line in your composer.json looks like this:

"require" : {
    "sabre/http" : "~3.0.0"
}

And run composer update sabre/http afterwards.

No full psr/http compliance

I've matched the Request and Response to behave closer to the draft psr-http draft, but I didn't go all the way!

I strongly disapprove of how message bodies are represented. The PSR introduces an object to wrap PHP streams, that has severely less features, and due to its design it's incompatible with regular PHP streams and doesn't cover all our use cases. All under the pretense that PHP streams are hard to use.

Unless that's fixed, we'll not be fully supporting the specification, but it's still a draft, and there's still time.

Full changelog can be found on Github


sabre/vobject 3.3.2 release

We just released sabre/vobject 3.3.2.

Further in-depth testing of the iTip subsystem has revealed a lot of small edge-cases that weren't properly covered.

In addition, we now correctly decode ATTACH properties in iCalendar objects that are specified as a URI, and fixed a few validator rules.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.3.2, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.3.2"


sabre/dav 2.0.4 release

We just released sabre/dav 2.0.4.

This releases has a number of improvements, namely:

  1. PostgresSQL files have been corrected. Note that while we ship postgres files, it is not an officially supported database.
  2. After nodes had been deleted, locks were not automatically removed. This was problematic, because re-creating a node could cause it to be locked instantly. This is now fixed.
  3. There were some problems with both the default Cal- and CardDAV PDO backends, when the 'Sync' plugin is not enabled. This is now resolved.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.3.1 release

We just released sabre/vobject 3.3.1.

Several bugs have been found in 3.3.0, all mostly related to the newly introduced iTip functionality.

This release also adds a new feature that allows people to specify new DATE-TIME values by passing PHP DateTime objects as such:

$vevent->DTSTART = new DateTime('...');

This was already possible in a lot of other places, but somehow this was missed for the 'magic property setter'.

Upgrade sabre/vobject by running:

composer update sabre/vobject

If this didn't upgrade you to 3.3.1, make sure that your composer.json file has a line that looks like this:

"sabre/vobject" : "~3.3.1"


sabre/vobject 3.3.0 release

We just released sabre/vobject 3.3.0!

This release has a few new features, but also changes a few things. For most people the upgrade should be seamless though.

Changes

Better RRULE parser

We now have much better support for RRULE, and especially exceptions to recurrences. This solved several bugs that have been outstanding for quite some time.

We now also support RDATE.

One change is that the old Sabre\VObject\RecurrenceIterator is now renamed to Sabre\VObject\Recur\EventIterator. The old class still exists, but will be removed in a future version.

Some more info about this feature here.

iTip support

VObject now supports generating and parsing iTip messages. iTip messages are a type of iCalendar object that are used for things like invites, replies and cancellations.

More info about this feature on the iTip page.

Switched to PSR-4

The directory structure of the VObject library changed. Everything that was previously in lib/Sabre/VObject is now moved to lib/.

If you are using composer you don't have to change a thing, but if you manually wrote an autoloader, you may have to make a change to accomodate for this.

We also removed lib/Sabre/VObject/includes.php.

Changelog

Full changelog can be found on Github

Upgrading

To update your sabre/vobject, edit composer.json to make sure that it includes a line like this:

"sabre/vobject" : "~3.3.0"


sabre/dav 1.7 end of support

As of right now, sabre/dav 1.7 has reached end of life status.

Version 1.8 has been released in November 2012, so people had 20 months to upgrade their systems.

We've done one final release (1.7.13), containing a few minor fixes and a newer version of the sabre/vobject library (if you're using the zip installation).

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github

What does this mean?

From this point forward, we will no longer accept bug reports for version 1.7.

Also, no future releases will be made.

We may consider certain security bugs, but there are no guarantees.

Upgrading to 1.8

Upgrading to version 1.8 is not difficult. The main change that has been made between these versions, is that 1.8 makes use of PHP namespaces, where 1.7 uses the classic 'pear-style' prefix notation.

Make sure to check out the migration instructions for a detailed overview of the changes.

Keep in mind though that version 2.0 of sabre/dav is also already released. If you are upgrading, you're highly encouraged to take that additional upgrade step. Version 2.0 has its own migration instructions.


sabre/dav 2.0.3 release

We just released sabre/dav 2.0.3.

A number of problems were found in the revamped browser plugin, related to generating links, and for a number of people none of the css and images would load due to incorrect CSP rules.

In addition we found out that the TooMuchMatches exception never worked due to a fatal error, so while fixing that, we also took the opportunity to change the name of the exception to TooManyMatches. Don't laugh.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/http 2.0.4 release

We just released sabre/http 2.0.4.

This release has a few small bugfixes related to the client, and can now optionally work with sabre/event 2.0 as well as sabre/event 1.0.

Upgrade sabre/http by running:

composer update sabre/http

Full changelog can be found on Github


sabre/vobject 3.2.4 release

We just released sabre/vobject 3.2.4.

Conversion between vcard 3 and 4 has been improved, a workaround has been added to deal with Yahoo's broken vcard generation and the CLI tool works again on PHP 5.3.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


sabre/event 2.0 release

We just released sabre/event 2.0.0. This releases adds a few features, and also slightly alters the API.

New stuff

  1. Support for promises.
  2. The event handler is now faster. This is especially noticable when making a lot of subscriptions to a single event, and is likely unnoticable for most.
  3. Added support for something called the 'continue callback' to to the EventEmitter. This makes it possible to implement something similar to javascript's preventDefault.
  4. When calling removeAllListeners without an argument, all listeners for all events are removed.

Api breaks

  1. We switched to PSR-4 for autoloading.
  2. EventEmitter::listeners() no longer returns a manipulatable array of event listeners by reference. It's not a simple list of callbacks, sorted by their priority. The original concept was good on paper.
  3. The argument on removeAllListeners is now optional.

Upgrade sabre/event by making sure your composer.json references ~2.0.0, and then run:

composer update sabre/event

Full changelog can be found on Github


sabre/dav 2.0.2 release

We just released sabre/dav 2.0.2.

Several bugs have been fixed in files from the examples/ directory, and more notably: the dependencies in the zip distribution have been updated, which, among other things, fixes compatibility with PHP versions older than 5.4.14.

Upgrade sabre/dav by running:

composer update sabre/dav

Or download the zip from the releases page.

Full changelog can be found on Github


sabre/vobject 3.2.3 release

We just released sabre/vobject 3.2.3.

Several improvements were made in the validator, and the "repair" option now works correctly again in the CLI tool.

Upgrade sabre/vobject by running:

composer update sabre/vobject

Full changelog can be found on Github


sabre/event 1.0.1 release

We just released sabre/event 1.0.1. A bug prevented the EventEmitter trait to work on PHP versions older than 5.4.14.

Upgrade sabre/event by running:

composer update sabre/event

Full changelog can be found on Github


jCal released as rfc7265

The IETF just made jCal available as rfc7265

jCal is a format to encode iCalendar, but instead of using the clumsy, and old 'mimedir' format, it uses JSON to encode the data.

This is very similar to jCard, which is the json-encoded version of vCards.

We're big fans of this new format. It can already be parsed by vobject and if you're running sabre/dav 2.0, the server can already emit it from REPORT and GET requests and accept it from PUT requests.

We recommend everyone in the industry to consider generating jCal where they are generating iCalendar today. It's a lot easier to parse and generate, and we hope that over time, jCal and jCard replace iCalendar and vCard as the format of choice.


sabre/dav 2.0.1 released

We just released sabre/dav 2.0.1. Two regressions have been found related to PROPFIND requests.

Upgrade if you're having compatiblity problems. The Windows 7 client in particular had issues.

Run composer update sabre/dav, or Download the new zip from GitHub.


sabre/dav 2.0 released

We just released sabre/dav 2.0. The last major release (1.8) was in 2012, so it's been a long time coming.

New features

New browser

new browser!

The browser got a big overhaul. It hadn't changed much since when it was introduced in 2009, so a visual refresh was long due.

The new browser plugin shows you a lot more information about webdav properties as well, making it a more useful debugging tool.

Performance

A lot of focus has gone into performance, specifically in relation to Cal- and CardDAV. We've been running the bleeding edge sabredav, and we've seen several major cpu drops as we've kept sabredav up to date.

We've optimized queries, and provided new shortcuts in the system that allowed backends to do optimizations that were not possible before.

Lastly, we added WebDAV-Sync support.

WebDAV-Sync

Support for WebDAV-Sync (rfc6578) has been added. WebDAV-Sync is used by an increasing number of popular Cal- and CardDAV clients. It allows clients to request a list of changes that happened in calendar and/or addressbooks. This can greatly reduce memory, bandwidth and cpu usage on both client and server, and is well worth it.

It's available as a plugin and the appropriate interfaces have been added to add support for WebDAV-Sync to the collections where you want to support it.

Furthermore, both the default Cal- and CardDAV PDO backends have out of the box support.

New packages

This is the first sabredav release that ships with sabre/vobject 3.0, and is also the first release that has part of it's functionality split out into two new packages: sabre/event and sabre/http.

Calendar subscription syncing

There's a proprietary protocol that allows calendar clients to sync subscriptions with a server. Support for this has been added to the CalDAV plugin, and is also available in the default PDO backend.

This protocol is at least supported by BusyCal and Apple's iOS and OS X clients.

jCal support

jCal is an upcoming standard for representing iCalendar objects in json. sabre/dav now live converts back and forward between iCalendar and jCal, and can return jCal everywhere it returns iCalendar.

We highly recommend using jCal over iCalendar. It's a much better format, easier to parse, and likely to use less memory and cpu while parsing.

New property system

A big part of DAV protocols is related to storing and retrieving properties on resources such as files and calendars.

The property system got a complete overhaul for this release. This allowed for a great reduction in property-related code and allows for a new feature: storage of arbitrary properties.

PHP 5.4

The minimum php version of sabre/dav has been increased to PHP 5.4. This was needed for a number of reasons, such as better closure support and traits.

And...

The list of changes is rather massive. Read up on them in the ChangeLog from 1.9.0alpha1 onwards.

Also, this includes all the changes from sabre/vobject from 3.0.0 onwards, changes from sabre/http from 2.0.0 onwards and everything from sabre/event.

Installation

As always, the zip can be found on the github releases page, but the recommended installation method is using composer:

composer install sabre/dav ~2.0.0

Upgrading

A lot of things have changed in this release. If you are running a standard server, it's likely that you only have to run the database upgrade script, but if you did any sort of customizations, chances are that you need to make changes in your code to keep stuff running.

Make a backup. and then head to the migration instructions for 2.0.

Drop a line on the mailing list if you run into any issues at all.

Support status

As of right now version 1.7 is no longer supported. 1.8 will be supported for an entire year, until May 2015.

Thank you

This was literally the largest release we've ever done, seeing the biggest diff, most new features, most contributors and longest development time.

Thanks everyone for hanging in there and all your contributions.

I want to specifically thank Markus Staab for tirelessly reviewing every incoming commit, and Dominik Tobschall for all the moral support.

Evert.


sabre/dav 1.7.12 and 1.8.10 released

We just released sabre/dav 1.7.12 and 1.8.10. These two releases are mainly bugfix releases centering around two things:

  • Better support for If-Match and If-None-Match
  • Lots of updates in the PATCH method.

Patch problems

We've gotten reports that there were problems with the PATCH plugin, and the associated documentation. Things were inconsistent and plain incorrect at times.

We've extended the documentation a great deal, now allowing you to correctly use negative offsets for patching and also appending.

We've also added a new interface to enable this functionality, namely Sabre\DAV\PartialUpdate\IPatchSupport.

The existing interface Sabre\DAV\PartialUpdate\IFile is now deprecated and will be removed in a future major version of sabre/dav. This was unfortunately needed to fix what was considered a bit of a mess.

VObject

sabre/vobject in the zip package is now upgraded to 2.1.4, which works around a backwards compatibile break that was introduced in PHP 5.5.10 in relation to timezones.

Upgrading

To upgrade with composer, just run composer update sabre/dav on the command- line.

The zip files can be found on github.


sabre/vobject 3.2 released

We just released sabre/vobject 3.2.0. This release is backwards compatible with the 3.1.* series.

New features:

  • We are now fully hhvm compatible. If you're running a recent hhvm version, everything should work as expected. From this point forward, we will also actively support hhvm.
  • The validator now understands a lot more validation rules. So using it now, either with the API, or on the command-line, should yield a lot more information.
  • Support for a range of new timezone identifiers.
  • Support for additional vcard properties from rfc6715 and rfc6474.
  • Added a UUID utility, for easily generating unique strings for use in UID properties.
  • Support for BYMONTH on DAILY recurrences.
  • Automatically fix broken vcards from Google's CardDAV server.

We hope you like it! To upgrade with composer, make sure that your composer.json has a line that says:

"sabre/vobject" : "~3.2"

And then run:

composer update sabre/vobject


New website launched!

You're looking at the brand-new website for sabre/dav. Up until now sabre/dav never had a proper website, and we've always just hosted from Google Code.

As Google slowly started to lose interested in code hosting, we migrated more and more features to GitHub. The biggest thing left: the wiki. So what once started as a place to host the new wiki, turned into a brand-new design, by our very own Martin Kaniut, who's also responsible for the fruux design.

We hope you like it, but since it's such a step up from Google Code, we're confident you probably will ;). If you're running into any bugs, definitely let us know. Want to contribute to the wiki? The entire site is open source, so take a look at some of the existing pages and get cracking!