Merge branch 'master' into multiple-email-new

This commit is contained in:
Andrew Ruthven 2021-02-26 00:18:53 +13:00
commit d3a7d10873
78 changed files with 2269 additions and 109 deletions

View File

@ -1,11 +1,15 @@
image: php:apache-buster
stages:
- build
- test
- testall
build:
stage: build
image: debian:unstable
script:
- apt-get -y update
- bash -c 'mkdir -p /usr/share/man/man{0..10}'
- apt-get -y install build-essential devscripts fakeroot dh-exec jdupes rst2pdf doxygen graphviz # todo build-dep instead, change this task's image to plain debian
- apt-get -y install build-essential devscripts fakeroot dh-exec jdupes doxygen graphviz php-cli
- mv debian/changelog debian/changelog.old
- >
cat
@ -26,10 +30,158 @@ build:
test:
stage: test
image: debian:unstable
artifacts:
paths:
- testing/report.xml
- apache2_log/*
- davical_log/*
reports:
junit: testing/report.xml
when:
always
script:
- apt-get -y update
- bash -c 'mkdir -p /usr/share/man/man{0..10}'
- apt-get -y install locales
- echo "en_NZ.UTF-8 UTF-8" >> /etc/locale.gen
- locale-gen
- echo "LANG=en_NZ.UTF-8" > /etc/default/locale
- apt-get -y install libdbd-pg-perl libyaml-perl php php-cli php-pgsql php-xml postgresql-client postgresql libapache2-mod-php curl xmlstarlet
- curl 'https://gitlab.com/davical-project/awl/-/archive/master/awl-master.tar.gz' | tar zxf -
- mv awl-master /usr/share/awl/
- chown -R www-data /usr/share/awl/
- dpkg --ignore-depends=libawl-php -i *.deb
- echo '127.0.1.1 regression mycaldav myempty' >> /etc/hosts
- rm /etc/apache2/ports.conf /etc/apache2/sites-enabled/000-default.conf && touch /etc/apache2/ports.conf
- cp testing/apache-site.conf.example /etc/apache2/sites-enabled/davical-regression.conf
- sed -i 's/\/path\/to/\/usr\/share/g' /etc/apache2/sites-enabled/davical-regression.conf
- mkdir /usr/share/davical/testing/
- cp testing/*.php /usr/share/davical/testing/
- rm /etc/davical/config.php
- cat testing/regression-conf.php.example | sed 's.//$c->dbg.$c->dbg.' > /etc/davical/regression-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/mycaldav-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/myempty-conf.php
- mkdir -p /var/log/davical
- chown www-data /var/log/davical
- sed -i '/peer/d' /etc/postgresql/13/main/pg_hba.conf
- echo 'local all all trust' >> /etc/postgresql/13/main/pg_hba.conf
- pg_ctlcluster 13 main start
- su postgres -c 'createuser davical_dba --createdb --createrole --superuser'
- su postgres -c 'createuser davical_app --superuser'
- su postgres -c 'createuser testrunner --superuser'
- pg_ctlcluster 13 main restart
- a2enmod rewrite
- apache2ctl start
- useradd testrunner
- cd testing && su testrunner -c 'IS_CI=yes ALLSUITES="regression-suite binding carddav scheduling" ./run_regressions.sh all x'
after_script:
- mkdir -p apache2_log
- cp -r /var/log/apache2 apache2_log/test
- bzip2 apache2_log/test/*
- mkdir -p davical_log
- cp -r /var/log/davical davical_log/test
test_bullseye_carddavclientinterop:
stage: testall
image: debian:bullseye
artifacts:
paths:
- testing/report.xml
- carddavclient-master/testreports/unit/results.html
- apache2_log/*
- davical_log/*
- carddavclient-master/testreports/interop/*
reports:
junit:
- testing/report.xml
- carddavclient-master/testreports/unit/results.html
when:
always
script:
- apt-get -y update
- bash -c 'mkdir -p /usr/share/man/man{0..10}'
- apt-get -y install locales
- echo "en_NZ.UTF-8 UTF-8" >> /etc/locale.gen
- locale-gen
- echo "LANG=en_NZ.UTF-8" > /etc/default/locale
- apt-get -y install libdbd-pg-perl libyaml-perl php php-cli php-pgsql php-xml postgresql-client postgresql libapache2-mod-php curl xmlstarlet composer phpunit
- curl 'https://gitlab.com/davical-project/awl/-/archive/master/awl-master.tar.gz' | tar zxf -
- mv awl-master /usr/share/awl/
- chown -R www-data /usr/share/awl/
- dpkg --ignore-depends=libawl-php -i *.deb
- echo '127.0.1.1 regression mycaldav myempty' >> /etc/hosts
- rm /etc/apache2/ports.conf /etc/apache2/sites-enabled/000-default.conf && touch /etc/apache2/ports.conf
- cp testing/apache-site.conf.example /etc/apache2/sites-enabled/davical-regression.conf
- sed -i 's/\/path\/to/\/usr\/share/g' /etc/apache2/sites-enabled/davical-regression.conf
- mkdir /usr/share/davical/testing/
- cp testing/*.php /usr/share/davical/testing/
- rm /etc/davical/config.php
- cat testing/regression-conf.php.example | sed 's.//$c->dbg.$c->dbg.' > /etc/davical/regression-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/mycaldav-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/myempty-conf.php
- mkdir -p /var/log/davical
- chown www-data /var/log/davical
- sed -i '/peer/d' /etc/postgresql/13/main/pg_hba.conf
- echo 'local all all trust' >> /etc/postgresql/13/main/pg_hba.conf
- pg_ctlcluster 13 main start
- su postgres -c 'createuser davical_dba --createdb --createrole --superuser'
- su postgres -c 'createuser davical_app --superuser'
- su postgres -c 'createuser testrunner --superuser'
- pg_ctlcluster 13 main restart
- a2enmod rewrite
- apache2ctl start
- useradd testrunner
- cd testing && su testrunner -c 'IS_CI=yes ALLSUITES="regression-suite binding carddav scheduling" ./run_regressions.sh all x'
- cd ..
- curl https://codeload.github.com/mstilkerich/carddavclient/tar.gz/master | tar zxf -
- cd carddavclient-master
- composer install
- echo '<?php declare(strict_types=1); namespace MStilkerich\Tests\CardDavClient\Interop; use MStilkerich\CardDavClient\{Account,AddressbookCollection,Config}; final class AccountData { public const ACCOUNTS = [ "Davical" => [ "username" => "user3", "password" => "user3", "discoveryUri" => "http://regression", "syncAllowExtraChanges" => false, "featureSet" => TestInfrastructureSrv::SRVFEATS_DAVICAL, ], ]; public const ADDRESSBOOKS = [ "Davical_0" => [ "account" => "Davical", "url" => "http://regression/caldav.php/user3/addresses/", "displayname" => "user3 addresses", ], ]; }' > tests/interop/AccountData.php
- mkdir -p testreports/interop
- phpunit -c tests/interop/phpunit.xml --no-coverage
after_script:
- mkdir -p apache2_log
- cp -r /var/log/apache2 apache2_log/test_bullseye
- bzip2 apache2_log/test_bullseye/*
- mkdir -p davical_log
- cp -r /var/log/davical davical_log/test_bullseye
build_buster_latestphp:
stage: testall
image: php:apache-buster
script:
- apt-get -y update
- bash -c 'mkdir -p /usr/share/man/man{0..10}'
- apt-get -y install build-essential devscripts fakeroot dh-exec jdupes doxygen graphviz
- mv debian/changelog debian/changelog.old
- >
cat
<(echo "davical ($(cat VERSION)-99~git$(date +"%Y%m%d")-$(git rev-parse --short $CI_COMMIT_SHA)) unstable; urgency=medium")
<(echo "")
<(echo " * Build on CI")
<(echo "")
<(echo " -- ${GITLAB_USER_NAME} <${GITLAB_USER_EMAIL}> $(date -R)")
<(echo "")
debian/changelog.old
>debian/changelog
- rm debian/changelog.old
- debuild --prepend-path=/usr/local/bin -us -uc -b -d
- 'mv ../davical_*_all.deb ./davical.deb'
artifacts:
paths:
- '*.deb'
test_buster_latestphp:
stage: testall
image: php:apache-buster
artifacts:
paths:
- testing/report.xml
- apache2_log/*
- davical_log/*
reports:
junit: testing/report.xml
when:
@ -56,9 +208,11 @@ test:
- mkdir /usr/share/davical/testing/
- cp testing/*.php /usr/share/davical/testing/
- rm /etc/davical/config.php
- cp testing/regression-conf.php.example /etc/davical/regression-conf.php
- cat testing/regression-conf.php.example | sed 's.//$c->dbg.$c->dbg.' > /etc/davical/regression-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/mycaldav-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/myempty-conf.php
- mkdir -p /var/log/davical
- chown www-data /var/log/davical
- sed -i '/peer/d' /etc/postgresql/11/main/pg_hba.conf
- echo 'local all all trust' >> /etc/postgresql/11/main/pg_hba.conf
- pg_ctlcluster 11 main start
@ -71,4 +225,65 @@ test:
- useradd testrunner
- cd testing && su testrunner -c 'IS_CI=yes ALLSUITES="regression-suite binding carddav scheduling" ./run_regressions.sh all x'
after_script:
- cp -r /var/log/apache2 apache2_log
- mkdir -p apache2_log
- cp -r /var/log/apache2 apache2_log/test_buster_latestphp
- bzip2 apache2_log/test_buster_latestphp/*
- mkdir -p davical_log
- cp -r /var/log/davical davical_log/test_buster_latestphp
test_stretch_latestphp:
stage: testall
image: php:apache-stretch
artifacts:
paths:
- testing/report.xml
- apache2_log/*
- davical_log/*
reports:
junit: testing/report.xml
when:
always
script:
- apt-get -y update
- bash -c 'mkdir -p /usr/share/man/man{0..10}'
- apt-get -y install locales
- echo "en_NZ.UTF-8 UTF-8" >> /etc/locale.gen
- locale-gen
- echo "LANG=en_NZ.UTF-8" > /etc/default/locale
- apt-get -y install libdbd-pg-perl libyaml-perl perl postgresql postgresql-client libpq-dev xmlstarlet
- curl 'https://gitlab.com/davical-project/awl/-/archive/master/awl-master.tar.gz' | tar zxf -
- mv awl-master /usr/share/awl/
- chown -R www-data /usr/share/awl/
- dpkg --ignore-depends=php,php-pgsql,php-xml,libawl-php,php-cli -i *.deb
- docker-php-ext-install -j$(nproc) pgsql
- docker-php-ext-install -j$(nproc) pdo_pgsql
- docker-php-ext-install -j$(nproc) calendar
- echo '127.0.1.1 regression mycaldav myempty' >> /etc/hosts
- cp testing/apache-site.conf.example /etc/apache2/sites-enabled/davical-regression.conf
- sed -i 's/\/path\/to/\/usr\/share/g' /etc/apache2/sites-enabled/davical-regression.conf
- mkdir /usr/share/davical/testing/
- cp testing/*.php /usr/share/davical/testing/
- rm /etc/davical/config.php
- cat testing/regression-conf.php.example | sed 's.//$c->dbg.$c->dbg.' > /etc/davical/regression-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/mycaldav-conf.php
- ln -s /etc/davical/regression-conf.php /etc/davical/myempty-conf.php
- mkdir -p /var/log/davical
- chown www-data /var/log/davical
- sed -i '/peer/d' /etc/postgresql/9.6/main/pg_hba.conf
- echo 'local all all trust' >> /etc/postgresql/9.6/main/pg_hba.conf
- pg_ctlcluster 9.6 main start
- su postgres -c 'createuser davical_dba --createdb --createrole --superuser'
- su postgres -c 'createuser davical_app --superuser'
- su postgres -c 'createuser testrunner --superuser'
- pg_ctlcluster 9.6 main restart
- a2enmod rewrite
- apache2ctl start
- useradd testrunner
- cd testing && su testrunner -c 'IS_CI=yes ALLSUITES="regression-suite binding carddav scheduling" ./run_regressions.sh all x'
after_script:
- mkdir -p apache2_log
- cp -r /var/log/apache2 apache2_log/test_stretch_latestphp
- bzip2 apache2_log/test_stretch_latestphp/*
- mkdir -p davical_log
- cp -r /var/log/davical davical_log/test_stretch_latestphp

View File

@ -113,6 +113,17 @@ $c->admin_email ='calendar-admin@example.com';
// $c->local_styles = array();
// $c->print_styles = array();
/**
* Allow users to see all accounts on the server in the web interface, or only
* their account and the accounts they have a relationship with. If set to
* false, users need the READ privilege to display another principal and their
* collections, and they need to be in the same group with another principal to
* find them in a drop-down list for granting privileges.
* Admins will still be able to see all accounts.
* Default: true
*/
// $c->list_everyone = false;
/***************************************************************************
* *

View File

@ -134,6 +134,7 @@ $c->locale_path = '../locale';
$c->base_url = preg_replace('#/[^/]+\.php.*$#', '', $_SERVER['SCRIPT_NAME']);
$c->base_directory = preg_replace('#/[^/]*$#', '', $_SERVER['DOCUMENT_ROOT']);
$c->default_privileges = array('read-free-busy', 'schedule-deliver');
$c->list_everyone = true;
$c->enable_auto_schedule = true;

View File

@ -13,7 +13,7 @@ function log_setup_error($errno , $errstr , $errfile , $errline) {
error_log('DAViCal setup.php: Informational: '.$errfile.'('.$errline.'): ['.$errno.'] '.$errstr);
}
function catch_setup_errors($errno , $errstr , $errfile , $errline , $errcontext ) {
function catch_setup_errors($errno , $errstr , $errfile , $errline , $errcontext = null ) {
if ( $errno == 2 ) {
// A working installation will regularly fail to include_once() for several files as it searches for the location
log_setup_error($errno , $errstr , $errfile , $errline);

View File

@ -1184,7 +1184,7 @@ function rrule_expand( $dtstart, $property, $component, $range_end, $is_date=nul
$expansion[$date->FloatOrUTC($return_floating_times)] = $component;
if ( $date > $range_end ) break;
if ( $i++ >= $c->rrule_expansion_limit ) {
dbg_error_log( 'ERROR', "Hit rrule expansion limit of ".$c->rrule_expansion_limit." - increase rrule_expansion_limit in config to avoid events missing from freebusy" );
dbg_error_log( 'ERROR', "Hit rrule expansion limit of ".$c->rrule_expansion_limit." on %s %s - increase rrule_expansion_limit in config to avoid events missing from freebusy", $component->GetType(), $component->GetProperty('UID'));
}
}
// if ( DEBUG_RRULE ) print_r( $expansion );

View File

@ -134,6 +134,7 @@ $c->locale_path = '../locale';
$c->base_url = preg_replace('#/[^/]+\.php.*$#', '', $_SERVER['SCRIPT_NAME']);
$c->base_directory = preg_replace('#/[^/]*$#', '', $_SERVER['DOCUMENT_ROOT']);
$c->default_privileges = array('read-free-busy', 'schedule-deliver');
$c->list_everyone = true;
$c->enable_auto_schedule = true;

View File

@ -277,7 +277,8 @@ if ( ! $target_collection->IsAddressbook() ) {
*/
$params = array();
$where = ' WHERE caldav_data.collection_id = ' . $target_collection->resource_id();
$where_collection = ' WHERE caldav_data.collection_id = ' . $target_collection->resource_id();
$where = '';
if ( is_array($qry_filters) ) {
dbg_log_array( 'cardquery', 'qry_filters', $qry_filters, true );
@ -318,7 +319,7 @@ if ( $need_post_filter && ( $qry_filters_combination == 'OR' )) {
$post_filters = $qry_filters;
}
$sql = 'SELECT * FROM caldav_data INNER JOIN addressbook_resource USING(dav_id)'. $where;
$sql = 'SELECT * FROM caldav_data INNER JOIN addressbook_resource USING(dav_id)'. $where_collection . $where;
if ( isset($c->strict_result_ordering) && $c->strict_result_ordering ) $sql .= " ORDER BY dav_id";
$qry = new AwlQuery( $sql, $params );
if ( $qry->Exec("cardquery",__LINE__,__FILE__) && $qry->rows() > 0 ) {

View File

@ -67,7 +67,7 @@ function utf8ToUnicode(&$str)
$len = strlen($str);
for($i = 0; $i < $len; $i++) {
$in = ord($str{$i});
$in = ord($str[$i]);
if (0 == $mState) {
// When mState is zero we expect either a US-ASCII character or a
// multi-octet sequence.

View File

@ -180,14 +180,16 @@ class ldapDriver
}
/**
* Returns the result of the LDAP query
* Actually look up a user in the LDAP directory
* (this is the LDAP part of LDAP_check() below)
*
* @param string $filter The filter used to search entries
* @param array $attributes Attributes to be returned
* @param string $username username to check
* @param string $passwd password to check
* @return array Contains selected attributes from all entries corresponding to the given filter
*/
function requestUser( $filter, $attributes=NULL, $username, $passwd) {
function requestUser( $filter, $attributes, $username, $passwd) {
global $c;
$entry=NULL;

View File

@ -39,7 +39,7 @@ function create_external ( $path,$is_calendar,$is_addressbook )
}
}
function fetch_external ( $bind_id, $min_age = '1 hour', $ua_string )
function fetch_external ( $bind_id, $min_age, $ua_string )
{
if ( ! function_exists ( "curl_init" ) ) {
dbg_error_log("external", "external resource cannot be fetched without curl, please install curl");

View File

@ -64,6 +64,14 @@ if ( isset($privsql) ) {
$privqry->Exec('admin-collection-edit',__LINE__,__FILE__);
$permissions = $privqry->Fetch();
$can_write_collection = ($session->AllowedTo('Admin') || (bindec($permissions->priv) & privilege_to_bits('DAV::bind')) );
if ( ! $c->list_everyone ) {
$can_read_collection = ($session->AllowedTo('Admin') || (bindec($permissions->priv) & privilege_to_bits('DAV::read')) );
if ( ! $can_read_collection ) {
dbg_error_log( 'LOG WARNING', 'Access to id "%s"/"%s" by user "%s" rejected.', $id, $collection_name, $session->username );
header('Location: index.php');
@ob_flush(); exit(0);
}
}
}
// Verify CSRF token
@ -416,7 +424,13 @@ if ( $editor->Available() ) {
$grantrow = new Editor("Grants", "grants");
$grantrow->SetSubmitName( 'savegrantrow' );
$grantrow->SetLookup( 'to_principal', 'SELECT principal_id, displayname FROM dav_principal WHERE principal_id NOT IN (SELECT member_id FROM group_member WHERE group_id = '.$id.') ORDER BY displayname' );
$limit_grantrow = '';
if ( ! $c->list_everyone ) {
if ( ! $session->AllowedTo( "Admin" ) ) {
$limit_grantrow = 'AND (principal_id = \''.$session->principal_id.'\' or principal_id in (select member_id from group_member where group_id in (select group_id from group_member where member_id = \''.$session->principal_id.'\')) or principal_id in (select group_id from group_member where member_id = \''.$session->principal_id.'\'))';
}
}
$grantrow->SetLookup( 'to_principal', 'SELECT principal_id, displayname FROM dav_principal WHERE principal_id NOT IN (SELECT member_id FROM group_member WHERE group_id = '.$id.') '.$limit_grantrow.' ORDER BY displayname' );
if ( $can_write_collection ) {
if ( $grantrow->IsSubmit() ) {
$_POST['by_collection'] = $id;

View File

@ -1,6 +1,10 @@
<?php
param_to_global( 'external_active', '([tf])', 'active' );
if ( !$session->AllowedTo("Admin" ) ) {
@ob_flush(); exit(0);
}
$browser = new Browser(translate('External Calendars'));
$browser->AddColumn( 'collection_id', translate('ID'), 'right', '##collection_link##' );

View File

@ -35,6 +35,9 @@ if ( isset($principal_type) ) {
$browser->AndWhere( 'type_id = '.$principal_type );
}
if ( ! $c->list_everyone && ! $session->AllowedTo( "Admin" ) ) {
$browser->AndWhere( '(pprivs('.$session->principal_id.',dav_principal.principal_id,'.$c->permission_scan_depth.') & 1::BIT(24))::INT4::BOOLEAN' );
}
$c->page_title = $browser->Title();

View File

@ -33,6 +33,14 @@ $can_write_principal = ($session->AllowedTo('Admin') || ($session->principal_id
if ( !$can_write_principal && $id > 0 ) {
$target_principal = new Principal('principal_id', $id);
$can_write_principal = $session->HavePrivilegeTo('DAV::write', $target_principal->dav_name());
if ( ! $c->list_everyone ) {
$can_read_principal = $session->HavePrivilegeTo('DAV::read', $target_principal->dav_name());
if ( ! $can_read_principal ) {
dbg_error_log( 'LOG WARNING', 'Access to "%s" by user "%s" rejected.', $target_principal->dav_name(), $session->username );
header('Location: index.php');
@ob_flush(); exit(0);
}
}
}
@ -748,7 +756,7 @@ function group_members_browser() {
function grant_row_editor() {
global $c, $id, $editor, $can_write_principal, $privilege_names;
global $c, $id, $editor, $can_write_principal, $privilege_names, $session;
$grantrow = new Editor("Grants", "grants");
$grantrow->SetSubmitName( 'savegrantrow' );
@ -756,7 +764,13 @@ function grant_row_editor() {
if ( isset($_GET['edit_grant']) ) {
$edit_grant_clause = ' AND to_principal != '.intval($_GET['edit_grant']);
}
$grantrow->SetLookup( 'to_principal', 'SELECT principal_id, displayname FROM dav_principal WHERE user_active AND principal_id NOT IN (SELECT to_principal FROM grants WHERE by_principal = '.$id.$edit_grant_clause.') ORDER BY fullname' );
$limit_grantrow = '';
if ( ! $c->list_everyone ) {
if ( ! $session->AllowedTo( "Admin" ) ) {
$limit_grantrow = 'AND (principal_id = \''.$session->principal_id.'\' or principal_id in (select member_id from group_member where group_id in (select group_id from group_member where member_id = \''.$session->principal_id.'\')) or principal_id in (select group_id from group_member where member_id = \''.$session->principal_id.'\'))';
}
}
$grantrow->SetLookup( 'to_principal', 'SELECT principal_id, displayname FROM dav_principal WHERE user_active AND principal_id NOT IN (SELECT to_principal FROM grants WHERE by_principal = '.$id.$edit_grant_clause.') '.$limit_grantrow.' ORDER BY fullname' );
if ( $can_write_principal ) {
if ( $grantrow->IsSubmit() ) {
if ( $grantrow->IsUpdate() )

View File

@ -124,6 +124,36 @@ the options being
This should allow for convenient updating of tests and expected results.
TEST SUITES
-----------
binding
Test binding locations under a principal.
carddav
CardDAV related tests.
ischedule
Scheduling extensions.
regression-suite
Bulk of the regression tests.
scheduling
Scheduling extensions.
timezone
Timezone tests. To run these you need to have run:
../zondedb/update-tzdata.sh
which in turn needs a binary called vzic. You build this from:
https://github.com/libical/vzic
WRITING TESTS
-------------

View File

@ -57,6 +57,10 @@ while( <STDIN> ) {
/^Content-Type: / && $no_content && do {
$_ = "";
};
/^HTTP\/1\.1 100 Continue/ && do {
my $swallow_next_line_as_well = <STDIN>;
next;
};
print;
}

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 204 No Content
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -65,6 +65,363 @@ VERSION:2.1
UID:a nice UID
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/F06EC844-EACD-4ADF-8823-588603991E04-ABSPlugin.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
N:McMillan;Andrew;;;
FN:Morphoss Ltd
ORG:Morphoss Ltd;
EMAIL;TYPE=INTERNET;TYPE=WORK;TYPE=pref:andrew+davical@morphoss.com
TEL;TYPE=WORK;TYPE=pref:+64272332426
PHOTO;BASE64: /9j/4AAQSkZJRgABAQAAAQABAAD/4QBARXhpZgAATU0AKgAAAAgAAYdpAA
QAAAABAAAAGgAAAAAA AqACAAQAAAABAAAA2qADAAQAAAABAAAA2gAAAAD/2wBDAAIBAQIBA
QICAQICAgICAwUDAwMDAwYE BAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkNDg0M
DgsMDAv/2wBDAQICAgMCAwUDAwUL CAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCws
LCwsLCwsLCwsLCwsLCwsLCwsLCwv/wAAR CADaANoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQ
EAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgED AwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE
1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRol JicoKSo0NTY3ODk6Q0RFRkdISUpT
VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWW l5iZmqKjpKWmp6ipqrKztLW
2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3 +Pn6/8QAHwEAAwEBAQ
EBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3 AAECAxEEBSExB
hJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5 OkNERUZH
SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaan qKm
qsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAI
R AxEAPwD6Nuf2mfHfju2aDwb488cWzx/6uf8At+6AY+/7zJFR2fxp+IXhvwg7a18U/Gmoar
5x3+R4 kuXWL0UjzOOPXBr5s+FF9c/EnUp9GfUptK0bSxC2rtA5S5uWlz5dsjj7gKqWcj5sY
A6mvdE/Zo8F eD7iGf4TW82lXd1bnzw0ZKSknuScsepyfwruhR5IObdj1YzVWoqcUi6/7TPx
JzgfEHxx/wCD66/+ OUwftMfErP8AyULxz/4Pbr/45XOa3oF94akxrEOIz0nj5jP1/u/jVIR
7lyvO78qyjKMlc3qYdxvd HdaN+1f8StJug7eO/F9yp6pNrNy4P5yV5t8eNG+LvxjuZtX/AG
df2gfjF4U8QyAltGn8b6mdNu2/ uxHz/wByT2xxWjHHnHr2q/o9jNdX0EdgG86RwECjkkmui
KUnoTQrTwdT2lPR+mn4mJ/wSb8eftBS a/8AFHUP2iviL8Ur650RY9MttP1nxTfXsUM+Gd3R
ZZWCnhBkdj719g6b8VvGlhpdrBP4u8TzTIix s76pOS7dyTvye9VNC8OQ+HPDkjiKOO+1N42
vJFHM8ioAWb1OEUUxIPMu0DAYUFzj/PvUVYq6ujqq VvrlWeIlFJvolotDWf4t+Ln+VvFniZ
WB4xqk/P8A4/Ug+MXi9WVp/FPiJGXgMNRmKN/vLu/WsWS3 8wncAcfpQLd05ALr6d6zi+Rid
GEuh0bfFnxVdFQfFPiOCU/dxqc2x/od9Zmp/EbxvExNv4u8Uq2f unVZ8H6HfVBLcoD9mIIP
WNvun/CrNrNkeVKpcH/lk/3h/unvW6cJoydFRW2hRb41eNoXKTeLfFAY dc6pP/8AF1Inxt8
ZZw3i3xP/AODWf/4up7/w9DqcZa3+bHVejpWBfaDJZFiQWQHrjkfUU+VLoR7J PVI34fjV4w
7+LPEx/wC4pOf/AGerEXxp8X8Z8V+JD/3E5v8A4uuNCkdPpUsUhU80WRm6S7Hbw/GP xaw+b
xT4jz/2E5v/AIqrEPxf8WHk+KfEJ+upTf8AxVcRFcDHB5q7a3fQtzVLl7Gcqa7HaRfFrxUe
vifxCf8AuJTf/FVZi+K/ik9fEviD/wAGE3/xVclBIp+7VuCQE/N+dXyx7GMoHVR/FLxPj/kZ
Nf8A /BhN/wDFVYh+KPiZ/wDmYtd9P+P+X/4quYj6DPSrERyevWqjGNjNxTOoi+JviQn5vEG
t/X7fL/8A FVdtviV4hB/ea9rR/wC32X/4quWgPTPrV2AZaq5Y9jNrodXB8RdfOM65q5/7fJ
P/AIqr9t491xvv 6zq343kn/wAVXMWw5BxzWhaL0zVKMX0IsdFB441pz/yF9UP/AG9Sf41dH
jDWMf8AIW1P/wACn/xr DtFwcVc2j0rVQj2GnY/OHVP2YdL8S+K9X1fwlqV3obaldRy3EMKg
xTPEuI5MdmCtjivUPC3hFPDO mpF58t1MFAaaQ5Zq+dP+CbPxj8bfFjwdf/8AC2rGSwmsHEZ
SY5dyABkd8GvqWKIk5HcdK8HFe0pS dKTvY+mwcKbgqkI2Kc9ms6lZVDAjBBGQa5HXfhTBNK
0uhk2kpySnWNj9O34V3XkEnLUNB5gOBXKp OOx6TSkrNHjd7oN7os23VoWT+645U/Q16d+zx
4Xh1DVbi7lQSS2ygcjiInoPrjn2zWpdWMX2Vjcq rKoJIIyK7L9n7w4tv4PF15YWTUJWnOBj
IJ4/SvSwdR1JO62PLx1CNFKUXubmux+UbaH/AJ5xmRh7 scD9BVG0hy87nsFQfz/wpbXV28S
atq8xCiC3vntICP4liAUn/vsP+VXbe3H2BWI5lZm/XA/lVVZc zuYULOKt1Kiwk47U9bc9+l
Wktznnr0p4t+fasWdKKTWYPQEHsRSSW2VxcqWBPDDtWkLbdinfZwRg jr2qLlLYzdkkBBfdK
qjhwf3i/j/EPrU4Md9HuusMBx5qDAHsw7VZax7xnn0PSoXtlMv7tjDORgEf xfh3FWqzjuQ6
S6GTq/hMffhCoTyCPun/AArDudPktZNtwpUn9a662vXiupYHAjZAGOeYnB6e6Hg+ 1Sz6XDq
SFCoWQjPlN391P+FbxkpK6MXE4kRnrTo5Cg4Na2p+HZbJ8wgso7H7w/xrNKYb09qG7EOH cf
FetGPmq5a6wA2HNZjdajdypOKpTM5UvI6u01RXxzxWjBOGHymuCjvGjbIY8e9XLPxRJbt8+S
B3 rRTMHQfQ723lGcVo2pyRj1rjdP8AF8MoxI20j1rX0fxlY3GrW9nFMrXFw21FHOTWikcs4
NdDsLUE 4FaVmmG96q29o6kAjB/lV61gKkE1Sepm4GhZrk1dC8dTUFlEABV8R8VvF32Iasfi
n4F+Mviz4KeG NGk+H6x+IIZbqSDUPPP+lS7chTGf4x8jNj0ZcZJr6y+Dn7QmifFDwVYajcX
EOmXt1K1q1ncOEl89 eGRVPJ618XeJLa5l1vwzofhNngmskikiGcOssxQw5PYiMWIP/XRq9A
+GusmPxHqt34Us7Fl8PJLN Y30sQeYqWSKIZPeQ/Zj/ANtmrPHYenWjzJa738r2V/Xp1sZ5b
mtWg+WWq2/C/wArep9qIgYZ7HpT lgBA7V4X4C/bIiuLaYeM7Tb5MHnrJEcb0yApIPdt0Z/4
GK7o/tSeB9K0ywn8a+INM0Ga+IUW19Os csTEKcOP4eHXk4HzCvCq0J03aUT7Khj6FZXU0dT
4oZotNaOHO+4IiXHqxx/WvbPBmmp4f8O2yHCp Zwbj+AzXjHhyW28c+NNCTRrm3vLORzdCWG
QSI6qOCGBIIya941Rfsfh6bYELTAQqGGQc9f0BrtwU eWm5PqcmYz55qKfQ4/S9HXSNHWGyX
H3pCOu53Jdj+LMavwxr9miSM58tAv6VmrFdaTwrEoP4JGLI fo/Vfo2frV2z1CK6lEcwaCY/
wPwW/wB09G/CokiadtEWRDzzUq2xxU0cZ/j+Ye3Wp0jDdOahnQkV RbZ+7Tzb46iraRYwAPx
p6w57VDKSKYtSBk44rPurbzPEFqP7kbsf0H9a3GiwORXLeJvHOl+D9cNz 4ou4rS3WDYHc9W
znAHU9KiWhVuhctbbN/ftIMhSi/kuf601rMqn+j42/e8tugPqD1U/SrOg39vrl hNeaRKJ4L
li0bjIBGAO/0q7NYrJz0Ydx1ojJrVCSUlqZf2oSjZdo0g9D/rU+n94frWfqnh2O8iMt kQ4/
vKOR9RWvdWIYf6Qu4Kchh1FU5kkt28xSx/6aJ97/AIEOjfzreNW/xESpNbHGajZS2Tfvhlex
HQ1nTXOMktiut17UopoSJlQMeN68o31HY/WuG8QWcltuaJsL125/kacpWBUXJXHT6moB3NV
KfXVQ nJFc5qWvi3cqzfN0x3rLudVMsJk1GQRxDnk4/OodRomVFHTXXiySQlLQjjqx7f41q/
CHxhZ6b8UN J+3O00gnyyj5mYYNeSan4vkv3MGhkxx9DLjk/wC6K2/g8v2H4g6Q7kkm6QMxO
c5OOv41yyx3K+WJ r/Z/uuU9D74tLa18RWS3GjSK6n07exHaozYNDJtkXDVyOkzXOjXXnaVI
Y37gj5XHoRXeaB4ks/FK rDeKLe8A+6T191PevTw+LhiFyvSR5OKwUqGq1RFbQlT7VcGcd6l
n017A/P8AMh6MOn4+lHk/Wu5X WjR50j8kdH8T/Dj4va02rarDL4T8SSROq3cTb7fzWjKLIV
PdSVYdOUX0q7c/s9at4G+GV4vhWW31 UareoBdWJ3rFAikRFsdMPJGx9BbD1FfKUvh3xF4P+
PieA9A+0a3eSaWmprmLaVBRJPKPPLBZYsnj lj6V6Z8Kv2mNT8E6jHFYXl3p1ypAe1mBAI90
Pak17WOj00+7p6Hnxw0FLnirPXbbXd22v59ToTpE N8jxuDDBf3KwjcMeXbQqGc/grj8bc+l
fLPxE8L6v+0J8TfE+tw38tuxuTGtu0IljfZl2DDrwZNnB H+rHpX3lF8WvBvxn057T4macdM
vpYZLddS08BSgkVlYlehyHYf8AAjXndn+xHrvw5tJtQ+EWo2vj HTpvMkeS3G26G9izF4ick
5P8Oa7MG17VuTtppfv6/wDDGeLpclDkaum1e2rUVe+nm30PO/2I/iHr /wCzJNa3HgXVXvrq
3R1u9PnkY20pZiflQ8x44AxxgfjX6wW3iLUfF1j4EfXbQadeXemNrN/ao5dY HaNEWPdgZwZ
H7fw1+fn7GnwktvFnxxbRtcgCXWryRwuHj+ZERi8gwRw3A/I1+m2vWytr8/kooW3R LZOPuh
Rkj82P5Us2jy8seTll18/61N8jptuShV56d9PLuvyMSSIlm2oXVU3Ed+uP8aqHSLe+RhAQ A
TkxsuVz9O31GK3I7YpHKx6swUfgM/1qCewSc5cYYdGHBFeFdp6H1qSluZEX2rSXAB3Rj+GVi
Vx7 SdR9G/OtO11GO4kCNmKYj7j8E/T1HuKjlml0xHN0BNEP4h97H071yni/4haZpVkDFdwQ
vJIUW2kX JY4znacbfqMUpW6jV4bHb31/DpFlLc6pNFBbQKXkkdgFQAZJJPQVx2h/tLeDfEO
rrYaTqqy3EpIh JgkRJ8dTGzKA4A5yCa+Ov2t/245hpmr6KmV02yeGK9dwZVILKZArj+Hy88
EEnJ9K8W8a/tpTvpmn DwO9nYOBvjvrhzJ5mekrL0XGfU5z2qGmmS6rufoV8X/2xfBHw8e7s
LzxDp39o2S77i3WYGWBcEkk Dp06V8I/FL/gojH8Q/Gd5DpKxX1lbzRyC3dWdn43Abh04+nP
rXwT8cf2ttQ8K/EvVYvFN4ur3l4j JNNHhI5VLMygBc8EuxOf6V4NN+07rei3k62Ny9rDOAC
I3OSoOVBPfHvV+yja8tjOWJSXxWufvR+y r+1Nc/EbxPFENRl02xihE0Vi0gJmLMCxYjgjB6
HHJB7V9gaB4lsfEtuW02aOR1JV1DAlSOxxX83f wf8A25byw02wNxqE9pc2S7VklzjHbkc49
vevtP8AZc/4KKeIW1bTyusWZ3EbjaQlVfngMp+979Kz lh/ZJtbGscRe3+W6P17ltwVyAD71
QvLTZkxcZ7V4R4G/bot/FWmWokSFbl5PLkEf7wg9ztyOPzr3 Lwz4ih8W6LHdWjI6yruBUEB
h6gHkVDi46s6ozUjkfE0eLolD5Uh68ZDfUd643xBftBG0cwEe7sT+ 7b6H+H6Hiu/8TW4ac+
YM/WuB8WWhIZc5Ujoa5XNwZ3xgpRPLfHviy00m9UbWe4wQI9vP5+lcrJe3 fiObdqTAIOViX
IVf8TW78Q9OV3tGAztkdCfTpxVHTbbaBtyccVx4qtJy5U9Dow9GKjzLclsbMRqM D61veFGN
j4jsJo+PKuEb6YYVn28JA5XNXbRjDcowAypB/KsqOjQq12mfbkMO4ZxwwzTmstxVo8qy nKk
HBB9Qak0c/adKtZRyJIlYe+QDVsR4H0rqSsea1ojY8LeOntALbxKPNiPyiXGf++h/WurSw0y
V AyTJtYZGJeMV555IYncKT7IO3HtnpXo0swnTXLLU82tl8KkuaDsfjt+zxqsnxU/aP+JPiy
X91JbG LQoXA/1ElwxklVT/ALEc8i+32celW774IaD8Tf22fF2teJDJFpXhrTLeG+USfItw2
JJOv3QkZlGO P9Sa+gf2bvgx8OvDWmy/8Kr1c6gt/q82t3iXTATzySH5l/75eZR0++PSvKV+
Gfifwr8CvFf/AAsW wnsfGnxX8Tz2rw4yYxez+UoUrn5Vga7bI7MK75c1NtR00SPnOV72PP8
A4Y/A7xj43+F1r428AWkV 1p2qvLc2+lpNm9gtS7eUxRuWDJtYYycEVteAfinrXgrWgIZL3T
L2BsNGwKMD6Mpr6J0fwJeeBdDs oLW3ls4LSNY7eSL7iKoAADA4HQcZB9q0dRi0zxqkafFLR
7LVmiIKXuzZcRqP9scn8ciu1Jvrc6lQ a2Z7R+yF4Ai+MOu+HPinrmlxadqtla3NndTImxdS
OFWObb/eCmUFu/HpXsUcZuY2ncEG4dpjn/aJ I/QgUfCLxOuu/AeK80uwTS7J4zZ6dGihA8I
IiR9oPGTuIHoAe9XbuMQwFY8AAbR/KssS72X9ehvg KMaTk4rr+JmG3K26D+9lvzqhq95FpF
q812dqKMk1uXUW18L/AAjA/CvFf2zviJN4E+FV7/YiySah Iu6IxttaIDktn6ZFcTV9j1XLl
Vzzj9qf9tuD4TweXplncXUkMu2cx4PljB4/3uOlflX+2J/wUa+I +seNNZv/AAT4uuItFd2W
2gi0+JWgQ4+QyFSSeOSD1H0r6H+Jsmr6zoWoQ65NqH2+4GYYZYSY8MnS Qjq3OSRmvjH42Q6
NoPg29efVFEMCPm1aZZSk4bBL9O44XnpnnIqoW5tjCs1zas8/+GX7XviW+8Wy x+OtUlv7a4
cSyQ3LkoeMHgnk4x+Vc38Xfj63hq6vLf4d6kXtnMkawyR5EKsQTsbPTsOOlef+DPAO pfEPW
JrjSVeC08wlZNuAR7V39p+yrNqcDfblm8wnhvWtJuC6HoYXLcZmFO9OHo3+Z4TrPiC48Q3s
s93IXlf5yx/lULIbpPOib5j95T2r3Zf2MrkM7tKY1Xr8pxipNO/Ywvb19sDuT3OzrzWN01ds
S4Qz B3cl+J5tompQad9meaIXS4ACbiN3HTjtX0h4G8R6Kh0d9ImS0uvIZJlQ8BvlwPfv1xj
ArD0v9iTU dPzLZShZkX92JV3oT7is/wAOfATxT4M103N9pjRy26yOMy7ophg8KMdec1q60Z
WRU8lxeFsqkfuP tf8AZ98U3hlsJtF1HyNQmcQoYmyQmQDx64yc+2O9fXPwB/aG8Q/DTxpba
LqGvDWrC8Ls0d7AElic EAhWXrnp3HBr8sfgX8VvEvwo8X2qzRCOSbDB2G5kU9NpzgDmvq3w
H+0Zp194zsZ9eivNtmPN3uAZ EbI7gYxjPH+NZSiptKxzSUqV0/kfqdc6umqFCHQtLGH2g/M
n1/Oua8U2u7JHoa4n4U/G/SfiHaWt 5pWoWzyugTarhW/EZ/T2rv8AW0JiUsOSK8qrFp6ntU
JKUVZni3jrSPscEW9ifNuZnHsCRxWbaL5e 0LXT/EyLNlZMcE+fMufyrnrZMgZAzXDiF+8+R
1YXWl95YjJB+Xj1qZPvjp+FNVdp7D8acMbz14NT DdNBUR9v/Dhv7T8AaLOOfNsoW/8AHBW2
bQha5v8AZ8uvt/wd0Bic7bYJ/wB8kj+ldutvvU8V22ue Yo+6jMW2/P3pfJx2rR+xkrkDmmm
1bPQ0WMZKx+A2mX/jv4WRWF9cWd9LZ3lst7FcW5LOkbM4Uvt6 E+WxA9CD3Fe5fCD/AIKH6n
or20fiV4dTjt3DpHeIPMjYcZUnow55616bDYR2WkW7RwpNYRqLi2iI 4a2tUHkD/gf2K3Hv9
p968X/4KIfDXRfBPws0i30azT/hIrk2mnW86JiQzyMXkk46ny7aU8/89s19 GsSp2jKP9f12
Z8ZHSV1ofXnwy/bN8D/FKJYdRmGi6hMNp34COffsw+tdr468DaInhN9WWezitHG2 O5t3ESu
5HyrtPyFj2AKk9ga/Kz4W+ANfbxjouh+G7s3f2+8uIhPMScxRSLEHGPVzx7MK/S39hz4f a5
Jd3fh3xFEmteF5ozDqcU+WgO1soyk9G3KGXHIxmtuRN+49dzoVWfLe3kfVWquPB2jeCvDemx
Ig dT5ijpHHbwgE4/32Srkv7yaNXA5bJ+gGab4o0k3nxJS/lkLfYtNFoqH+FpJPMdvxCxinR
YN028/d j49SSf8A61c1Z3k/uO/Cq0SvK3zYY/Svjb9s/wCLhvNTvoPDmp6TEunCWKYSHzJG
5wy4+6OmOa+z Lq3Ei4cZ9a/Fj/gq58R/EH7L/iPxdp3gvxTPZxX12b9o5lWWKQSMfkUEZDg
jkZIJ578YqPM7I6qk mle2h5b+3x/wUv1Hwbpq6P4VuI/t7ECaMWrxowwQDuLYxjHCnnvXwz
4MPiH9qf4kPc+L7uSSxifz Jwo2RL6KqDAz7+leffE3xtf+PvFEt3rV/d6jcztlnmfc2T29v
wr6s/Zq8CQeCvBNrEqqLmVd8x7s 5/zitHJUV7u5tk+GeYYr3vgjv59j0XwN4I03w9aw21hb
KiRLtA28Cu1stJiZM26qMnnArDsm+zRI zHORjGOldDoVwWQgnv27159Rtn67l9KLSS6Ej2k
CIwlQN2PHFdN8PNDtZrxVu4kCdeBWVBpHmlTK uVfnGeldX4Wsi17CsKgpjDc4K1F0j6KlKn
CJ6XpPgHTdQsszW8TuThTjoK15v2b7DxFphjlhB342 sAMqfasPw1rn2W+WMlkBO1RnvX0t8
HPBEviAQlA8nmAEhRn9KuPvaI4cVGl7N+0St5nyD4+/4Jxy eI/C14loxt9Qs1aSzcIdr9Tt
9gTXx58Pfi1c6B8RLzQ/HhuLKaycwSxOv+qdDjbj3P5g1+/OmfDl YNKeO5hV14XDivxL/wC
C8HwIj/Z8/ai0/wASeHbVrW18XWLFwowrXMLAN+JV0P4V2Qbtys/LuIcJ Spr29NaXs/8AP9
D1L4U/En/hHvEEjaB4nSxv9SgGLZosAtnAzv8Aug+tfbn7PXxv1jxoq6f8QXga /Vf4F2grj
Ckc98c5r8cP2Y/G8nifWreC0sby+uJmBu2aQMwA6DJ+6o49q/U/9hp5bjw/qs+oLE81 sUSN
WkDPbwgk7F7/AHhnP0FY14JwfNujw8LWm6istD1z4ihZtMtyjZ2Xcqn6+lc3bR8DvW54ztjb
6QxY5WXUZXU56ggGsS2YZG2vDxK9/wCR9Bgr+yu+7LCLjhiaeOW5HOeTTUUk8fnSoTkjoRW
KKqO5 9h/snXP2v4Kabg58mSWP8nP+Nep2q7+2K8Z/Ys1AT/COWPvb38ox9Qp/rXtNkcqN3N
d55mys+7LM MOcAVN9gB7fpSQD5uRxVsNgU0jJ6H5x3Hw4uf+EztLEWMtrYReTbW6yLx5MI8
3H1P2bTk+rsPWvk f9vHxoPEn7SWi6Pp7ebH4cs7nXiBypI/cW2T/tC1jIH/AE3961vgj/wV
B13RkhtPEdxFqsKYXy7l dsgH41315c/BX9o7X7jV9UjvfCHii9hht2vIm82BliZGjUxk7do
MadCMhRmvoHhJRlZ6/wBfefEU 5X/qxyn7JHgR7H4l3lxJEzReGbCLTUJHPnKglk/EvND+Vf
q78DfACeBfAekaesapMsCNOQOXkIyx PvnNfI/7Hv7Lf/COTpGviDTPE6ahqpv7m7gHlvIrS
GVt0ZPBJEa4GQAor7tCCws5ZXOBFGSSe3Fd OFg4OU5eh1yklCMV5s4e/wDF2kaj4z1Gy0jU
7OTUIpR59oZR5sZ2rjjOR8u386fdTCJsX0bRejMP l/766V+WvxZ+KV34k+NXiTxBpl3NBLe
6nNLFLE5VggfamCP9lVr0L4Yf8FBfHXgWNbbWruLxBYgA NFfAmTHtIOfzzUzpRqa9S6OM5N
JLQ+3/AIg/EFPBrWMEbxPd6nP9ntEkfCu2xmPPsEJ9+B3r+cH/ AILVfG6++KP7ZfieM6ot9
o1hdNbWrx/6vcoHmAAddrEqD3xnvX6Kf8FRP+CmsXh/4M6B4j8D6Ze2 eq6feSRtCHAEEkke
ElVwMEAqwIKjO6vxT+M/7QeqfGG0tbbxHDYA6fPcSx3EUGyZ/Ok3srkfeAbO OmMmsacHSbk
/Q0r4pSjo9DkvCWnrqHjCyjPCvMpOTyBnrX2z8PiFsYVUZCgAc9RXyH8A9AbxL8SL SPqq5d
++AP8AIr7H8IRQ2wRnLKiMBXNXezsfUcLQtSlLuztIZkuLbGM7cZOOtbXhyMCZWj3HecAe l
cxDqlvJcEWU0ZPQgHGa3vDc88dwAVJSTkcg4NcUr2ufpOB/dJOWzPR9F0P7R+9fkR8le5q94
fv1 tb6aSQkAAgDH86zNF8RL9jLuQoC/Mc+1Q+GLs6zeSR4ByxYkdwK57NJntdLt6HrPw80F
dZ1QPcnK jawPevtH4K3h0PRVihi+YqqqwHOTXy7+zjoUeqZChdh43E56da+qPhtd20SwKpH
lxHO/d9444I+l duHukeZmlSM4ci1sfQXw7tf+EliWPbmKBAc471+UX/B0/wCDUX4a/Di9g2
I1rrd0Ax+9tMKgj9Af wr9eP2cdOXWzP9j+6FAGP4q/MX/g6J8Lz33hHwBodjB59zeXN3dLt
XeYyFABxXpOnzcrW5+cZxXX s5Um+x+W37Jt9FqUMdqsn2K9sD9qstQjH7xeu63fjDoxGQD0
Nfqj+wv4lvfFrXMPiC0hivo7YFZo ovKjvIA3Lbf4Tlun86/Pj4Efs6PCNBl8KLcww3YSSaQ
j5Y7xAwKj1RgM/ifSv04/YN0tNS+G0erX dt5Vy6vEjHkqu750J74ZePbFcmISim2eFhXzyj
Fd/wCvM7f4kRpFoFusYchLpgcnPODmuUhAA7c8 Vv8Aja5mm0a58wkrFqkir7DBrnoDnH0rw
MUrzXofTYP+F82W4+Op7UPKF6dKjBJGfzpC27gnpWMY 9WVNn0/+wbc/avCGuwZOYrxHx6bk
/wDsa+g7aEgZ7Gvmv/gnveCW88S2rHjZBL+rj+tfUlvZbkBF dyWh5j+0vNkdswEnzdKvADH
Sq72JRjjNJ+8HrVpGLPxLtvg/4D+JerfE/wAe+OdPiHh7RJ5jZi3J h22ljbSSuVK4wWWK0j
z/ANNz3rzz4MfA/Vte8E+DtQhv/KvNf0w6rc28gwtpEWmZBnr/AKq3kc59 vWu//aehf4T/A
LBmh+EtJhkGsfEnUbDw5DHg73a8kF9cfiLaKzQ/XFeqeGNCttIvdSygW3gt7bw9 Zqg42Fha
jH1isrtv+2+e9fQYeUnonu7L8O/rf5bnwtRtWS6l/wDZg8K+LE8Y6fZ/DKS8k1MMrjym ICj
g7n7BR3Jr9BP2iPH178MP2W/Ees+JpoW1W10lw8kfyo85TauPq7LXN/sS+BNP8KfDUXmmWqR
3 OosWlmI+eQA8ZPp7VwX/AAV18cnQ/wBnSz0S1YibXtRijYDqY48yt+qIPxr0cRZJpbGibS
956n5s fayAVLZ24GSetMkvjHHuRuR2qoztGSsgPB5zVe6nfqn3T2rj5uoJM8m/bW1LS9Y+C
+s2fi8ExCHf F/eRwflYfjX5fXqeXdOFfeATz61+pP7UHwTb45/DufSY7qWynJDpLGu48c7S
MjIPpmvzb+Kfwrvv hV4qudL1lhI0bfI4UrvXPUg8qeOlZSvPbcubvoemfsXaHDI2salKy+d
EUgUHqAQSf1Fev6j4k8yb yIJNuXwyg8n8a8c+A/hK9sfAE+q+Hr+S1uGlZZo9u5ZYxjIHcN
1wRXZ+OfAc99qbp4etoLUOq7pX UOwGOozyT71zpK75mfc5NOdHDw5I7a/edvfxXttatNoU1
oZ9o+SV8FfeqnhT4zeI/Duqbbq1F2iH BMcqsvucZzXAXvwO1iSGx/sh5pCFKSiQuUcZJzlf
r0rR17wVNpFlYQ2vkxtbxlbh1BQzEk5IPt0G fShxp9X/AF956tPHY2pN/u+W3no/wPdvCPx
j/wCEwaS3tlZHYhJEU/dOea9Gm1C78FWklyI5NksK lcDGctg18s/swfb5viDNa+GY0uIojg
mQEEsDg59K+8vjF4yv5/2a7PTNf8Nafo+tWzgw6i1ySl1G wKgLHs5bdwDuxuxmuepStU5Fs
e5SzWpHB+2n1dr9DjfAP7bdt8NlS3vY5toOAFPXsc5r6V+Bf7Xm mfEPWbKHTGk2zEKybuF9
s1+ZPiG41iCS4fbNK9oRtT7PGfNHcnKkg17f+xf8TfEF3erd+HvDwuBb SrF5JQJLPIT92Nc
jd1HOO9bU6SWt9Ec7z2Sm4VYtf9u3/FXP6Jf2KtPW60cTmI+S9uHVuhU5wVP5 gg+h9q/M7/
g5pmGhfEv4e20bj7RPDLLChXPmRrMpPT0B5PpX15+y5/wULtPh18E9CHiHQnklvLh7 aSG3m
JuYGQcpJAyK6Nk8DLA84Jr47/4L863aftE/tM/ASTQ7qztbCbQ7rUA0U/nTSQTzIiytGB+7
RtpUB8HIbgba3hze15ls/wBEz4DH4idavUqfZlovl2/4B8XfBzU5dR1DTYtbu30+xjja5SFD
tMMi qygDHsAPq3vX39+w9BewfB/Gs7VCzHygF253IrsSPXLn9a+d/Cv7NulfHj4zQRaLBJY
WtxPE0cSY SSPAIdicEKCVU9OrHAr7h8OfCzT/AITaJHpegQNDHGMsWdneRu5LMSSTisswXs
6fLbVjy6Lq1ebo jj/ibb7dAJUAFrzcf++TXDW7kgZyO1d58VDt8Ose32ofqDXBRNxkda+fx
Wkl6H1GHfuP1ZZ34Ppi mucnOTk881xfxb+LC/CaxsL68s3vLW4uDDN5bfPGoUtuA78A8e1a
OmfEXTdZ8QLp2jzNczG1S7Zk HyRo/Kbj6kc4qOSVlKxlKpHmcE9f6/zPp/8A4J63234maxb
Mf9fp+7HrtkX/AOKNfY9ooQDOOtfD v7BWofZ/j9DESMXNhPHweuAG/wDZa+1tZmktLNngJD
LzXXT+FM4J/FI09gaUDsR1p32FT1zXzf4G /az8W+M/27dd+EOgaPo80ej+F4/EsEs9w0Mt8
hmWJ40OCoZS+eRggdRXup8caxEdtz4J8XiReGCW qOoPfDB8Ee4610xi2tDzJ4+jCTjKVmu5
+ZPx6/Zq1T9oD47fC3xX4C1fw/q/hj4dDU9XNik4W4ut Tm2+QVjIxtSOC3iBzkc8YrY8MfB
3WPDun6FZ+ILK7SVbma5uWljPUIttAM9OizSf9tfevlDw74Z+ Kfwh1toLlJ5vJcgT2UpdXC
lwWGOcfunPI6DNfVfwO/aV8Z+GmtF8TN/aMSEGS3u03fhzX0lOEcO4 7W/4f5dT5L2fM73dl
b87n3z8JvDaeGvA+m2cahTHEuQB6ivi/wD4KseKT4h+KWkaNCS0Wk2LTN6B 5Wx+e2MfnX27
8OfHlp8RPAthremWUmniWAmSFjwGHGVz2OK+Jf2g7u28efFPXJ9SijuYhcNChYZ4 T5ev4H8
6WLnZXaKT50fFd7pPzHCkFiazrvTSDheDX0VrvwY0vU9zWDyWzen3l/I81wniT4I6jZMz WQ
julH9zr+RrznU8zoVN9Dxq+t2jJ9hjnpXw9/wUA0Jrjxmt08Dy7IAqPj7oySfw4/Wv0E17QX
sZ JI7yJkkU8qwwePavjX9sbwnN4z+JsGmRTi2t7i0dp5GXKwopHp3J/nWlKaclc0S11PJ/2
X2/4oq4 juf9XJcPgn69Pxr0mXzrGywiQXaocAuTHIfYkAg/XivM/gfLHZaNNaWmd1rKQfqa
9Bg1HzrkK3Qn p71z1ad6jufp3D+GhVowUux1Ona5Ppelri2nCkHIS4Rxn2Bxn8a4rxPqk9z
dSTXdk8xI/dK8qbQf U7c/lXaabbx3UQClVQjkZ9q5rxfdpFqC2OlKklyx4Xsvqax5XF2PoM
RlEKFO6k/w/wAjr/2UNCNj raXFzGBdXcgaTA/L8q/S7xh8DIPib+zJp9xNaR3934e23yR7Q
5aIf6xAO525YDuQK/O34E6XMt1G wf51wTg96/Xf9mzR7rTPgVb3ktq9y6WxYxqM+aNucfyH
40Jc05dzsxFGksBCC010/r1Pz7+L3wH8 OeHPGL3ngW7jvtHvsTiJx5dzbhucbHAYiveP2Tf
AvhnwtLbaqbG0nli/ebpI2DJ9FzjNef8Axl+M GhfEXxpJB4atTZpBK0XkSJyhBwVKn0IIru
P2bvgTYeK9ci+02Ns3mnlGiU4z+FEIvntE5JZLV+rq cpJq3mtPlc+mQNN8VlJ9Igt7fVVZV
s4VwJbu6Y4RQpJ3Z+X5uwBJOBxJ+3h+zT8KvAvxQ8KeB/DG iaLpGsQ+HFvdQvbeFI7zUZZJ
mG93I3SOXDSEZ6Oexr61/Zf/AGbvDfg3TdMXQ9G0+zu5Yi0ssNqi NtGMgsBmvnj/AIKffDX
SvGH7Qk1x4jZY54raKG0kV/LkTCb9yv8A7Jweo6e9ddOMqdSzlrbp9x+a Zq+fEKC+zd2X9L
+vU4T4IfAy4+Grw/YbxkhkUymURASysfViDgduDxXoXiK5e5cG4YuwULk9SAMf 0rL8Gatea
jo2mT38gRPsyxqUHykjKsfxK7uefmFXNcLYy2CPUV5uLqSnL3jswNKEKalDqedfFO4W Twlc
bCCY7tMgc9q85FwAo9veuv8AiAkseh61uUgNexOn+0No6fjmuBW6H/1q4MRFcyO/Bz5oz9Wc
z8dvB93468PWNvpEZnMV2GkUPsbYyMhIPsWBPsDTfgl8MW+GOhTw6hKbieWXarsdzLEowi5
PXHJx 2ziuoF/ubH5EVKkxf3qVJqPJ0BxUZOXf+v0PXf2L9SFl+0j4cycee8kJ/wCBRN/9av
vzWId9jKG/ u1+cP7M2q/2f8fvCcxO0DUolP/Ajt/rX6V6jbbrd+v3a7KELwOCo/wB40fEtn
df8K+/4LkfCK+z5 UPjTwdrGhykf8tGiH2hAfxjFfpDz71+ZH7b10Ph9+3X+yt4vz5aWfjoa
RM+cfJdp5JBPp8xr9OGO 1iOePenK8UrHx2aw5a7ufkL4egTUdamtbUeZPcL9lhYDqrkRFv8
Avzbzt/22r0z9mL4L2Pj34oap qPjmE3H2Kbd9n/5Zljgjd6gDHFeT/st/F/wh438VXa6Xq1
ms+mxO8dvO3lTnKrGpAb7wEcecju5r 6/8A2WPCg0zw7dag6kS6jMZWOPU5r36ELV+VrZXMo
pKjzPe56F8QPEVv4F+GmqXsaxwxWVsxRQAq gKpOB2HSvzduviwjarJH4lguNOvJWLstyhTc
WOcgnqDnrX2j+3Zr76T8F10yF8Ta7eQWKgdSHkG7 /wAdD18n+NPjHrOoeI72z1xNO1zS45T
DHaalarOiIpwArEbl/A1vVh7V8q/r8DJSjCKcupltq39r WrnRriASkfKThgD71TsL3Upp3+
2xR+SnBfo3AGTj65xU9p4c8H6zN5ek6RqPhTUsNIn2G6Mtm+0b m+RwWXgHocVjeMNA8TWNm
l9oDO2mXCsF8yPGBnGd2MHNcdWjys6Kburp3Ll54etta0PZqUUU6yKZ PnUH7xz/AFr4q/bu
8IeHfhZHqmsapugW8szbKinq2ScLnnnNfYR8eR6JpQh8QNGlwihCY/mjJxxg 9+K/L3/grh8
cf+E1+IOm+HdDdjb6fEZ7hzxvdj8oA9AAx/GueEE3obcyW6PBPhDr/wBmv7qMsyLO wcjPP0
/WvS9P1ZGycbUyeQOfyrwbwfqBs9SGWwe3vXq+neK7W1tIvOl2kL0Y9/StHPmvJH3WQ4qU a
as9j0mXxJbaFo/n3cuFUAY7k15T4t+LP2PXpdTwRIU2CMNzj1+tcv8AE/4kG/lEdizeWp7Nk
NXG y3P9pSrG7ACcYLnOFb/P86yle19zuzXiH2i9lTd2j6L/AGdf2gZ1Mja7dR2fnNtSWUNs
TnqQoJ/I V+gGg/8ABYnUPg/4H8IaB4MkstR0SyQtqt0ysbiYg/djUkBF24+Zs9+BX5GafLB
bW0UF3OsVxG25 8kkBcDGMdx/WvQ/heYb/AFiyzcmCcAlt7fISuSOT0J7Z45rN6K7Wp5tLNJ
ySp1KjaVvv/M+i/wDh ou68RfHTWfEUZigTX9Qm1BI0I2RGWQsVH03V+hX7CHxDbUdXsJXYN
5rBTnkZr83vBPwgh8VWV81k Vt5EEctqA+dpMe4ggdBkdsYAr69/4Ju/FGPSpHtdcdIb3TnK
yRSMBlweik9aVKoozTeh9dgs4p18 J7FK3KkkvK2n3H78/BZ7VPBdtfvLGALYPITx5Y7kn0w
K/OX/AIKefEhdf8Xa3qDXBexwlqoAysKu +Cw+o8sn2Fe7/DP9pc2HwevJxdwiPUFWBInbO3
apDjHpk18Tftg36+I9B1YX95I0EiPceSjZLSrH 8uR3Hy89sL+fVZKpJ3u3+B+aYuhKFepUk
9W/6RwOqftZeIv2b9X0vR/COsJq1gtjHdSi6USxTNJk 7V5yqj7vB5xnuK9F8H/8FFvDHjC3
jj8b2NzoNw3BmhPmwE+uOo/Kvhi8km1bU5WvJZDjCKgPCqOA B7DFbfh7Q1llXcOO+azqQhU
0ZnSxFWkrJn354216z8RfDafUdAu4720uWjkjmj+643Yry8ahufmt b4cEQ/sv28S4CRRn/w
BHsf61xkeo5k6/WvIxULTse/gKznSvLds6GO824wanjvSW4Pb61hW95vXI PJ6VcguyRg9qw
UTeUjtfhZrB034l6BdJ8ph1GBsj08wV+r93H5tsxHda/H7Q9SNlq9rKpx5UyPn6 MDX7GaNA
NU0OynTlbi3jkz67lB/rXfhdInl4qpyTTPzp/wCC0sLeH/gv4Y8UW+Vl8HeMtM1UOOqh Jx/
iK/UWwnj1WxhurVt0VzGsqEd1YZH6Gvjf/gpr+xxrX7Sn7Lvinw14IWNtS1BEltvMOAHSRXH
P /Aa0Phn+3t4n8C/Dfw/onif4SeM7vUtH022sbueKWAxzTRRKjuuT0LKSPY1vDDTqK0e/dH
zuaQVW opJXR+CGgeMPtV1DdWMpguoGykiNhgp6rkfnX1l+zJ/wVR8c/s5yW2m6vMniPw+rc
2l4cyIvfy5f vL9DkV8F/DjWd00JJLKXOc+legT6kl8oLDIHy59D2r6lU3B2ep83SxEnFXP1
M+KP7b/hL9rC/wDC F94SuXsLLR5H1DU4L0hGs2RMIC2cMMs3I/SvB3+Pfgm68XajbnxHphk
s7aTUZ5Ek8xPKX75BXOdo 5OO3NfDHi/XtOtdDvtO8U36WlpewmNn83YUBHUHPBHX8K+aNC/
acT4S6jrdrHMmsNJpN5osEoPyg XEZheUe+xmwPU1hKHLdxZ1JqtZNaL+v61P2C8JftWfCDV
tQlDfETSre8FtILOOS2m23TnHyBwh2k jOMjGepFe16N+3d8Gfhz8KbSPxj428OI1ral5YJL
hd+dx+Xae/PSv5ttU+K2o3FyJ7C6a2xwojJD L+Nc5feJbvU5d9/cTTuerO5JrCfspvVs7MN
iPY3VtD9bP21/+C2vwzj8RR2PwK8FWetRwyE3GoSk 26SH0RV+99SK/M749/F2P4x/FjWvE0
EL2serSh4bZ38z7OoULt3YGehPTvXnUlwZ5Mhsgc4PapYf 33zgtn19K45xjO6iilVlUdnuX
9P1No7wmRsuc7SOxrR1HXZUhCp80uMDPIGe1c3HPiQbcnb0q/p7 s98kc2TIflC4yV7/AJ1z
JtO6Ouji5U4OMWTzWOpXJVpoiwzxk4LeuBV7QdGvNQv0hWP5ydwUD86n 0vzNNEFzqRfegZU
TPPJ457d+fpUkHiqSK7jbTI5USJs7ZHyFA68kfzrb2adlexVKrBTUmaUnh20D xrf3ESyhtv
zK2QK9F+G/gizntY7vT5ZbpbQFpGVfRSdvPPQV5zq/iSHUdWOoWax4DCTaw5Y8dMdQ PSu88
LfF+DwndGzW1mQSr57xR8bmPTI6Dt9PenUpSULRPc+v0lH4I83fU9C8K/FbVNEjiudEt5ZY
7Z0VygJ3KMgrgnn7xHHY17P8I/GdvJ8QbvU7Kf5pyrNGG27WCjcMD0I6182+CvH8mra9ZrHH
PY/Y 51MaTIBHIf4g+Bzk8c9a9b+Hs0+n6pJdaFbeUl8yGbYo+XHAJ7AE1y1KbvqOlilSmpx
2P0S8A/HK 8j8IadaGcTW0jPHKjn54flBVj7E45z61Fr9/fWlwup6k0F5C8bQshOd28EDI9C
A3P4V4x8JNYuvi BpsQ0+WS4vLKIiKNEA8zYpJBI6k7SPXgV6l4WZvGWhw2ksw/tEkeV5qna
/yk4PoR/M9KvDrmqbE4 2tGULSZ4z8RPBMei61LLpkTrDI67k6hNwzj8wR+FT6BpskYQmNv3
gyMDrWN+2rY+OtC0qe98JXUu nXCt5s+yMAsoiRWKnGOkYb8a+Hrn9rXxp4a8SPHLrurF45p
AySzsdo4x7Z69K6nRs7s8ZVmk3LdH 7K+AJWX9m3DKQQr8fSU152l0TJhs9a+Rv2WP+Ci/iI
rFp2r6kZlkygWb5o1zn7wNeq+C/wDgoN4a n8cf2H8Z9E+x75zCNRsW2hBnG5oz1H5Vz1sul
Ud4vU9DDZrGgvZzjt1Wp7pa3GBtJz9BV+G4yBnm quv6OmjywTaZOt3p99ELi0uV5SeM9CKj
tbgkcnJ+leVKm4PlZ7EK0asVKLumbdtcksCG4/Wv2h+B d0ut/BvwlerhvtGlWz5/7ZrX4p2
dxsOa/Yv9ijVv7a/ZR8Czltx/stIyf90lf6VadoaHh51U5IRl HzPT2iVlwygj0IrNk8H2Tu
xMEJyc/drUp26iMpQ2Z85RxEo394/jY8IeNIdFsxPeTRxRAbxlsYXG c1w/xT/bQur65ls/A
X7i0U484/fcjuPSvHdU8VX+pabb2LzEwxrt68t9awTYOkhB5I5619dXrpfA jihQgnzM3vE3
xH1XxbdtL4hvJ7tnPO5zwPYViz7Zw7x5OPWoyS3Ocn+VAkVMliR2OK5JVJNXZ0W7 EYYjrzz
TCSxye9KxG4nt2pmfmP6Vxvey3NEhrt5bcGr1oxFucnhuvY4qtY2TahfJDCVDyHA3HAp4 uf
3RC9+PwqYvl36mkdyS0AF1HuG4M2cHvW1ocmy6nlusRvKAobPzJk5P5jI/GsITmCdXQcpgj6
1u G5juo0k2JE0jHDqM7uOeOxHH50Qi5aMpS02NRbZ7aRLnzY7pGHykRkR/7ozya2YdIitor
ybWbaSQ FAURDjaxGST+n51tfDXTrWfQSLy1DpbxSSJM65ZicDgegJJPet3wtpV94pujYXIh
mtLkBZJEA8sl ckcdcYyOO9dFrrbQ7KTaV5fLqeY6laQ2lzts42BjcCJmP31ZjtYjsa6X4co
fEevf2fdyC3e52QAx 8kDIPPfA54rpfF/w8TVVnOmCET6evluQvXCkgDHsMDPOa5b4drep4w
Fxa2a+YjAKCdroT7dT1yK0 irK97F8zpO70PZT8H49KiljhAMrSZMomJlPoSvTk844PNdx4B
lv/AA1plzba8PNW4tjBDcxPhGII Iyex9jU3w2nf4gW8DkpHdQLGswjbO4su1uOh7MD9fw9X
+H3gC20q6/s/xKEMcLAOx+68LAjJI4B4 6fSs6kOfVot12o8tyx+z74gufB8LPo10ReLG3nq
MhUByu7ce/wAy5Gf4vTNew/CzxTeX6Q6iha2Y TK6rI3ILZXIP4fhmvJtI0bTrXwrqz3NqPt
kTLHD5CeX5y7lJDgEDIAH19a7m18drp3gTw8ttEZpk tmhKp8pSRnJLkH0DhRn0rJ0ZwfNEu
NeM1GMo79/62PYodUX4ueBPEFhpkCXl8trJEJLlN4ilbgDG OQQGB9jX5f8A7VX7P+meE9fh
uLoTWNpqEaS2zv8AfiyoZ0JH3grEjPtX6P8Aw18Zt4fiuTay26Tg JciUNtaTK7cfgSx985r
5i/bf8IWFpo3iPU7VX1GxguHneCOI4wDnCnHCMzqMjGAtdT96PP8A1fQ4 nFwm/wCXz7Hw54
UNx4H8TWcgkDJNiSJgwO9SxAyOx4/zmuy+MV9LYePLS8tnfF5Akob+Ek9SM+4r zK81e4v/A
BJ9p1pkHmvvjRB8sajsB2AxivVfiPMur+FPDN3cRAhcxYwfkUjdye+Tmrpt6af1uVez 5lts
fo/+wp4yf4v/ALJ/2RpXnvPCOJFU8uIXOCPwIB/Ou0tbnawySBXhn/BGT4xW2har4u0qJYJV
fS3ncOMhljZGKn6jP5V9R/F/wVZ6Iljrng5hJour5aIqSRG45ZD9M1zZlhHJ+2R1ZPjoxnL
Cy7u3 52MK0n6Z578V+uf/AATa1U6r+x34X3tuNs1xAfbbK2P0Ir8gLKff3r9WP+CSeqjUP2
TFhySbPV7m P6ZCN/WvFatFnRnS/cfM+nKKKKk+UP4HzMwPBPAwOaVrkj7pI9ajU5BDZoA3n
2HPvX0PM+Tsb2QB 8HK96aZDyFyc03JR+DS54znmuVzve+5VrDt+7ORx3ppXLfL9KQfKc/hT
mGGJB5PepcdL9h7DD8kg 25GOfpU0UgZzI3GOo96gkG49c4pVPTJx3rFKWxXoTRL50wDdWPX
tWhFBKFEahxzhARwc+lVLGMSM DkAL3NT6dc3IuVW0dlfPyjPAP4100Y2SBHuPh23l846XpM
0SLZWcQbfF9xigLEnHqx49q9N+Gvhs Jo+oNdNC0jRuY3jBCFwowqgjjNeY+Gbu30Lwu73Fx
FFO0Q8133MpLL6V6x8N/E1lfaTBdWV0sUEK CExuCF3Dknbjrk10zg1H3f62/M7o2Sut+pmx
yzS2D22qWoikv4wZC6FGkZWAyOOnI5964pPBqeA/ iPBZThp5J5DP9oZsKgXnC88NgHnrXrO
qeHrnSIkeeQ3Xmv54lySY+/B9CO1QeIfBVr4pujfyr89o RIqBiGcdPlPuTz7elEHZ3T0KnK
7v2G/C+S08KeMGjnf7MLkBYzI/DqeQw/E/pX0hp2mrNY/6VuWa 4nK253AmUBRnHqrKenqPr
XhOueHbTxFNHcJFCbi1MYkQjZk7RgKfT5T+de1aRZRa7oNkNSmxHbEy W8gP3WU4KE5oi7yV
2ZvVJs7PxD4Ku9V8Cx2GliJbm1mExQ8tKj7d5B9uOBzxXFDwtr/hj4kSaZPC ptLHU3e6Erj
y5U5yVb+FSpOB/hXouj60+q2to9i8kd9axMZVzhZVUkHPrnKkfWsnW9YE2g2msyMi XF/K9n
IpGBNFtz847MGJAPPFbWV72JUmtJdTZj1x9C0GCRbe3kexbyi0+Wea2c74Wb3Afbnvtpb3 Q
28Z+HriC6hgtmuLK4syjODC6z4Q/iMg57VxHhpZbvTp7DWrpY72BURJgCYrkR5IBz0IU9uOK
9J8 F6YukjTYIjMbi+mQxtcHj7y7kKdMA/Nu7g1k6dlYbqe7Zv8A4PU/Mn9oT4A3fgKK51W0
EK2Vrqr2 kcK7t8YYSEYJHzL+5fn1qOO8e6+AEzzM0ptZUAyeYixYAD2619rf8FIPglfavZa
Xf+GrQS2c5e8n sUjJLPE8iSMNuGJCgk4zwTivjWe3Ft8MdVs2iNtFdXSqMHchxJgAE88Zro
inL3r9iH7yUlu7Hrn/ AATb8fr8LYPGusagiTxS6FPbDe2F3NgAeueT/k19y/sMftKf8Lq0V
PAPiYGaw1TC2b/x2TgcMPb1 9q/MnQb1vCXwt1OG2uf9IluhaL5Ywsi7uSPXOOtfQf8AwTm8
Sy6F8S9EneWWNo5F3MvOFzxnHfIx +NdlOKmnCWz0+5HLiIunerHdar5I+3PF3hifwR4pvNL
vyfMtJChOOuO9fpR/wRc1Rr74C+JrRjn7 LrAcc/34V/8Aia+Fv2j/ABD4W8ZfEFHivY9L1e
+gjKPIw+z3UmAPLJ/gfjHPFfZ//BFK2vNC8PeP tL1qGWCaK4tJtkgweVkGfpwOa+cxmFdFS
utND2KuNhjsInfXS6Pt8gqeaSp3TeKgryvh0PBnTcWf wOsvzEdfcUqEBhkZ/pSyjGcVFn5m
+tfQvZF7oV05PIphHHSpB9+mt/rT9TWNaXI7FbCHG0Bs+tOP TrSN/Wm56/SlG62AG9R+NIv
zjA5NJL96pLHm4XPrUWUpKJV7K5f0yMIpEqgpgZ55zWx4e0hdV1Sb yy3lxqGOxCCASAcntx
3rIJwiY710ehOU8JXJUkFmUMQeSMjrXdTSUkOk7y19TuoZIr9Ht7NYfIim UAE58wbcDPsoG
a9R+DNlazaQrTsjK11JGo+9yBggfXIOfavJvhzGr2zl1BJmbkj2FelfApinh692 EjbfNjHb
KnNbVF+75l5fidEaj0a6ux6LpGp3bmf+1IWMEkXkBCMqjLldynvkEce1anhBFi06KVH8 6Wx
zBIf4kRm657kcf5zXOLO41i5QO+0yxEjPB5I6fTitbwMc+MNRQ/cMI+XtznPFcvKloa03eSN
l IFsvEwsbdTPHqTnZlcIH2k/UA449DXR+HGfwj4TitYy19BaqdpVssxyxIPr1/SuasJGH9k
MGO4Sq Ac89DXS6KojtpPLAX9/J0470Qlr9w5SvLbuekfDPxFHFoEsV3M5nYjDlfmUEc/X6V
H8Q9NGn6Npd xcSzQxJeMI3UbwdwDqeOg4Ye2KqRoI7awZAFLRqSQOTz3q/4xjWTwzLHIoaM
SK4UjI3DocevvXXC Xutoycrsx5pBqOh6imqB5LiSIH5G+XduAVgR0yMjFeieDdXk1Twvp7r
NG15pBCxB1zlSp53dsHAz /wDWrznwSxk0OcOSwNlMSDzz8h/qa3LmVoNM0wQMyB7WQsFON3
3evrWtSSavYydR6pHbfFn7Vr3h bT7jSNQkjfSI5bmOK4OchsrJg9cbXP1r4/8Ajp8NrT/hD
Nei8OiO1FhcXWo2jScJMvkiSROeVKeW 5Ud8e9fbllZxT/CkvNFG7/a/K3MoJ2HqufT2r5X+
Ocanwn4wjKjZHbTFVxwp2SLkDtwxH0JFYyl7 PVL+tC1FSSPlP4g3B0jwZ4fgsm3vcwecV/u
HO3/69epfsweLG8OzJNFctHdJGDxwFxzn868b8Ykv JpYc5CcLn+EccCuv+GsjBuGI+Yjr2x
XcpNRsVJ3iovrdnufxy+Od/wCIdASeC9lEsUu8lWO786/T b/g31/4KiR6n4vt/AHxbuPtFx
qUC21nqDnL4UkojHuBk49AcV+Nfi+Rns2DsxGehPtXrv/BLe5kt v2mPCrW8jxsL+PBViD19
qujCOLg6dRXUrr0IqUVDDuot1qj+t+k2g1Q8KSNL4W01pWLM1rESSckn YK0K+GkrOxC95XP
/2Q==
X-ABSHOWAS:COMPANY
CATEGORIES:My Contacts
X-ABUID:685FC9B6-8446-45B8-89AF-3F3BC70CA03A:ABPerson
UID:a nice UID
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
@ -97,6 +454,152 @@ EMAIL;TYPE=WORK:vvh@gmail.no
UID:a nice UID
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/mustrmahn.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
N:Mustermann;Anton;Karl;Dr.;
FN:Überwerbung GmbH
NICKNAME:Boss
X-MAIDENNAME:Müller
X-PHONETIC-FIRST-NAME:Anto
X-PHONETIC-MIDDLE-NAME:Carl
X-PHONETIC-LAST-NAME:Mustrmahn
ORG:Überwerbung GmbH;Marketing
TITLE:CEO
EMAIL;TYPE=INTERNET;TYPE=WORK;TYPE=pref:karl@mustermann.de
TEL;TYPE=WORK;TYPE=pref:+49 30 1234567
TEL;TYPE=CELL:+49 172 1234567
ITEM1.ADR;TYPE=WORK;TYPE=pref:;;Musterweg 1a;Musterhausen;;12345;DE
ITEM1.X-ABADR:de
NOTE:Test vCard
ITEM2.URL;TYPE=pref:mustermann.de
ITEM2.X-ABLABEL:_$!&lt;HomePage&gt;!$_
BDAY;VALUE=date:1969-08-16
X-AIM;TYPE=WORK;TYPE=pref:bethel69
X-JABBER;TYPE=HOME;TYPE=pref:bethel69@foo.com
PHOTO;BASE64: /9j/4AAQSkZJRgABAQAAAQABAAD/4QBARXhpZgAATU0AKgAAAAgAAYdpAA
QAAAABAAAAGgAAAAAA AqACAAQAAAABAAAAS6ADAAQAAAABAAAASwAAAAD/2wBDAAIBAQIBA
QICAQICAgICAwUDAwMDAwYE BAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkNDg0M
DgsMDAv/2wBDAQICAgMCAwUDAwUL CAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCws
LCwsLCwsLCwsLCwsLCwsLCwsLCwv/wAAR CABLAEsDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQ
EAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgED AwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE
1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRol JicoKSo0NTY3ODk6Q0RFRkdISUpT
VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWW l5iZmqKjpKWmp6ipqrKztLW
2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3 +Pn6/8QAHwEAAwEBAQ
EBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3 AAECAxEEBSExB
hJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5 OkNERUZH
SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaan qKm
qsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAI
R AxEAPwDmrj9qzxB4q8F3MniG/uYdSubhYYxa+U9zJGkYJQQNMpbgKwZV4KeormNe+MXiG9
0sWN/d 6Zql/qN1NcTzRW6EMXAVV2sg3SKwfPHGW5PU/NXgq90/xwJo9KS61eSaGSUyWqMGj
KqQs8kxJWDG TydpcEqo5yf11/4Ji/8ABJXw38XP2d9J+In7SN94qkuvFVlLceHdJhvjB/wj
1pKCIrre0Yk+0FPm G8lIw6jYWBY/u9XinDYCEXtFaJRtt2SWiPiaeRYjHSc5Xb6uTf66s8/
/AOCc37dE3wl+P1t4X8Tv byeB/H17a2d5Yr5cENlLegRwyxRgbV/eyRIyqACkgJ6V3f8AwV
Q/4Ja+FfjN4Pvrn4F6nL8NdY04 Y1WDR1EVjrFsALjDWzHZBOB5bCQFFycMGFfKv/BTD/gnv
47/AGEfiLYv8B9Q8ReOfB2qrBa6ZqUM fm6noV1BKk8VrflFwCbdNyXRCBwjZAIWvXfiB+2P
b+A/Duup4N1e9Hh+9n86S7vbybUNQuSURRDD NcO5jDFGG4scbSVTawr53G5vg54qONg2lOP
vJdWu6vvbT5I9illmIp0fYJWs9G9jz34JfG/4c/sr fCK60rTtP8Q6x4V0tDfX+vaRYlNaSV
UZ3h1C0mI8uQkvP58D7JI7hXhjYJKU8x/Z2+NGvftT/tDe Evhx+zv4LvdMXVtWj1CHSYIpL
a00m1VjNc3Ny8iARxKhLPIByzhUBMsYLtX/AGpEstYuLnRLSz0X TnhWeC00yFYINUgMkrlm
ZcHzlkklIduI2kkwF3kV9V/8Et/+Chvhb4WfEQ+DfFt5frB49lgms9Vu L15okIAWOBQ5xCr
O3zgYVnkU45NfL8RY1cQ06dDncYRafLZa+r3Vrnt5Vl0sJX9pJpy73Z+mXwM/ Z70T4DaYl0
n2bVPEbQeRc6rMu1wDtLRxK2TFFlF+TPJQFsnms342ftC2Fl4ZA0LU9Jg1G6uTp3l3 F3DBI
rgB8RtK4TOzc4z/AAhvQVyP7Yvxqv8A4S/sv/EDXvCMkQ1TQtEnubFrltsfmgqEMn96PLYG
PvHg1/N7+2f8V/iN8UvElhoX7U/j2W40HxVfm8xZwSx2kl0EMRieGVikLR5K7gPujjg15tHC
1MNB 4ijR54Qdm+idtLndmc4yt9Yn+8lt/wAA/e/9k/8AaB079ofTLjxPptzp17b60S8Nzpl
wbmxvVt2a 3MsErcshdJR/tcnoa0PFmiJrniS9uo3nZJJSFZXIDAfKD+IGa+ff+CWvw+8VeA
P2Jf2e9d8UXYuU 8Q+DLcAmNTsgR5BZJkdSLKO359c19c+HLSFtFgMyxu2DlnQbjyetffYR/
u1NrXb7m0fN4iSp1OVb Dda/4KE+Cvgzby2/iTwv4x8EWcL+WG1HwtJptupHQK4TY/XtwK82
1T/gr94O8R6tFo/geeHVdZ1t nttEgs3+0S6rdDGLYQg8kqpbII2bdx4VhXu/g742Q6hZm3u
7hrceXsdCG2jtjJ+U1xHiv9lD4VfF nxveXet+EdE0zxJDaxyWesaXaRw3ce5jsukeJRtuIp
VVklTEi4GW8suD+Z4vK8YqfNQraLyV38/0 t8z6vA5rhfaf7TR+ab/I8K/4LBfETxl8Hv2LN
H0q10wXkPi/XoZfHeq27iT+x7WL/TG2xn5nLPHH CJT8qLETjL1+MfxN/a3tfEDSyST2sUcy
NG0JYsgh2/djYHCAAcHGCBuxgMD+qn7VfxOuj8KLjQf2 ifF2i23iMajceDdanuRBBp9xcpF
G4ZxLlUW5iaGZAoXBkG0jAr4Q1r9j/wCA3wFuoZPFF38OP7Tm uJp0g1e7jmkZFxwyzuwUBg
cyEBT0LV81VzqpQfJCm3/wD2MZllV83LHmW91trsfFl/8AHqa+04W+ h3s89xYuZbdLUedgN
jKsiqdxIC54zwM5IzW9ongr44fE+HzPhR8OPiRqYf8Ae+ZbaHdKquAWcLvj +bh0bAK45wa+
x/Cv/BQjUPAHhDVYfhP8KfDsem6JI9jFq6+IZIvC8BkHmRBUsFSA3EuJWSJ503fN txsctle
Ev+Cy3xE8Z/C69YJ4S0Z7ixuLK+u9K0IvqWkxyq0R+xSXU8qS7Hj3/OjttDfNuZTSp4/F Yl
+7C3rJX+655To16TSdO3rp+Vz9DP2s/HvijX/+COuo2d9A3i74iXvgrS9L1fSdMK6jqY1WT7
It xBJbW++QOsjsrLw3BJPFfk38ItK0j4p/tIaX8Mfi74bsfEs+tasPDM+ieITJYmz1S7X7P
byRvC6S RYkZIGY4eNt25T5YY/d2h/ts+G/28f8Agmn8SY/HJ0Lwx+0J4R0GTXFufD1vHpOp
362ZM/2zSbzA l3GGBkePLSJghlPmHP5L6h+07ZfGeS58U/ErTru18b6vAJrzVNLmWGDU7tS
omurm2kjISSZN7yTQ uB56RuIxvOP0jhbF+0o1cPXceWT9Xtb7tjzuJqTqeyrNarsf1N638H
7X4T/Afwt4W8H2UVpZfDnT LHT7G3iZpYoobO2S12IWJZlEanBb5iACecivG9N/ap8G2tr5V
9rAhmid0eOd3jkQhiCCo6D09sV8 Ufsof8HJY8B+B/DGkfto6DqfifRooF0u88V6M3m39gpU
Ilxc2hbF1G6nLSRFZF8tvlY/KPqnT/ij +zZ8U9OtvENp47+Fetw6vDHcRXw8U2cDXKFRtZ4
pXWSN8AbkdVZWDBgCCK+hwcZYJPC1baWaa2af Y+UlONV+0a3Ifhx8Z73+2bO21qeJYbskQN
cBm8xPTyVyWf6K2PavWPjR8a9R+G2jaDfeCtEiku70 fZDcanqCW1vabyqb5UiQuFPykAn+F
sgHIHyr4W+KukaRqrvYiKNvODPJGxEjuQBnJ5PQjPpXpX7Q 37Q2if8ADPus/FXVpJLKD4QD
b4htVCrDqljcQmS1HLKglFyyIhYhf3kisSHxXysKyjScr7Hvzpvn SaPD/wBrDx7ceA9bk0r
Q0sPEVh47sb298RaPdSi4j1+WKSG2uLYLMrIzoL6xntmZVSL7Iof5JmZc r9oK/wBH/Z90vV
ND+L/wV/4Wdpnifw2tpomuaYotdb0/W7S3EKzSSwyLcfZJIvs8rPbFmgkhbbCw nUJ4N4B8E
3Xx3vYr/wCL3j3w9Z3XhXTry41Tw7aak8N5bmQxPPFfagBItohWGJSkaNI27hirZq7o 3x60
a4+IetXPwqv/AA7JqFxc/Yrq31ia7ub63fzDgNbIvlqjISsbpIjFUOADvFfndZYrB0PrVSNl
dq/XXX0/G/kfouWPLc2rPL+a8+VO17fD0v8AoR/tE/GqXwN+wZpWn/GPR10m7EEqabpMWkw
xwf2j Kju11LZW4Cm8k3yPNO48w/MGIA2j8rPCvxck8L6VdWejRyWf2u2uIjL5h3qHfaCe4P
3yfbiv1Q/a t8XXHxJ+Ekq6Dp0lzqmnea9tE0WdzvFJExHZgwZ1z/EvXOa+Ik/4JLeLfEHhK
61Sx1vRNNvo5Jrm 4t7vdBHb2qx/PKWTd84JC7SANpB6mufCYunL45auxWeYapFxWFjaMen5
/wDBPN/A/wARNVv73wvo fwue2uPEWp6pFFYwblSGN2EkTv8A9MI1IiYvwm1CSMK2ej/aF/Y
n+Jnww8c+Nr2y+H+uX/hzQ9dv 9NuNY0LTZrjR/tFq8a3DxOqH9yskmFfhDuZR9w12f7EHwo
i8PePpPHNpbafFaWDSrayxx74JLeG3 eANHuJLG5ncgDPIT3xX2xovxd8VJ4rudQ8O3d7YC2
sfIJEsc1wXilEs0kYkYnKiTygf3e7bIVYEH P3mTZdGMY1pSak+lloflOccRSpzlh4wUkut3
o/8Agn5geEfFMmoaFcxaYzTTWuJCYlZ5IW+bcCpO fm2sTnjDMuAGxXc6P+zn4Z+IWnprTwT
acdQLS/ZorqIpH8xHGITjOM4ycZxX3H4++MnwJ/a+17Wt K+PXw312CfQpEttS+J3h3w+bq9
tT5asuozXFmkSyIsqvDLE0VzuePIlRDuT4y+LH7JfxA/Z48fX3 hHSfDWv+N9P0wRS2Ov8Ah
vWjDpesWs8SXEFxDGYWMe+KaNmQklXLA9K+1w+Z0KdNQqrnS8jyaU/r Ert+zdr6tar+vmfX
3w++Lnib4n3V8fh1pFzqEenAySu08cNpYKpOGuJ952YHRWxkdOtekfBP9t/Q /hXrl/qHxw0
zwx4gi04Rajpk0Wo2c9v4f1C0VpF1N7eWWX7WbeITSxI0RaOSPzIkLqrL1vh/9kC7 8Tazps
H7Rc+t2vgW5uFt4LTSNItrjT7SRw7LKp0x5LO7iXCgqXQgdlbICW/7Vnw9+AOq3cJ8O6L/ A
MKt1ELaaR8QfDOmmbUL1ysvmWzaOiGSFN8Uqbg5BG1vvMa/Nfr0cI4xqTS5tubZ9fTp3Pq61
ZSf JbX7vz6ng37Vf7ct94/8U69eXlzrZ8OaPaQ3Fva3qSwXWrXl2m23a7LYMzyxb5zPycKW
znFfEXw0 +OXjr4W6/wCIvGXwk18W+qa9rRtLmJ41ktNRWLOyPyWGAI1kO1h0BIFfbX/BXfw
TrXxY8LeFfiB8 NZ1uvCdtZJCyWkBhnslnBaGZ967ijJJtww/c8g/eFfJ2i+BrPRvBej6faR
SR21szklgPnYtuLMRz tLseD0wAeldTxbziHvWt2X9eR5NXDyyDEOpCT5pWs3vY+hP2RvB3x
Q/bD8OTeKvH2rre6fa6nPaX Ftp8T2c0flOu2QtITkEs42r24q5+3Np83h650v4OfD13lu/F
bWy+JdQIeSa3sZZPMis1kzwZRG8r EcAKAetfWX/BG/wJbaL+yPpOq/KZ9dmuNRuV+8GdrqV
wRnvtUDNfOf7c2v2tj/wUK8eQ6ne6Z4Zj ENhAuoahKkVnYq2nWq72Zm2hiWfgr2rxsDk1CW
LVSWy18tD7bNM5rUsnUr/vJJa97/qca1xbXXxX 8B/D74fWqwWcV3FdX0UJCLBa2EfmJEB90
OZfK5PACe9cb+1t8Stf+CPxVv49C1S1srix0a6WO4lQ YWC5uNsAEX3GJkjJKgYG0N2zWX8e
vCOlfCGxtdH8IeJTrPirxvbT6asenSC7kMNyYmuJYViAzvRX +Yv/ABAdsDJ8afsMfFT4lXJ
8f+M9OjuNNQWmm6XFd3gl3W4EdqkkoQnHyuSwz1znnNfSY3MYYWLi 3Z36P/I/NsBlVbMmpU
4N730/zPoD9lme3+CHhrw82oa82gazLYAS6e97HLJZRzItxPcvcKdsAWV3 cg4bEx5YsFHrH
g3/AIK7eFPC/hq1sNC1b4lala2wZUuobOK2inyxJaKOa4WQRkk7d6hiu0kc1u/s /f8ABule
6n8Ira/8efEK+t/Eh23Mdvp9pFNpKyhi6vJFOn79gcfeY4IOMcVynif/AIJb/teeHNfu rLw
t4F+H/ibT7d8QapBcG0S8U87vJyQjckMAcbgcYHFdVLN3FJSjZdLxcr/cddfg/Ey96VnfopJ
W 9dV+Z+o/hr9n74XfDP4SP4j/AGE4rfNx5cNpY3us3iWVp5j70W5gMgkZVbG1SwxuOSydeC
/a+/Yq 1r49x2etfCSHTZrnStFXS9Q8Nx6VBptzDH5yTLPpt3bJGruJIm24ffGHbynQuwf4M
1f4w+IPBf7S Og+HvDV1bW+kX+qNFcwGwt5DOvkyS/NI8ZcneAck56jOCRX2Z4t+OvjD4O/s
yazd/DTxDqWkzvf2 0QMUm5YldV3eWrZWMnJBZADjjOOK8auoVMP7KrH7nY9TEUFjLxm2103
0/Fo+a/B0t/4Z+HuoaV8U H1S41S2uLjSpm1m2CXbRoybVuFCIwYIwR3dQXZGbGDXzjrfgnw
3+0L4m1b4XWF9p/hPx5ZD+1fCX iCKyilg8Q2iL++sbqLbmTy8krs/eFfKKn91Jn0n4v+MNW
8QXF3rPiPU7/U9W1LVpLi7u724e5muX TyUQu0hJYKgCgHgKAAMCvnzwb/pn7T3w7up8+eni
GyCsvy7fkc8AcA/Owz1wcdABX59LMHgMV7Gk 3ZO2+uuuve1z9MynKaeKyymq9paW1R+m/wD
wT6/Z/T4M/s7aJ4fub6O5mtLaNBceWUMgKFshWJKZ 3fd7ZxX5Zf8ABfz4V3a/t0XOoaTcxR
6d4i0LTLqQTymKKQpB5Dt83y7g0OcgdTk81+tHwZvZbCx8 qzby44Y2aNVAwmBxj0HJ46du1
fAX/By7otq3hP4Ya00KnVLS9OkxXHO5bWSJZGix0I3ksCRlSzFS Nxz9tRq89BSkjwc4wvuu
nB2Stb8jwr/gi18KNJ1Xxh4v8SeILV7x9NvLaK2e6mVmDrE0kmGHX59o 47AZr9R/jt8V/AP
hb4I6jpN/fWMF1Fp3mBHOyN9rFo44iQBIwdFO0ZYZ4IHFfnh+yR4ftPBX7M3g PU/Csb2Woe
I7ZLzUp45W33cpdgXbJ64AHGOAB0r7Q8N3kknga484iQm3dcyKHIB3ZAJ6Z9q8atiW lJJan
pZTho0qUFJtrfsfor+z/wCKLfW/hno1ygB+1WUUyue4dQ3QgEDnof1616IbLzsMZbJcgcPa
F2/E7xn8q8D/AGLYwPBvhi3O4wvZQgoSSAAqYAz0HJ4FeH+Pfjl4suPGWotLrd2T5xHAUAAc
AAAc AACv0nhTLKvEkZWmoqKW6ueHxPmdLh5Qm4uXO3s7H//Z
ITEM3.X-ABDATE;TYPE=pref:2000-12-31
ITEM3.X-ABLABEL:_$!&lt;Anniversary&gt;!$_
X-ABSHOWAS:COMPANY
X-ABUID:73FD0F46-DE18-4F1F-AA2C-59E8738B4249:ABPerson
UID:a nice UID
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
@ -598,6 +1101,43 @@ X-DESCRIPTION;CHARSET=utf-8:außerdem
CATEGORIES:uni
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/J%C3%B6rg_Test-Ro%C3%9Fdeutscher_3_0.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
N:Test-Roßdeutscher;Jörg;;;
FN:Jörg Test-Roßdeutscher
ORG:Factor Design AG;
EMAIL;TYPE=INTERNET;TYPE=WORK;TYPE=pref:
joerg.rossdeutscher@factordesign.foo
EMAIL;TYPE=INTERNET;TYPE=WORK:joerg@factordesign.foo
EMAIL;TYPE=INTERNET;TYPE=HOME:joerg.rossdeutscher@gesindel.foo
EMAIL;TYPE=INTERNET;TYPE=HOME:raettchen@gmail.bar
TEL;TYPE=WORK;TYPE=pref:040 999999432571-43
TEL;TYPE=CELL:017799999978200
TEL;TYPE=HOME:040999999793017
ITEM1.ADR;TYPE=WORK;TYPE=pref:;;abcStraße 58;Hamburg;;20357;Deutschland
ITEM1.X-ABADR:de
ITEM2.ADR;TYPE=HOME:;;Gayens Weg 9;Hamburg;;22761;Deutschland
ITEM2.X-ABADR:de
NOTE:Technik\, Web\, DTP\, SysAdmin\, €-Vermögensverwalter
ITEM3.URL;TYPE=pref:www.gesindel.baz
ITEM3.X-ABLABEL:_$!&lt;HomePage&gt;!$_
ITEM4.URL:www.factordesign.foo
ITEM4.X-ABLABEL:_$!&lt;HomePage&gt;!$_
BDAY;VALUE=date:1969-06-20
X-ABUID:58AB933D-81D3-4095-8CB5-A63431AC934D:ABPerson
UID:a nice UID
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user1/addressbook/andresenesq.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:Sven Joseph Klaus Michael Andresen\, Esq.
FBURL:http://caldav.andresen.local/freebusy
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/hans_dieter.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:Hans Dieter Schmidt
FBURL:http://davical.hadi-schmist.home/freebusy
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,50 @@
#
# Request a REPORT
#
# negate-condition should only return a result if the
# property exists on the vCard, and doesn't match.
#
# RFC 6352, section 10.5.1:
#
# ...
# A vCard property of the type specified by the "name" attribute
# exists, and the CARDDAV:prop-filter is empty, or it matches any
# specified CARDDAV:text-match or CARDDAV:param-filter
# conditions.
# ...
#
# This test should return all vCards with a FBURL property, except
# for Andrew McMillan. Currently there are two vCards which meet
# this restriction.
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user1/addressbook/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
# HEAD
BEGINDATA
<?xml version="1.0"?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<D:prop>
<D:getetag/>
<C:address-data>
<C:prop name="VERSION"/>
<C:prop name="FN"/>
<C:prop name="FBURL"/>
</C:address-data>
</D:prop>
<C:filter>
<C:prop-filter name="FBURL">
<C:text-match negate-condition="yes">andrew@morphoss.com</C:text-match>
</C:prop-filter>
</C:filter>
</C:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/
REPLACE=/^UID:.*$/UID:a nice UID/

View File

@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user1/addressbook/andrew_mcmillan.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
TEL;X-EVOLUTION-UI-SLOT=3;TYPE=CELL:+64 22 123 4567
TEL;X-EVOLUTION-UI-SLOT=2;TYPE=HOME,VOICE:+64 4 123 4567
TEL;X-EVOLUTION-UI-SLOT=1;TYPE=WORK,VOICE:+64 22 123 4567
FN:Andrew Watson McMillan
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/donald_kelly.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
FN:Donald Kelly
TEL;TYPE=work:+64 4 347 4747
TEL;TYPE=cell:+64 2 1234-4321
VERSION:2.1
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/F06EC844-EACD-4ADF-8823-588603991E04-ABSPlugin.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Morphoss Ltd
TEL;TYPE=WORK;TYPE=pref:+64272332426
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/van_houtte.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Vincent VAN HOUTTE
TEL;TYPE=CELL,VOICE:0486 11 22 33
TEL;TYPE=HOME,VOICE:052 11 22 33
TEL;TYPE=HOME,FAX:052 44 55 66
TEL;TYPE=WORK,VOICE:052 11 22 33
TEL;TYPE=WORK,FAX:052 44 55 66
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/mustrmahn.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Überwerbung GmbH
TEL;TYPE=WORK;TYPE=pref:+49 30 1234567
TEL;TYPE=CELL:+49 172 1234567
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/andresenesq.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:Sven Joseph Klaus Michael Andresen\, Esq.
TEL;TYPE=WORK,VOICE:+49 89 11 11 111
TEL;TYPE=WORK,VOICE:+49 234 222 222
TEL;TYPE=WORK,FAX:+49 7373 73
TEL;TYPE=PAGER:+49 160 073 727 272
TEL;TYPE=PAGER:+49 2626 26
TEL;TYPE=CELL,VOICE:+49 39292 82
TEL;TYPE=CELL,VOICE:+49 7272 722
TEL;TYPE=PREF,VOICE:+49 12 34 567
TEL;TYPE=CAR,VOICE:+49 8292 38 383
TEL;TYPE=HOME,VOICE:+49 7327 272 727
TEL;TYPE=HOME,VOICE:+49 7272 7282
TEL;TYPE=HOME,FAX:+49 1010 1
TEL;TYPE=ISDN:8797
TEL;TYPE=ISDN:98732947234
TEL;TYPE=X-EVOLUTION-RADIO:+49 88 298 723 498 32
TEL;TYPE=X-EVOLUTION-RADIO:+49 9872 394 872 34
TEL;TYPE=X-EVOLUTION-TELEX:+49 2763 382 882 28 82
TEL;TYPE=X-EVOLUTION-TELEX:+49 7722 88 28 282
TEL;TYPE=MAIN:+49 6237 623 723 84 76
TEL;TYPE=MAIN:+49 9324 32 479 234234
TEL;X-EVOLUTION-CALLBACK:+49 8383 73 723
TEL;X-EVOLUTION-CALLBACK:+49 7363 6363
TEL;TYPE=MODEM:+49 8383 73 723
TEL;TYPE=MODEM:+49 7363 6363
TEL;X-EVOLUTION-TTYTDD:+49 3377 37 373
TEL;X-EVOLUTION-TTYTDD:+49 8378 33
TEL;X-QUICKDIAL:13355
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/hans_dieter.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:Hans Dieter Schmidt
TEL;TYPE=WORK,VOICE:+49 9823 9084
TEL;TYPE=WORK,VOICE:+49 234 234 234
TEL;TYPE=WORK,FAX:+49 7373 73
TEL;TYPE=PAGER:+49 2626 26
TEL;TYPE=CELL,VOICE:+49 7272 722
TEL;TYPE=PREF,VOICE:+49 12 34 567
TEL;TYPE=CAR,VOICE:+49 8292 38 383
TEL;TYPE=HOME,VOICE:+49 7327 272 727
TEL;TYPE=HOME,FAX:+49 40 812 387 21
TEL;TYPE=ISDN:4234234235
TEL;TYPE=ISDN:98732947234
TEL;TYPE=X-EVOLUTION-RADIO:+49 9872 349 832
TEL;TYPE=X-EVOLUTION-RADIO:+49 9872 394 872 34
TEL;TYPE=X-EVOLUTION-TELEX:+49 38 288 228 82
TEL;TYPE=X-EVOLUTION-TELEX:+49 7722 88 28 282
TEL;TYPE=MAIN:+49 6237 623 723 84 76
TEL;TYPE=MAIN:+49 9324 32 479 234234
TEL;X-EVOLUTION-CALLBACK:+49 8383 73 723
TEL;TYPE=MODEM:+49 8383 73 723
TEL;X-EVOLUTION-TTYTDD:+49 7373 73
TEL;X-EVOLUTION-TTYTDD:+49 8378 33
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/J%C3%B6rg_Test-Ro%C3%9Fdeutscher_3_0.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Jörg Test-Roßdeutscher
TEL;TYPE=WORK;TYPE=pref:040 999999432571-43
TEL;TYPE=CELL:017799999978200
TEL;TYPE=HOME:040999999793017
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,41 @@
#
# Request a REPORT
#
# param-filter should filter on parameter value. With a negated
# null value we should return all vCards with the property that
# matches the prop-filter type, and there there is a parameter
# of TYPE set.
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user1/addressbook/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
# HEAD
BEGINDATA
<?xml version="1.0"?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<D:prop>
<D:getetag/>
<C:address-data>
<C:prop name="VERSION"/>
<C:prop name="FN"/>
<C:prop name="TEL"/>
</C:address-data>
</D:prop>
<C:filter>
<C:prop-filter name="TEL">
<C:param-filter name="TYPE">
<C:text-match name="TYPE" negate-condition="yes"></C:text-match>
</C:param-filter>
</C:prop-filter>
</C:filter>
</C:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/
REPLACE=/^UID:.*$/UID:a nice UID/

View File

@ -0,0 +1,211 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user1/addressbook/andrew_mcmillan.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
TEL;X-EVOLUTION-UI-SLOT=3;TYPE=CELL:+64 22 123 4567
TEL;X-EVOLUTION-UI-SLOT=2;TYPE=HOME,VOICE:+64 4 123 4567
TEL;X-EVOLUTION-UI-SLOT=1;TYPE=WORK,VOICE:+64 22 123 4567
EMAIL;X-EVOLUTION-UI-SLOT=2;TYPE=HOME:andrew@mcmillan.net.nz
EMAIL;X-EVOLUTION-UI-SLOT=1;TYPE=WORK:andrew@morphoss.com
FN:Andrew Watson McMillan
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/donald_kelly.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
FN:Donald Kelly
EMAIL;TYPE=internet:donald@example.co.nz
TEL;TYPE=work:+64 4 347 4747
TEL;TYPE=cell:+64 2 1234-4321
VERSION:2.1
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/F06EC844-EACD-4ADF-8823-588603991E04-ABSPlugin.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Morphoss Ltd
EMAIL;TYPE=INTERNET;TYPE=WORK;TYPE=pref:andrew+davical@morphoss.com
TEL;TYPE=WORK;TYPE=pref:+64272332426
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/van_houtte.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Vincent VAN HOUTTE
TEL;TYPE=CELL,VOICE:0486 11 22 33
TEL;TYPE=HOME,VOICE:052 11 22 33
TEL;TYPE=HOME,FAX:052 44 55 66
EMAIL;TYPE=HOME:vvh@gmail.no
TEL;TYPE=WORK,VOICE:052 11 22 33
TEL;TYPE=WORK,FAX:052 44 55 66
EMAIL;TYPE=WORK:vvh@gmail.no
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/mustrmahn.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Überwerbung GmbH
EMAIL;TYPE=INTERNET;TYPE=WORK;TYPE=pref:karl@mustermann.de
TEL;TYPE=WORK;TYPE=pref:+49 30 1234567
TEL;TYPE=CELL:+49 172 1234567
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/andresenesq.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:Sven Joseph Klaus Michael Andresen\, Esq.
EMAIL;TYPE=INTERNET:sven@andresen.de
EMAIL;TYPE=INTERNET:andresen@andresen.de
TEL;TYPE=WORK,VOICE:+49 89 11 11 111
TEL;TYPE=WORK,VOICE:+49 234 222 222
TEL;TYPE=WORK,FAX:+49 7373 73
TEL;TYPE=PAGER:+49 160 073 727 272
TEL;TYPE=PAGER:+49 2626 26
TEL;TYPE=CELL,VOICE:+49 39292 82
TEL;TYPE=CELL,VOICE:+49 7272 722
TEL;TYPE=PREF,VOICE:+49 12 34 567
TEL;TYPE=CAR,VOICE:+49 8292 38 383
TEL;TYPE=HOME,VOICE:+49 7327 272 727
TEL;TYPE=HOME,VOICE:+49 7272 7282
TEL;TYPE=HOME,FAX:+49 1010 1
TEL;TYPE=ISDN:8797
TEL;TYPE=ISDN:98732947234
TEL;TYPE=X-EVOLUTION-RADIO:+49 88 298 723 498 32
TEL;TYPE=X-EVOLUTION-RADIO:+49 9872 394 872 34
TEL;TYPE=X-EVOLUTION-TELEX:+49 2763 382 882 28 82
TEL;TYPE=X-EVOLUTION-TELEX:+49 7722 88 28 282
TEL;TYPE=MAIN:+49 6237 623 723 84 76
TEL;TYPE=MAIN:+49 9324 32 479 234234
TEL;X-EVOLUTION-CALLBACK:+49 8383 73 723
TEL;X-EVOLUTION-CALLBACK:+49 7363 6363
TEL;TYPE=MODEM:+49 8383 73 723
TEL;TYPE=MODEM:+49 7363 6363
TEL;X-EVOLUTION-TTYTDD:+49 3377 37 373
TEL;X-EVOLUTION-TTYTDD:+49 8378 33
TEL;X-QUICKDIAL:13355
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/hans_dieter.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:Hans Dieter Schmidt
EMAIL;TYPE=INTERNET:ich@hadi-schmidt.de
EMAIL;TYPE=INTERNET:hadi@telekom-d.de
TEL;TYPE=WORK,VOICE:+49 9823 9084
TEL;TYPE=WORK,VOICE:+49 234 234 234
TEL;TYPE=WORK,FAX:+49 7373 73
TEL;TYPE=PAGER:+49 2626 26
TEL;TYPE=CELL,VOICE:+49 7272 722
TEL;TYPE=PREF,VOICE:+49 12 34 567
TEL;TYPE=CAR,VOICE:+49 8292 38 383
TEL;TYPE=HOME,VOICE:+49 7327 272 727
TEL;TYPE=HOME,FAX:+49 40 812 387 21
TEL;TYPE=ISDN:4234234235
TEL;TYPE=ISDN:98732947234
TEL;TYPE=X-EVOLUTION-RADIO:+49 9872 349 832
TEL;TYPE=X-EVOLUTION-RADIO:+49 9872 394 872 34
TEL;TYPE=X-EVOLUTION-TELEX:+49 38 288 228 82
TEL;TYPE=X-EVOLUTION-TELEX:+49 7722 88 28 282
TEL;TYPE=MAIN:+49 6237 623 723 84 76
TEL;TYPE=MAIN:+49 9324 32 479 234234
TEL;X-EVOLUTION-CALLBACK:+49 8383 73 723
TEL;TYPE=MODEM:+49 8383 73 723
TEL;X-EVOLUTION-TTYTDD:+49 7373 73
TEL;X-EVOLUTION-TTYTDD:+49 8378 33
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/J%C3%B6rg_Test-Ro%C3%9Fdeutscher_3_0.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:3.0
FN:Jörg Test-Roßdeutscher
EMAIL;TYPE=INTERNET;TYPE=WORK;TYPE=pref:
joerg.rossdeutscher@factordesign.foo
EMAIL;TYPE=INTERNET;TYPE=WORK:joerg@factordesign.foo
EMAIL;TYPE=INTERNET;TYPE=HOME:joerg.rossdeutscher@gesindel.foo
EMAIL;TYPE=INTERNET;TYPE=HOME:raettchen@gmail.bar
TEL;TYPE=WORK;TYPE=pref:040 999999432571-43
TEL;TYPE=CELL:017799999978200
TEL;TYPE=HOME:040999999793017
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user1/addressbook/test_multiple_email.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:CardDavClient Test212420682
EMAIL;TYPE=HOME:john6doe@example.com
EMAIL;TYPE=WORK:doe6@example.com
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,45 @@
#
# Request a REPORT
#
# param-filter should filter on parameter value, anyof says any
# filter can match.
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user1/addressbook/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
# HEAD
BEGINDATA
<?xml version="1.0"?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<D:prop>
<D:getetag/>
<C:address-data>
<C:prop name="VERSION"/>
<C:prop name="FN"/>
<C:prop name="TEL"/>
<C:prop name="EMAIL"/>
</C:address-data>
</D:prop>
<C:filter test="anyof">
<C:prop-filter name="TEL">
<C:param-filter name="TYPE">
<C:text-match name="TYPE" match-type="equals">WORK</C:text-match>
</C:param-filter>
</C:prop-filter>
<C:prop-filter name="EMAIL">
<C:param-filter name="TYPE">
<C:text-match name="TYPE" match-type="equals">WORK</C:text-match>
</C:param-filter>
</C:prop-filter>
</C:filter>
</C:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/
REPLACE=/^UID:.*$/UID:a nice UID/

View File

@ -0,0 +1,58 @@
#
# Put the VCARDs used for carddavclient's interop/AddressbookQueryTest
# into user5's addressbook
#
TYPE=PUT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/vcard
AUTH=user5:user5
# HEAD
BEGINDATA
BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13
FN:CardDavClient Test212420682
N:Test212420682;CardDavClient;;;
NICKNAME:Jonny0
EMAIL;TYPE=HOME:john6doe@example.com
EMAIL;TYPE=WORK:doe6@example.com
X-CUSTOMPROP;X-CUSTOMPARAM=WORK:foobar
END:VCARD
BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36
FN:CardDavClient Test913043917
N:Test913043917;CardDavClient;;;
NICKNAME:Jonny1
EMAIL:maxmu@abcd.com
X-CUSTOMPROP;X-CUSTOMPARAM=HOME,WORK:foobar
END:VCARD
BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-41956788-1273-449e-bfb7-716850c91ec6
FN:CardDavClient Test879489908
N:Test879489908;CardDavClient;;;
NICKNAME:Jonny2
TEL;TYPE=HOME:12345
TEL:555
END:VCARD
BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b
FN:CardDavClient Test1520108081
N:Test1520108081;CardDavClient;;;
NICKNAME:Jonny3
item1.EMAIL:foo@ex.com
item1.X-ABLABEL:CustomLabel
IMPP;X-SERVICE-TYPE=Jabber;TYPE=HOME:xmpp:foo@example.com
END:VCARD
ENDDATA

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:"/>

View File

@ -0,0 +1,41 @@
#
# Request a REPORT for a property with multiple values, where one has the
# parameter defined, the other has not -> must not return a match
#
# (Jonny2 has two TEL properties, one of which has a TYPE parameter.
# Therefore, Jonny2 must not match the is-not-defined filter)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data>
<CARDDAV:prop name="VERSION"/>
<CARDDAV:prop name="FN"/>
<CARDDAV:prop name="TEL"/>
</CARDDAV:address-data>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="TEL" test="anyof">
<CARDDAV:param-filter name="TYPE">
<CARDDAV:is-not-defined/>
</CARDDAV:param-filter>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:CardDavClient Test1520108081
IMPP;X-SERVICE-TYPE=Jabber;TYPE=HOME:xmpp:foo@example.com
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,37 @@
#
# Request a REPORT for two properties, both of which must be defined
#
# (Jonny0 and Jonny1 have only one of them and must not be returned)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data>
<CARDDAV:prop name="VERSION"/>
<CARDDAV:prop name="FN"/>
<CARDDAV:prop name="EMAIL"/>
<CARDDAV:prop name="IMPP"/>
</CARDDAV:address-data>
</DAV:prop>
<CARDDAV:filter test="allof">
<CARDDAV:prop-filter name="EMAIL" test="anyof"/>
<CARDDAV:prop-filter name="IMPP" test="anyof"/>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:CardDavClient Test212420682
EMAIL;TYPE=HOME:john6doe@example.com
EMAIL;TYPE=WORK:doe6@example.com
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
FN:CardDavClient Test913043917
EMAIL:maxmu@abcd.com
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,39 @@
#
# Request a REPORT for a property which satisfies any of two text-match
# conditions, only one of which actually matches
#
# (this must return both Jonny0 and Jonny1)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data>
<CARDDAV:prop name="VERSION"/>
<CARDDAV:prop name="FN"/>
<CARDDAV:prop name="EMAIL"/>
</CARDDAV:address-data>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="EMAIL" test="anyof">
<CARDDAV:text-match negate-condition="no" collation="i;unicode-casemap" match-type="starts-with">doe</CARDDAV:text-match>
<CARDDAV:text-match negate-condition="no" collation="i;unicode-casemap" match-type="ends-with">abcd.com</CARDDAV:text-match>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-41956788-1273-449e-bfb7-716850c91ec6.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-41956788-1273-449e-bfb7-716850c91ec6
FN:CardDavClient Test879489908
N:Test879489908;CardDavClient;;;
NICKNAME:Jonny2
TEL;TYPE=HOME:12345
TEL:555
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,34 @@
#
# Test for nonexistence of a lowercase property, which must treated
# cases-insensitively (hence EMAIL must not match)
#
# (only Jonny2 does not have EMAIL)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="email" test="anyof">
<CARDDAV:is-not-defined/>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13
FN:CardDavClient Test212420682
N:Test212420682;CardDavClient;;;
NICKNAME:Jonny0
EMAIL;TYPE=HOME:john6doe@example.com
EMAIL;TYPE=WORK:doe6@example.com
X-CUSTOMPROP;X-CUSTOMPARAM=WORK:foobar
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36
FN:CardDavClient Test913043917
N:Test913043917;CardDavClient;;;
NICKNAME:Jonny1
EMAIL:maxmu@abcd.com
X-CUSTOMPROP;X-CUSTOMPARAM=HOME,WORK:foobar
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b
FN:CardDavClient Test1520108081
N:Test1520108081;CardDavClient;;;
NICKNAME:Jonny3
ITEM1.EMAIL:foo@ex.com
ITEM1.X-ABLABEL:CustomLabel
IMPP;X-SERVICE-TYPE=Jabber;TYPE=HOME:xmpp:foo@example.com
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,32 @@
#
# This is the inverse of 2054, we request a REPORT for (lowercase)
# property 'email' and expect all three results containing EMAIL
#
# (Jonny0, Jonny1 and Jonny3 should be returned)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="email" test="anyof"/>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13
FN:CardDavClient Test212420682
N:Test212420682;CardDavClient;;;
NICKNAME:Jonny0
EMAIL;TYPE=HOME:john6doe@example.com
EMAIL;TYPE=WORK:doe6@example.com
X-CUSTOMPROP;X-CUSTOMPARAM=WORK:foobar
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36
FN:CardDavClient Test913043917
N:Test913043917;CardDavClient;;;
NICKNAME:Jonny1
EMAIL:maxmu@abcd.com
X-CUSTOMPROP;X-CUSTOMPARAM=HOME,WORK:foobar
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-41956788-1273-449e-bfb7-716850c91ec6.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-41956788-1273-449e-bfb7-716850c91ec6
FN:CardDavClient Test879489908
N:Test879489908;CardDavClient;;;
NICKNAME:Jonny2
TEL;TYPE=HOME:12345
TEL:555
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,32 @@
#
# Test for non-existence of a grouped property (case-insensitive)
#
# (Jonny3 has item1.EMAIL set)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="item1.EMAIL" test="anyof">
<CARDDAV:is-not-defined/>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b
FN:CardDavClient Test1520108081
N:Test1520108081;CardDavClient;;;
NICKNAME:Jonny3
ITEM1.EMAIL:foo@ex.com
ITEM1.X-ABLABEL:CustomLabel
IMPP;X-SERVICE-TYPE=Jabber;TYPE=HOME:xmpp:foo@example.com
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,30 @@
#
# Request a report for a grouped property (inverse of 2055)
#
# (only Jonny3 has item1.EMAIL set)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="item1.EMAIL" test="anyof"/>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b
FN:CardDavClient Test1520108081
N:Test1520108081;CardDavClient;;;
NICKNAME:Jonny3
ITEM1.EMAIL:foo@ex.com
ITEM1.X-ABLABEL:CustomLabel
IMPP;X-SERVICE-TYPE=Jabber;TYPE=HOME:xmpp:foo@example.com
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,33 @@
#
# Request a report for a text-match on a grouped property
#
# (only Jonny3 has item1.EMAIL set or a matching address)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="item1.EMAIL" test="anyof">
<CARDDAV:text-match negate-condition="no" collation="i;unicode-casemap" match-type="equals">foo@ex.com</CARDDAV:text-match>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-34cd55a8-330f-47cd-8b69-6fbd16a0880b
FN:CardDavClient Test1520108081
N:Test1520108081;CardDavClient;;;
NICKNAME:Jonny3
ITEM1.EMAIL:foo@ex.com
ITEM1.X-ABLABEL:CustomLabel
IMPP;X-SERVICE-TYPE=Jabber;TYPE=HOME:xmpp:foo@example.com
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,34 @@
#
# Request a report for a text-match on a grouped property
#
# (only Jonny3 has item1.EMAIL set, but the text-match alone might also find
# Jonny0)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="item1.EMAIL" test="anyof">
<CARDDAV:text-match negate-condition="no" collation="i;unicode-casemap" match-type="contains">@ex</CARDDAV:text-match>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-8121cd7a-8251-4b74-a952-ca91fdc21e36
FN:CardDavClient Test913043917
N:Test913043917;CardDavClient;;;
NICKNAME:Jonny1
EMAIL:maxmu@abcd.com
X-CUSTOMPROP;X-CUSTOMPARAM=HOME,WORK:foobar
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,36 @@
#
# Test matching one of a multi-value parameter
#
# (Jonny1 has X-CUSTOMPARAM=HOME,WORK but "HOME" is not just a part but
# an entire value ("equals") of a multi-value parameter
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="X-CUSTOMPROP" test="anyof">
<CARDDAV:param-filter name="X-CUSTOMPARAM">
<CARDDAV:text-match negate-condition="no" collation="i;unicode-casemap" match-type="equals">HOME</CARDDAV:text-match>
</CARDDAV:param-filter>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13
FN:CardDavClient Test212420682
N:Test212420682;CardDavClient;;;
NICKNAME:Jonny0
EMAIL;TYPE=HOME:john6doe@example.com
EMAIL;TYPE=WORK:doe6@example.com
X-CUSTOMPROP;X-CUSTOMPARAM=WORK:foobar
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,33 @@
#
# Request a REPORT for EMAIL with defined TYPE parameter
#
# (only Jonny0 has a TYPE defined)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="EMAIL" test="anyof">
<CARDDAV:param-filter name="TYPE"/>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav">
<response>
<href>/caldav.php/user5/addresses/sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13.vcf</href>
<propstat>
<prop>
<getetag>some valid etag</getetag>
<VC:address-data>BEGIN:VCARD
VERSION:4.0
PRODID:-//Sabre//Sabre VObject 4.3.3//EN
UID:sabre-vobject-131cdf91-5460-423b-a836-e420e5affe13
FN:CardDavClient Test212420682
N:Test212420682;CardDavClient;;;
NICKNAME:Jonny0
EMAIL;TYPE=HOME:john6doe@example.com
EMAIL;TYPE=WORK:doe6@example.com
X-CUSTOMPROP;X-CUSTOMPARAM=WORK:foobar
REV:date
END:VCARD
</VC:address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,34 @@
#
# Request a REPORT for EMAIL with defined TYPE parameter
# (like 2061, but param-filter needs to be case-insensitive)
#
# (again only Jonny0)
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user5/addresses/
HEADER=Accept: text/xml,application/xml
HEADER=Content-Type: text/xml
HEADER=Depth: 1
AUTH=user5:user5
# HEAD
BEGINDATA
<?xml version="1.0"?>
<CARDDAV:addressbook-query xmlns:DAV="DAV:" xmlns:CARDDAV="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<DAV:prop>
<DAV:getetag/>
<CARDDAV:address-data/>
</DAV:prop>
<CARDDAV:filter test="anyof">
<CARDDAV:prop-filter name="EMAIL" test="anyof">
<CARDDAV:param-filter name="type"/>
</CARDDAV:prop-filter>
</CARDDAV:filter>
</CARDDAV:addressbook-query>
ENDDATA
REPLACE=_<getetag>"[0-9a-f]+"</getetag>_<getetag>some valid etag</getetag>_
REPLACE=/^REV:.*$/REV:date/

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
ETag: "2f9bb75f51266683f713f8d382a67bff"

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
ETag: "2f9bb75f51266683f713f8d382a67bff"

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -2,36 +2,12 @@ HTTP/1.1 207 Multi-Status
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule
DAV: extended-mkcol, bind, addressbook, calendar-auto-schedule, calendar-proxy
ETag: "8bfa1d55385dd1c0d877ba64358b56d4"
Content-Length: 1574
ETag: "ad7855a9510df25e6c23b501a47f38ff"
Content-Length: 865
Content-Type: text/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
<response>
<href>/davical/caldav.php/user1/home/2178279a-aec2-471f-832d-1f6df6203f2f.ics</href>
<propstat>
<prop>
<getetag>"509b0f0d8a3363379f9f5727f5dd74a0"</getetag>
<C:calendar-data>BEGIN:VCALENDAR
PRODID:-//Mozilla Calendar//NONSGML Sunbird//EN
VERSION:2.0
BEGIN:VTODO
CREATED:20070805T200215Z
LAST-MODIFIED:20070805T201531Z
DTSTAMP:20070805T200215Z
UID:2178279a-aec2-471f-832d-1f6df6203f2f
SUMMARY:Incomplete\, uncancelled
X-MOZ-LOCATIONPATH:2178279a-aec2-471f-832d-1f6df6203f2f.ics
DESCRIPTION:This task is incomplete and has not been cancelled (has no
status at all)
END:VTODO
END:VCALENDAR
</C:calendar-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/davical/caldav.php/user1/home/917b9e47-b748-4550-a566-657fbe672447.ics</href>
<propstat>

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 207 Multi-Status
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 207 Multi-Status
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -1,5 +1,3 @@
HTTP/1.1 100 Continue
HTTP/1.1 204 No Content
Date: Dow, 01 Jan 2000 00:00:00 GMT
DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule

View File

@ -5,7 +5,7 @@
setval
--------
1649
1653
(1 row)
setval
@ -125,7 +125,7 @@
setval
--------
42
43
(1 row)
setval

View File

@ -1,12 +1,12 @@
HTTP/1.1 200 OK
Date: Dow, 01 Jan 2000 00:00:00 GMT
Content-Length: 3011
Content-Length: 2962
Content-Type: application/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8" ?>
<capabilities xmlns="urn:ietf:params:xml:ns:timezone-service">
<info>
<primary-source>Olson releases/tzdata2012c
<primary-source>Olson tzdata-latest
</primary-source>
<contact>mailto:admin@davical.example.com</contact>
</info>
@ -15,14 +15,14 @@ Content-Type: application/xml; charset="utf-8"
<action>list</action>
<description>List timezone identifiers and localized forms
</description>
<accept-parameter>
<name>lang</name>
<required>false</required>
<multi>true</multi>
<description>Specify desired localized form(s)</description>
</accept-parameter>
<accept-parameter>
<name>changedsince</name>
<required>false</required>
@ -31,7 +31,7 @@ Content-Type: application/xml; charset="utf-8"
given date
</description>
</accept-parameter>
<accept-parameter>
<name>returnall</name>
<required>false</required>
@ -40,14 +40,14 @@ Content-Type: application/xml; charset="utf-8"
</description>
</accept-parameter>
</operation>
<operation>
<action>get</action>
<description>
Returns one or more timezones as specified by the
tzid parameter.
</description>
<accept-parameter>
<name>format</name>
<required>false</required>
@ -57,14 +57,14 @@ Content-Type: application/xml; charset="utf-8"
<description>Specify required format for timezone.
</description>
</accept-parameter>
<accept-parameter>
<name>lang</name>
<required>false</required>
<multi>true</multi>
<description>Specify desired localized form(s)</description>
</accept-parameter>
<accept-parameter>
<name>tzid</name>
<required>true</required>
@ -73,21 +73,21 @@ Content-Type: application/xml; charset="utf-8"
</description>
</accept-parameter>
</operation>
<operation>
<action>expand</action>
<description>
Expands the specified timezone(s) into local onset and UTC
offsets
</description>
<accept-parameter>
<name>tzid</name>
<required>true</required>
<multi>true</multi>
<description>Specify desired timezone identifiers</description>
</accept-parameter>
<accept-parameter>
<name>start</name>
<required>false</required>
@ -97,7 +97,7 @@ Content-Type: application/xml; charset="utf-8"
current year is assumed.
</description>
</accept-parameter>
<accept-parameter>
<name>end</name>
<required>false</required>
@ -108,7 +108,7 @@ Content-Type: application/xml; charset="utf-8"
</description>
</accept-parameter>
</operation>
<operation>
<action>capabilities</action>
<description>Gets the capabilities of the server</description>

View File

@ -5,7 +5,7 @@
setval
--------
1674
1678
(1 row)
setval
@ -125,7 +125,7 @@
setval
--------
47
48
(1 row)
setval