<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[12142] CalendarServer/branches/users/gaya/sharedgroupfixes</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/12142">12142</a></dd>
<dt>Author</dt> <dd>gaya@apple.com</dd>
<dt>Date</dt> <dd>2013-12-18 20:51:29 -0800 (Wed, 18 Dec 2013)</dd>
</dl>
<h3>Log Message</h3>
<pre>merge in 12017 to 12131 from trunk</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVcalendaruserproxyxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVprivatecommentsxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharingcreatexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharinginvitesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterverifiersmultistatusItemspy">CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesbinproxyclean">CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesbintrial">CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserver__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserveraccesslogpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisionrootpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisiontesttest_rootpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverpushapplepushpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertapcaldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertaptesttest_caldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertaputilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsagentpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsanonymizepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsbackup_pgpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsconfigpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsdkimtoolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsgatewaypy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsprincipalspy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstestgatewaycaldavdplist">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_gatewaypy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purgepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purge_old_eventspy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadminresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadmintesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebcalresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfauthaugmentstestxml">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfauthresourcestestxml">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdappleplist">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdtestplist">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformanceloadtestsimpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsinvitepy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsmultigetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsputpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestssyncpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagesqlusagepy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancestatspy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixespyflakes">CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixessetuppy">CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixessupportbuildsh">CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixessupportpysh">CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestest">CalendarServer/branches/users/gaya/sharedgroupfixes/test</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedpluginscaldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldav__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavauthkerbpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbackuppy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbindpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavcachepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclient__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientpoolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientreverseproxypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclienttesttest_reverseproxypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersperuserdatapy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersprivateeventspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafilterstesttest_privateeventspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaddressbookpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryappleopendirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaugmentpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycachingdirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendaruserproxypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycommonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydigestpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryinternalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryldapdirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryopendirectorybackerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryprincipalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_aggregatepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_digestpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_guidchangepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_ldapdirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_opendirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_principalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_wikipy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_xmlfilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorywikipy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlaccountsparserpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlfilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorybackedaddressbookpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdropboxpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavextensionspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavfreebusyurlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicaldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavlinkresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepoolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepropspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodaclpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodgetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpostpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpropfindpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreportpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_addressbook_querypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_calendar_querypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_commonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_freebusypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_multiget_commonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_sync_collectionpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavnotificationspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavtesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsharingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsimpleresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstdconfigpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstorebridgepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_accountingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookmultigetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_cachepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_calendarquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_collectioncontentspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_configpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_extensionspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_freebusyquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_icalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_kerberospy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_linkpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachelockpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachepropspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_mkcalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_multigetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_optionspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_propspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_sharingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_utilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_wrappingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezoneservicepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezonestdservicepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavupgradepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavvcardpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdav__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastoresubpostgrespy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorebasepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorexattrpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavdeliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipdeliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimiptesttest_deliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimplicitpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledeliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledkimpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_dkimpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_localserverspy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingitippy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingprocessingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingtesttest_implicitpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoresqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestcommonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_attachmentspy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_filepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_sqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_utilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavicalendarstorepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoresqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoretestcommonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoresqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoretestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_4_to_5py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradetesttest_migratepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommonidirectoryservicepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavidavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavxmlbasepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavxmlrfc2518py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavxmltesttest_xml_rfc3744py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li>CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/implicit/auto11/</li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCalDAVprivatecomments44ics">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics</a></li>
<li>CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV-pod/</li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARveventxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARvtodoxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharedasxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingdecline2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite1xml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2ropodxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite23podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingremove2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply3podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDinvitexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDnotificationtypexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDpropsxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVimplicitauto11xml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcachexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcalendarsxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcreatexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdirectxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdropboxxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingfreebusyxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharinginvitesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmovesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmultiplexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingnotificationsyncxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserdataxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserpropertiesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingpropfindxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingproxiesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingrepliesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingreportsmultigetxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingsyncxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingunsharexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingwebcalxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml</a></li>
<li>CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/test/</li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcacheclientpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py</a></li>
<li>CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/</li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li>CalendarServer/branches/users/gaya/sharedgroupfixes/twext/</li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedpluginskqueuereactorpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedpluginsmasterchildpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py</a></li>
</ul>
<h3>Property Changed</h3>
<ul>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestester">CalDAVTester/branches/users/gaya/sharedgroupfixestester/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixes">CalendarServer/branches/users/gaya/sharedgroupfixes/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2auth">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/auth/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2channel">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/channel/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2client">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/client/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2dav">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/dav/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2davmethod">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/dav/method/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2filter">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/filter/</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestester"></a>
<div class="propset"><h4>Property changes: CalDAVTester/branches/users/gaya/sharedgroupfixestester</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4>Modified: svn:mergeinfo</h4></div>
<span class="cx">/CalDAVTester/branches/release/CalDAVTester-4.3-dev:10193
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/attendee-comments-2887:2888-2910
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/better-proxy-3148:3149-3163
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/component-set-fixes:8221-8346
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/conditional-4466:4467-4469
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/implicitauto-2948:2949-2989
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/location-partial-accept-3574:3575-3581
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/managed-attachments:9986-10145
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/normalize-cuaddr-3533:3534-3558
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycalendar:7160-7206
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycard:7226-7237
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/sharing-5228:5229-5440
</span><span class="cx">/CalDAVTester/branches/users/gaya/sharedgroupstester-3:11181-11204
</span><span class="cx">/CalDAVTester/trunk:11742-12016
</span><span class="cx"> + /CalDAVTester/branches/release/CalDAVTester-3.0-dev:7584
</span><span class="cx">/CalDAVTester/branches/release/CalDAVTester-4.3-dev:10193
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/attendee-comments-2887:2888-2910
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/better-proxy-3148:3149-3163
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/component-set-fixes:8221-8346
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/conditional-4466:4467-4469
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/implicitauto-2948:2949-2989
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/location-partial-accept-3574:3575-3581
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/managed-attachments:9986-10145
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/normalize-cuaddr-3533:3534-3558
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycalendar:7160-7206
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycard:7226-7237
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/sharing-5228:5229-5440
</span><span class="cx">/CalDAVTester/branches/users/gaya/sharedgroupstester-3:11181-11204
</span><span class="cx">/CalDAVTester/trunk:11742-12016,12018-12132
</span><a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCalDAVprivatecomments44icsfromrev12132CalDAVTestertrunkResourceCalDAVprivatecomments44ics"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics (from rev 12132, CalDAVTester/trunk/Resource/CalDAV/privatecomments/44.ics) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+BEGIN:VTIMEZONE
+TZID:US/Eastern
+LAST-MODIFIED:20040110T032845Z
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:event3@ninevah.local
+DTSTART;TZID=US/Eastern:$now.year.1:0101T100000
+DURATION:PT1H
+ATTENDEE;CN=$username1:;PARTSTAT=ACCEPTED:$cuaddr1:
+ATTENDEE;CN=$username2:;PARTSTAT=ACCEPTED;RSVP=TRUE:$cuaddr2:
+CREATED:20060101T150000Z
+DTSTAMP:20051222T205953Z
+ORGANIZER;CN=$username1::$cuaddr1:
+SUMMARY:event 3
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="$cuaddrurn2:
+ ";X-CALENDARSERVER-DTSTAMP=20080827T171052Z:I have accepted.
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="$cuaddrurn2:
+ ";X-CALENDARSERVER-DTSTAMP=20080828T171052Z:I have accepted again.
+END:VEVENT
+END:VCALENDAR
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARveventxmlfromrev12132CalDAVTestertrunkResourceCommonMKCALENDARveventxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/MKCALENDAR/vevent.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<C:mkcalendar xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+<D:set>
+<D:prop>
+<C:supported-calendar-component-set>
+<C:comp name="VEVENT"/>
+</C:supported-calendar-component-set>
+</D:prop>
+</D:set>
+</C:mkcalendar>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARvtodoxmlfromrev12132CalDAVTestertrunkResourceCommonMKCALENDARvtodoxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/MKCALENDAR/vtodo.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<C:mkcalendar xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+<D:set>
+<D:prop>
+<C:supported-calendar-component-set>
+<C:comp name="VTODO"/>
+</C:supported-calendar-component-set>
+</D:prop>
+</D:set>
+</C:mkcalendar>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharedasxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharedasxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharedas.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+<?xml version='1.0' encoding='UTF-8'?>
+<shared-as xmlns='http://calendarserver.org/ns/'>
+ <href xmlns='DAV:'></href>
+</shared-as>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingdecline2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingdecline2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingdecline2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+<?xml version='1.0' encoding='UTF-8'?>
+<invite-reply xmlns='http://calendarserver.org/ns/'>
+ <href xmlns='DAV:'>mailto:$pemail2:</href>
+ <invite-declined/>
+ <hosturl>
+ <href xmlns='DAV:'>$calendarhome1:/shared</href>
+ </hosturl>
+ <in-reply-to>$inviteuid2:</in-reply-to>
+ <summary>The Shared Calendar</summary>
+ <common-name>$pusername2:</common-name>
+ <first-name>$pfirstname2:</first-name>
+ <last-name>$plastname2:</last-name>
+</invite-reply>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite1xmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite1xml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite1.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<CS:share xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>$cuaddr1:</D:href>
+ <CS:summary>My Shared Calendar</CS:summary>
+ <CS:read-write/>
+ </CS:set>
+</CS:share>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<CS:share xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>$pcuaddr2:</D:href>
+ <CS:summary>My Shared Calendar</CS:summary>
+ <CS:read-write/>
+ </CS:set>
+</CS:share>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2ropodxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite2ropodxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite2-ro-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<CS:share xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>$pcuaddr2:</D:href>
+ <CS:summary>My Shared Calendar</CS:summary>
+ <CS:read/>
+ </CS:set>
+</CS:share>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite23podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite23podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite23-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<CS:share xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>$pcuaddr2:</D:href>
+ <CS:summary>My Shared Calendar</CS:summary>
+ <CS:read-write/>
+ </CS:set>
+ <CS:set>
+ <D:href>$pcuaddr3:</D:href>
+ <CS:summary>My Shared Calendar</CS:summary>
+ <CS:read/>
+ </CS:set>
+</CS:share>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingremove2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingremove2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingremove2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<CS:share xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+ <CS:remove>
+ <D:href>$pcuaddr2:</D:href>
+ <CS:read-write/>
+ </CS:remove>
+</CS:share>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingreply2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingreply2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+<?xml version='1.0' encoding='UTF-8'?>
+<invite-reply xmlns='http://calendarserver.org/ns/'>
+ <href xmlns='DAV:'>mailto:$pemail2:</href>
+ <invite-accepted/>
+ <hosturl>
+ <href xmlns='DAV:'>$hosturl2:</href>
+ </hosturl>
+ <in-reply-to>$inviteuid2:</in-reply-to>
+ <summary>The Shared Calendar</summary>
+ <common-name>$pusername2:</common-name>
+ <first-name>$pfirstname2:</first-name>
+ <last-name>$plastname2:</last-name>
+</invite-reply>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply3podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingreply3podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingreply3-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+<?xml version='1.0' encoding='UTF-8'?>
+<invite-reply xmlns='http://calendarserver.org/ns/'>
+ <href xmlns='DAV:'>mailto:$pemail3:</href>
+ <invite-accepted/>
+ <hosturl>
+ <href xmlns='DAV:'>$hosturl3:</href>
+ </hosturl>
+ <in-reply-to>$inviteuid3:</in-reply-to>
+ <summary>The Shared Calendar</summary>
+ <common-name>$pusername3:</common-name>
+ <first-name>$pfirstname3:</first-name>
+ <last-name>$plastname3:</last-name>
+</invite-reply>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDinvitexmlfromrev12132CalDAVTestertrunkResourceCommonPROPFINDinvitexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/PROPFIND/invite.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+<D:prop>
+<CS:invite/>
+</D:prop>
+</D:propfind>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDnotificationtypexmlfromrev12132CalDAVTestertrunkResourceCommonPROPFINDnotificationtypexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/PROPFIND/notificationtype.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+<D:prop>
+<CS:notificationtype/>
+</D:prop>
+</D:propfind>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDpropsxmlfromrev12132CalDAVTestertrunkResourceCommonPROPFINDpropsxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/PROPFIND/props.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+<?xml version="1.0" encoding="utf-8" ?>
+<D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
+<D:prop>
+<D:creationdate/>
+<D:current-user-privilege-set/>
+<D:displayname/>
+<D:getcontenttype/>
+<CS:getctag/>
+<D:getetag/>
+<D:getlastmodified/>
+<D:resource-id/>
+<D:resourcetype/>
+<D:supported-report-set/>
+<D:sync-token/>
+</D:prop>
+</D:propfind>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVcalendaruserproxyxml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -148,11 +148,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -171,11 +171,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -223,11 +223,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value><![CDATA[{DAV:}group-member-set$<D:href xmlns:D="DAV:">$principaluri2:</D:href>]]></value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri2:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -246,11 +246,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -269,11 +269,10 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value><![CDATA[{DAV:}group-membership$<D:href xmlns:D="DAV:">$principaluri1:calendar-proxy-read/</D:href>]]></value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[=$principaluri1:calendar-proxy-read/]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -339,11 +338,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -362,11 +361,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -385,11 +384,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -437,11 +436,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value><![CDATA[{DAV:}group-member-set$<D:href xmlns:D="DAV:">$principaluri2:</D:href>]]></value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri2:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -460,11 +459,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -483,11 +482,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value><![CDATA[{DAV:}group-membership$<D:href xmlns:D="DAV:">$principaluri1:calendar-proxy-write/</D:href>]]></value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[$principaluri1:calendar-proxy-write/]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -581,11 +580,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -604,11 +603,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -627,11 +626,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set$</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set[|]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -700,11 +699,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value><![CDATA[{DAV:}group-member-set$<D:href xmlns:D="DAV:">$principaluri1:</D:href>]]></value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -723,10 +722,10 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>dataString</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>contains</name>
-                                                <value>&lt;href&gt;$rprincipaluri1:calendar-proxy-write/&lt;/href&gt;</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[$rprincipaluri1:calendar-proxy-write/]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -745,11 +744,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value><![CDATA[{DAV:}group-member-set$<D:href xmlns:D="DAV:">$principaluri3:</D:href>]]></value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri3:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -768,10 +767,10 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>dataString</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>contains</name>
-                                                <value>&lt;href&gt;$rprincipaluri1:calendar-proxy-read/&lt;/href&gt;</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[=$rprincipaluri1:calendar-proxy-read/]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -808,21 +807,14 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/2.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{DAV:}group-member-set</value>
-                                                <value>{DAV:}group-membership$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri2:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri3:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}group-membership[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><del>-                                <verify>
-                                        <callback>dataString</callback>
-                                        <arg>
-                                                <name>contains</name>
-                                                <value>&lt;href&gt;$principaluri2:&lt;/href&gt;</value>
-                                                <value>&lt;href&gt;$principaluri3:&lt;/href&gt;</value>
-                                        </arg>
-                                </verify>
</del><span class="cx">                         </request>
</span><span class="cx">                 </test>
</span><span class="cx">                 <test name='2'>
</span><span class="lines">@@ -873,7 +865,7 @@
</span><span class="cx">                         <description>Default setup</description>
</span><span class="cx">                         <request print-response="no">
</span><span class="cx">                                 <method>PROPFIND</method>
</span><del>-                                <ruri>$principal1:/</ruri>
</del><ins>+                                <ruri>$principal1:</ruri>
</ins><span class="cx">                                 <header>
</span><span class="cx">                                         <name>Depth</name>
</span><span class="cx">                                         <value>0</value>
</span><span class="lines">@@ -883,11 +875,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/10.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{http://calendarserver.org/ns/}calendar-proxy-read-for$</value>
-                                                <value>{http://calendarserver.org/ns/}calendar-proxy-write-for$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-read-for[|]</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-write-for[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -926,7 +918,7 @@
</span><span class="cx">                         </request>
</span><span class="cx">                         <request print-response="no">
</span><span class="cx">                                 <method>PROPFIND</method>
</span><del>-                                <ruri>$principal1:/</ruri>
</del><ins>+                                <ruri>$principal1:</ruri>
</ins><span class="cx">                                 <header>
</span><span class="cx">                                         <name>Depth</name>
</span><span class="cx">                                         <value>0</value>
</span><span class="lines">@@ -936,11 +928,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/10.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindValues</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value><![CDATA[{http://calendarserver.org/ns/}calendar-proxy-read-for$<D:href xmlns:D="DAV:">$principaluri2:</D:href>]]></value>
-                                                <value><![CDATA[{http://calendarserver.org/ns/}calendar-proxy-write-for$<D:href xmlns:D="DAV:">$principaluri3:</D:href>]]></value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-read-for/{DAV:}href[=$principaluri2:]</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-write-for/{DAV:}href[=$principaluri3:]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="lines">@@ -979,7 +971,7 @@
</span><span class="cx">                         </request>
</span><span class="cx">                         <request print-response="no">
</span><span class="cx">                                 <method>PROPFIND</method>
</span><del>-                                <ruri>$principal1:/</ruri>
</del><ins>+                                <ruri>$principal1:</ruri>
</ins><span class="cx">                                 <header>
</span><span class="cx">                                         <name>Depth</name>
</span><span class="cx">                                         <value>0</value>
</span><span class="lines">@@ -989,11 +981,11 @@
</span><span class="cx">                                         <filepath>Resource/CalDAV/calendaruserproxy/10.xml</filepath>
</span><span class="cx">                                 </data>
</span><span class="cx">                                 <verify>
</span><del>-                                        <callback>propfindItems</callback>
</del><ins>+                                        <callback>xmlElementMatch</callback>
</ins><span class="cx">                                         <arg>
</span><del>-                                                <name>okprops</name>
-                                                <value>{http://calendarserver.org/ns/}calendar-proxy-read-for$</value>
-                                                <value>{http://calendarserver.org/ns/}calendar-proxy-write-for$</value>
</del><ins>+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-read-for[|]</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-write-for[|]</value>
</ins><span class="cx">                                         </arg>
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVimplicitauto11xmlfromrev12132CalDAVTestertrunkscriptstestsCalDAVimplicitauto11xml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml (from rev 12132, CalDAVTester/trunk/scripts/tests/CalDAV/implicitauto11.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,256 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test implicit scheduling for auto-accept location where hidden instances are used</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>auto-accept</feature>
+                <feature>implicit-scheduling</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>GET</method>
+                        <ruri>$calendarpath1:/</ruri>
+                </request>
+                <request user="$userid2:" pswd="$pswd2:">
+                        <method>GET</method>
+                        <ruri>$calendarpath2:/</ruri>
+                </request>
+                <request>
+                        <method>DELETEALL</method>
+                        <ruri>$inboxpath1:/</ruri>
+                </request>
+                <request user="$userid2:" pswd="$pswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$inboxpath2:/</ruri>
+                </request>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$rinboxpath1:/</ruri>
+                </request>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$rcalendarpath1:/</ruri>
+                </request>
+        </start>
+        
+        <test-suite name='#1 Non-recurring' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>Create recurring event - resource invited to two instances only</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/implicit/auto11/suite1/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>One item in user01 Inbox</description>
+                        <request print-response="no">
+                                <method>WAITDELETEALL 1</method>
+                                <ruri>$inboxpath1:/</ruri>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>One item in user01 Calendar</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/implicit/auto11/suite1/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>No items in resource01 Inbox</description>
+                        <request user="$useradmin:" pswd="$pswdadmin:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$rinboxpath1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>One item in resource01 Calendar</description>
+                        <request user="$useradmin:" pswd="$pswdadmin:" print-response="no">
+                                <method>GETNEW</method>
+                                <ruri>$rcalendarpath1:/</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/implicit/auto11/suite1/3.ics</value>
+                                        </arg>
+                                </verify>
+                                <graburi>$r1:</graburi>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Proxy removes first instance to decline it</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$r1:</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/implicit/auto11/suite1/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>One item in resource01 Calendar</description>
+                        <request user="$useradmin:" pswd="$pswdadmin:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$r1:</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/implicit/auto11/suite1/4.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>One item in user01 Inbox</description>
+                        <request print-response="no">
+                                <method>WAITDELETEALL 1</method>
+                                <ruri>$inboxpath1:/</ruri>
+                        </request>
+                </test>
+                <test name='9' ignore='no'>
+                        <description>One item in user01 Calendar</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/implicit/auto11/suite1/5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='10' ignore='no'>
+                        <description>Organizer cancels second instance</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/implicit/auto11/suite1/6.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11' ignore='no'>
+                        <description>One item in user01 Calendar</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/implicit/auto11/suite1/7.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='12' ignore='no'>
+                        <description>No item in resource01 Calendar</description>
+                        <request user="$useradmin:" pswd="$pswdadmin:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$r1:</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='-1' ignore='no'>
+                        <description>Clean-up inboxes</description>
+                        <request>
+                                <method>DELETEALL</method>
+                                <ruri>$inboxpath1:/</ruri>
+                        </request>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$inboxpath2:/</ruri>
+                        </request>
+                        <request user="$useradmin:" pswd="$pswdadmin:">
+                                <method>DELETEALL</method>
+                                <ruri>$rinboxpath1:/</ruri>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request>
+                        <method>DELETEALL</method>
+                        <ruri>$inboxpath1:/</ruri>
+                        <ruri>$calendarpath1:/</ruri>
+                </request>
+                <request user="$userid2:" pswd="$pswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$inboxpath2:/</ruri>
+                        <ruri>$calendarpath2:/</ruri>
+                </request>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$rinboxpath1:/</ruri>
+                        <ruri>$rcalendarpath1:/</ruri>
+                </request>
+        </end>
+        
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVprivatecommentsxml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1124,8 +1124,175 @@
</span><span class="cx">                                 </verify>
</span><span class="cx">                         </request>
</span><span class="cx">                 </test>
</span><ins>+                <test name='-1'>
+                        <description>Clean-up</description>
+                        <request user="$userid1:" pswd="$pswd1:">
+                                <method>DELETEALL</method>
+                                <ruri>$calendarpath1:/</ruri>
+                        </request>
+                        <request user="$userid1:" pswd="$pswd1:">
+                                <method>DELETEALL</method>
+                                <ruri>$inboxpath1:/</ruri>
+                        </request>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$calendarpath2:/</ruri>
+                        </request>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$inboxpath2:/</ruri>
+                        </request>
+                        <request user="$userid3:" pswd="$pswd3:">
+                                <method>DELETEALL</method>
+                                <ruri>$calendarpath3:/</ruri>
+                        </request>
+                        <request user="$userid3:" pswd="$pswd3:">
+                                <method>DELETEALL</method>
+                                <ruri>$inboxpath3:/</ruri>
+                        </request>
+                </test>
</ins><span class="cx">         </test-suite>
</span><span class="cx">
</span><ins>+        <test-suite name='No duplicates' ignore='no'>
+                <test name='1'>
+                        <description>Organizer invites Attendee</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/3.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/privatecomments/26.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Organizer checks data</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/3.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/privatecomments/27.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Attendee Inbox Item</description>
+                        <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+                                <method>WAITDELETEALL 1</method>
+                                <ruri>$inboxpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Attendee has data</description>
+                        <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$calendarpath2:/</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/privatecomments/28.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Attendee -> Accepts with comment</description>
+                        <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$calendarpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                        <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/privatecomments/29.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>Attendee has data</description>
+                        <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$calendarpath2:/</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/privatecomments/30.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Organizer Inbox Item</description>
+                        <request print-response='no'>
+                                <method>WAITDELETEALL 1</method>
+                                <ruri>$inboxpath1:/</ruri>
+                        </request>
+                </test>
+                <test name='9'>
+                        <description>Organizer data changed</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/3.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/privatecomments/35.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='10'>
+                        <description>Organizer duplicates comment</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/3.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/privatecomments/44.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>prepostcondition</callback>
+                                        <arg>
+                                                <name>error</name>
+                                                <value>{http://calendarserver.org/ns/}no-duplicate-private-comments</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11'>
+                        <description>Organizer checks data</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/3.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/privatecomments/35.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
</ins><span class="cx">         <end>
</span><span class="cx">                 <request user="$userid1:" pswd="$pswd1:">
</span><span class="cx">                         <method>DELETEALL</method>
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharingcreatexml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx"> limitations under the License.
</span><span class="cx"> -->
</span><span class="cx">
</span><del>-<caldavtest ignore-all='yes'>
</del><ins>+<caldavtest>
</ins><span class="cx">         <description>Test calendar sharing replies</description>
</span><span class="cx">
</span><span class="cx">         <require-feature>
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharinginvitesxml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -526,10 +526,6 @@
</span><span class="cx">                         <request user="$userid2:" pswd="$pswd2:" print-response='no'>
</span><span class="cx">                                 <method>DELETE</method>
</span><span class="cx">                                 <ruri>$shareecalendar2:/</ruri>
</span><del>-                                <data substitutions='yes'>
-                                        <content-type>application/xml; charset=utf-8</content-type>
-                                        <filepath>Resource/CalDAV/sharing/invites/double/5.xml</filepath>
-                                </data>
</del><span class="cx">                                 <verify>
</span><span class="cx">                                         <callback>statusCode</callback>
</span><span class="cx">                                 </verify>
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcachexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingcachexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-cache.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,412 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest ignore-all='yes'>
+        <description>Test calendar sharing interaction with cache</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </start>
+        
+        <test-suite name='Generate invite' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>Create</description>
+                        <request end-delete="yes">
+                                <method>MKCALENDAR</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>PROPFIND Home to cache it</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>notcontains</name>
+                                                <value>user02</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>PROPFIND Home check</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>contains</name>
+                                                <value>puser02</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>POST uninvite</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>PROPFIND Home check</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>notcontains</name>
+                                                <value>puser02</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Send first reply'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>PROPFIND Home check</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/sharedas.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>PROPFIND Home check</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$shareecalendar:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Delete shared</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>PROPFIND Home check</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>nohrefs</name>
+                                                <value>$shareecalendar:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Sharee replies ACCEPTED - need to do this cycle of accept/delete twice to regress properly</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/sharedas.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='9' ignore='no'>
+                        <description>PROPFIND Home check</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$shareecalendar:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='10' ignore='no'>
+                        <description>Delete shared</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11' ignore='no'>
+                        <description>PROPFIND Home check</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>nohrefs</name>
+                                                <value>$shareecalendar:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcalendarsxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingcalendarsxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-calendars.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,574 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing calendars</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request>
+                        <method>PROPPATCH</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                        </data>
+                </request>
+        </start>
+        
+        <test-suite name='Read-write calendar'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Shared calendar exists</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{DAV:}collection</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:caldav}calendar</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                                <value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4a'>
+                        <description>Shared calendar exists Depth:1</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>parent</name>
+                                                <value>$multistatus-response-prefix:[^{DAV:}href=$sharedcalendar:/]</value>
+                                        </arg>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-response-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-response-prefix:/{DAV:}resourcetype/{DAV:}collection</value>
+                                                <value>$verify-response-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:caldav}calendar</value>
+                                                <value>$verify-response-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                                <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                                <value>$verify-response-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4b'>
+                        <description>Shared calendar has invite property</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{http://calendarserver.org/ns/}invite</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}organizer</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}organizer/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}organizer/{http://calendarserver.org/ns/}common-name[=$username1:]</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user/{DAV:}href[=$pcuaddrurn2:]</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user/{http://calendarserver.org/ns/}access/{http://calendarserver.org/ns/}read-write</value>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user/{http://calendarserver.org/ns/}invite-accepted</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Original calendar unchanged</description>
+                        <request>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}opaque</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharee creates event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>Sharer sees event</description>
+                        <request>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Sharer changes event</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='9'>
+                        <description>Sharee sees changed event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='10'>
+                        <description>Sharer creates event</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11'>
+                        <description>Sharee sees new event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar:/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/4.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='12'>
+                        <description>Sharee changes event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='13'>
+                        <description>Sharer sees changed event</description>
+                        <request>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Default calendar cannot be shared calendar' ignore='no'>
+                <test name='1'>
+                        <description>Set property on Inbox</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPPATCH</method>
+                                <ruri>$pinboxpath2:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/defaultcalendar/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>badprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}schedule-default-calendar-URL</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Verify property on inbox</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$pinboxpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/defaultcalendar/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value><![CDATA[{urn:ietf:params:xml:ns:caldav}schedule-default-calendar-URL$<href xmlns="DAV:">$pcalendarpath2:</href>]]></value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Change to read-only calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-ro-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-only/1.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Shared calendar exists</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Create event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/3.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-only/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharer creates event</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/4.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-only/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>Sharee sees new event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar:/4.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-only/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Sharee cannot change event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/4.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-only/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+        
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcreatexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingcreatexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-create.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,220 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing replies</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </start>
+        
+        <test-suite name='Create calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request end-delete="yes">
+                                <method>MKCALENDAR</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>Change the color</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/direct/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{http://apple.com/ns/ical/}calendar-color</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Generate invite' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Accept' ignore='no'>
+                <test name='1'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>Check accept status</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Check Sharer notification collection</description>
+                        <request>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationreply2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Shared calendar exists without color</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/direct/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>badprops</name>
+                                                <value>{http://apple.com/ns/ical/}calendar-color</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdirectxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingdirectxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-direct.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,762 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing calendars</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request print-response='no'>
+                        <method>PROPPATCH</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                        </data>
+                </request>
+        </start>
+        
+        <test-suite name='Read-write calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>Add puser02 as read write for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-write/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/direct/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Sharee does direct share</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/?action=share</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Shared calendar exists</description>
+                        <pause/>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                                <value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Original calendar unchanged</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}opaque</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee creates event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharer sees event</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>Sharer changes event</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Sharee sees changed event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$sharedcalendar:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='9'>
+                        <description>Sharer creates event</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='10'>
+                        <description>Sharee sees new event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$sharedcalendar:/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/4.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11'>
+                        <description>Sharee changes event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='12'>
+                        <description>Sharer sees changed event</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/calendars/read-write/5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='13'>
+                        <description>Sharee does direct share again</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/?action=share</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='14'>
+                        <description>Shared calendar exists</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                                <value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Change to read-only calendar' ignore='yes'>
+                <test name='1' ignore='no'>
+                        <description>Clear user02 as read-write proxy for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-write/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/calendaruserproxy/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>Add user02 as read-only for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-read/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/calendaruserproxy/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Shared calendar exists</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-only/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Create event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/3.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-only/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharer creates event</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/4.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-only/6.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharee sees new event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$sharedcalendar:/4.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/calendars/read-only/6.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>Sharee cannot change event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/4.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-only/7.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Removal of direct share' ignore='yes'>
+                <test name='1' ignore='no'>
+                        <description>Remove direct share</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Shared calendar does not exist</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-only/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharer calendar does exist</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-only/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>3</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Direct share not allowed' ignore='yes'>
+                <test name='1' ignore='no'>
+                        <description>Clear user02 as read-only proxy for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-read/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/calendaruserproxy/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Sharee does direct share</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/?action=share</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Using non __uids__ path' ignore='yes'>
+                <test name='1' ignore='no'>
+                        <description>Add user02 as read write for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-write/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/calendaruserproxy/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Sharee does direct share</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhomealt1:/shared/?action=share</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Shared calendar exists</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-write/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                                <value>$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Sharee creates event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar2:/9.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/calendars/read-write/9.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharer sees event</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/9.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/calendars/read-write/9.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Remove direct share</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Clear user02 as read-write proxy for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-write/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/calendaruserproxy/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Calendar color' ignore='yes'>
+                <test name='1' ignore='no'>
+                        <description>Add user02 as read write for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-write/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/calendaruserproxy/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>Change the color</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhomealt1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/direct/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{http://apple.com/ns/ical/}calendar-color</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee does direct share</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhomealt1:/shared/?action=share</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Shared calendar exists with color</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/direct/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{http://apple.com/ns/ical/}calendar-color[=#00112233]</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>Remove direct share</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Clear user02 as read-write proxy for user01</description>
+                        <request print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$principal1:calendar-proxy-write/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/calendaruserproxy/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end/>
+        
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdropboxxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingdropboxxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-dropbox.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,323 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest ignore-all="no">
+        <description>Test Quota support on the server for shared calendars</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>dropbox</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid2:" pswd="$pswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath2:/</ruri>
+                </request>
+                <request user="$userid3:" pswd="$pswd3:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath3:/</ruri>
+                </request>
+                <request user="$userid4:" pswd="$pswd4:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath4:/</ruri>
+                </request>
+                <request user="$userid2:" pswd="$pswd2:" end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome2:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Setup two sharees'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome2:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite234.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee 2 notification collection</description>
+                        <request user="$userid3:" pswd="$pswd3:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath3:/</ruri>
+                        </request>
+                        <request user="$userid3:" pswd="$pswd3:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid23:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl23:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee 2 replies ACCEPTED</description>
+                        <request user="$userid3:" pswd="$pswd3:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome3:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply23.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar3:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Check Sharee 3 notification collection</description>
+                        <request user="$userid4:" pswd="$pswd4:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath4:/</ruri>
+                        </request>
+                        <request user="$userid4:" pswd="$pswd4:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath4:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid24:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl24:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee 3 replies ACCEPTED</description>
+                        <request user="$userid4:" pswd="$pswd4:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome4:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply24.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar4:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Clean out notifications</description>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath2:/</ruri>
+                        </request>
+                        <request user="$userid3:" pswd="$pswd3:">
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath3:/</ruri>
+                        </request>
+                        <request user="$userid4:" pswd="$pswd4:">
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath4:/</ruri>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='PUT by User 2' ignore='no'>
+                <test name='1'>
+                        <description>PUT event by user 2</description>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>PUT</method>
+                                <ruri>$calendarhome2:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/dropbox/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>PUT attachment by user 2</description>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>PUT</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/2.xml</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/dropbox/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>Attachment exists for User 2</description>
+                        <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Attachment exists for User 3</description>
+                        <request user="$userid3:" pswd="$pswd3:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>PUT attachment by user 3</description>
+                        <request user="$userid3:" pswd="$pswd3:">
+                                <method>PUT</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/3.xml</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/dropbox/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Attachments exists for User 4</description>
+                        <request user="$userid4:" pswd="$pswd4:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>2</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>PUT attachment by user 4</description>
+                        <request user="$userid4:" pswd="$pswd4:">
+                                <method>PUT</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/3.xml</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/dropbox/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>DELETE attachment by user 2</description>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>DELETE</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/2.xml</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='9'>
+                        <description>DELETE attachment by user 2</description>
+                        <request user="$userid2:" pswd="$pswd2:">
+                                <method>DELETE</method>
+                                <ruri>$dropboxpath2:/54E181BC7CCC373042B28842/3.xml</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                        <ruri>$notificationpath2:/</ruri>
+                        <ruri>$notificationpath3:/</ruri>
+                        <ruri>$notificationpath4:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingfreebusyxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingfreebusyxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-freebusy.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,419 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest ignore-all='no'>
+        <description>Test calendar sharing per-user data</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                </request>
+                <request>
+                        <method>POST</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharinginvite23-pod.xml</filepath>
+                        </data>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>WAITCOUNT 1</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>GETNEW</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                <variable>$inviteuid2:</variable>
+                        </grabelement>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                <variable>$hosturl2:</variable>
+                        </grabelement>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>POST</method>
+                        <ruri>$pcalendarhome2:/</ruri>
+                        <data substitutions='yes'>
+                                <content-type>application/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                        </data>
+                        <grabelement>
+                                <name>{DAV:}href</name>
+                                <variable>$sharedcalendar2:</variable>
+                        </grabelement>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                        <method>WAITCOUNT 1</method>
+                        <ruri>$pnotificationpath3:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                        <method>GETNEW</method>
+                        <ruri>$pnotificationpath3:/</ruri>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                <variable>$inviteuid3:</variable>
+                        </grabelement>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                <variable>$hosturl3:</variable>
+                        </grabelement>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                        <method>POST</method>
+                        <ruri>$pcalendarhome3:/</ruri>
+                        <data substitutions='yes'>
+                                <content-type>application/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharingreply3-pod.xml</filepath>
+                        </data>
+                        <grabelement>
+                                <name>{DAV:}href</name>
+                                <variable>$sharedcalendar3:</variable>
+                        </grabelement>
+                </request>
+                <request>
+                        <method>PROPPATCH</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                        </data>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>PROPPATCH</method>
+                        <ruri>$sharedcalendar2:/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                        </data>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                        <method>PROPPATCH</method>
+                        <ruri>$sharedcalendar3:/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                        </data>
+                </request>
+        </start>
+        
+        <test-suite name='Initial event'>
+                <test name='1'>
+                        <description>User01 store to shared</description>
+                        <request user="$userid1:" pswd="$pswd1:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/1.ics</filepath>
+                                </data>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>User01 freebusy</description>
+                        <request>
+                                <method>POST</method>
+                                <ruri>$outboxpath1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>User02 freebusy</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>User03 freebusy</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath3:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.0:T230000Z/$now.1:T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Changed event'>
+                <test name='1'>
+                        <description>User02 store to shared</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar2:/1.ics</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/2.ics</filepath>
+                                </data>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>User01 freebusy</description>
+                        <request>
+                                <method>POST</method>
+                                <ruri>$outboxpath1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.1:T230000Z/$now.2:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.1:T230000Z/$now.2:T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>User02 freebusy</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.1:T230000Z/$now.2:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.1:T230000Z/$now.2:T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>User03 freebusy</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath3:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/freebusy/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.1:T230000Z/$now.2:T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.1:T230000Z/$now.2:T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <ruri>$pnotificationpath3:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharinginvitesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharinginvitesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-invites.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,575 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing invitations</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared2/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared3/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Send new invite'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Notification type property</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/notificationtype.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}notificationtype/{http://calendarserver.org/ns/}invite-notification[@shared-type="calendar"]</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Update new invite'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-ro-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2-ro.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Notification type property</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/notificationtype.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{http://calendarserver.org/ns/}notificationtype/{http://calendarserver.org/ns/}invite-notification[@shared-type="calendar"]</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Uninvite new invite'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Attempt broken invite'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/invites/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>424</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>403</name>
+                                                <value>mailto:bogus@example.net</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Delete new invite'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>DELETE collection</description>
+                        <request print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Uninvite invalid invite'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request end-delete="yes">
+                                <method>MKCALENDAR</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>POST valid invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>POST single invalid uninvitate</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/invites/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>POST invalid and valid uninvitate</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/invites/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>200</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>403</name>
+                                                <value>mailto:bogus@example.com</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>DELETE collection</description>
+                        <request print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Double invites'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation #2</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared2/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2-2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>POST invitation #3</description>
+                        <request print-response='no'>
+                                <method>DELAY</method>
+                                <ruri>1</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared3/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 2</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2-3.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee replies ACCEPTED #2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/sharedas.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharee deletes shared calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$shareecalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Remove invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared2/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>Remove invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared3/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmovesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingmovesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-moves.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,546 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest ignore-all='no'>
+        <description>Test calendar sharing and MOVE</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                </request>
+                <request print-response='no'>
+                        <method>POST</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharinginvite2.xml</filepath>
+                        </data>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                        <method>WAITCOUNT 1</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                        <method>GETNEW</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                <variable>$inviteuid2:</variable>
+                        </grabelement>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                <variable>$hosturl2:</variable>
+                        </grabelement>
+                </request>
+                <request user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                        <method>POST</method>
+                        <ruri>$pcalendarhome2:/</ruri>
+                        <data substitutions='yes'>
+                                <content-type>application/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharingreply2.xml</filepath>
+                        </data>
+                        <grabelement>
+                                <name>{DAV:}href</name>
+                                <variable>$sharedcalendar2:</variable>
+                        </grabelement>
+                </request>
+        </start>
+        
+        <test-suite name='OK event to shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User02 store to personal calendar</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarpath2:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 moves event to shared calendar</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$calendarpath2:/1.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$sharedcalendar2:/1.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User02 sees event</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>User01 sees event</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        
+        <test-suite name='Bad event to shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User02 store to personal calendar</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" end-delete="yes" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarpath2:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 moves event to shared calendar</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$calendarpath2:/2.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$sharedcalendar2:/2.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='OK event from shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to shared calendar</description>
+                        <request print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/3.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 moves event from shared calendar</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$sharedcalendar2:/3.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$calendarpath2:/3.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User02 sees event</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarpath2:/3.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$calendarpath2:/3.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>User01 sees no event</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/3.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        
+        <test-suite name='Bad event to shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to shared calendar</description>
+                        <request end-delete="yes" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/4.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 moves event from shared calendar</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$sharedcalendar2:/4.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$calendarpath2:/4.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='OK owner event to shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to personal calendar</description>
+                        <request print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/5.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 moves event to shared calendar</description>
+                        <request print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$calendarpath1:/5.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$calendarhome1:/shared/5.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User02 sees event</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/5.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>User01 sees event</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/5.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$calendarhome1:/shared/5.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        
+        <test-suite name='OK owner event with organizer to shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to personal calendar</description>
+                        <request print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/6.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/6.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 moves event to shared calendar</description>
+                        <request print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$calendarpath1:/6.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$calendarhome1:/shared/6.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User02 sees event</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/6.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/6.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>User01 sees event</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/6.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/6.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$calendarhome1:/shared/6.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='OK owner event from shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to shared calendar</description>
+                        <request print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/7.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/7.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 moves event from shared calendar</description>
+                        <request print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$calendarhome1:/shared/7.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$calendarpath1:/7.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User02 does not see event</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/7.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>User01 sees event</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/7.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/7.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$calendarpath1:/7.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        
+        <test-suite name='OK owner event with organizer from shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to shared calendar</description>
+                        <request print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/8.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/moves/8.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 moves event from shared calendar</description>
+                        <request print-response="no">
+                                <method>MOVE</method>
+                                <ruri>$calendarhome1:/shared/8.ics</ruri>
+                                <header>
+                                        <name>Destination</name>
+                                        <value>$host:$calendarpath1:/8.ics</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User02 does not see event</description>
+                        <request user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/8.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>User01 sees event</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarpath1:/8.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/moves/8.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request print-response="no">
+                                <method>DELETE</method>
+                                <ruri>$calendarpath1:/8.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmultiplexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingmultiplexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-multiple.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,429 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing invitations</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared1/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared2/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Send new invite #1'>
+                <test name='1' ignore='no'>
+                        <description>Initial collection count</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabcount>$calendarhome2count:</grabcount>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared1/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>One more calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>$calendarhome2count:+1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>One more calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Send new invite #2'>
+                <test name='1' ignore='no'>
+                        <description>Initial collection count</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabcount>$calendarhome2count:</grabcount>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared2/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 2</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>One more calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>$calendarhome2count:+1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>One more calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Uninvite #2'>
+                <test name='1' ignore='no'>
+                        <description>Initial collection count</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabcount>$calendarhome2count:</grabcount>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared2/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>2</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>One less calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>$calendarhome2count:-1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>One less calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Existing calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingnotificationsyncxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingnotificationsyncxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-notification-sync.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,1410 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing calendars</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+                <feature>sync-report</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request print-response='no'>
+                        <method>PROPPATCH</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                        </data>
+                </request>
+        </start>
+        
+        <test-suite name='initial tokens - depth 1' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>initial query - grab token</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>totalcount</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>initial query - grab token</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>totalcount</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Read-write calendar - depth 1' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>new resource</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>totalcount</name>
+                                                <value>1</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}response/{DAV:}href</name>
+                                        <variable>$href2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Remove notification</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>new resource</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$href2:</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='initial tokens - depth infinity' ignore='no'>
+                <test name='1' ignore='no'>
+                        <require-feature>
+                                <feature>sync-report-home</feature>
+                        </require-feature>
+                        <description>initial query - grab token</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$notification:/</value>
+                                                <value>shared/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$dropbox:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <require-feature>
+                                <feature>sync-report-home</feature>
+                        </require-feature>
+                        <description>initial query - grab token</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$dropbox:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Read-write calendar - depth infinity - sharee delete'>
+                <require-feature>
+                        <feature>sync-report-home</feature>
+                </require-feature>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>new resource</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <graburi>basename($notification2:)</graburi>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>totalcount</name>
+                                                <value>2</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Remove notification</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>deleted resource</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$notification:/$notification2:</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>new calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>Sharee removes calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>removed calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Read-write calendar - depth infinity - sharer removes'>
+                <require-feature>
+                        <feature>sync-report-home</feature>
+                </require-feature>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>new resource</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <graburi>basename($notification2:)</graburi>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>totalcount</name>
+                                                <value>2</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Remove notification</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>deleted resource</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$notification:/$notification2:</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>new calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>removed calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='9' ignore='no'>
+                        <description>no calendar change</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>totalcount</name>
+                                                <value>0</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Shared calendar data - depth infinity'>
+                <require-feature>
+                        <feature>sync-report-home</feature>
+                </require-feature>
+                <test name='1'>
+                        <description>Sharer creates event</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/notification-sync/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>new resource</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Remove notification</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>new calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Grab sharer's sync token'</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Sharer creates event</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/notification-sync/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='9' ignore='no'>
+                        <description>Sharer change</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                                <value>shared/2.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='10' ignore='no'>
+                        <description>Sharee change</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='11'>
+                        <description>Sharee creates event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar:/3.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/notification-sync/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='12' ignore='no'>
+                        <description>Sharer change</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                                <value>shared/3.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='13' ignore='no'>
+                        <description>Sharee change</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='14'>
+                        <description>Sharer deletes event</description>
+                        <request>
+                                <method>DELETE</method>
+                                <ruri>$calendarhome1:/shared/3.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='15' ignore='no'>
+                        <description>Sharer change</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>shared/3.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='16' ignore='no'>
+                        <description>Sharee change</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='17'>
+                        <description>Sharee deletes event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>DELETE</method>
+                                <ruri>$sharedcalendar:/2.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='18' ignore='no'>
+                        <description>Sharer change</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>shared/2.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='19' ignore='no'>
+                        <description>Sharee change</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='20'>
+                        <description>Sharee removes calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='21' ignore='no'>
+                        <description>removed calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Response cache' ignore='no'>
+                <require-feature>
+                        <feature>sync-report-home</feature>
+                </require-feature>
+                <test name='1' ignore='no'>
+                        <description>PROPFIND of current sync-token - direct</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>$verify-property-prefix:/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>PROPFIND of home</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>contains</name>
+                                                <value>$synctoken1:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>PROPFIND of home again - to cache it</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>contains</name>
+                                                <value>$synctoken1:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>PROPFIND of home - token changed</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>notcontains</name>
+                                                <value>$synctoken1:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>PROPFIND of new sync-token - direct</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>$verify-property-prefix:/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>PROPFIND of home</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>contains</name>
+                                                <value>$synctoken2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notcontains</name>
+                                                <value>$synctoken1:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>PROPFIND of home again - to cache it</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>contains</name>
+                                                <value>$synctoken2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notcontains</name>
+                                                <value>$synctoken1:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='9'>
+                        <description>Remove notification</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='10' ignore='no'>
+                        <description>PROPFIND of home - token changed</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/sync-token.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>dataString</callback>
+                                        <arg>
+                                                <name>notcontains</name>
+                                                <value>$synctoken1:</value>
+                                                <value>$synctoken2:</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserdataxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingperuserdataxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-peruser-data.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,711 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest ignore-all='no'>
+        <description>Test calendar sharing per-user data</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                </request>
+                <request print-response='no'>
+                        <method>POST</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharinginvite23-pod.xml</filepath>
+                        </data>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                        <method>WAITCOUNT 1</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                        <method>GETNEW</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                <variable>$inviteuid2:</variable>
+                        </grabelement>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                <variable>$hosturl2:</variable>
+                        </grabelement>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                        <method>POST</method>
+                        <ruri>$pcalendarhome2:/</ruri>
+                        <data substitutions='yes'>
+                                <content-type>application/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                        </data>
+                        <grabelement>
+                                <name>{DAV:}href</name>
+                                <variable>$sharedcalendar2:</variable>
+                        </grabelement>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                        <method>WAITCOUNT 1</method>
+                        <ruri>$pnotificationpath3:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                        <method>GETNEW</method>
+                        <ruri>$pnotificationpath3:/</ruri>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                <variable>$inviteuid3:</variable>
+                        </grabelement>
+                        <grabelement>
+                                <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                <variable>$hosturl3:</variable>
+                        </grabelement>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                        <method>POST</method>
+                        <ruri>$pcalendarhome3:/</ruri>
+                        <data substitutions='yes'>
+                                <content-type>application/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/POST/sharingreply3-pod.xml</filepath>
+                        </data>
+                        <grabelement>
+                                <name>{DAV:}href</name>
+                                <variable>$sharedcalendar3:</variable>
+                        </grabelement>
+                </request>
+        </start>
+        
+        <test-suite name='Initial event' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to shared</description>
+                        <request user="$userid1:" pswd="$pswd1:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/simple-put/1.ics</filepath>
+                                </data>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 sees event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/simple-put/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User03 sees event</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar3:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/simple-put/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='User01 changed event' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to shared</description>
+                        <request user="$userid1:" pswd="$pswd1:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/simple-change01/1.ics</filepath>
+                                </data>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 sees event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/simple-change01/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User03 sees event</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar3:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/simple-change01/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='User02 changed event' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User02 store to shared</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar2:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/simple-change02/1.ics</filepath>
+                                </data>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 sees event</description>
+                        <request user="$userid1:" pswd="$pswd1:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/simple-change02/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User03 sees event</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar3:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/simple-change02/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Different freebusy' ignore='no'>
+                <test name='1'>
+                        <description>Set properties on new calendars</description>
+                        <request print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$sharedcalendar2:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$sharedcalendar3:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 freebusy</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$outboxpath1:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User02 freebusy</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath2:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>User03 freebusy</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath3:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='User01 complex recurring store' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 store to shared</description>
+                        <request user="$userid1:" pswd="$pswd1:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/complex-put/1.ics</filepath>
+                                </data>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 sees event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar2:/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/complex-put/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User03 sees event</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar3:/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/complex-put/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='User02 complex recurring store' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User02 store to shared</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$sharedcalendar2:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/complex-change02/1.ics</filepath>
+                                </data>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 sees event</description>
+                        <request user="$userid1:" pswd="$pswd1:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/complex-change02/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User03 sees event</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>GET</method>
+                                <ruri>$sharedcalendar3:/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/peruser-data/complex-change02/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Complex freebusy' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 freebusy</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$outboxpath1:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                                <value>$now.year.1:0103T140000Z/$now.year.1:0103T150000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0102T130000Z/$now.year.1:0102T140000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                                <value>$now.year.1:0102T130000Z/$now.year.1:0102T140000Z</value>
+                                                <value>$now.year.1:0103T140000Z/$now.year.1:0103T150000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User02 freebusy</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath2:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                                <value>$now.year.1:0103T140000Z/$now.year.1:0103T150000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0102T130000Z/$now.year.1:0102T140000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                                <value>$now.year.1:0102T130000Z/$now.year.1:0102T140000Z</value>
+                                                <value>$now.year.1:0103T140000Z/$now.year.1:0103T150000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User03 freebusy</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response="no">
+                                <method>POST</method>
+                                <ruri>$poutboxpath3:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$cuaddr1:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                                <value>$now.year.1:0103T140000Z/$now.year.1:0103T150000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr2:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0102T130000Z/$now.year.1:0102T140000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>postFreeBusy</callback>
+                                        <arg>
+                                                <name>attendee</name>
+                                                <value>$pcuaddr3:</value>
+                                        </arg>
+                                        <arg>
+                                                <name>busy</name>
+                                                <value>$now.year.1:0101T130000Z/$now.year.1:0101T140000Z</value>
+                                                <value>$now.year.1:0101T230000Z/$now.year.1:0102T000000Z</value>
+                                                <value>$now.year.1:0102T130000Z/$now.year.1:0102T140000Z</value>
+                                                <value>$now.year.1:0103T140000Z/$now.year.1:0103T150000Z</value>
+                                                <value>$now.year.1:0104T130000Z/$now.year.1:0104T140000Z</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Prevent per-user data injection' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>User01 new event with injected per-user data</description>
+                        <request user="$userid1:" pswd="$pswd1:" end-delete="yes" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/inject/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>prepostcondition</callback>
+                                        <arg>
+                                                <name>error</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}valid-calendar-data</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>User01 new event with valid data</description>
+                        <request user="$userid1:" pswd="$pswd1:" end-delete="yes" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/inject/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>User01 existing event with injected per-user data</description>
+                        <request user="$userid1:" pswd="$pswd1:" print-response="no">
+                                <method>PUT</method>
+                                <ruri>$calendarpath1:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-data/inject/3.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>prepostcondition</callback>
+                                        <arg>
+                                                <name>error</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}valid-calendar-data</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <ruri>$pnotificationpath3:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserpropertiesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingperuserpropertiesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,394 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test per-user WebDAV properties</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Read-write calendar'>
+                <test name='1' ignore='no'>
+                        <description>PROPPATCH of displayname before share</description>
+                        <request print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/nonglobal/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$Changed Name #1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>PROPPATCH of calendar-description before share</description>
+                        <request print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/shadowable/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}calendar-description</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}calendar-description$Description #1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$sharedcalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Shared calendar exists</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/calendars/read-write/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>
+                                                <value>$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value>
+                                        </arg>
+                                        <arg>
+                                                <name>notexists</name>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value>
+                                                <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='prop patches - non-global' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>PROPFIND of shared displayname</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$The Shared Calendar</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>PROPPATCH of displayname</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/nonglobal/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$Shared Name #2</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>PROPFIND of shared displayname</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$Changed Name #1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='prop patches - shadowable' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>PROPFIND of shared calendar-description</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}calendar-description$Description #1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>PROPPATCH of calendar-description</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/shadowable/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}calendar-description</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$sharedcalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}calendar-description$Sharee Description #2</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>PROPFIND of shared calendar-description</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{urn:ietf:params:xml:ns:caldav}calendar-description$Description #1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingpropfindxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingpropfindxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-propfind.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,371 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request end-delete="yes">
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/1.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/1.txt</filepath>
+                        </data>
+                </request>
+                <request end-delete="yes">
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/2.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/2.txt</filepath>
+                        </data>
+                </request>
+                <request end-delete="yes">
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/3.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/3.txt</filepath>
+                        </data>
+                </request>
+                <request end-delete="yes">
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/4.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/4.txt</filepath>
+                        </data>
+                </request>
+                <request end-delete="yes">
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/5.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/5.txt</filepath>
+                        </data>
+                </request>
+        </start>
+        
+        <test-suite name='Set up share'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>basename($shareecalendar2:)</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendarpath2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='regular home prop finds'>
+                <test name='1'>
+                        <description>PROPFIND of basic properties depth=0</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>PROPFIND of basic properties depth=1</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$calendar:/</value>
+                                                <value>$shareecalendar2:/</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>PROPFIND of basic properties depth=infinity</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>infinity</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>prepostcondition</callback>
+                                        <arg>
+                                                <name>error</name>
+                                                <value>{DAV:}propfind-finite-depth</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='regular calendar prop finds'>
+                <test name='1'>
+                        <description>PROPFIND of basic properties depth=0</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>PROPFIND of basic properties depth=1</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value></value>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                                <value>5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>PROPFIND of basic properties depth=infinity</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>infinity</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>prepostcondition</callback>
+                                        <arg>
+                                                <name>error</name>
+                                                <value>{DAV:}propfind-finite-depth</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='regular calendar resource prop finds'>
+                <test name='1'>
+                        <description>PROPFIND of basic properties depth=0</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendarpath2:/1.ics</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value></value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-property-prefix:/{DAV:}creationdate</value>
+                                                <value>$verify-property-prefix:/{DAV:}getcontenttype</value>
+                                                <value>$verify-property-prefix:/{DAV:}getetag</value>
+                                                <value>$verify-property-prefix:/{DAV:}getlastmodified</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>PROPFIND of basic properties depth=1</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendarpath2:/1.ics</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value></value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>PROPFIND of basic properties depth=infinity</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendarpath2:/1.ics</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>infinity</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/props.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>prepostcondition</callback>
+                                        <arg>
+                                                <name>error</name>
+                                                <value>{DAV:}propfind-finite-depth</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+        
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingproxiesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingproxiesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-proxies.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,569 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing with proxies</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+                <feature>proxy</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request host2="yes" user="$userid4:" pswd="$pswd4:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Setup proxies' ignore="no">
+                <test name='1'>
+                        <description>Add user03 as read proxy for user02</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$pprincipal2:calendar-proxy-read/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/proxies/setupproxies/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Add user04 as write proxy for user02</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                                <method>PROPPATCH</method>
+                                <ruri>$pprincipal2:calendar-proxy-write/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/proxies/setupproxies/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}group-member-set</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Set up share'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/Common/POST/sharedas.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Check accept status</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/proxies/setupproxies/4.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Check Sharer notification collection</description>
+                        <request>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationreply2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharer adds event</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/proxies/setupproxies/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Proxies see calendar and contents'>
+                <test name='1'>
+                        <description>Read proxy lists calendar home</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$shareecalendar:/</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Write proxy lists calendar home</description>
+                        <request host2="yes" user="$puserid4:" pswd="$ppswd4:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>prefix</name>
+                                                <value/>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$shareecalendar:/</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Read proxy lists calendar</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Write proxy lists calendar</description>
+                        <request host2="yes" user="$puserid4:" pswd="$ppswd4:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Proxy data changes'>
+                <test name='1'>
+                        <description>Read proxy cannot write new data</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$shareecalendar:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/proxies/put/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Read proxy cannot write existing data</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$shareecalendar:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/proxies/setupproxies/5.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Write proxy can write new data</description>
+                        <request host2="yes" user="$puserid4:" pswd="$ppswd4:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$shareecalendar:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/proxies/put/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Sharer sees new data</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/proxies/put/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee sees new data</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$shareecalendar:/2.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/proxies/put/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Write proxy can write existing data with per-user alarm</description>
+                        <request host2="yes" user="$puserid4:" pswd="$ppswd4:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$shareecalendar:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/proxies/put/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7'>
+                        <description>Sharer sees new data without alarm</description>
+                        <request print-response='no'>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/proxies/put/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Sharee sees new data with alarm</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GET</method>
+                                <ruri>$shareecalendar:/1.ics</ruri>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/proxies/put/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Proxy property changes'>
+                <test name='1'>
+                        <description>Read proxy cannot write properties</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/proxies/properties/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>403</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Write proxy can write properties</description>
+                        <request host2="yes" user="$puserid4:" pswd="$ppswd4:" print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/proxies/properties/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>Sharer sees original displayname</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/displayname.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Sharee sees new displayname</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/displayname.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$Changed Name #1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <ruri>$pnotificationpath3:/</ruri>
+                        <ruri>$pnotificationpath4:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                        <method>PROPPATCH</method>
+                        <ruri>$pprincipal2:calendar-proxy-read/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV-pod/sharing/proxies/setupproxies/3.xml</filepath>
+                        </data>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response="no">
+                        <method>PROPPATCH</method>
+                        <ruri>$pprincipal2:calendar-proxy-write/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV-pod/sharing/proxies/setupproxies/3.xml</filepath>
+                        </data>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingrepliesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingrepliesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-replies.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,286 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing replies</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Send first reply'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/Common/POST/sharedas.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Check accept status</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/replies/accept/1.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Check Sharer notification collection</description>
+                        <request>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationreply2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Check sharee calendar displyname/shared-url</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/replies/accept/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindValues</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$The Shared Calendar</value>
+                                                <value>{http://calendarserver.org/ns/}sharedurl$$calendarhome1:/shared</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Check sharer calendar displyname</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/displayname.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname$shared</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Update reply'>
+                <test name='1'>
+                        <description>Sharee replies DECLINED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingdecline2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>Check declined status</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/replies/decline/1.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Check Sharer notification collection</description>
+                        <request>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationdecline2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingreportsmultigetxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingreportsmultigetxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,730 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <require-feature>
+                <feature>caldav</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared-tasks/</ruri>
+                        <data>
+                                <content-type>application/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/MKCALENDAR/vtodo.xml</filepath>
+                        </data>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/1.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/1.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/2.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/2.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/3.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/3.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/4.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/4.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/5.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/5.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/6.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/6.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/7.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/7.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/8.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/8.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/9.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/9.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/10.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/10.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/11.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/11.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/12.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/12.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/13.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/13.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/14.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/14.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <exclude-feature>
+                                <feature>split-calendars</feature>
+                        </exclude-feature>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/15.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/15.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/18.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/18.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/19.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/19.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/20.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/20.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/21.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/21.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/22.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/22.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared/27.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/27.ics</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared-tasks/101.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/101.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared-tasks/102.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/102.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared-tasks/103.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/103.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared-tasks/104.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/104.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared-tasks/105.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/105.txt</filepath>
+                        </data>
+                </request>
+                <request>
+                        <method>PUT</method>
+                        <ruri>$calendarhome1:/shared-tasks/106.ics</ruri>
+                        <data>
+                                <content-type>text/calendar; charset=utf-8</content-type>
+                                <filepath>Resource/CalDAV/reports/put/106.txt</filepath>
+                        </data>
+                </request>
+        </start>
+        
+        <test-suite name='Set up share'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>basename($shareecalendar2:)</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendarpath2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>POST invitation</description>
+                        <request>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared-tasks/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>WAITCOUNT 2</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>basename($shareetasks2:)</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareetaskspath2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='multiget reports' ignore='no'>
+                <test name='1a' ignore='no'>
+                        <description>basic multiget of 4 resources returning etag and entire ics data</description>
+                        <pause/>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <exclude-feature>
+                                                <feature>split-calendars</feature>
+                                        </exclude-feature>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <require-feature>
+                                                <feature>split-calendars</feature>
+                                        </require-feature>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                        <pause/>
+                </test>
+                <test name='1b' ignore='no'>
+                        <require-feature>
+                                <feature>split-calendars</feature>
+                        </require-feature>
+                        <description>basic multiget of 4 resources returning etag and entire ics data</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareetaskspath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/1b.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>basic multiget of 4 resources returning etag and only VCALENDAR property data (no embedded components)</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/2.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>basic multiget of 4 resources returning etag and only VTIMEZONE components</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4a' ignore='no'>
+                        <description>basic multiget of 4 resources returning etag and only SUMMARY/UID properties inside VEVENT components and VALARMs</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/4.xml</filepath>
+                                </data>
+                                <verify>
+                                        <exclude-feature>
+                                                <feature>split-calendars</feature>
+                                        </exclude-feature>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <require-feature>
+                                                <feature>split-calendars</feature>
+                                        </require-feature>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4b' ignore='no'>
+                        <require-feature>
+                                <feature>split-calendars</feature>
+                        </require-feature>
+                        <description>basic multiget of 4 resources returning etag and only SUMMARY/UID properties inside VEVENT components and VALARMs</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareetaskspath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/4b.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5a' ignore='no'>
+                        <description>as 4.xml except that the SUMMARY property value is not returned</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/5.xml</filepath>
+                                </data>
+                                <verify>
+                                        <exclude-feature>
+                                                <feature>split-calendars</feature>
+                                        </exclude-feature>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <require-feature>
+                                                <feature>split-calendars</feature>
+                                        </require-feature>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5b' ignore='no'>
+                        <require-feature>
+                                <feature>split-calendars</feature>
+                        </require-feature>
+                        <description>as 4.xml except that the SUMMARY property value is not returned</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareetaskspath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/5b.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>101.ics</value>
+                                                <value>102.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Does allprop</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/6.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Does propname</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/7.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                                <value>2.ics</value>
+                                                <value>3.ics</value>
+                                                <value>4.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>Single non-existent query</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>REPORT</method>
+                                <ruri>$shareecalendarpath2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/multiget/8.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>bogus-resource.ics</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>$verify-bad-response:[*404]</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+        
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingsyncxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingsyncxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-sync.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,1810 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing and cached home sync tokens</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+                <feature>sync-report</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+                <request print-response='no'>
+                        <method>PROPPATCH</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <data>
+                                <content-type>text/xml; charset=utf-8</content-type>
+                                <filepath>Resource/Common/PROPPATCH/calendar-transp-opaque.xml</filepath>
+                        </data>
+                </request>
+        </start>
+        
+        <test-suite name='Read-write calendar'>
+                <test name='1' ignore='no'>
+                        <description>Initial sync tokens</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken3:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken4:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken5:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>basename($sharedcalendar:)</variable>
+                                </grabelement>
+                        </request>
+                        <request>
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>Updated tokens</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value>1</value>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken3:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken4:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value>1</value>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken5:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken6:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Sharee creates event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/sync/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Updated tokens</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                                <value>shared/1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken3:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken4:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken5:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken6:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='8'>
+                        <description>Sharer changes event</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/sync/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='9' ignore='no'>
+                        <description>Updated tokens</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                                <value>shared/1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken3:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken4:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken5:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken6:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='10'>
+                        <description>Sharee deletes event</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/1.ics</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11' ignore='no'>
+                        <description>Updated tokens</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>shared/1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken3:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken4:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken5:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>1.ics</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken6:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='12'>
+                        <description>Sharer unshares</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='13' ignore='no'>
+                        <description>Updated tokens</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken3:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken4:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                                <value>1</value>
+                                        </arg>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$notification:/</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken5:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+
+        <test-suite name='calendar webdav property change - home depth:infinity' ignore='no'>
+                <require-feature>
+                        <feature>sync-report-home</feature>
+                </require-feature>
+                <test name='1' ignore='no'>
+                        <description>POST invitation and accept</description>
+                        <request>
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl2:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>basename($sharedcalendar:)</variable>
+                                </grabelement>
+                        </request>
+                        <request>
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>initial query - grab token</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$calendar:/</value>
+                                                <value>shared/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>initial query - grab token for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$calendar:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Change a property by user 1</description>
+                        <request>
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/17.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Remove a property by user 1</description>
+                        <request>
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/18.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='9' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='10' ignore='no'>
+                        <description>Change a property by user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPPATCH</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/17.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='12' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='13' ignore='no'>
+                        <description>Remove a property by user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPPATCH</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/18.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='14' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='15' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>badhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='16'>
+                        <description>Sharer unshares</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='calendar webdav property change - home depth:1' ignore='no'>
+                <require-feature>
+                        <feature>sync-report-home</feature>
+                </require-feature>
+                <test name='1' ignore='no'>
+                        <description>POST invitation and accept</description>
+                        <request user="$useradmin:" pswd="$pswdadmin:">
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>DELETEALL</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl2:</variable>
+                                </grabelement>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>basename($sharedcalendar:)</variable>
+                                </grabelement>
+                        </request>
+                        <request user="$useradmin:" pswd="$pswdadmin:">
+                                <method>DELETEALL</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>initial query - grab token</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$calendar:/</value>
+                                                <value>shared/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>initial query - grab token for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$calendar:/</value>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                        <arg>
+                                                <name>ignoremissing</name>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Change a property by user 1</description>
+                        <request>
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/17.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='6' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='7' ignore='no'>
+                        <description>Remove a property by user 1</description>
+                        <request>
+                                <method>PROPPATCH</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/18.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='8' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>shared/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='9' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='10' ignore='no'>
+                        <description>Change a property by user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPPATCH</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/17.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='11' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='12' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[!$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='13' ignore='no'>
+                        <description>Remove a property by user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PROPPATCH</method>
+                                <ruri>$pcalendarhome2:/$sharedcalendar:/</ruri>
+                                <data>
+                                        <content-type>text/vcard; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/reports/sync/18.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='14' ignore='no'>
+                        <description>Sync for user 1</description>
+                        <request print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$calendarhome1:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken1:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='15' ignore='no'>
+                        <description>Sync for user 2</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>REPORT</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data substitutions='yes'>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/REPORT/sync-token2-level-1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>okhrefs</name>
+                                                <value>$sharedcalendar:/</value>
+                                        </arg>
+                                </verify>
+                                <verify>
+                                        <callback>xmlElementMatch</callback>
+                                        <arg>
+                                                <name>exists</name>
+                                                <value>/{DAV:}multistatus/{DAV:}sync-token[!$synctoken2:]</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>/{DAV:}multistatus/{DAV:}sync-token</name>
+                                        <variable>$synctoken2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='16'>
+                        <description>Sharer unshares</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingremove2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+        </end>
+        
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingunsharexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingunsharexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-unshare.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,500 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test calendar sharing unshare/delete behavior</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Set up share' ignore="no">
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/Common/POST/sharedas.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Check accept status</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/invited2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Check Sharer notification collection</description>
+                        <request>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationreply2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+        
+        <test-suite name='Delete' ignore="no">
+                <test name='1'>
+                        <description>Sharer adds event</description>
+                        <request print-response='no'>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/unshare/shareedelete/1.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2' ignore='no'>
+                        <description>Sharee deletes shared calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>DELETE</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>infinity</value>
+                                </header>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3' ignore='no'>
+                        <description>No more shared calendar</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/resourcetype.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                        <arg>
+                                                <name>status</name>
+                                                <value>404</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Sharer still has calendar data</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>1</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/count.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>multistatusItems</callback>
+                                        <arg>
+                                                <name>count</name>
+                                                <value>1</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='Reshare after sharee DELETE shared calendar' ignore='no'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationinvite2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/Common/POST/sharedas.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4' ignore='no'>
+                        <description>Check accept status</description>
+                        <request print-response='no'>
+                                <method>PROPFIND</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <header>
+                                        <name>Depth</name>
+                                        <value>0</value>
+                                </header>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/PROPFIND/invite.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/invited2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Check Sharer notification collection</description>
+                        <request>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$notificationpath1:/</ruri>
+                        </request>
+                        <request print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$notificationpath1:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/common/notificationreply2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+
+        <test-suite name='Invite, display name change, uninvite' ignore="no">
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/unshare/shareruninvite/1.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath3:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath3:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/unshare/shareruninvite/2.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome3:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/unshare/shareruninvite/3.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/unshare/shareruninvite/4.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{DAV:}href</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Sharee changes name</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>PROPPATCH</method>
+                                <ruri>$shareecalendar:/</ruri>
+                                <data>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/unshare/shareruninvite/5.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>propfindItems</callback>
+                                        <arg>
+                                                <name>okprops</name>
+                                                <value>{DAV:}displayname</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5' ignore='no'>
+                        <description>POST uninvitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV-pod/sharing/unshare/shareruninvite/6.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>Check Sharee notification collection</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath3:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath3:/</ruri>
+                                <verify>
+                                        <callback>xmlDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV-pod/sharing/unshare/shareruninvite/7.xml</value>
+                                        </arg>
+                                        <arg>
+                                                <name>filter</name>
+                                                <value>{http://calendarserver.org/ns/}dtstamp</value>
+                                                <value>{http://calendarserver.org/ns/}uid</value>
+                                        </arg>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <ruri>$pnotificationpath3:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingwebcalxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingwebcalxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-webcal.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml         (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,498 @@
</span><ins>+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<caldavtest>
+        <description>Test internet calendar subscription behavior with sharing</description>
+
+        <require-feature>
+                <feature>caldav</feature>
+                <feature>webcal</feature>
+                <feature>shared-calendars</feature>
+        </require-feature>
+
+        <start>
+                <request user="$userid1:" pswd="$pswd1:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                </request>
+                <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath3:/</ruri>
+                </request>
+                <request end-delete="yes">
+                        <method>MKCALENDAR</method>
+                        <ruri>$calendarhome1:/shared/</ruri>
+                        <verify>
+                                <callback>statusCode</callback>
+                        </verify>
+                </request>
+        </start>
+        
+        <test-suite name='Setup two sharees'>
+                <test name='1' ignore='no'>
+                        <description>POST invitation</description>
+                        <request print-response='no'>
+                                <method>POST</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <data>
+                                        <content-type>text/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharinginvite23-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>Check Sharee 2 notification collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid2:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>Sharee 2 replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome2:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply2-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar2:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>Check Sharee 3 notification collection</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>WAITCOUNT 1</method>
+                                <ruri>$pnotificationpath3:/</ruri>
+                        </request>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>GETNEW</method>
+                                <ruri>$pnotificationpath3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
+                                        <variable>$inviteuid3:</variable>
+                                </grabelement>
+                                <grabelement>
+                                        <name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href</name>
+                                        <variable>$hosturl3:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>Sharee 3 replies ACCEPTED</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:" print-response='no'>
+                                <method>POST</method>
+                                <ruri>$pcalendarhome3:/</ruri>
+                                <data substitutions='yes'>
+                                        <content-type>application/xml; charset=utf-8</content-type>
+                                        <filepath>Resource/Common/POST/sharingreply3-pod.xml</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <grabelement>
+                                        <name>{DAV:}href</name>
+                                        <variable>$shareecalendar3:</variable>
+                                </grabelement>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='GET on empty calendar collection'>
+                <test name='1'>
+                        <description>GET on empty calendar collection</description>
+                        <request>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>GET on empty calendar collection - 2nd time from cache</description>
+                        <request>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>GET on empty calendar collection</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>GET on empty calendar collection - 2nd time from cache</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>GET on empty calendar collection</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>GET on empty calendar collection - 2nd time from cache</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/1.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='GET on calendar collection after initial PUT'>
+                <test name='1'>
+                        <description>GET on calendar collection after initial PUT</description>
+                        <request>
+                                <method>PUT</method>
+                                <ruri>$calendarhome1:/shared/1.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/webcal/rolled/2.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                        <request>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>GET on calendar collection after initial PUT - 2nd time from cache</description>
+                        <request>
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/2.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>GET on calendar collection after initial PUT</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>GET on calendar collection after initial PUT - 2nd time from cache</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>GET on calendar collection after initial PUT</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>GET on calendar collection after initial PUT - 2nd time from cache</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/3.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <test-suite name='GET on calendar collection after sharee PUT'>
+                <test name='1'>
+                        <description>GET on calendar collection after sharee PUT</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>PUT</method>
+                                <ruri>$shareecalendar2:/2.ics</ruri>
+                                <data>
+                                        <content-type>text/calendar; charset=utf-8</content-type>
+                                        <filepath>Resource/CalDAV/sharing/webcal/rolled/4.ics</filepath>
+                                </data>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                        </request>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='2'>
+                        <description>GET on calendar collection after sharee PUT - 2nd time from cache</description>
+                        <request print-response="no">
+                                <method>GET</method>
+                                <ruri>$calendarhome1:/shared/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/5.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='3'>
+                        <description>GET on calendar collection after sharee PUT</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/6.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='4'>
+                        <description>GET on calendar collection after sharee PUT - 2nd time from cache</description>
+                        <request host2="yes" user="$puserid2:" pswd="$ppswd2:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar2:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/6.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='5'>
+                        <description>GET on calendar collection after sharee PUT</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/7.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+                <test name='6'>
+                        <description>GET on calendar collection after sharee PUT - 2nd time from cache</description>
+                        <request host2="yes" user="$puserid3:" pswd="$ppswd3:">
+                                <method>GET</method>
+                                <ruri>$shareecalendar3:/</ruri>
+                                <verify>
+                                        <callback>statusCode</callback>
+                                </verify>
+                                <verify>
+                                        <callback>calendarDataMatch</callback>
+                                        <arg>
+                                                <name>filepath</name>
+                                                <value>Resource/CalDAV/sharing/webcal/rolled/7.ics</value>
+                                        </arg>
+                                </verify>
+                        </request>
+                </test>
+        </test-suite>
+
+        <end>
+                <request user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$notificationpath1:/</ruri>
+                </request>
+                <request host2="yes" user="$useradmin:" pswd="$pswdadmin:">
+                        <method>DELETEALL</method>
+                        <ruri>$pnotificationpath2:/</ruri>
+                        <ruri>$pnotificationpath3:/</ruri>
+                </request>
+        </end>
+
+</caldavtest>
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterverifiersmultistatusItemspy"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -47,9 +47,9 @@
</span><span class="cx"> prefix = prefix[0] if prefix[0] != "-" else ""
</span><span class="cx"> else:
</span><span class="cx"> prefix = uri
</span><del>- okhrefs = [prefix + i for i in okhrefs]
- nohrefs = [prefix + i for i in nohrefs]
- badhrefs = [prefix + i for i in badhrefs]
</del><ins>+ okhrefs = [(prefix + i).rstrip("/") for i in okhrefs]
+ nohrefs = [(prefix + i).rstrip("/") for i in nohrefs]
+ badhrefs = [(prefix + i).rstrip("/") for i in badhrefs]
</ins><span class="cx"> for k, v in args.items():
</span><span class="cx"> v = [prefix + i for i in v]
</span><span class="cx"> args[k] = v
</span><span class="lines">@@ -86,7 +86,7 @@
</span><span class="cx"> href = response.findall("{DAV:}href")
</span><span class="cx"> if href is None or len(href) != 1:
</span><span class="cx"> return False, " Incorrect/missing DAV:Href element in response"
</span><del>- href = urllib.unquote(href[0].text)
</del><ins>+ href = urllib.unquote(href[0].text).rstrip("/")
</ins><span class="cx">
</span><span class="cx"> # Verify status
</span><span class="cx"> status = response.findall("{DAV:}status")
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixes"></a>
<div class="propset"><h4>Property changes: CalendarServer/branches/users/gaya/sharedgroupfixes</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4>Modified: svn:mergeinfo</h4></div>
<span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><span class="cx">/CalendarServer/trunk:11632-11860,11862-12017
</span><span class="cx"> + /CalDAVTester/trunk:11193-11198
</span><span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><span class="cx">/CalendarServer/trunk:11632-11860,11862-12132
</span><a id="CalendarServerbranchesusersgayasharedgroupfixesbinproxyclean"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> except ImportError:
</span><span class="cx"> sys.exc_clear()
</span><span class="cx">
</span><del>-from twext.python.plistlib import readPlist
</del><ins>+from plistlib import readPlist
</ins><span class="cx">
</span><span class="cx"> try:
</span><span class="cx"> import opendirectory
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesbintrial"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,7 +16,10 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><ins>+from __future__ import print_function
+
</ins><span class="cx"> import sys
</span><ins>+import os
</ins><span class="cx">
</span><span class="cx"> #PYTHONPATH
</span><span class="cx">
</span><span class="lines">@@ -29,5 +32,8 @@
</span><span class="cx"> except ImportError:
</span><span class="cx"> sys.exc_clear()
</span><span class="cx">
</span><ins>+ for name, value in os.environ.items():
+ print("{0}={1}".format(name, value))
+
</ins><span class="cx"> from twisted.scripts.trial import run
</span><span class="cx"> run()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserver__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,13 +19,10 @@
</span><span class="cx"> CalendarServer application code.
</span><span class="cx"> """
</span><span class="cx">
</span><del>-# Make sure we have twext's required Twisted patches loaded before we do
-# anything at all.
-__import__("twext")
-
</del><span class="cx"> #
</span><span class="cx"> # setuptools is annoying
</span><span class="cx"> #
</span><ins>+
</ins><span class="cx"> from warnings import filterwarnings
</span><span class="cx"> filterwarnings("ignore", "Module (.*) was already imported (.*)")
</span><span class="cx"> del filterwarnings
</span><span class="lines">@@ -38,3 +35,11 @@
</span><span class="cx"> from calendarserver.version import version as __version__
</span><span class="cx"> except ImportError:
</span><span class="cx"> __version__ = None
</span><ins>+
+
+#
+# Get imap4 module to STFU
+#
+
+# from twisted.mail.imap4 import Command
+# Command._1_RESPONSES += tuple(['BYE'])
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserveraccesslogpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -40,9 +40,9 @@
</span><span class="cx"> getAdjustedClientName
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import iweb
-from twext.web2.log import BaseCommonAccessLoggingObserver
-from twext.web2.log import LogWrapperResource
</del><ins>+from txweb2 import iweb
+from txweb2.log import BaseCommonAccessLoggingObserver
+from txweb2.log import LogWrapperResource
</ins><span class="cx">
</span><span class="cx"> from twisted.internet import protocol, task
</span><span class="cx"> from twisted.protocols import amp
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisionrootpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,11 +20,11 @@
</span><span class="cx"> ]
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.wrapper import UnauthorizedResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.wrapper import UnauthorizedResponse
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.xattrprops import xattrPropertyStore
-from twext.web2.http import HTTPError, StatusResponse, RedirectResponse
</del><ins>+from txweb2.dav.xattrprops import xattrPropertyStore
+from txweb2.http import HTTPError, StatusResponse, RedirectResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.cred.error import LoginFailed, UnauthorizedLogin
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx"> self.responseCache = DisabledCache()
</span><span class="cx">
</span><span class="cx"> if config.ResponseCompression:
</span><del>- from twext.web2.filter import gzip
</del><ins>+ from txweb2.filter import gzip
</ins><span class="cx"> self.contentFilters.append((gzip.gzipfilter, True))
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisiontesttest_rootpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,15 +19,15 @@
</span><span class="cx"> from twisted.cred.portal import Portal
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, maybeDeferred, returnValue
</span><span class="cx">
</span><del>-from twext.web2 import http_headers
-from twext.web2 import responsecode
-from twext.web2 import server
-from twext.web2.auth import basic
-from twext.web2.dav import auth
</del><ins>+from txweb2 import http_headers
+from txweb2 import responsecode
+from txweb2 import server
+from txweb2.auth import basic
+from txweb2.dav import auth
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.iweb import IResponse
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.http import HTTPError
+from txweb2.iweb import IResponse
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverpushapplepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,12 +18,12 @@
</span><span class="cx"> from twext.internet.ssl import ChainingOpenSSLContextFactory
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.server import parsePOSTData
</del><ins>+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.server import parsePOSTData
</ins><span class="cx"> from twisted.application import service
</span><span class="cx"> from twisted.internet import protocol
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="lines">@@ -888,7 +888,7 @@
</span><span class="cx"> to add a subscription entry to the database.
</span><span class="cx">
</span><span class="cx"> @param request: The request to process
</span><del>- @type request: L{twext.web2.server.Request}
</del><ins>+ @type request: L{txweb2.server.Request}
</ins><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> token = request.args.get("token", ("",))[0].replace(" ", "").lower()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -52,15 +52,15 @@
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.protocols.amp import AMP
</span><span class="cx">
</span><del>-from twext.web2.server import Site
</del><ins>+from txweb2.server import Site
</ins><span class="cx"> from twext.python.log import Logger, LogLevel, replaceTwistedLoggers
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><span class="cx"> from twext.internet.ssl import ChainingOpenSSLContextFactory
</span><span class="cx"> from twext.internet.tcp import MaxAcceptTCPServer, MaxAcceptSSLServer
</span><span class="cx"> from twext.internet.fswatch import DirectoryChangeListener, IDirectoryChangeListenee
</span><del>-from twext.web2.channel.http import LimitingHTTPFactory, SSLRedirectRequest, \
</del><ins>+from txweb2.channel.http import LimitingHTTPFactory, SSLRedirectRequest, \
</ins><span class="cx"> HTTPChannel
</span><del>-from twext.web2.metafd import ConnectionLimiter, ReportingHTTPService
</del><ins>+from txweb2.metafd import ConnectionLimiter, ReportingHTTPService
</ins><span class="cx"> from twext.enterprise.ienterprise import POSTGRES_DIALECT
</span><span class="cx"> from twext.enterprise.ienterprise import ORACLE_DIALECT
</span><span class="cx"> from twext.enterprise.adbapi2 import ConnectionPool
</span><span class="lines">@@ -119,7 +119,7 @@
</span><span class="cx"> from version import version as getVersion
</span><span class="cx"> version = "%s (%s*)" % getVersion()
</span><span class="cx">
</span><del>-from twext.web2.server import VERSION as TWISTED_VERSION
</del><ins>+from txweb2.server import VERSION as TWISTED_VERSION
</ins><span class="cx"> TWISTED_VERSION = "CalendarServer/%s %s" % (
</span><span class="cx"> version.replace(" ", ""), TWISTED_VERSION,
</span><span class="cx"> )
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertaptesttest_caldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -42,9 +42,9 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.python.plistlib import writePlist #@UnresolvedImport
-from twext.web2.dav import auth
-from twext.web2.log import LogWrapperResource
</del><ins>+from plistlib import writePlist #@UnresolvedImport
+from txweb2.dav import auth
+from txweb2.log import LogWrapperResource
</ins><span class="cx"> from twext.internet.tcp import MaxAcceptTCPServer, MaxAcceptSSLServer
</span><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config, ConfigDict, ConfigurationError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertaputilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -34,11 +34,11 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.auth.basic import BasicCredentialFactory
-from twext.web2.dav import auth
-from twext.web2.http_headers import Headers
-from twext.web2.resource import Resource
-from twext.web2.static import File as FileResource
</del><ins>+from txweb2.auth.basic import BasicCredentialFactory
+from txweb2.dav import auth
+from txweb2.http_headers import Headers
+from txweb2.resource import Resource
+from txweb2.static import File as FileResource
</ins><span class="cx">
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.cred.portal import Portal
</span><span class="lines">@@ -130,7 +130,7 @@
</span><span class="cx"> databaseName=config.Postgres.DatabaseName,
</span><span class="cx"> clusterName=config.Postgres.ClusterName,
</span><span class="cx"> logFile=config.Postgres.LogFile,
</span><del>- socketDir=config.RunRoot,
</del><ins>+ socketDir=config.Postgres.SocketDirectory,
</ins><span class="cx"> listenAddresses=config.Postgres.ListenAddresses,
</span><span class="cx"> sharedBuffers=config.Postgres.SharedBuffers,
</span><span class="cx"> maxConnections=config.Postgres.MaxConnections,
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsagentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> import socket
</span><span class="cx">
</span><span class="cx"> from calendarserver.tap.util import getRootResource
</span><del>-from twext.python.plistlib import readPlistFromString, writePlistToString
</del><ins>+from plistlib import readPlistFromString, writePlistToString
</ins><span class="cx"> from twisted.application.internet import StreamServerEndpointService
</span><span class="cx"> from twisted.cred.checkers import ICredentialsChecker
</span><span class="cx"> from twisted.cred.credentials import IUsernameHashedPassword
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsanonymizepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> import xattr
</span><span class="cx"> import zlib
</span><span class="cx">
</span><del>-from twext.python.plistlib import readPlistFromString
</del><ins>+from plistlib import readPlistFromString
</ins><span class="cx">
</span><span class="cx"> from pycalendar.icalendar.calendar import Calendar
</span><span class="cx"> from pycalendar.parameter import Parameter
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsbackup_pgpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx">
</span><span class="cx"> PSQL = "%s/usr/bin/psql" % (SIPP,)
</span><span class="cx"> PGDUMP = "%s/usr/bin/pg_dump" % (SIPP,)
</span><del>-PGSOCKETDIR = "/Library/Server/PostgreSQL For Server Services/Socket"
</del><ins>+PGSOCKETDIR = "/var/run/caldavd/PostgresSocket"
</ins><span class="cx">
</span><span class="cx"> def usage(e=None):
</span><span class="cx"> name = os.path.basename(sys.argv[0])
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> import sys
</span><span class="cx"> import xml
</span><span class="cx">
</span><del>-from twext.python.plistlib import readPlistFromString, writePlistToString
</del><ins>+from plistlib import readPlistFromString, writePlistToString
</ins><span class="cx"> from twistedcaldav.config import config, ConfigDict, ConfigurationError, mergeData
</span><span class="cx"> from twistedcaldav.stdconfig import DEFAULT_CONFIG_FILE
</span><span class="cx"> WRITABLE_CONFIG_KEYS = [
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsdkimtoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,9 +24,9 @@
</span><span class="cx"> from twisted.python.usage import Options
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger, LogLevel, StandardIOObserver
</span><del>-from twext.web2.client.http import ClientRequest
-from twext.web2.http_headers import Headers
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.client.http import ClientRequest
+from txweb2.http_headers import Headers
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.dkim import RSA256, DKIMRequest, \
</span><span class="cx"> PublicKeyLookup, DKIMVerifier, DKIMVerificationError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsgatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> import sys
</span><span class="cx"> import xml
</span><span class="cx">
</span><del>-from twext.python.plistlib import readPlistFromString, writePlistToString
</del><ins>+from plistlib import readPlistFromString, writePlistToString
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryError
</span><span class="lines">@@ -32,7 +32,9 @@
</span><span class="cx"> principalForPrincipalID, proxySubprincipal, addProxy, removeProxy,
</span><span class="cx"> ProxyError, ProxyWarning, autoDisableMemcached
</span><span class="cx"> )
</span><del>-from calendarserver.tools.principals import getProxies, setProxies, updateRecord
</del><ins>+from calendarserver.tools.principals import (
+ getProxies, setProxies, updateRecord, attrMap
+)
</ins><span class="cx"> from calendarserver.tools.purge import WorkerService, PurgeOldEventsService, DEFAULT_BATCH_SIZE, DEFAULT_RETAIN_DAYS
</span><span class="cx"> from calendarserver.tools.cmdline import utilityMain
</span><span class="cx">
</span><span class="lines">@@ -140,26 +142,6 @@
</span><span class="cx"> utilityMain(configFileName, RunnerService, verbose=debug)
</span><span class="cx">
</span><span class="cx">
</span><del>-attrMap = {
- 'GeneratedUID' : { 'attr' : 'guid', },
- 'RealName' : { 'attr' : 'fullName', },
- 'RecordName' : { 'attr' : 'shortNames', },
- 'Comment' : { 'extras' : True, 'attr' : 'comment', },
- 'Description' : { 'extras' : True, 'attr' : 'description', },
- 'Type' : { 'extras' : True, 'attr' : 'type', },
- 'Capacity' : { 'extras' : True, 'attr' : 'capacity', },
- 'Building' : { 'extras' : True, 'attr' : 'building', },
- 'Floor' : { 'extras' : True, 'attr' : 'floor', },
- 'Street' : { 'extras' : True, 'attr' : 'street', },
- 'City' : { 'extras' : True, 'attr' : 'city', },
- 'State' : { 'extras' : True, 'attr' : 'state', },
- 'ZIP' : { 'extras' : True, 'attr' : 'zip', },
- 'Country' : { 'extras' : True, 'attr' : 'country', },
- 'Phone' : { 'extras' : True, 'attr' : 'phone', },
- 'Geo' : { 'extras' : True, 'attr' : 'geo', },
- 'AutoSchedule' : { 'attr' : 'autoSchedule', },
- 'AutoAcceptGroup' : { 'attr' : 'autoAcceptGroup', },
-}
</del><span class="cx">
</span><span class="cx"> class Runner(object):
</span><span class="cx">
</span><span class="lines">@@ -218,9 +200,9 @@
</span><span class="cx"> self.respondWithError("Command failed: '%s'" % (str(e),))
</span><span class="cx"> raise
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> # Locations
</span><span class="cx">
</span><del>-
</del><span class="cx"> def command_getLocationList(self, command):
</span><span class="cx"> self.respondWithRecordsOfTypes(self.dir, command, ["locations"])
</span><span class="cx">
</span><span class="lines">@@ -266,6 +248,7 @@
</span><span class="cx">
</span><span class="cx"> command_getResourceAttributes = command_getLocationAttributes
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def command_setLocationAttributes(self, command):
</span><span class="cx">
</span><span class="lines">@@ -306,9 +289,9 @@
</span><span class="cx"> return
</span><span class="cx"> self.respondWithRecordsOfTypes(self.dir, command, ["locations"])
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> # Resources
</span><span class="cx">
</span><del>-
</del><span class="cx"> def command_getResourceList(self, command):
</span><span class="cx"> self.respondWithRecordsOfTypes(self.dir, command, ["resources"])
</span><span class="cx">
</span><span class="lines">@@ -379,6 +362,67 @@
</span><span class="cx"> self.respondWithRecordsOfTypes(self.dir, command, ["locations", "resources"])
</span><span class="cx">
</span><span class="cx">
</span><ins>+ # Addresses
+
+ def command_getAddressList(self, command):
+ self.respondWithRecordsOfTypes(self.dir, command, ["addresses"])
+
+
+ @inlineCallbacks
+ def command_createAddress(self, command):
+ kwargs = {}
+ for key, info in attrMap.iteritems():
+ if key in command:
+ kwargs[info['attr']] = command[key]
+
+ try:
+ yield updateRecord(True, self.dir, "addresses", **kwargs)
+ except DirectoryError, e:
+ self.respondWithError(str(e))
+ return
+
+ self.respondWithRecordsOfTypes(self.dir, command, ["addresses"])
+
+
+ def command_getAddressAttributes(self, command):
+ guid = command['GeneratedUID']
+ record = self.dir.recordWithGUID(guid)
+ if record is None:
+ self.respondWithError("Principal not found: %s" % (guid,))
+ return
+ recordDict = recordToDict(record)
+ self.respond(command, recordDict)
+ return succeed(None)
+
+
+ @inlineCallbacks
+ def command_setAddressAttributes(self, command):
+ kwargs = {}
+ for key, info in attrMap.iteritems():
+ if key in command:
+ kwargs[info['attr']] = command[key]
+ try:
+ yield updateRecord(False, self.dir, "addresses", **kwargs)
+ except DirectoryError, e:
+ self.respondWithError(str(e))
+ return
+
+ yield self.command_getAddressAttributes(command)
+
+
+ def command_deleteAddress(self, command):
+ kwargs = {}
+ for key, info in attrMap.iteritems():
+ if key in command:
+ kwargs[info['attr']] = command[key]
+ try:
+ self.dir.destroyRecord("addresses", **kwargs)
+ except DirectoryError, e:
+ self.respondWithError(str(e))
+ return
+ self.respondWithRecordsOfTypes(self.dir, command, ["addresses"])
+
+
</ins><span class="cx"> # Config
</span><span class="cx">
</span><span class="cx"> def command_readConfig(self, command):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsprincipalspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -87,8 +87,14 @@
</span><span class="cx"> print(" --get-auto-schedule-mode: read auto-schedule mode")
</span><span class="cx"> print(" --set-auto-accept-group=principal: set auto-accept-group")
</span><span class="cx"> print(" --get-auto-accept-group: read auto-accept-group")
</span><del>- print(" --add {locations|resources} 'full name' [record name] [GUID]: add a principal")
</del><ins>+ print(" --add {locations|resources|addresses} 'full name' [record name] [GUID]: add a principal")
</ins><span class="cx"> print(" --remove: remove a principal")
</span><ins>+ print(" --set-geo=url: set the geo: url for an address (e.g. geo:37.331741,-122.030333)")
+ print(" --get-geo: get the geo: url for an address")
+ print(" --set-street-address=streetaddress: set the street address string for an address")
+ print(" --get-street-address: get the street address string for an address")
+ print(" --set-address=guid: associate principal with an address (by guid)")
+ print(" --get-address: get the associated address's guid")
</ins><span class="cx">
</span><span class="cx"> if e:
</span><span class="cx"> sys.exit(64)
</span><span class="lines">@@ -116,8 +122,29 @@
</span><span class="cx"> directory = rootResource.getDirectory()
</span><span class="cx"> yield self.function(rootResource, directory, self.store, *self.params)
</span><span class="cx">
</span><ins>+attrMap = {
+ 'GeneratedUID' : { 'attr' : 'guid', },
+ 'RealName' : { 'attr' : 'fullName', },
+ 'RecordName' : { 'attr' : 'shortNames', },
+ 'AutoSchedule' : { 'attr' : 'autoSchedule', },
+ 'AutoAcceptGroup' : { 'attr' : 'autoAcceptGroup', },
</ins><span class="cx">
</span><ins>+ 'Comment' : { 'extras' : True, 'attr' : 'comment', },
+ 'Description' : { 'extras' : True, 'attr' : 'description', },
+ 'Type' : { 'extras' : True, 'attr' : 'type', },
</ins><span class="cx">
</span><ins>+ # For "Locations", i.e. scheduled spaces
+ 'Capacity' : { 'extras' : True, 'attr' : 'capacity', },
+ 'Floor' : { 'extras' : True, 'attr' : 'floor', },
+ 'AssociatedAddress' : { 'extras' : True, 'attr' : 'associatedAddress', },
+
+ # For "Addresses", i.e. nonscheduled areas containing Locations
+ 'AbbreviatedName' : { 'extras' : True, 'attr' : 'abbreviatedName', },
+ 'StreetAddress' : { 'extras' : True, 'attr' : 'streetAddress', },
+ 'Geo' : { 'extras' : True, 'attr' : 'geo', },
+}
+
+
</ins><span class="cx"> def main():
</span><span class="cx"> try:
</span><span class="cx"> (optargs, args) = getopt(
</span><span class="lines">@@ -142,6 +169,12 @@
</span><span class="cx"> "get-auto-schedule-mode",
</span><span class="cx"> "set-auto-accept-group=",
</span><span class="cx"> "get-auto-accept-group",
</span><ins>+ "set-geo=",
+ "get-geo",
+ "set-address=",
+ "get-address",
+ "set-street-address=",
+ "get-street-address",
</ins><span class="cx"> "verbose",
</span><span class="cx"> ],
</span><span class="cx"> )
</span><span class="lines">@@ -258,6 +291,24 @@
</span><span class="cx"> elif opt in ("", "--get-auto-accept-group"):
</span><span class="cx"> principalActions.append((action_getAutoAcceptGroup,))
</span><span class="cx">
</span><ins>+ elif opt in ("", "--set-geo"):
+ principalActions.append((action_setValue, "Geo", arg))
+
+ elif opt in ("", "--get-geo"):
+ principalActions.append((action_getValue, "Geo"))
+
+ elif opt in ("", "--set-street-address"):
+ principalActions.append((action_setValue, "StreetAddress", arg))
+
+ elif opt in ("", "--get-street-address"):
+ principalActions.append((action_getValue, "StreetAddress"))
+
+ elif opt in ("", "--set-address"):
+ principalActions.append((action_setValue, "AssociatedAddress", arg))
+
+ elif opt in ("", "--get-address"):
+ principalActions.append((action_getValue, "AssociatedAddress"))
+
</ins><span class="cx"> else:
</span><span class="cx"> raise NotImplementedError(opt)
</span><span class="cx">
</span><span class="lines">@@ -274,7 +325,7 @@
</span><span class="cx"> elif addType:
</span><span class="cx">
</span><span class="cx"> try:
</span><del>- addType = matchStrings(addType, ["locations", "resources"])
</del><ins>+ addType = matchStrings(addType, ["locations", "resources", "addresses"])
</ins><span class="cx"> except ValueError, e:
</span><span class="cx"> print(e)
</span><span class="cx"> return
</span><span class="lines">@@ -296,7 +347,7 @@
</span><span class="cx"> elif listPrincipals:
</span><span class="cx"> try:
</span><span class="cx"> listPrincipals = matchStrings(listPrincipals, ["users", "groups",
</span><del>- "locations", "resources"])
</del><ins>+ "locations", "resources", "addresses"])
</ins><span class="cx"> except ValueError, e:
</span><span class="cx"> print(e)
</span><span class="cx"> return
</span><span class="lines">@@ -393,6 +444,7 @@
</span><span class="cx"> "groups" : "Group",
</span><span class="cx"> "locations" : "Place",
</span><span class="cx"> "resources" : "Resource",
</span><ins>+ "addresses" : "Address",
</ins><span class="cx"> }.get(record.recordType),
</span><span class="cx"> ))
</span><span class="cx"> print(" GUID: %s" % (record.guid,))
</span><span class="lines">@@ -667,7 +719,30 @@
</span><span class="cx"> print("No auto-accept-group assigned to %s" % (prettyPrincipal(principal),))
</span><span class="cx">
</span><span class="cx">
</span><ins>+@inlineCallbacks
+def action_setValue(rootResource, directory, store, principal, name, value):
+ print("Setting %s to %s for %s" % (
+ name, value, prettyPrincipal(principal),
+ ))
</ins><span class="cx">
</span><ins>+ principal.record.extras[attrMap[name]["attr"]] = value
+ (yield updateRecord(False, directory,
+ principal.record.recordType,
+ guid=principal.record.guid,
+ shortNames=principal.record.shortNames,
+ fullName=principal.record.fullName,
+ **principal.record.extras
+ ))
+
+
+def action_getValue(rootResource, directory, store, principal, name):
+ print("%s for %s is %s" % (
+ name,
+ prettyPrincipal(principal),
+ principal.record.extras[attrMap[name]["attr"]]
+ ))
+
+
</ins><span class="cx"> def abort(msg, status=1):
</span><span class="cx"> sys.stdout.write("%s\n" % (msg,))
</span><span class="cx"> try:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstestgatewaycaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -176,6 +176,7 @@
</span><span class="cx"> <array>
</span><span class="cx"> <string>resources</string>
</span><span class="cx"> <string>locations</string>
</span><ins>+ <string>addresses</string>
</ins><span class="cx"> </array>
</span><span class="cx"> </dict>
</span><span class="cx"> </dict>
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_gatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx">
</span><span class="cx"> import os
</span><span class="cx"> import sys
</span><del>-from twext.python.plistlib import readPlistFromString
</del><ins>+from plistlib import readPlistFromString
</ins><span class="cx"> import xml
</span><span class="cx">
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="lines">@@ -127,15 +127,9 @@
</span><span class="cx"> def test_getLocationAttributes(self):
</span><span class="cx"> yield self.runCommand(command_createLocation)
</span><span class="cx"> results = yield self.runCommand(command_getLocationAttributes)
</span><del>- self.assertEquals(results["result"]["Building"], "Test Building")
- self.assertEquals(results["result"]["City"], "Cupertino")
</del><span class="cx"> self.assertEquals(results["result"]["Capacity"], "40")
</span><span class="cx"> self.assertEquals(results["result"]["Description"], "Test Description")
</span><del>- self.assertEquals(results["result"]["ZIP"], "95014")
- self.assertEquals(results["result"]["Floor"], "First")
</del><span class="cx"> self.assertEquals(results["result"]["RecordName"], ["createdlocation01"])
</span><del>- self.assertEquals(results["result"]["State"], "CA")
- self.assertEquals(results["result"]["Street"], "1 Infinite Loop")
</del><span class="cx"> self.assertEquals(results["result"]["RealName"],
</span><span class="cx"> "Created Location 01 %s %s" % (unichr(208), u"\ud83d\udca3"))
</span><span class="cx"> self.assertEquals(results["result"]["Comment"], "Test Comment")
</span><span class="lines">@@ -162,6 +156,45 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> @inlineCallbacks
</span><ins>+ def test_createAddress(self):
+ directory = getDirectory()
+
+ record = directory.recordWithUID("C701069D-9CA1-4925-A1A9-5CD94767B74B")
+ self.assertEquals(record, None)
+ yield self.runCommand(command_createAddress)
+
+ directory.flushCaches()
+
+ record = directory.recordWithUID("C701069D-9CA1-4925-A1A9-5CD94767B74B")
+ self.assertEquals(record.fullName.decode("utf-8"),
+ "Created Address 01 %s %s" % (unichr(208), u"\ud83d\udca3"))
+
+ self.assertNotEquals(record, None)
+
+ self.assertEquals(record.extras["abbreviatedName"], "Addr1")
+ self.assertEquals(record.extras["streetAddress"], "1 Infinite Loop\nCupertino, 95014\nCA")
+ self.assertEquals(record.extras["geo"], "geo:37.331,-122.030")
+
+ results = yield self.runCommand(command_getAddressList)
+ self.assertEquals(len(results["result"]), 1)
+
+ results = yield self.runCommand(command_getAddressAttributes)
+ self.assertEquals(results["result"]["RealName"], u'Created Address 01 \xd0 \U0001f4a3')
+
+ results = yield self.runCommand(command_setAddressAttributes)
+
+ results = yield self.runCommand(command_getAddressAttributes)
+ self.assertEquals(results["result"]["RealName"], u'Updated Address')
+ self.assertEquals(results["result"]["StreetAddress"], u'Updated Street Address')
+ self.assertEquals(results["result"]["Geo"], u'Updated Geo')
+
+ results = yield self.runCommand(command_deleteAddress)
+
+ results = yield self.runCommand(command_getAddressList)
+ self.assertEquals(len(results["result"]), 0)
+
+
+ @inlineCallbacks
</ins><span class="cx"> def test_createLocation(self):
</span><span class="cx"> directory = getDirectory()
</span><span class="cx">
</span><span class="lines">@@ -184,16 +217,8 @@
</span><span class="cx"> self.assertEquals(record.autoSchedule, True)
</span><span class="cx">
</span><span class="cx"> self.assertEquals(record.extras["comment"], "Test Comment")
</span><del>- self.assertEquals(record.extras["building"], "Test Building")
</del><span class="cx"> self.assertEquals(record.extras["floor"], "First")
</span><span class="cx"> self.assertEquals(record.extras["capacity"], "40")
</span><del>- self.assertEquals(record.extras["street"], "1 Infinite Loop")
- self.assertEquals(record.extras["city"], "Cupertino")
- self.assertEquals(record.extras["state"], "CA")
- self.assertEquals(record.extras["zip"], "95014")
- self.assertEquals(record.extras["country"], "USA")
- self.assertEquals(record.extras["phone"], "(408) 555-1212")
- self.assertEquals(record.extras["geo"], "geo:37.331,-122.030")
</del><span class="cx">
</span><span class="cx"> results = yield self.runCommand(command_getLocationAttributes)
</span><span class="cx"> self.assertEquals(set(results["result"]["ReadProxies"]), set(['user03', 'user04']))
</span><span class="lines">@@ -216,15 +241,9 @@
</span><span class="cx"> record = directory.recordWithUID("836B1B66-2E9A-4F46-8B1C-3DD6772C20B2")
</span><span class="cx">
</span><span class="cx"> self.assertEquals(record.extras["comment"], "Updated Test Comment")
</span><del>- self.assertEquals(record.extras["building"], "Updated Test Building")
</del><span class="cx"> self.assertEquals(record.extras["floor"], "Second")
</span><span class="cx"> self.assertEquals(record.extras["capacity"], "41")
</span><del>- self.assertEquals(record.extras["street"], "2 Infinite Loop")
- self.assertEquals(record.extras["city"], "Updated Cupertino")
- self.assertEquals(record.extras["state"], "Updated CA")
- self.assertEquals(record.extras["zip"], "95015")
- self.assertEquals(record.extras["country"], "Updated USA")
- self.assertEquals(record.extras["phone"], "(408) 555-1213")
</del><ins>+ self.assertEquals(record.extras["streetAddress"], "2 Infinite Loop\nCupertino, 95014\nCA")
</ins><span class="cx"> self.assertEquals(record.autoSchedule, True)
</span><span class="cx"> self.assertEquals(record.autoAcceptGroup, "F5A6142C-4189-4E9E-90B0-9CD0268B314B")
</span><span class="cx">
</span><span class="lines">@@ -385,6 +404,31 @@
</span><span class="cx"> </plist>
</span><span class="cx"> """
</span><span class="cx">
</span><ins>+command_createAddress = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>command</key>
+ <string>createAddress</string>
+ <key>GeneratedUID</key>
+ <string>C701069D-9CA1-4925-A1A9-5CD94767B74B</string>
+ <key>RealName</key>
+ <string>Created Address 01 %s %s</string>
+ <key>AbbreviatedName</key>
+ <string>Addr1</string>
+ <key>RecordName</key>
+ <array>
+ <string>createdaddress01</string>
+ </array>
+ <key>StreetAddress</key>
+ <string>1 Infinite Loop\nCupertino, 95014\nCA</string>
+ <key>Geo</key>
+ <string>geo:37.331,-122.030</string>
+</dict>
+</plist>
+""" % (unichr(208), u"\ud83d\udca3")
+
+
</ins><span class="cx"> command_createLocation = """<?xml version="1.0" encoding="UTF-8"?>
</span><span class="cx"> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
</span><span class="cx"> <plist version="1.0">
</span><span class="lines">@@ -407,26 +451,12 @@
</span><span class="cx"> <string>Test Comment</string>
</span><span class="cx"> <key>Description</key>
</span><span class="cx"> <string>Test Description</string>
</span><del>- <key>Building</key>
- <string>Test Building</string>
</del><span class="cx"> <key>Floor</key>
</span><span class="cx"> <string>First</string>
</span><span class="cx"> <key>Capacity</key>
</span><span class="cx"> <string>40</string>
</span><del>- <key>Street</key>
- <string>1 Infinite Loop</string>
- <key>City</key>
- <string>Cupertino</string>
- <key>State</key>
- <string>CA</string>
- <key>ZIP</key>
- <string>95014</string>
- <key>Country</key>
- <string>USA</string>
- <key>Phone</key>
- <string>(408) 555-1212</string>
- <key>Geo</key>
- <string>geo:37.331,-122.030</string>
</del><ins>+ <key>AssociatedAddress</key>
+ <string>C701069D-9CA1-4925-A1A9-5CD94767B74B</string>
</ins><span class="cx"> <key>ReadProxies</key>
</span><span class="cx"> <array>
</span><span class="cx"> <string>users:user03</string>
</span><span class="lines">@@ -454,14 +484,16 @@
</span><span class="cx"> <string>AF575A61-CFA6-49E1-A0F6-B5662C9D9801</string>
</span><span class="cx"> <key>RealName</key>
</span><span class="cx"> <string>Laptop 1</string>
</span><ins>+ <key>Comment</key>
+ <string>Test Comment</string>
+ <key>Description</key>
+ <string>Test Description</string>
</ins><span class="cx"> <key>Type</key>
</span><span class="cx"> <string>Computer</string>
</span><span class="cx"> <key>RecordName</key>
</span><span class="cx"> <array>
</span><span class="cx"> <string>laptop1</string>
</span><span class="cx"> </array>
</span><del>- <key>Comment</key>
- <string>Test Comment</string>
</del><span class="cx"> <key>ReadProxies</key>
</span><span class="cx"> <array>
</span><span class="cx"> <string>users:user03</string>
</span><span class="lines">@@ -500,6 +532,19 @@
</span><span class="cx"> </plist>
</span><span class="cx"> """
</span><span class="cx">
</span><ins>+
+command_deleteAddress = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>command</key>
+ <string>deleteAddress</string>
+ <key>GeneratedUID</key>
+ <string>C701069D-9CA1-4925-A1A9-5CD94767B74B</string>
+</dict>
+</plist>
+"""
+
</ins><span class="cx"> command_getLocationAndResourceList = """<?xml version="1.0" encoding="UTF-8"?>
</span><span class="cx"> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
</span><span class="cx"> <plist version="1.0">
</span><span class="lines">@@ -530,6 +575,17 @@
</span><span class="cx"> </plist>
</span><span class="cx"> """
</span><span class="cx">
</span><ins>+command_getAddressList = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>command</key>
+ <string>getAddressList</string>
+</dict>
+</plist>
+"""
+
+
</ins><span class="cx"> command_listReadProxies = """<?xml version="1.0" encoding="UTF-8"?>
</span><span class="cx"> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
</span><span class="cx"> <plist version="1.0">
</span><span class="lines">@@ -604,24 +660,12 @@
</span><span class="cx"> <string>Updated Test Comment</string>
</span><span class="cx"> <key>Description</key>
</span><span class="cx"> <string>Updated Test Description</string>
</span><del>- <key>Building</key>
- <string>Updated Test Building</string>
</del><span class="cx"> <key>Floor</key>
</span><span class="cx"> <string>Second</string>
</span><span class="cx"> <key>Capacity</key>
</span><span class="cx"> <string>41</string>
</span><del>- <key>Street</key>
- <string>2 Infinite Loop</string>
- <key>City</key>
- <string>Updated Cupertino</string>
- <key>State</key>
- <string>Updated CA</string>
- <key>ZIP</key>
- <string>95015</string>
- <key>Country</key>
- <string>Updated USA</string>
- <key>Phone</key>
- <string>(408) 555-1213</string>
</del><ins>+ <key>StreetAddress</key>
+ <string>2 Infinite Loop\nCupertino, 95014\nCA</string>
</ins><span class="cx"> <key>ReadProxies</key>
</span><span class="cx"> <array>
</span><span class="cx"> <string>users:user03</string>
</span><span class="lines">@@ -648,6 +692,38 @@
</span><span class="cx"> </plist>
</span><span class="cx"> """
</span><span class="cx">
</span><ins>+command_getAddressAttributes = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>command</key>
+ <string>getAddressAttributes</string>
+ <key>GeneratedUID</key>
+ <string>C701069D-9CA1-4925-A1A9-5CD94767B74B</string>
+</dict>
+</plist>
+"""
+
+command_setAddressAttributes = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>command</key>
+ <string>setAddressAttributes</string>
+ <key>GeneratedUID</key>
+ <string>C701069D-9CA1-4925-A1A9-5CD94767B74B</string>
+ <key>RealName</key>
+ <string>Updated Address</string>
+ <key>StreetAddress</key>
+ <string>Updated Street Address</string>
+ <key>Geo</key>
+ <string>Updated Geo</string>
+
+</dict>
+</plist>
+"""
+
+
</ins><span class="cx"> command_setResourceAttributes = """<?xml version="1.0" encoding="UTF-8"?>
</span><span class="cx"> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
</span><span class="cx"> <plist version="1.0">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_WRITE
</span><span class="cx">
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> import os
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purge_old_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx">
</span><span class="cx"> from twext.enterprise.dal.syntax import Update, Delete
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadminresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -36,12 +36,12 @@
</span><span class="cx"> from twistedcaldav.extensions import DAVFile, ReadOnlyResourceMixIn
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><del>-from twext.web2.http import Response
</del><ins>+from txweb2.http import Response
</ins><span class="cx"> from twisted.python.modules import getModule
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx"> from zope.interface.declarations import implements
</span><del>-from twext.web2.stream import MemoryStream
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.stream import MemoryStream
+from txweb2.http import HTTPError
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx">
</span><span class="cx"> from twisted.web.iweb import ITemplateLoader
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadmintesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -37,8 +37,8 @@
</span><span class="cx"> from txdav.xml.rfc3744 import GroupMemberSet
</span><span class="cx"> from txdav.xml.rfc2518 import DisplayName
</span><span class="cx">
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.responsecode import CONFLICT
</del><ins>+from txweb2.http import HTTPError
+from txweb2.responsecode import CONFLICT
</ins><span class="cx"> from txdav.xml.rfc2518 import HRef
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryRecord
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebcalresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,19 +28,21 @@
</span><span class="cx"> from urlparse import urlparse
</span><span class="cx"> from cgi import parse_qs
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from twisted.internet.defer import succeed
+
+from txweb2 import responsecode
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.extensions import DAVFile, ReadOnlyResourceMixIn
</span><ins>+from twistedcaldav.timezones import hasTZ
</ins><span class="cx">
</span><del>-from twisted.internet.defer import succeed
</del><ins>+DEFAULT_TIMEZONE = "America/Los_Angeles"
</ins><span class="cx">
</span><del>-from twext.python.timezone import getLocalTimezone
</del><span class="cx">
</span><span class="cx">
</span><span class="cx"> class WebCalendarResource (ReadOnlyResourceMixIn, DAVFile):
</span><span class="lines">@@ -75,7 +77,7 @@
</span><span class="cx"> return "Web Calendar"
</span><span class="cx">
</span><span class="cx"> def contentType(self):
</span><del>- return MimeType.fromString("text/html; charset=utf-8");
</del><ins>+ return MimeType.fromString("text/html; charset=utf-8")
</ins><span class="cx">
</span><span class="cx"> def contentEncoding(self):
</span><span class="cx"> return None
</span><span class="lines">@@ -95,8 +97,11 @@
</span><span class="cx"> else:
</span><span class="cx"> cacheAttr = "_htmlContent"
</span><span class="cx"> templateFileName = "standalone.html"
</span><del>- templateFileName = os.path.join(config.WebCalendarRoot, templateFileName)
</del><span class="cx">
</span><ins>+ templateFileName = os.path.join(
+ config.WebCalendarRoot, templateFileName
+ )
+
</ins><span class="cx"> #
</span><span class="cx"> # See if the file changed, and dump the cached template if so.
</span><span class="cx"> # Don't bother to check if we've checked in the past minute.
</span><span class="lines">@@ -135,14 +140,17 @@
</span><span class="cx">
</span><span class="cx"> #
</span><span class="cx"> # Get URL of authenticated principal.
</span><del>- # Don't need to authenticate here because the ACL will have already required it.
</del><ins>+ # Don't need to authenticate here because the ACL will have already
+ # required it.
</ins><span class="cx"> #
</span><del>- authenticatedPrincipalURL = str(request.authnUser.childOfType(davxml.HRef))
</del><ins>+ authenticatedPrincipalURL = str(
+ request.authnUser.childOfType(davxml.HRef)
+ )
</ins><span class="cx">
</span><span class="cx"> def queryValue(arg):
</span><span class="cx"> query = parse_qs(urlparse(request.uri).query, True)
</span><span class="cx"> return query.get(arg, [""])[0]
</span><del>-
</del><ins>+
</ins><span class="cx"> #
</span><span class="cx"> # Parse debug query arg
</span><span class="cx"> #
</span><span class="lines">@@ -180,3 +188,36 @@
</span><span class="cx"> response.headers.setHeader(header, value)
</span><span class="cx">
</span><span class="cx"> return response
</span><ins>+
+
+
+try:
+ from Foundation import NSTimeZone
+
+ def lookupSystemTimezone():
+ return NSTimeZone.localTimeZone().name().encode("utf-8")
+
+except ImportError:
+ def lookupSystemTimezone():
+ return ""
+
+
+def getLocalTimezone():
+ """
+ Returns the default timezone for the server. The order of precedence is:
+ config.DefaultTimezone, lookupSystemTimezone( ), DEFAULT_TIMEZONE.
+ Also, if neither of the first two values in that list are in the timezone
+ database, DEFAULT_TIMEZONE is returned.
+
+ @return: The server's local timezone name
+ @rtype: C{str}
+ """
+ if config.DefaultTimezone:
+ if hasTZ(config.DefaultTimezone):
+ return config.DefaultTimezone
+
+ systemTimezone = lookupSystemTimezone()
+ if hasTZ(systemTimezone):
+ return systemTimezone
+
+ return DEFAULT_TIMEZONE
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfauthaugmentstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -109,6 +109,7 @@
</span><span class="cx"> <enable-addressbook>true</enable-addressbook>
</span><span class="cx"> <enable-login>true</enable-login>
</span><span class="cx"> <auto-schedule>true</auto-schedule>
</span><ins>+ <auto-schedule-mode>default</auto-schedule-mode>
</ins><span class="cx"> </record>
</span><span class="cx"> <record>
</span><span class="cx"> <uid>C38BEE7A-36EE-478C-9DCB-CBF4612AFE65</uid>
</span><span class="lines">@@ -136,4 +137,49 @@
</span><span class="cx"> <enable-login>true</enable-login>
</span><span class="cx"> <auto-schedule>true</auto-schedule>
</span><span class="cx"> </record>
</span><ins>+ <record>
+ <uid>6F9EE33B-78F6-481B-9289-3D0812FF0D64</uid>
+ <enable>true</enable>
+ <enable-calendar>true</enable-calendar>
+ <enable-addressbook>true</enable-addressbook>
+ <enable-login>true</enable-login>
+ <auto-schedule>false</auto-schedule>
+ <auto-schedule-mode>default</auto-schedule-mode>
+ </record>
+ <record>
+ <uid>76E7ECA6-08BC-4AE7-930D-F2E7453993A5</uid>
+ <enable>true</enable>
+ <enable-calendar>true</enable-calendar>
+ <enable-addressbook>true</enable-addressbook>
+ <enable-login>true</enable-login>
+ <auto-schedule>false</auto-schedule>
+ <auto-schedule-mode>default</auto-schedule-mode>
+ </record>
+ <record>
+ <uid>63A2F949-2D8D-4C8D-B8A5-DCF2A94610F3</uid>
+ <enable>true</enable>
+ <enable-calendar>true</enable-calendar>
+ <enable-addressbook>true</enable-addressbook>
+ <enable-login>true</enable-login>
+ <auto-schedule>false</auto-schedule>
+ <auto-schedule-mode>default</auto-schedule-mode>
+ </record>
+ <record>
+ <uid>06E3BDCB-9C19-485A-B14E-F146A80ADDC6</uid>
+ <enable>true</enable>
+ <enable-calendar>true</enable-calendar>
+ <enable-addressbook>true</enable-addressbook>
+ <enable-login>true</enable-login>
+ <auto-schedule>true</auto-schedule>
+ <auto-schedule-mode>default</auto-schedule-mode>
+ </record>
+ <record>
+ <uid>4D66A20A-1437-437D-8069-2F14E8322234</uid>
+ <enable>true</enable>
+ <enable-calendar>true</enable-calendar>
+ <enable-addressbook>true</enable-addressbook>
+ <enable-login>true</enable-login>
+ <auto-schedule>true</auto-schedule>
+ <auto-schedule-mode>default</auto-schedule-mode>
+ </record>
</ins><span class="cx"> </augments>
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfauthresourcestestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,5 +1,13 @@
</span><span class="cx"> <accounts realm="Test Realm">
</span><span class="cx"> <location>
</span><ins>+ <uid>fantastic</uid>
+ <guid>4D66A20A-1437-437D-8069-2F14E8322234</guid>
+ <name>Fantastic Conference Room</name>
+ <extras>
+ <associatedAddress>63A2F949-2D8D-4C8D-B8A5-DCF2A94610F3</associatedAddress>
+ </extras>
+ </location>
+ <location>
</ins><span class="cx"> <uid>jupiter</uid>
</span><span class="cx"> <guid>jupiter</guid>
</span><span class="cx"> <name>Jupiter Conference Room, Building 2, 1st Floor</name>
</span><span class="lines">@@ -78,6 +86,9 @@
</span><span class="cx"> <uid>sharissroom</uid>
</span><span class="cx"> <guid>80689D41-DAF8-4189-909C-DB017B271892</guid>
</span><span class="cx"> <name>Shari's Room</name>
</span><ins>+ <extras>
+ <associatedAddress>6F9EE33B-78F6-481B-9289-3D0812FF0D64</associatedAddress>
+ </extras>
</ins><span class="cx"> </location>
</span><span class="cx"> <location>
</span><span class="cx"> <uid>pluto</uid>
</span><span class="lines">@@ -95,6 +106,14 @@
</span><span class="cx"> <name>Room 10</name>
</span><span class="cx"> </location>
</span><span class="cx"> <location>
</span><ins>+ <uid>pretend</uid>
+ <guid>06E3BDCB-9C19-485A-B14E-F146A80ADDC6</guid>
+ <name>Pretend Conference Room</name>
+ <extras>
+ <associatedAddress>76E7ECA6-08BC-4AE7-930D-F2E7453993A5</associatedAddress>
+ </extras>
+ </location>
+ <location>
</ins><span class="cx"> <uid>neptune</uid>
</span><span class="cx"> <guid>neptune</guid>
</span><span class="cx"> <name>Neptune Conference Room, Building 2, 1st Floor</name>
</span><span class="lines">@@ -224,4 +243,31 @@
</span><span class="cx"> <guid>resource09</guid>
</span><span class="cx"> <name>Resource 09</name>
</span><span class="cx"> </resource>
</span><ins>+ <address>
+ <uid>testaddress1</uid>
+ <guid>6F9EE33B-78F6-481B-9289-3D0812FF0D64</guid>
+ <name>Test Address One</name>
+ <extras>
+ <streetAddress>20300 Stevens Creek Blvd, Cupertino, CA 95014</streetAddress>
+ <geo>37.322281,-122.028345</geo>
+ </extras>
+ </address>
+ <address>
+ <uid>il2</uid>
+ <guid>63A2F949-2D8D-4C8D-B8A5-DCF2A94610F3</guid>
+ <name>IL2</name>
+ <extras>
+ <streetAddress>2 Infinite Loop, Cupertino, CA 95014</streetAddress>
+ <geo>37.332633,-122.030502</geo>
+ </extras>
+ </address>
+ <address>
+ <uid>il1</uid>
+ <guid>76E7ECA6-08BC-4AE7-930D-F2E7453993A5</guid>
+ <name>IL1</name>
+ <extras>
+ <streetAddress>1 Infinite Loop, Cupertino, CA 95014</streetAddress>
+ <geo>37.331741,-122.030333</geo>
+ </extras>
+ </address>
</ins><span class="cx"> </accounts>
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdappleplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -123,6 +123,8 @@
</span><span class="cx"> <string>cluster.pg</string>
</span><span class="cx"> <key>LogFile</key>
</span><span class="cx"> <string>xpg_ctl.log</string>
</span><ins>+ <key>SocketDirectory</key>
+ <string>/var/run/caldavd/PostgresSocket</string>
</ins><span class="cx"> </dict>
</span><span class="cx">
</span><span class="cx"> <!-- Data root -->
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdtestplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -284,29 +284,20 @@
</span><span class="cx"> <string>mail</string>
</span><span class="cx"> <string>mailAlias</string>
</span><span class="cx"> </array>
</span><del>- <key>firstName</key>
- <string></string>
- <key>lastName</key>
- <string></string>
</del><span class="cx"> </dict>
</span><span class="cx"> </dict>
</span><span class="cx"> <key>locations</key>
</span><span class="cx"> <dict>
</span><span class="cx"> <key>rdn</key>
</span><span class="cx"> <string>ou=locations</string>
</span><ins>+ <key>associatedAddressAttr</key>
+ <string></string>
</ins><span class="cx"> <key>mapping</key>
</span><span class="cx"> <dict>
</span><span class="cx"> <key>recordName</key>
</span><span class="cx"> <string>cn</string>
</span><span class="cx"> <key>fullName</key>
</span><span class="cx"> <string>cn</string>
</span><del>- <key>emailAddresses</key>
- <array>
- </array>
- <key>firstName</key>
- <string></string>
- <key>lastName</key>
- <string></string>
</del><span class="cx"> </dict>
</span><span class="cx"> </dict>
</span><span class="cx"> <key>resources</key>
</span><span class="lines">@@ -319,15 +310,24 @@
</span><span class="cx"> <string>cn</string>
</span><span class="cx"> <key>fullName</key>
</span><span class="cx"> <string>cn</string>
</span><del>- <key>emailAddresses</key>
- <array>
- </array>
- <key>firstName</key>
- <string></string>
- <key>lastName</key>
- <string></string>
</del><span class="cx"> </dict>
</span><span class="cx"> </dict>
</span><ins>+ <key>addresses</key>
+ <dict>
+ <key>rdn</key>
+ <string>ou=buildings</string>
+ <key>geoAttr</key>
+ <string></string>
+ <key>streetAddressAttr</key>
+ <string></string>
+ <key>mapping</key>
+ <dict>
+ <key>recordName</key>
+ <string>cn</string>
+ <key>fullName</key>
+ <string>cn</string>
+ </dict>
+ </dict>
</ins><span class="cx"> </dict>
</span><span class="cx"> <key>groupSchema</key>
</span><span class="cx"> <dict>
</span><span class="lines">@@ -826,6 +826,10 @@
</span><span class="cx"> <!-- Private Events -->
</span><span class="cx"> <key>EnablePrivateEvents</key>
</span><span class="cx"> <true/>
</span><ins>+
+ <!-- Private Comment fix off for testing -->
+ <key>RemoveDuplicatePrivateComments</key>
+ <false/>
</ins><span class="cx">
</span><span class="cx"> <!-- Timezone Service -->
</span><span class="cx"> <key>EnableTimezoneService</key>
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformanceloadtestsimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -43,6 +43,8 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twisted.internet.protocol import ProcessProtocol
</span><span class="cx">
</span><ins>+from twisted.web.server import Site
+
</ins><span class="cx"> from contrib.performance.loadtest.ical import OS_X_10_6
</span><span class="cx"> from contrib.performance.loadtest.profiles import Eventer, Inviter, Accepter
</span><span class="cx"> from contrib.performance.loadtest.population import (
</span><span class="lines">@@ -214,7 +216,6 @@
</span><span class="cx"> Arrival = namedtuple('Arrival', 'factory parameters')
</span><span class="cx">
</span><span class="cx">
</span><del>-from twisted.web import server
</del><span class="cx">
</span><span class="cx"> class LoadSimulator(object):
</span><span class="cx"> """
</span><span class="lines">@@ -461,7 +462,7 @@
</span><span class="cx"> if self.runtime is not None:
</span><span class="cx"> self.reactor.callLater(self.runtime, self.stopAndReport)
</span><span class="cx"> if self.webadminPort:
</span><del>- self.reactor.listenTCP(self.webadminPort, server.Site(LoadSimAdminResource(self)))
</del><ins>+ self.reactor.listenTCP(self.webadminPort, Site(LoadSimAdminResource(self)))
</ins><span class="cx"> self.reactor.run()
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsinvitepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml
</span><span class="cx">
</span><span class="cx"> ICAL = """BEGIN:VCALENDAR
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsmultigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.http.data.string import ResponseDataString
</span><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml, statuscodes
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx">
</span><span class="cx"> class MultigetTest(HTTPTestBase):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsputpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx">
</span><span class="cx"> ICAL = """BEGIN:VCALENDAR
</span><span class="cx"> CALSCALE:GREGORIAN
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml, statuscodes
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> from caldavclientlibrary.protocol.caldav.query import QueryVEVENTTimeRange
</span><span class="cx"> from caldavclientlibrary.protocol.http.data.string import ResponseDataString
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestssyncpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx">
</span><span class="cx"> ICAL = """BEGIN:VCALENDAR
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagesqlusagepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> from contrib.performance.sqlusage.requests.query import QueryTest
</span><span class="cx"> from contrib.performance.sqlusage.requests.sync import SyncTest
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> import getopt
</span><span class="cx"> import itertools
</span><span class="cx"> import sys
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancestatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,16 +15,19 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from __future__ import print_function
</span><ins>+
</ins><span class="cx"> from math import log, sqrt
</span><ins>+from time import mktime
+import random
+import sqlparse
+
</ins><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> from pycalendar.duration import Duration as PyDuration
</span><span class="cx"> from pycalendar.icalendar.property import Property
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><ins>+
+from zope.interface import Interface, implements
</ins><span class="cx"> from twisted.python.util import FancyEqMixin
</span><del>-from zope.interface import Interface, implements
-import random
-import time
-import sqlparse
</del><span class="cx">
</span><span class="cx">
</span><span class="cx"> NANO = 1000000000.0
</span><span class="lines">@@ -394,7 +397,7 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> def astimestamp(self, dt):
</span><del>- return time.mktime(dt.timetuple())
</del><ins>+ return mktime(dt.timetuple())
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> def _findWorkAfter(self, when):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixespyflakes"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,16 +14,13 @@
</span><span class="cx"> fi;
</span><span class="cx">
</span><span class="cx"> if [ $# -eq 0 ]; then
</span><del>- set - calendarserver twext twisted twistedcaldav txdav contrib;
</del><ins>+ set - calendarserver twisted twistedcaldav txdav contrib;
</ins><span class="cx"> fi;
</span><span class="cx">
</span><span class="cx"> tmp="$(mktemp "/tmp/pyflakes.XXXXX")";
</span><span class="cx">
</span><del>-cd "${wd}" && "${pyflakes}" "$@" | sed \
- -e "/'from ctypes import \\*' used; unable to detect undefined names/d" \
- -e "/redefinition of unused/d" \
- -e "/^twext\\/backport/d" \
- -e "/xmlext.py:[0-9][0-9]*: /d" \
</del><ins>+cd "${wd}" && "${pyflakes}" "$@" | sed \
+ -e "/xmlext.py:[0-9][0-9]*: /d" \
</ins><span class="cx"> | tee "${tmp}";
</span><span class="cx">
</span><span class="cx"> if [ -s "${tmp}" ]; then error="true"; else error="false"; fi;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixessetuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,6 +15,7 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><ins>+
</ins><span class="cx"> from __future__ import print_function
</span><span class="cx">
</span><span class="cx"> import sys
</span><span class="lines">@@ -24,18 +25,20 @@
</span><span class="cx">
</span><span class="cx"> from version import version
</span><span class="cx">
</span><del>-def find_modules():
</del><ins>+
+
+def find_packages():
</ins><span class="cx"> modules = [
</span><span class="cx"> "twisted.plugins",
</span><span class="cx"> ]
</span><span class="cx">
</span><ins>+ excludes = [
+ ".svn",
+ "_trial_temp",
+ "build",
+ ]
+
</ins><span class="cx"> for root, dirs, files in os.walk("."):
</span><del>- excludes = [
- ".svn",
- "_trial_temp",
- "build",
- ]
-
</del><span class="cx"> if root == ".":
</span><span class="cx"> excludes.append("data")
</span><span class="cx">
</span><span class="lines">@@ -48,38 +51,41 @@
</span><span class="cx">
</span><span class="cx"> return modules
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> #
</span><span class="cx"> # Options
</span><span class="cx"> #
</span><span class="cx">
</span><del>-description = "CalDAV/CardDAV protocol extensions to twext.web2.dav",
</del><ins>+description = "Calendar and Contacts Server",
</ins><span class="cx"> long_description = """
</span><del>-Extends twisted.web2.dav to implement CalDAV/CardDAV-aware resources and methods.
</del><ins>+Calendar and Contacts Server, implementing the CalDAV and CardDAV protocols.
</ins><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> classifiers = None
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> #
</span><span class="cx"> # Write version file
</span><span class="cx"> #
</span><span class="cx">
</span><span class="cx"> version_number, version_info = version()
</span><span class="cx">
</span><del>-version_string = "{number} ({info})".format(number=version_number, info=version_info)
</del><ins>+version_string = (
+ "{number} ({info})"
+ .format(number=version_number, info=version_info)
+)
</ins><span class="cx"> version_file = file(os.path.join("calendarserver", "version.py"), "w")
</span><span class="cx"> version_file.write('version = "{version}"\n'.format(version=version_string))
</span><span class="cx"> version_file.close()
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> #
</span><span class="cx"> # Set up Extension modules that need to be built
</span><span class="cx"> #
</span><span class="cx">
</span><span class="cx"> from distutils.core import Extension
</span><span class="cx">
</span><del>-extensions = [
- Extension("twext.python.sendmsg",
- sources=["twext/python/sendmsg.c"])
-]
</del><ins>+extensions = []
</ins><span class="cx">
</span><span class="cx"> if sys.platform == "darwin":
</span><span class="cx"> extensions.append(
</span><span class="lines">@@ -90,11 +96,7 @@
</span><span class="cx"> )
</span><span class="cx"> )
</span><span class="cx">
</span><del>- from twext.python import launchd
- extensions.append(launchd.ffi.verifier.get_extension())
</del><span class="cx">
</span><del>-
-
</del><span class="cx"> #
</span><span class="cx"> # Run setup
</span><span class="cx"> #
</span><span class="lines">@@ -107,58 +109,58 @@
</span><span class="cx"> version=version_string,
</span><span class="cx"> description=description,
</span><span class="cx"> long_description=long_description,
</span><del>- url=None,
</del><ins>+ url="http://www.calendarserver.org/",
</ins><span class="cx"> classifiers=classifiers,
</span><span class="cx"> author="Apple Inc.",
</span><span class="cx"> author_email=None,
</span><del>- license=None,
</del><ins>+ license="Apache License, Version 2.0",
</ins><span class="cx"> platforms=["all"],
</span><del>- packages=find_modules(),
</del><ins>+ packages=find_packages(),
</ins><span class="cx"> package_data={
</span><del>- "twistedcaldav": [
- "*.html",
- "zoneinfo/*.ics",
- "zoneinfo/*/*.ics",
- "zoneinfo/*/*/*.ics",
- "images/*/*.jpg",
- ],
- "calendarserver.webadmin": [
- "*.html"
- ],
- "twistedcaldav.directory": [
- "*.html"
- ],
- "txdav.common.datastore": [
- "sql_schema/*.sql",
- "sql_schema/*/*.sql",
- "sql_schema/*/*/*.sql",
- ],
- },
</del><ins>+ "twistedcaldav": [
+ "*.html",
+ "zoneinfo/*.ics",
+ "zoneinfo/*/*.ics",
+ "zoneinfo/*/*/*.ics",
+ "images/*/*.jpg",
+ ],
+ "calendarserver.webadmin": [
+ "*.html"
+ ],
+ "twistedcaldav.directory": [
+ "*.html"
+ ],
+ "txdav.common.datastore": [
+ "sql_schema/*.sql",
+ "sql_schema/*/*.sql",
+ "sql_schema/*/*/*.sql",
+ ],
+ },
</ins><span class="cx"> scripts=[
</span><del>- "bin/caldavd",
- "bin/calendarserver_backup",
- "bin/calendarserver_bootstrap_database",
- "bin/calendarserver_command_gateway",
- "bin/calendarserver_config",
- #"bin/calendarserver_dbinspect",
- #"bin/calendarserver_dkimtool",
- "bin/calendarserver_export",
- #"bin/calendarserver_icalendar_validate",
- #"bin/calendarserver_load_augmentdb",
- #"bin/calendarserver_manage_postgres",
- "bin/calendarserver_manage_principals",
- "bin/calendarserver_manage_push",
- "bin/calendarserver_manage_timezones",
- "bin/calendarserver_migrate_resources",
- #"bin/calendarserver_monitor_amp_notifications",
- #"bin/calendarserver_monitor_notifications",
- "bin/calendarserver_purge_attachments",
- "bin/calendarserver_purge_events",
- "bin/calendarserver_purge_principals",
- "bin/calendarserver_shell",
- "bin/calendarserver_upgrade",
- #"bin/calendarserver_verify_data",
- ],
</del><ins>+ "bin/caldavd",
+ "bin/calendarserver_backup",
+ "bin/calendarserver_bootstrap_database",
+ "bin/calendarserver_command_gateway",
+ "bin/calendarserver_config",
+ # "bin/calendarserver_dbinspect",
+ # "bin/calendarserver_dkimtool",
+ "bin/calendarserver_export",
+ # "bin/calendarserver_icalendar_validate",
+ # "bin/calendarserver_load_augmentdb",
+ # "bin/calendarserver_manage_postgres",
+ "bin/calendarserver_manage_principals",
+ "bin/calendarserver_manage_push",
+ "bin/calendarserver_manage_timezones",
+ "bin/calendarserver_migrate_resources",
+ # "bin/calendarserver_monitor_amp_notifications",
+ # "bin/calendarserver_monitor_notifications",
+ "bin/calendarserver_purge_attachments",
+ "bin/calendarserver_purge_events",
+ "bin/calendarserver_purge_principals",
+ "bin/calendarserver_shell",
+ "bin/calendarserver_upgrade",
+ # "bin/calendarserver_verify_data",
+ ],
</ins><span class="cx"> data_files=[("caldavd", ["conf/caldavd.plist"]), ],
</span><span class="cx"> ext_modules=extensions,
</span><span class="cx"> py_modules=[],
</span><span class="lines">@@ -177,7 +179,9 @@
</span><span class="cx"> install_lib = install_lib[len(root):]
</span><span class="cx">
</span><span class="cx"> for script in dist.scripts:
</span><del>- scriptPath = os.path.join(install_scripts, os.path.basename(script))
</del><ins>+ scriptPath = os.path.join(
+ install_scripts, os.path.basename(script)
+ )
</ins><span class="cx">
</span><span class="cx"> print("rewriting {0}".format(scriptPath))
</span><span class="cx">
</span><span class="lines">@@ -196,17 +200,29 @@
</span><span class="cx"> line = line.rstrip("\n")
</span><span class="cx"> if fileType == "sh":
</span><span class="cx"> if line == "#PYTHONPATH":
</span><del>- script.append('PYTHONPATH="{add}:$PYTHONPATH"'.format(add=install_lib))
</del><ins>+ script.append(
+ 'PYTHONPATH="{add}:$PYTHONPATH"'
+ .format(add=install_lib)
+ )
</ins><span class="cx"> elif line == "#PATH":
</span><del>- script.append('PATH="{add}:$PATH"'.format(add=os.path.join(base, "usr", "bin")))
</del><ins>+ script.append(
+ 'PATH="{add}:$PATH"'
+ .format(add=os.path.join(base, "usr", "bin"))
+ )
</ins><span class="cx"> else:
</span><span class="cx"> script.append(line)
</span><span class="cx">
</span><span class="cx"> elif fileType == "python":
</span><span class="cx"> if line == "#PYTHONPATH":
</span><del>- script.append('PYTHONPATH="{path}"'.format(path=install_lib))
</del><ins>+ script.append(
+ 'PYTHONPATH="{path}"'
+ .format(path=install_lib)
+ )
</ins><span class="cx"> elif line == "#PATH":
</span><del>- script.append('PATH="{path}"'.format(path=os.path.join(base, "usr", "bin")))
</del><ins>+ script.append(
+ 'PATH="{path}"'
+ .format(path=os.path.join(base, "usr", "bin"))
+ )
</ins><span class="cx"> else:
</span><span class="cx"> script.append(line)
</span><span class="cx">
</span><span class="lines">@@ -218,6 +234,5 @@
</span><span class="cx"> newScript.close()
</span><span class="cx">
</span><span class="cx">
</span><del>-
</del><span class="cx"> if __name__ == "__main__":
</span><span class="cx"> doSetup()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixessupportbuildsh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,6 +16,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><ins>+set -e
+set -u
+
</ins><span class="cx"> . "${wd}/support/py.sh";
</span><span class="cx">
</span><span class="cx"> echo_header () {
</span><span class="lines">@@ -51,55 +54,33 @@
</span><span class="cx"> # Assert that ldap.h is present with a version >= 20344
</span><span class="cx"> # find_header "ldap.h" 20344 "LDAP_VENDOR_VERSION"
</span><span class="cx"> find_header () {
</span><del>- ARGS="$@";
- ret=1; # default to a failed check, forcing a fetch of the depencency
- i=0;
- for a in $ARGS; do
- [ $i -eq 0 ] && local sysheader="$1";
- [ $i -eq 1 ] && local minver="$2";
- [ $i -eq 2 ] && local def="$3";
- i=$(($i+1));
- done;
- [ ! $sysheader ] && return 1;
</del><ins>+ sys_header="$1"; shift;
+ if [ $# -ge 1 ]; then
+ min_version="$1"; shift;
+ version_macro="$1"; shift;
+ fi;
+
+ # No min_version given:
</ins><span class="cx"> # Check for presence of a header. We use the "-c" cc option because we don't
</span><span class="cx"> # need to emit a file; cc exits nonzero if it can't find the header
</span><del>- if [ $# -lt 2 ]; then
- echo "#include <${sysheader}>" | cc -x c -c - -o /dev/null 2> /dev/null;
</del><ins>+ if [ -z "${min_version:-}" ]; then
+ echo "#include <${sys_header}>" | cc -x c -c - -o /dev/null 2> /dev/null;
</ins><span class="cx"> return "$?";
</span><ins>+ fi;
+
</ins><span class="cx"> # Check for presence of a header of specified version
</span><ins>+ found_version="$(printf "#include <${sys_header}>\n${version_macro}\n" | cc -x c -E - | tail -1)";
+
+ if [ "${found_version}" == "${version_macro}" ]; then
+ # Macro was not replaced
+ return 1;
+ fi;
+
+ if cmp_version "${min_version}" "${found_version}"; then
+ return 0;
</ins><span class="cx"> else
</span><del>- found='';
- local aout=$(mktemp -t ccXXXXXX); # compiled executable file path
- local prog=$(mktemp -t ccXXXXXX); # C source file path
- cat <<DOC > ${prog}
-#include <${sysheader}>
-#include <stdio.h>
-#define STR(x) #x
-#define SHOW_DEFINE(x) printf("%s", STR(x))
-int main()
-{
- if (${def})
- {
- SHOW_DEFINE(${def});
- return 0;
- };
</del><span class="cx"> return 1;
</span><del>-};
-DOC
- cc -x c -o ${aout} ${prog} &> /dev/null;
- if [ $? -eq 0 ] && [ -e ${aout} ] ; then
- found=$(${aout});
- fi;
- if [ $? -eq 0 ] && [ ! -z ${found} ] ; then
- cmp_version $minver $found;
- ret=$?;
- else
- ret=1; #cc exited nonzero or didn't emit a file
- fi;
- rm -f "${aout}";
- rm -f "${prog}";
</del><span class="cx"> fi;
</span><del>- return $ret;
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> # Initialize all the global state required to use this library.
</span><span class="lines">@@ -528,9 +509,7 @@
</span><span class="cx"> # already has it?
</span><span class="cx"> local inplace=""; # Do development in-place; don't run setup.py to
</span><span class="cx"> # build, and instead add the source directory plus the
</span><del>- # given relative path directly to sys.path. twisted
- # and pycalendar are developed often enough that this is
- # convenient.
</del><ins>+ # given relative path directly to sys.path.
</ins><span class="cx"> local skip_egg="false"; # Skip even the 'egg_info' step, because nothing needs
</span><span class="cx"> # to be built.
</span><span class="cx"> local revision="0"; # Revision (if svn)
</span><span class="lines">@@ -730,13 +709,14 @@
</span><span class="cx"> using_system "memcached";
</span><span class="cx"> else
</span><span class="cx"> local le="libevent-2.0.21-stable";
</span><del>- local mc="memcached-1.4.15";
</del><ins>+ local mc="memcached-1.4.16";
</ins><span class="cx"> c_dependency -m "b2405cc9ebf264aa47ff615d9de527a2" \
</span><span class="cx"> "libevent" "${le}" \
</span><span class="cx"> "http://github.com/downloads/libevent/libevent/${le}.tar.gz";
</span><del>- c_dependency -m "36ea966f5a29655be1746bf4949f7f69" \
</del><ins>+ c_dependency -m "1c5781fecb52d70b615c6d0c9c140c9c" \
</ins><span class="cx"> "memcached" "${mc}" \
</span><del>- "http://memcached.googlecode.com/files/${mc}.tar.gz";
</del><ins>+ "http://www.memcached.org/files/${mc}.tar.gz";
+ # "http://memcached.googlecode.com/files/${mc}.tar.gz";
</ins><span class="cx"> fi;
</span><span class="cx">
</span><span class="cx"> if type -P postgres > /dev/null; then
</span><span class="lines">@@ -796,6 +776,20 @@
</span><span class="cx"> "setuptools" "setuptools" "${st}" \
</span><span class="cx"> "$pypi/s/setuptools/${st}.tar.gz";
</span><span class="cx">
</span><ins>+ local v="0.6";
+ local n="cffi";
+ local p="${n}-${v}";
+ py_dependency -v "0.6" -m "5be33b1ab0247a984d42b27344519337" \
+ "${n}" "${n}" "${p}" \
+ "${pypi}/c/${n}/${p}.tar.gz";
+
+ local v="2.10";
+ local n="pycparser";
+ local p="${n}-${v}";
+ py_dependency -v "0.6" -m "d87aed98c8a9f386aa56d365fe4d515f" \
+ "${n}" "${n}" "${p}" \
+ "${pypi}/p/${n}/${p}.tar.gz";
+
</ins><span class="cx"> local v="4.0.5";
</span><span class="cx"> local n="zope.interface";
</span><span class="cx"> local p="${n}-${v}";
</span><span class="lines">@@ -812,8 +806,10 @@
</span><span class="cx">
</span><span class="cx"> local n="PyKerberos";
</span><span class="cx"> if type -P krb5-config > /dev/null; then
</span><del>- py_dependency -r 9409 \
- "${n}" "kerberos" "${n}" \
</del><ins>+ local v="9409";
+ local p="${n}-${v}";
+ py_dependency -r "${v}" \
+ "${n}" "kerberos" "${p}" \
</ins><span class="cx"> "${svn_uri_base}/${n}/trunk";
</span><span class="cx"> fi;
</span><span class="cx">
</span><span class="lines">@@ -840,8 +836,27 @@
</span><span class="cx"> "${n}" "pgdb" "${p}" \
</span><span class="cx"> "${pypi}/P/${n}/${p}.tgz";
</span><span class="cx">
</span><del>- # Maintenance note: next time the Twisted dependency gets updated, check out
- # twext/patches.py.
</del><ins>+ local v="0.1.2";
+ local n="sqlparse";
+ local p="${n}-${v}";
+ py_dependency -v "${v}" -s "978874e5ebbd78e6d419e8182ce4fb3c30379642" \
+ "SQLParse" "${n}" "${p}" \
+ "http://python-sqlparse.googlecode.com/files/${p}.tar.gz";
+
+ local v="2.6.1";
+ local n="pycrypto";
+ local p="${n}-${v}";
+ py_dependency -v "${v}" -m "55a61a054aa66812daf5161a0d5d7eda" \
+ "PyCrypto" "${n}" "${p}" \
+ "http://ftp.dlitz.net/pub/dlitz/crypto/${n}/${p}.tar.gz";
+
+ local v="0.1.7";
+ local n="pyasn1";
+ local p="${n}-${v}";
+ py_dependency -v "${v}" -m "2cbd80fcd4c7b1c82180d3d76fee18c8" \
+ "${n}" "${n}" "${p}" \
+ "${pypi}/p/${n}/${p}.tar.gz";
+
</ins><span class="cx"> local v="13.2.0";
</span><span class="cx"> local n="Twisted";
</span><span class="cx"> local p="${n}-${v}";
</span><span class="lines">@@ -849,6 +864,13 @@
</span><span class="cx"> "${n}" "twisted" "${p}" \
</span><span class="cx"> "${pypi}/T/${n}/${p}.tar.bz2";
</span><span class="cx">
</span><ins>+ local v="12094";
+ local n="twext";
+ local p="${n}-${v}";
+ py_dependency -fe -r "${v}" \
+ "${n}" "${n}" "${p}" \
+ "${svn_uri_base}/${n}/trunk";
+
</ins><span class="cx"> local v="1.5";
</span><span class="cx"> local n="python-dateutil";
</span><span class="cx"> local p="${n}-${v}";
</span><span class="lines">@@ -870,23 +892,26 @@
</span><span class="cx"> "Python-LDAP" "ldap" "${p}" \
</span><span class="cx"> "${pypi}/p/${n}/${p}.tar.gz";
</span><span class="cx">
</span><del>- # XXX actually PyCalendar should be imported in-place.
- py_dependency -fe -i "src" -r 11947 \
- "PyCalendar" "pycalendar" "pycalendar" \
- "${svn_uri_base}/PyCalendar/trunk";
</del><ins>+ local v="11947";
+ local n="PyCalendar";
+ local p="${n}-${v}";
+ py_dependency -fe -i "src" -r "${v}" \
+ "${n}" "pycalendar" "${p}" \
+ "${svn_uri_base}/${n}/trunk";
</ins><span class="cx">
</span><ins>+ # Can't add "-v 2011g" to args because the version check expects numbers.
+ local v="2013.8";
+ local n="pytz";
+ local p="${n}-${v}";
+ py_dependency -m "37750ca749ed3a52523b9682b0b7e381" \
+ "${n}" "${n}" "${p}" \
+ "${pypi}/p/${n}/${p}.tar.gz";
+
</ins><span class="cx"> #
</span><span class="cx"> # Tool dependencies. The code itself doesn't depend on these, but
</span><span class="cx"> # they are useful to developers.
</span><span class="cx"> #
</span><span class="cx">
</span><del>- local v="0.1.2";
- local n="sqlparse";
- local p="${n}-${v}";
- py_dependency -v "${v}" -s "978874e5ebbd78e6d419e8182ce4fb3c30379642" \
- "SQLParse" "${n}" "${p}" \
- "http://python-sqlparse.googlecode.com/files/${p}.tar.gz";
-
</del><span class="cx"> if type -P pyflakes > /dev/null; then
</span><span class="cx"> using_system "PyFlakes";
</span><span class="cx"> else
</span><span class="lines">@@ -898,32 +923,13 @@
</span><span class="cx"> "${pypi}/p/${n}/${p}.tar.gz";
</span><span class="cx"> fi;
</span><span class="cx">
</span><del>- py_dependency -o -r HEAD \
- "CalDAVClientLibrary" "caldavclientlibrary" "CalDAVClientLibrary" \
- "${svn_uri_base}/CalDAVClientLibrary/trunk";
-
- # Can't add "-v 2011g" to args because the version check expects numbers.
- local v="2013.8";
- local n="pytz";
</del><ins>+ local v="12068";
+ local n="CalDAVClientLibrary";
</ins><span class="cx"> local p="${n}-${v}";
</span><del>- py_dependency -m "37750ca749ed3a52523b9682b0b7e381" \
- "${n}" "${n}" "${p}" \
- "${pypi}/p/${n}/${p}.tar.gz";
</del><ins>+ py_dependency -o -r "${v}" \
+ "${n}" "caldavclientlibrary" "${p}" \
+ "${svn_uri_base}/${n}/trunk";
</ins><span class="cx">
</span><del>- local v="2.6.1";
- local n="pycrypto";
- local p="${n}-${v}";
- py_dependency -v "${v}" -m "55a61a054aa66812daf5161a0d5d7eda" \
- "PyCrypto" "${n}" "${p}" \
- "http://ftp.dlitz.net/pub/dlitz/crypto/${n}/${p}.tar.gz";
-
- local v="0.1.7";
- local n="pyasn1";
- local p="${n}-${v}";
- py_dependency -v "${v}" -m "2cbd80fcd4c7b1c82180d3d76fee18c8" \
- "${n}" "${n}" "${p}" \
- "${pypi}/p/${n}/${p}.tar.gz";
-
</del><span class="cx"> local v="1.1.8";
</span><span class="cx"> local n="setproctitle";
</span><span class="cx"> local p="${n}-${v}";
</span><span class="lines">@@ -931,20 +937,6 @@
</span><span class="cx"> "${n}" "${n}" "${p}" \
</span><span class="cx"> "${pypi}/s/${n}/${p}.tar.gz";
</span><span class="cx">
</span><del>- local v="0.8";
- local n="cffi";
- local p="${n}-${v}";
- py_dependency -v "0.6" -m "e61deb0515311bb42d5d58b9403bc923" \
- "${n}" "${n}" "${p}" \
- "${pypi}/c/${n}/${p}.tar.gz";
-
- local v="2.10";
- local n="pycparser";
- local p="${n}-${v}";
- py_dependency -v "0.6" -m "d87aed98c8a9f386aa56d365fe4d515f" \
- "${n}" "${n}" "${p}" \
- "${pypi}/p/${n}/${p}.tar.gz";
-
</del><span class="cx"> svn_get "CalDAVTester" "${top}/CalDAVTester" \
</span><span class="cx"> "${svn_uri_base}/CalDAVTester/trunk" HEAD;
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixessupportpysh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,6 +15,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><ins>+set -e
+set -u
+
</ins><span class="cx"> # Echo the major.minor version of the given Python interpreter.
</span><span class="cx">
</span><span class="cx"> py_version () {
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestest"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/test (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/test        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/test        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,7 +21,9 @@
</span><span class="cx">
</span><span class="cx"> wd="$(cd "$(dirname "$0")" && pwd -L)";
</span><span class="cx">
</span><del>-#. "${wd}/support/build.sh";
</del><ins>+##
+# Options
+##
</ins><span class="cx">
</span><span class="cx"> do_setup="false";
</span><span class="cx"> do_get="false";
</span><span class="lines">@@ -78,15 +80,30 @@
</span><span class="cx"> test_modules="$@";
</span><span class="cx"> flaky=true;
</span><span class="cx"> else
</span><del>- test_modules="calendarserver twistedcaldav twext txdav contrib ${m_twisted}";
</del><ins>+ test_modules="calendarserver twistedcaldav txdav contrib ${m_twisted}";
</ins><span class="cx"> flaky=true;
</span><span class="cx"> fi;
</span><span class="cx">
</span><ins>+
+##
+# Clean up
+##
+
</ins><span class="cx"> find "${wd}" -name \*.pyc -print0 | xargs -0 rm;
</span><span class="cx">
</span><ins>+
+##
+# Unit tests
+##
+
</ins><span class="cx"> mkdir -p "${wd}/data";
</span><span class="cx"> cd "${wd}" && "${wd}/bin/trial" --temp-directory="${wd}/data/trial" --rterrors ${reactor} ${random} ${until_fail} ${no_colour} ${coverage} ${numjobs} ${test_modules};
</span><span class="cx">
</span><ins>+
+##
+# Code linting
+##
+
</ins><span class="cx"> if ${flaky}; then
</span><span class="cx"> echo "";
</span><span class="cx"> echo "Running pyflakes...";
</span><span class="lines">@@ -110,7 +127,7 @@
</span><span class="cx">
</span><span class="cx"> #tmp="$(mktemp "/tmp/calendarserver_test_flakish.XXXXX")";
</span><span class="cx"> #echo "";
</span><del>-#echo "Checking for other issues..."
</del><ins>+#echo "Checking for legacy print statements..."
</ins><span class="cx"> #search_py 'print *[^(]' | sed 's|#.*||' | grep 'print *[^(]' > "${tmp}" || true;
</span><span class="cx"> #if [ -s "${tmp}" ]; then
</span><span class="cx"> # echo "**** Use of legacy print statement found. ****";
</span><span class="lines">@@ -119,6 +136,11 @@
</span><span class="cx"> #fi;
</span><span class="cx"> #rm -f "${tmp}";
</span><span class="cx">
</span><ins>+
+##
+# Empty files
+##
+
</ins><span class="cx"> tmp="$(mktemp "/tmp/calendarserver_test_emtpy.XXXXX")";
</span><span class="cx"> find "${wd}" '!' '(' -type d '(' -path '*/.*' -or -name data ')' -prune ')' -type f -size 0 > "${tmp}";
</span><span class="cx"> if [ -s "${tmp}" ]; then
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedpluginscaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,6 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-__import__("twext") # install patches before doing anything
-
</del><span class="cx"> from zope.interface import implements
</span><span class="cx"> from twisted.plugin import IPlugin
</span><span class="cx"> from twisted.application.service import IServiceMaker
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedpluginskqueuereactorpy"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,23 +0,0 @@
</span><del>-##
-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-__import__("twext")
-
-from twisted.application.reactors import Reactor
-
-caldav_kqueue = Reactor(
- 'caldav_kqueue', 'twext.internet.kqreactor',
- 'kqueue(2)-based reactor.')
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedpluginsmasterchildpy"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,58 +0,0 @@
</span><del>-##
-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-from zope.interface import implementer
-
-from twisted.python.reflect import namedClass
-from twisted.plugin import IPlugin
-from twisted.application.service import IServiceMaker
-
-from twext.application.masterchild import MasterOptions, ChildOptions
-
-
-@implementer(IPlugin, IServiceMaker)
-class ServiceMaker(object):
- def __init__(self, name, description, options, serviceMakerClass):
- self.tapname = name
- self.description = description
- self.options = options
- self.serviceMakerClass = serviceMakerClass
- self._serviceMaker = None
-
-
- def makeService(self, options):
- if self._serviceMaker is None:
- self._serviceMaker = namedClass(self.serviceMakerClass)()
-
- return self._serviceMaker.makeService(options)
-
-
-
-masterServiceMaker = ServiceMaker(
- "master",
- "Master process application container",
- MasterOptions,
- "twext.application.masterchild.MasterServiceMaker"
-)
-
-
-
-childServiceMaker = ServiceMaker(
- "child",
- "Child process application container",
- ChildOptions,
- "twext.application.masterchild.ChildServiceMaker"
-)
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,15 +21,11 @@
</span><span class="cx"> See RFC 4791.
</span><span class="cx"> """
</span><span class="cx">
</span><del>-# Make sure we have twext's required Twisted patches loaded before we do
-# anything at all.
-__import__("twext")
-
</del><span class="cx"> #
</span><span class="cx"> # Load in suitable file extension/content-type map from OS X
</span><span class="cx"> #
</span><span class="cx">
</span><del>-from twext.web2.static import File, loadMimeTypes
</del><ins>+from txweb2.static import File, loadMimeTypes
</ins><span class="cx">
</span><span class="cx"> File.contentTypes = loadMimeTypes(("/etc/apache2/mime.types", "/etc/httpd/mime.types",))
</span><span class="cx">
</span><span class="lines">@@ -49,7 +45,7 @@
</span><span class="cx"> # DefaultHTTPHandler
</span><span class="cx"> #
</span><span class="cx">
</span><del>-from twext.web2.http_headers import DefaultHTTPHandler, last, singleHeader
</del><ins>+from txweb2.http_headers import DefaultHTTPHandler, last, singleHeader
</ins><span class="cx">
</span><span class="cx"> DefaultHTTPHandler.updateParsers({
</span><span class="cx"> "If-Schedule-Tag-Match": (last, str),
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavauthkerbpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -42,9 +42,9 @@
</span><span class="cx">
</span><span class="cx"> from twisted.cred import checkers, credentials, error
</span><span class="cx"> from twisted.internet.defer import succeed
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.interfaces import ICredentialFactory
-from twext.web2.dav.auth import IPrincipalCredentials
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.interfaces import ICredentialFactory
+from txweb2.dav.auth import IPrincipalCredentials
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbackuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> import fnmatch
</span><span class="cx"> import commands
</span><span class="cx">
</span><del>-from twext.python.plistlib import readPlist
</del><ins>+from plistlib import readPlist
</ins><span class="cx">
</span><span class="cx"> VERBOSE = os.environ.get('VERBOSE', False)
</span><span class="cx"> FUNCLOG = os.environ.get('FUNCLOG', False)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,16 +19,16 @@
</span><span class="cx"> Have to have this in a separate module for now.
</span><span class="cx"> """
</span><span class="cx">
</span><del>-from twext.web2.dav.util import bindMethods
</del><ins>+from txweb2.dav.util import bindMethods
</ins><span class="cx">
</span><span class="cx"> ##
</span><span class="cx"> # Attach methods
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> def doBind():
</span><del>- import twext.web2.dav.method
- from twext.web2.dav.resource import DAVResource
- bindMethods(twext.web2.dav.method, DAVResource)
</del><ins>+ import txweb2.dav.method
+ from txweb2.dav.resource import DAVResource
+ bindMethods(txweb2.dav.method, DAVResource)
</ins><span class="cx">
</span><span class="cx"> import twistedcaldav.method
</span><span class="cx"> from twistedcaldav.resource import CalDAVResource
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavcachepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,10 +15,10 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http import Response
-from twext.web2.iweb import IResource
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.util import allDataFromStream
+from txweb2.http import Response
+from txweb2.iweb import IResource
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclient__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.http_headers import DefaultHTTPHandler, tokenize, generateList, singleHeader
</del><ins>+from txweb2.http_headers import DefaultHTTPHandler, tokenize, generateList, singleHeader
</ins><span class="cx">
</span><span class="cx"> DefaultHTTPHandler.updateParsers({
</span><span class="cx"> "x-forwarded-for": (tokenize, list),
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientpoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,11 +33,11 @@
</span><span class="cx"> from twisted.internet.error import ConnectionLost, ConnectionDone, ConnectError
</span><span class="cx"> from twisted.internet.protocol import ClientFactory
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.client.http import HTTPClientProtocol
-from twext.web2.http import StatusResponse, HTTPError
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.client.http import HTTPClientProtocol
+from txweb2.http import StatusResponse, HTTPError
+from txweb2.dav.util import allDataFromStream
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> class PooledHTTPClientFactory(ClientFactory):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientreverseproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,10 +20,10 @@
</span><span class="cx">
</span><span class="cx"> from zope.interface.declarations import implements
</span><span class="cx">
</span><del>-from twext.web2 import iweb, responsecode
-from twext.web2.client.http import ClientRequest
-from twext.web2.http import StatusResponse, HTTPError
-from twext.web2.resource import LeafResource
</del><ins>+from txweb2 import iweb, responsecode
+from txweb2.client.http import ClientRequest
+from txweb2.http import StatusResponse, HTTPError
+from txweb2.resource import LeafResource
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclienttesttest_reverseproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,9 +14,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.client.http import ClientRequest
-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.client.http import ClientRequest
+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> from twistedcaldav.client.pool import _clientPools
</span><span class="cx"> from twistedcaldav.client.reverseproxy import ReverseProxyResource
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersperuserdatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx">
</span><span class="cx"> # X- properties that are ignored - by default all X- properties are treated as per-user except for the
</span><span class="cx"> # ones listed here
</span><del>- IGNORE_X_PROPERTIES = (Component.HIDDEN_INSTANCE_PROPERTY,)
</del><ins>+ IGNORE_X_PROPERTIES = [Component.HIDDEN_INSTANCE_PROPERTY]
</ins><span class="cx">
</span><span class="cx"> def __init__(self, uid):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersprivateeventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> from twistedcaldav.caldavxml import Property, CalendarData, CalendarComponent, \
</span><span class="cx"> AllProperties, AllComponents
</span><span class="cx"> from twistedcaldav.datafilters.calendardata import CalendarDataFilter
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafilterstesttest_privateeventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.http import HTTPError
</del><ins>+from txweb2.http import HTTPError
</ins><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav.datafilters.privateevents import PrivateEventFilter
</span><span class="cx"> from twistedcaldav.ical import Component
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaddressbookpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,10 +26,10 @@
</span><span class="cx"> ]
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError
-from twext.web2.http_headers import ETag, MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError
+from txweb2.http_headers import ETag, MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryappleopendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twext.web2.auth.digest import DigestedCredentials
</del><ins>+from txweb2.auth.digest import DigestedCredentials
</ins><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span><span class="cx"> from twistedcaldav.directory.cachingdirectory import CachingDirectoryService, \
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaugmentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -79,6 +79,7 @@
</span><span class="cx"> "groups" : "Group",
</span><span class="cx"> "locations" : "Location",
</span><span class="cx"> "resources" : "Resource",
</span><ins>+ "addresses" : "Address",
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> class AugmentDB(object):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycachingdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -31,9 +31,9 @@
</span><span class="cx"> import base64
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.python.memcacheclient import ClientFactory, MemcacheError
</del><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config
</span><ins>+from twistedcaldav.memcacheclient import ClientFactory, MemcacheError
</ins><span class="cx"> from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord, DirectoryError, UnknownRecordTypeError
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import normalizeCUAddr
</span><span class="cx"> from twistedcaldav.directory.util import normalizeUUID
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx"> ]
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError
-from twext.web2.http_headers import ETag, MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError
+from txweb2.http_headers import ETag, MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendaruserproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -31,12 +31,12 @@
</span><span class="cx"> import time
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import dav_namespace
</span><del>-from twext.web2.dav.util import joinURL
-from twext.web2.dav.noneprops import NonePropertyStore
</del><ins>+from txweb2.dav.util import joinURL
+from txweb2.dav.noneprops import NonePropertyStore
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,9 +16,9 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2.http import HTTPError
-from twext.web2 import responsecode
-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.http import HTTPError
+from txweb2 import responsecode
+from txweb2.dav.util import joinURL
</ins><span class="cx"> from twistedcaldav.directory.util import transactionFromRequest, NotFoundResource
</span><span class="cx"> from twistedcaldav.directory.resource import DirectoryReverseProxyResource
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydigestpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,12 +17,12 @@
</span><span class="cx">
</span><span class="cx"> from twisted.cred import error
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2.auth.digest import DigestCredentialFactory
-from twext.web2.auth.digest import DigestedCredentials
-from twext.web2.http_headers import Token
-from twext.web2.http_headers import parseKeyValue
-from twext.web2.http_headers import split
-from twext.web2.http_headers import tokenize
</del><ins>+from txweb2.auth.digest import DigestCredentialFactory
+from txweb2.auth.digest import DigestedCredentials
+from txweb2.http_headers import Token
+from txweb2.http_headers import parseKeyValue
+from txweb2.http_headers import split
+from txweb2.http_headers import tokenize
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span><span class="cx"> """
</span><del>-Overrides twext.web2.auth.digest to allow specifying a qop value as a configuration parameter.
</del><ins>+Overrides txweb2.auth.digest to allow specifying a qop value as a configuration parameter.
</ins><span class="cx"> Also adds an sqlite-based credentials cache that is multi-process safe.
</span><span class="cx">
</span><span class="cx"> """
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx">
</span><span class="cx"> class QopDigestCredentialFactory(DigestCredentialFactory):
</span><span class="cx"> """
</span><del>- See twext.web2.auth.digest.DigestCredentialFactory
</del><ins>+ See txweb2.auth.digest.DigestCredentialFactory
</ins><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> def __init__(self, algorithm, qop, realm, namespace="DIGESTCREDENTIALS"):
</span><span class="lines">@@ -196,7 +196,7 @@
</span><span class="cx"> @type response: C{str}
</span><span class="cx"> @param response: A string of comma seperated key=value pairs
</span><span class="cx">
</span><del>- @type request: L{twext.web2.server.Request}
</del><ins>+ @type request: L{txweb2.server.Request}
</ins><span class="cx"> @param request: the request being processed
</span><span class="cx">
</span><span class="cx"> @return: L{DigestedCredentials}
</span><span class="lines">@@ -253,7 +253,7 @@
</span><span class="cx"> @param auth: the response parameters.
</span><span class="cx"> @type auth: C{dict}
</span><span class="cx"> @param request: the request being processed.
</span><del>- @type request: L{twext.web2.server.Request}
</del><ins>+ @type request: L{txweb2.server.Request}
</ins><span class="cx">
</span><span class="cx"> @return: C{True} if validated.
</span><span class="cx"> @raise LoginFailed: if validation fails.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,8 +35,8 @@
</span><span class="cx"> from twext.enterprise.dal.syntax import Delete
</span><span class="cx"> from twext.enterprise.queue import WorkItem, PeerConnectionPool
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.auth import IPrincipalCredentials
-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.auth import IPrincipalCredentials
+from txweb2.dav.util import joinURL
</ins><span class="cx">
</span><span class="cx"> from twisted.cred.checkers import ICredentialsChecker
</span><span class="cx"> from twisted.cred.error import UnauthorizedLogin
</span><span class="lines">@@ -86,6 +86,7 @@
</span><span class="cx"> recordType_groups = "groups"
</span><span class="cx"> recordType_locations = "locations"
</span><span class="cx"> recordType_resources = "resources"
</span><ins>+ recordType_addresses = "addresses"
</ins><span class="cx">
</span><span class="cx"> searchContext_location = "location"
</span><span class="cx"> searchContext_resource = "resource"
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryinternalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx"> "InternalDirectoryService",
</span><span class="cx"> ]
</span><span class="cx">
</span><del>-from twext.web2.dav.auth import IPrincipalCredentials
</del><ins>+from txweb2.dav.auth import IPrincipalCredentials
</ins><span class="cx">
</span><span class="cx"> from twisted.cred.error import UnauthorizedLogin
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -60,8 +60,8 @@
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx"> from twisted.internet.threads import deferToThread
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2 import responsecode
</del><ins>+from txweb2.http import HTTPError, StatusResponse
+from txweb2 import responsecode
</ins><span class="cx">
</span><span class="cx"> class LdapDirectoryService(CachingDirectoryService):
</span><span class="cx"> """
</span><span class="lines">@@ -113,8 +113,6 @@
</span><span class="cx"> "guidAttr": "entryUUID",
</span><span class="cx"> "users": {
</span><span class="cx"> "rdn": "ou=People",
</span><del>- "attr": "uid", # used only to synthesize email address
- "emailSuffix": None, # used only to synthesize email address
</del><span class="cx"> "filter": None, # additional filter for this type
</span><span class="cx"> "loginEnabledAttr" : "", # attribute controlling login
</span><span class="cx"> "loginEnabledValue" : "yes", # "True" value of above attribute
</span><span class="lines">@@ -130,8 +128,6 @@
</span><span class="cx"> },
</span><span class="cx"> "groups": {
</span><span class="cx"> "rdn": "ou=Group",
</span><del>- "attr": "cn", # used only to synthesize email address
- "emailSuffix": None, # used only to synthesize email address
</del><span class="cx"> "filter": None, # additional filter for this type
</span><span class="cx"> "mapping" : { # maps internal record names to LDAP
</span><span class="cx"> "recordName": "cn",
</span><span class="lines">@@ -143,23 +139,18 @@
</span><span class="cx"> },
</span><span class="cx"> "locations": {
</span><span class="cx"> "rdn": "ou=Places",
</span><del>- "attr": "cn", # used only to synthesize email address
- "emailSuffix": None, # used only to synthesize email address
</del><span class="cx"> "filter": None, # additional filter for this type
</span><span class="cx"> "calendarEnabledAttr" : "", # attribute controlling enabledForCalendaring
</span><span class="cx"> "calendarEnabledValue" : "yes", # "True" value of above attribute
</span><ins>+ "associatedAddressAttr" : "",
</ins><span class="cx"> "mapping" : { # maps internal record names to LDAP
</span><span class="cx"> "recordName": "cn",
</span><span class="cx"> "fullName" : "cn",
</span><span class="cx"> "emailAddresses" : ["mail"], # multiple LDAP fields supported
</span><del>- "firstName" : "givenName",
- "lastName" : "sn",
</del><span class="cx"> },
</span><span class="cx"> },
</span><span class="cx"> "resources": {
</span><span class="cx"> "rdn": "ou=Resources",
</span><del>- "attr": "cn", # used only to synthesize email address
- "emailSuffix": None, # used only to synthesize email address
</del><span class="cx"> "filter": None, # additional filter for this type
</span><span class="cx"> "calendarEnabledAttr" : "", # attribute controlling enabledForCalendaring
</span><span class="cx"> "calendarEnabledValue" : "yes", # "True" value of above attribute
</span><span class="lines">@@ -167,10 +158,18 @@
</span><span class="cx"> "recordName": "cn",
</span><span class="cx"> "fullName" : "cn",
</span><span class="cx"> "emailAddresses" : ["mail"], # multiple LDAP fields supported
</span><del>- "firstName" : "givenName",
- "lastName" : "sn",
</del><span class="cx"> },
</span><span class="cx"> },
</span><ins>+ "addresses": {
+ "rdn": "ou=Buildings",
+ "filter": None, # additional filter for this type
+ "streetAddressAttr" : "",
+ "geoAttr" : "",
+ "mapping" : { # maps internal record names to LDAP
+ "recordName": "cn",
+ "fullName" : "cn",
+ },
+ },
</ins><span class="cx"> },
</span><span class="cx"> "groupSchema": {
</span><span class="cx"> "membersAttr": "member", # how members are specified
</span><span class="lines">@@ -238,8 +237,10 @@
</span><span class="cx"> for recordType in self.recordTypes():
</span><span class="cx"> if self.rdnSchema[recordType]["attr"]:
</span><span class="cx"> attrSet.add(self.rdnSchema[recordType]["attr"])
</span><del>- if self.rdnSchema[recordType].get("calendarEnabledAttr", False):
- attrSet.add(self.rdnSchema[recordType]["calendarEnabledAttr"])
</del><ins>+ for n in ("calendarEnabledAttr", "associatedAddressAttr",
+ "streetAddressAttr", "geoAttr"):
+ if self.rdnSchema[recordType].get(n, False):
+ attrSet.add(self.rdnSchema[recordType][n])
</ins><span class="cx"> for attrList in self.rdnSchema[recordType]["mapping"].values():
</span><span class="cx"> if attrList:
</span><span class="cx"> # Since emailAddresses can map to multiple LDAP fields,
</span><span class="lines">@@ -304,7 +305,7 @@
</span><span class="cx">
</span><span class="cx"> # Build filter
</span><span class="cx"> filterstr = "(!(objectClass=organizationalUnit))"
</span><del>- typeFilter = self.rdnSchema[recordType]["filter"]
</del><ins>+ typeFilter = self.rdnSchema[recordType].get("filter", "")
</ins><span class="cx"> if typeFilter:
</span><span class="cx"> filterstr = "(&%s%s)" % (filterstr, typeFilter)
</span><span class="cx">
</span><span class="lines">@@ -778,6 +779,7 @@
</span><span class="cx"> enabledForAddressBooks = None
</span><span class="cx"> uid = None
</span><span class="cx"> enabledForLogin = True
</span><ins>+ extras = {}
</ins><span class="cx">
</span><span class="cx"> shortNames = tuple(self._getMultipleLdapAttributes(attrs, self.rdnSchema[recordType]["mapping"]["recordName"]))
</span><span class="cx"> if not shortNames:
</span><span class="lines">@@ -794,17 +796,17 @@
</span><span class="cx">
</span><span class="cx"> # Find or build email
</span><span class="cx"> # (The emailAddresses mapping is a list of ldap fields)
</span><del>- emailAddressesMappedTo = self.rdnSchema[recordType]["mapping"]["emailAddresses"]
</del><ins>+ emailAddressesMappedTo = self.rdnSchema[recordType]["mapping"].get("emailAddresses", "")
</ins><span class="cx"> # Supporting either string or list for emailAddresses:
</span><span class="cx"> if isinstance(emailAddressesMappedTo, str):
</span><del>- emailAddresses = set(self._getMultipleLdapAttributes(attrs, self.rdnSchema[recordType]["mapping"]["emailAddresses"]))
</del><ins>+ emailAddresses = set(self._getMultipleLdapAttributes(attrs, self.rdnSchema[recordType]["mapping"].get("emailAddresses", "")))
</ins><span class="cx"> else:
</span><span class="cx"> emailAddresses = set(self._getMultipleLdapAttributes(attrs, *self.rdnSchema[recordType]["mapping"]["emailAddresses"]))
</span><del>- emailSuffix = self.rdnSchema[recordType]["emailSuffix"]
</del><ins>+ emailSuffix = self.rdnSchema[recordType].get("emailSuffix", None)
</ins><span class="cx">
</span><span class="cx"> if len(emailAddresses) == 0 and emailSuffix:
</span><span class="cx"> emailPrefix = self._getUniqueLdapAttribute(attrs,
</span><del>- self.rdnSchema[recordType]["attr"])
</del><ins>+ self.rdnSchema[recordType].get("attr", "cn"))
</ins><span class="cx"> emailAddresses.add(emailPrefix + emailSuffix)
</span><span class="cx">
</span><span class="cx"> proxyGUIDs = ()
</span><span class="lines">@@ -890,6 +892,25 @@
</span><span class="cx"> autoAcceptGroup = self._getUniqueLdapAttribute(attrs,
</span><span class="cx"> self.resourceSchema["autoAcceptGroupAttr"])
</span><span class="cx">
</span><ins>+ if recordType == self.recordType_locations:
+ if self.rdnSchema[recordType]["associatedAddressAttr"]:
+ associatedAddress = self._getUniqueLdapAttribute(attrs,
+ self.rdnSchema[recordType]["associatedAddressAttr"])
+ if associatedAddress:
+ extras["associatedAddress"] = associatedAddress
+
+ elif recordType == self.recordType_addresses:
+ if self.rdnSchema[recordType].get("geoAttr", ""):
+ geo = self._getUniqueLdapAttribute(attrs,
+ self.rdnSchema[recordType]["geoAttr"])
+ if geo:
+ extras["geo"] = geo
+ if self.rdnSchema[recordType].get("streetAddressAttr", ""):
+ street = self._getUniqueLdapAttribute(attrs,
+ self.rdnSchema[recordType]["streetAddressAttr"])
+ if street:
+ extras["streetAddress"] = street
+
</ins><span class="cx"> serverID = None
</span><span class="cx"> if self.poddingSchema["serverIdAttr"]:
</span><span class="cx"> serverID = self._getUniqueLdapAttribute(attrs,
</span><span class="lines">@@ -911,6 +932,7 @@
</span><span class="cx"> extProxies=proxyGUIDs,
</span><span class="cx"> extReadOnlyProxies=readOnlyProxyGUIDs,
</span><span class="cx"> attrs=attrs,
</span><ins>+ **extras
</ins><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> if self.augmentService is not None:
</span><span class="lines">@@ -981,7 +1003,7 @@
</span><span class="cx">
</span><span class="cx"> # Build filter
</span><span class="cx"> filterstr = "(!(objectClass=organizationalUnit))"
</span><del>- typeFilter = self.rdnSchema[recordType]["filter"]
</del><ins>+ typeFilter = self.rdnSchema[recordType].get("filter", "")
</ins><span class="cx"> if typeFilter:
</span><span class="cx"> filterstr = "(&%s%s)" % (filterstr, typeFilter)
</span><span class="cx">
</span><span class="lines">@@ -1003,17 +1025,17 @@
</span><span class="cx"> elif indexType == self.INDEX_TYPE_CUA:
</span><span class="cx"> # indexKey is of the form "mailto:test@example.net"
</span><span class="cx"> email = indexKey[7:] # strip "mailto:"
</span><del>- emailSuffix = self.rdnSchema[recordType]["emailSuffix"]
</del><ins>+ emailSuffix = self.rdnSchema[recordType].get("emailSuffix", None)
</ins><span class="cx"> if emailSuffix is not None and email.partition("@")[2] == emailSuffix:
</span><span class="cx"> filterstr = "(&%s(|(&(!(mail=*))(%s=%s))(mail=%s)))" % (
</span><span class="cx"> filterstr,
</span><del>- self.rdnSchema[recordType]["attr"],
</del><ins>+ self.rdnSchema[recordType].get("attr", "cn"),
</ins><span class="cx"> email.partition("@")[0],
</span><span class="cx"> ldapEsc(email)
</span><span class="cx"> )
</span><span class="cx"> else:
</span><span class="cx"> # emailAddresses can map to multiple LDAP fields
</span><del>- ldapFields = self.rdnSchema[recordType]["mapping"]["emailAddresses"]
</del><ins>+ ldapFields = self.rdnSchema[recordType]["mapping"].get("emailAddresses", "")
</ins><span class="cx"> if isinstance(ldapFields, str):
</span><span class="cx"> if ldapFields:
</span><span class="cx"> subfilter = "(%s=%s)" % (ldapFields, ldapEsc(email))
</span><span class="lines">@@ -1108,7 +1130,7 @@
</span><span class="cx"> typeCounts[recordType] = 0
</span><span class="cx"> base = self.typeDNs[recordType]
</span><span class="cx"> scope = ldap.SCOPE_SUBTREE
</span><del>- extraFilter = self.rdnSchema[recordType]["filter"]
</del><ins>+ extraFilter = self.rdnSchema[recordType].get("filter", "")
</ins><span class="cx"> filterstr = buildFilterFromTokens(recordType, self.rdnSchema[recordType]["mapping"],
</span><span class="cx"> tokens, extra=extraFilter)
</span><span class="cx">
</span><span class="lines">@@ -1509,7 +1531,7 @@
</span><span class="cx"> guid, shortNames, authIDs, fullName,
</span><span class="cx"> firstName, lastName, emailAddresses,
</span><span class="cx"> uid, dn, memberGUIDs, extProxies, extReadOnlyProxies,
</span><del>- attrs
</del><ins>+ attrs, **kwargs
</ins><span class="cx"> ):
</span><span class="cx"> super(LdapDirectoryRecord, self).__init__(
</span><span class="cx"> service=service,
</span><span class="lines">@@ -1524,6 +1546,7 @@
</span><span class="cx"> extProxies=extProxies,
</span><span class="cx"> extReadOnlyProxies=extReadOnlyProxies,
</span><span class="cx"> uid=uid,
</span><ins>+ **kwargs
</ins><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> # Save attributes of dn and attrs in case you might need them later
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryopendirectorybackerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -46,9 +46,9 @@
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import twisted_dav_namespace, dav_namespace, parse_date, twisted_private_namespace
</span><del>-from twext.web2.dav.resource import DAVPropertyMixIn
-from twext.web2.dav.util import joinURL
-from twext.web2.http_headers import MimeType, generateContentType, ETag
</del><ins>+from txweb2.dav.resource import DAVPropertyMixIn
+from txweb2.dav.util import joinURL
+from txweb2.http_headers import MimeType, generateContentType, ETag
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> from twistedcaldav import customxml, carddavxml
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryprincipalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -38,12 +38,12 @@
</span><span class="cx"> from twisted.web.template import XMLFile, Element, renderer, tags
</span><span class="cx"> from twistedcaldav.directory.util import NotFoundResource
</span><span class="cx">
</span><del>-from twext.web2.auth.digest import DigestedCredentials
-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.auth.digest import DigestedCredentials
+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.util import joinURL
-from twext.web2.dav.noneprops import NonePropertyStore
</del><ins>+from txweb2.dav.util import joinURL
+from txweb2.dav.noneprops import NonePropertyStore
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx"> Implements a directory-backed principal hierarchy.
</span><span class="cx"> """
</span><span class="cx">
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.client.reverseproxy import ReverseProxyResource
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_aggregatepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -56,6 +56,7 @@
</span><span class="cx"> groups = property(_records("groups"))
</span><span class="cx"> locations = property(_records("locations"))
</span><span class="cx"> resources = property(_records("resources"))
</span><ins>+ addresses = property(_records("addresses"))
</ins><span class="cx">
</span><span class="cx"> recordTypePrefixes = tuple(s[0] for s in testServices)
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_digestpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,16 +21,16 @@
</span><span class="cx"> from twisted.internet import address
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python import failure
</span><del>-from twext.web2.auth import digest
-from twext.web2.auth.wrapper import UnauthorizedResponse
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.auth import digest
+from txweb2.auth.wrapper import UnauthorizedResponse
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.directory.digest import QopDigestCredentialFactory
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> from twistedcaldav.config import config
</span><del>-from twext.web2.auth.digest import DigestCredentialFactory
-from twext.web2.test.test_httpauth import makeDigestDeterministic
-from twext.web2.test.test_httpauth import FAKE_STATIC_NONCE
</del><ins>+from txweb2.auth.digest import DigestCredentialFactory
+from txweb2.test.test_httpauth import makeDigestDeterministic
+from txweb2.test.test_httpauth import FAKE_STATIC_NONCE
</ins><span class="cx">
</span><span class="cx"> class FakeDigestCredentialFactory(QopDigestCredentialFactory):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_guidchangepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,8 +18,8 @@
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><span class="cx">
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.dav.resource import AccessDeniedError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.directory.test.util import maybeCommit
</span><span class="cx"> from twistedcaldav.test.util import TestCase, xmlFile
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_ldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -541,8 +541,6 @@
</span><span class="cx"> "recordName": "cn",
</span><span class="cx"> "fullName" : "cn",
</span><span class="cx"> "emailAddresses" : ["mail", "emailAliases"],
</span><del>- "firstName" : "givenName",
- "lastName" : "sn",
</del><span class="cx"> },
</span><span class="cx"> },
</span><span class="cx"> "locations": {
</span><span class="lines">@@ -552,12 +550,11 @@
</span><span class="cx"> "filter": "(objectClass=apple-resource)", # additional filter for this type
</span><span class="cx"> "calendarEnabledAttr" : "", # attribute controlling calendaring
</span><span class="cx"> "calendarEnabledValue" : "yes", # "True" value of above attribute
</span><ins>+ "associatedAddressAttr" : "assocAddr",
</ins><span class="cx"> "mapping": { # maps internal record names to LDAP
</span><span class="cx"> "recordName": "cn",
</span><span class="cx"> "fullName" : "cn",
</span><span class="cx"> "emailAddresses" : "", # old style, single string
</span><del>- "firstName" : "givenName",
- "lastName" : "sn",
</del><span class="cx"> },
</span><span class="cx"> },
</span><span class="cx"> "resources": {
</span><span class="lines">@@ -571,10 +568,17 @@
</span><span class="cx"> "recordName": "cn",
</span><span class="cx"> "fullName" : "cn",
</span><span class="cx"> "emailAddresses" : [], # new style, array
</span><del>- "firstName" : "givenName",
- "lastName" : "sn",
</del><span class="cx"> },
</span><span class="cx"> },
</span><ins>+ "addresses": {
+ "rdn": "cn=Buildings",
+ "geoAttr" : "coordinates",
+ "streetAddressAttr" : "postal",
+ "mapping": { # maps internal record names to LDAP
+ "recordName": "cn",
+ "fullName" : "cn",
+ },
+ },
</ins><span class="cx"> },
</span><span class="cx"> "groupSchema": {
</span><span class="cx"> "membersAttr": "uniqueMember", # how members are specified
</span><span class="lines">@@ -1514,6 +1518,39 @@
</span><span class="cx"> self.service.recordType_users)
</span><span class="cx"> self.assertEquals(record.guid, guid.upper())
</span><span class="cx">
</span><ins>+ # Location with associated Address
+
+ dn = "cn=odtestlocation,cn=locations,dc=example,dc=com"
+ guid = "D3094652-344B-4633-8DB8-09639FA00FB6"
+ attrs = {
+ "apple-generateduid": [guid],
+ "cn": ["odtestlocation"],
+ "assocAddr" : ["6C6CD280-E6E3-11DF-9492-0800200C9A66"],
+ }
+ record = self.service._ldapResultToRecord(dn, attrs,
+ self.service.recordType_locations)
+ self.assertEquals(record.extras, {
+ "associatedAddress": "6C6CD280-E6E3-11DF-9492-0800200C9A66"
+ })
+
+ # Address with street and geo
+
+ dn = "cn=odtestaddress,cn=buildings,dc=example,dc=com"
+ guid = "6C6CD280-E6E3-11DF-9492-0800200C9A66"
+ attrs = {
+ "apple-generateduid": [guid],
+ "cn": ["odtestaddress"],
+ "coordinates" : ["geo:1,2"],
+ "postal" : ["1 Infinite Loop, Cupertino, CA"],
+ }
+ record = self.service._ldapResultToRecord(dn, attrs,
+ self.service.recordType_addresses)
+ self.assertEquals(record.extras, {
+ "geo": "geo:1,2",
+ "streetAddress" : "1 Infinite Loop, Cupertino, CA",
+ })
+
+
</ins><span class="cx"> def test_listRecords(self):
</span><span class="cx"> """
</span><span class="cx"> listRecords makes an LDAP query (with fake results in this test)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_opendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx"> else:
</span><span class="cx"> from calendarserver.platform.darwin.od import dsattributes
</span><span class="cx"> from collections import defaultdict
</span><del>- from twext.web2.auth.digest import DigestedCredentials
</del><ins>+ from txweb2.auth.digest import DigestedCredentials
</ins><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twisted.python.runtime import platform
</span><span class="cx"> from twisted.trial.unittest import SkipTest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_principalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,10 +20,10 @@
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.fileop import rmdir
-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.dav.fileop import rmdir
+from txweb2.dav.resource import AccessDeniedError
+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.cache import DisabledCacheNotifier
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_wikipy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,8 +20,8 @@
</span><span class="cx"> )
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> from twisted.web.xmlrpc import Fault
</span><del>-from twext.web2.http import HTTPError
-from twext.web2 import responsecode
</del><ins>+from txweb2.http import HTTPError
+from txweb2 import responsecode
</ins><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twisted.web.error import Error as WebError
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_xmlfilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -34,7 +34,8 @@
</span><span class="cx"> DirectoryService.recordType_users,
</span><span class="cx"> DirectoryService.recordType_groups,
</span><span class="cx"> DirectoryService.recordType_locations,
</span><del>- DirectoryService.recordType_resources
</del><ins>+ DirectoryService.recordType_resources,
+ DirectoryService.recordType_addresses,
</ins><span class="cx"> ))
</span><span class="cx">
</span><span class="cx"> users = {
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx">
</span><span class="cx"> from twisted.trial.unittest import SkipTest
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twext.web2.auth.digest import DigestedCredentials, calcResponse, calcHA1
</del><ins>+from txweb2.auth.digest import DigestedCredentials, calcResponse, calcHA1
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><span class="cx"> from twistedcaldav.directory.directory import UnknownRecordTypeError
</span><span class="lines">@@ -44,6 +44,10 @@
</span><span class="cx"> # Subclass should init this to a dict of resourcenames keys and dict values.
</span><span class="cx"> resources = {}
</span><span class="cx">
</span><ins>+ # Subclass should init this to a dict of addressname keys and dict values.
+ addresses = {}
+
+
</ins><span class="cx"> # Subclass should init this to an IDirectoryService implementation class.
</span><span class="cx"> def service(self):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx">
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.wrapper import UnauthorizedResponse
-from twext.web2.dav.resource import DAVResource
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.wrapper import UnauthorizedResponse
+from txweb2.dav.resource import DAVResource
+from txweb2.http import StatusResponse
</ins><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from uuid import UUID, uuid5
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorywikipy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx">
</span><span class="cx"> from twext.internet.gaiendpoint import MultiFailure
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.wrapper import UnauthorizedResponse
-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.wrapper import UnauthorizedResponse
+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.web.error import Error as WebError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlaccountsparserpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> ELEMENT_GROUP = "group"
</span><span class="cx"> ELEMENT_LOCATION = "location"
</span><span class="cx"> ELEMENT_RESOURCE = "resource"
</span><ins>+ELEMENT_ADDRESS = "address"
</ins><span class="cx">
</span><span class="cx"> ELEMENT_SHORTNAME = "uid"
</span><span class="cx"> ELEMENT_GUID = "guid"
</span><span class="lines">@@ -65,6 +66,7 @@
</span><span class="cx"> ELEMENT_GROUP : DirectoryService.recordType_groups,
</span><span class="cx"> ELEMENT_LOCATION : DirectoryService.recordType_locations,
</span><span class="cx"> ELEMENT_RESOURCE : DirectoryService.recordType_resources,
</span><ins>+ ELEMENT_ADDRESS : DirectoryService.recordType_addresses,
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> class XMLAccountsParser(object):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlfilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> import types
</span><span class="cx">
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twext.web2.auth.digest import DigestedCredentials
</del><ins>+from txweb2.auth.digest import DigestedCredentials
</ins><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twisted.internet.defer import succeed
</span><span class="lines">@@ -71,6 +71,7 @@
</span><span class="cx"> self.recordType_groups,
</span><span class="cx"> self.recordType_locations,
</span><span class="cx"> self.recordType_resources,
</span><ins>+ self.recordType_addresses,
</ins><span class="cx"> ),
</span><span class="cx"> 'realmName' : '/Search',
</span><span class="cx"> 'statSeconds' : 15,
</span><span class="lines">@@ -373,6 +374,7 @@
</span><span class="cx"> 'groups' : 'group',
</span><span class="cx"> 'locations' : 'location',
</span><span class="cx"> 'resources' : 'resource',
</span><ins>+ 'addresses' : 'address',
</ins><span class="cx"> }
</span><span class="cx"> xmlType = xmlTypes[principal.recordType]
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorybackedaddressbookpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,10 +23,10 @@
</span><span class="cx"> ]
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, maybeDeferred, returnValue
</span><span class="cx"> from twisted.python.reflect import namedClass
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdropboxpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,11 +24,11 @@
</span><span class="cx"> ]
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.resource import DAVResource, TwistedACLInheritable
-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.resource import DAVResource, TwistedACLInheritable
+from txweb2.dav.util import joinURL
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavextensionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -40,23 +40,23 @@
</span><span class="cx"> from twisted.web.template import Element, XMLFile, renderer, tags, flattenString
</span><span class="cx"> from twisted.python.modules import getModule
</span><span class="cx">
</span><del>-from twext.web2 import responsecode, server
-from twext.web2.http import HTTPError, Response, RedirectResponse
-from twext.web2.http import StatusResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import FileStream
-from twext.web2.static import MetaDataMixin, StaticRenderMixin
</del><ins>+from txweb2 import responsecode, server
+from txweb2.http import HTTPError, Response, RedirectResponse
+from txweb2.http import StatusResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import FileStream
+from txweb2.static import MetaDataMixin, StaticRenderMixin
</ins><span class="cx"> from txdav.xml import element
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><span class="cx"> from txdav.xml.element import dav_namespace
</span><del>-from twext.web2.dav.http import MultiStatusResponse
-from twext.web2.dav.static import DAVFile as SuperDAVFile
-from twext.web2.dav.resource import DAVResource as SuperDAVResource
-from twext.web2.dav.resource import (
</del><ins>+from txweb2.dav.http import MultiStatusResponse
+from txweb2.dav.static import DAVFile as SuperDAVFile
+from txweb2.dav.resource import DAVResource as SuperDAVResource
+from txweb2.dav.resource import (
</ins><span class="cx"> DAVPrincipalResource as SuperDAVPrincipalResource
</span><span class="cx"> )
</span><span class="cx"> from twisted.internet.defer import gatherResults
</span><del>-from twext.web2.dav.method import prop_common
</del><ins>+from txweb2.dav.method import prop_common
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span><span class="lines">@@ -541,7 +541,7 @@
</span><span class="cx"> SuperDAVResource,
</span><span class="cx"> DirectoryRenderingMixIn, StaticRenderMixin):
</span><span class="cx"> """
</span><del>- Extended L{twext.web2.dav.resource.DAVResource} implementation.
</del><ins>+ Extended L{txweb2.dav.resource.DAVResource} implementation.
</ins><span class="cx">
</span><span class="cx"> Note we add StaticRenderMixin as a base class because we need all the etag etc behavior
</span><span class="cx"> that is currently in static.py but is actually applicable to any type of resource.
</span><span class="lines">@@ -577,7 +577,7 @@
</span><span class="cx">
</span><span class="cx"> class DAVResourceWithChildrenMixin (object):
</span><span class="cx"> """
</span><del>- Bits needed from twext.web2.static
</del><ins>+ Bits needed from txweb2.static
</ins><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> def __init__(self, principalCollections=None):
</span><span class="lines">@@ -646,7 +646,7 @@
</span><span class="cx">
</span><span class="cx"> class DAVResourceWithoutChildrenMixin (object):
</span><span class="cx"> """
</span><del>- Bits needed from twext.web2.static
</del><ins>+ Bits needed from txweb2.static
</ins><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> def __init__(self, principalCollections=None):
</span><span class="lines">@@ -670,7 +670,7 @@
</span><span class="cx"> SuperDAVPrincipalResource,
</span><span class="cx"> DirectoryRenderingMixIn):
</span><span class="cx"> """
</span><del>- Extended L{twext.web2.dav.static.DAVFile} implementation.
</del><ins>+ Extended L{txweb2.dav.static.DAVFile} implementation.
</ins><span class="cx"> """
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span><span class="lines">@@ -761,7 +761,7 @@
</span><span class="cx">
</span><span class="cx"> class DAVFile (SuperDAVFile, DirectoryRenderingMixIn):
</span><span class="cx"> """
</span><del>- Extended L{twext.web2.dav.static.DAVFile} implementation.
</del><ins>+ Extended L{txweb2.dav.static.DAVFile} implementation.
</ins><span class="cx"> """
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavfreebusyurlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,15 +25,15 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError
-from twext.web2.http import Response
-from twext.web2.http import StatusResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError
+from txweb2.http import Response
+from txweb2.http import StatusResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.caldavxml import TimeRange
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,8 +35,8 @@
</span><span class="cx"> import uuid
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.stream import IStream
-from twext.web2.dav.util import allDataFromStream
</del><ins>+from txweb2.stream import IStream
+from txweb2.dav.util import allDataFromStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.dateops import timeRangesOverlap, normalizeForIndex, differenceDateTime, \
</span><span class="lines">@@ -3418,7 +3418,33 @@
</span><span class="cx"> return False
</span><span class="cx">
</span><span class="cx">
</span><ins>+ def hasDuplicatePrivateComments(self, doFix=False):
+ """
+ Test and optionally remove "X-CALENDARSERVER-ATTENDEE-COMMENT" properties that have the same
+ "X-CALENDARSERVER-ATTENDEE-REF" parameter values in the same component.
</ins><span class="cx">
</span><ins>+ @return: C{True} if there are duplicates that were not fixed.
+ """
+ if self.name() == "VCALENDAR":
+ for component in self.subcomponents():
+ if component.name() in ("VTIMEZONE",):
+ continue
+ if component.hasDuplicatePrivateComments(doFix):
+ return True
+ else:
+ attendee_refs = set()
+ for prop in tuple(self.properties("X-CALENDARSERVER-ATTENDEE-COMMENT")):
+ ref = prop.parameterValue("X-CALENDARSERVER-ATTENDEE-REF")
+ if ref in attendee_refs:
+ if doFix:
+ self.removeProperty(prop)
+ else:
+ return True
+ attendee_refs.add(ref)
+ return False
+
+
+
</ins><span class="cx"> # #
</span><span class="cx"> # Timezones
</span><span class="cx"> # #
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx"> "ICalendarPrincipalResource",
</span><span class="cx"> ]
</span><span class="cx">
</span><del>-from twext.web2.dav.idav import IDAVResource
</del><ins>+from txweb2.dav.idav import IDAVResource
</ins><span class="cx">
</span><span class="cx"> class ICalDAVResource(IDAVResource):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavlinkresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,10 +16,10 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode, server, http
</del><ins>+from txweb2 import responsecode, server, http
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.resource import WrapperResource
</del><ins>+from txweb2.http import HTTPError, StatusResponse
+from txweb2.resource import WrapperResource
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcacheclientpyfromrev12132CalendarServertrunktwistedcaldavmemcacheclientpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py (from rev 12132, CalendarServer/trunk/twistedcaldav/memcacheclient.py) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py         (rev 0)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,1457 @@
</span><ins>+#!/usr/bin/env python
+from __future__ import print_function
+
+"""
+client module for memcached (memory cache daemon)
+
+Overview
+========
+
+See U{the MemCached homepage<http://www.danga.com/memcached>} for more about memcached.
+
+Usage summary
+=============
+
+This should give you a feel for how this module operates::
+
+ import memcacheclient
+ mc = memcacheclient.Client(['127.0.0.1:11211'], debug=0)
+
+ mc.set("some_key", "Some value")
+ value = mc.get("some_key")
+
+ mc.set("another_key", 3)
+ mc.delete("another_key")
+
+ mc.set("key", "1") # note that the key used for incr/decr must be a string.
+ mc.incr("key")
+ mc.decr("key")
+
+The standard way to use memcache with a database is like this::
+
+ key = derive_key(obj)
+ obj = mc.get(key)
+ if not obj:
+ obj = backend_api.get(...)
+ mc.set(obj)
+
+ # we now have obj, and future passes through this code
+ # will use the object from the cache.
+
+Detailed Documentation
+======================
+
+More detailed documentation is available in the L{Client} class.
+"""
+
+import sys
+import socket
+import time
+import os
+import re
+import types
+
+from twext.python.log import Logger
+
+from twistedcaldav.config import config
+
+log = Logger()
+
+
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+
+try:
+ from zlib import compress, decompress
+ _supports_compress = True
+except ImportError:
+ _supports_compress = False
+ # quickly define a decompress just in case we recv compressed data.
+ def decompress(val):
+ raise _Error("received compressed data but I don't support compession (import error)")
+
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+
+from binascii import crc32 # zlib version is not cross-platform
+serverHashFunction = crc32
+
+__author__ = "Evan Martin <martine@danga.com>"
+__version__ = "1.44"
+__copyright__ = "Copyright (C) 2003 Danga Interactive"
+__license__ = "Python"
+
+SERVER_MAX_KEY_LENGTH = 250
+# Storing values larger than 1MB requires recompiling memcached. If you do,
+# this value can be changed by doing "memcacheclient.SERVER_MAX_VALUE_LENGTH = N"
+# after importing this module.
+SERVER_MAX_VALUE_LENGTH = 1024*1024
+
+class _Error(Exception):
+ pass
+
+class MemcacheError(_Error):
+ """
+ Memcache connection error
+ """
+
+class NotFoundError(MemcacheError):
+ """
+ NOT_FOUND error
+ """
+
+class TokenMismatchError(MemcacheError):
+ """
+ Check-and-set token mismatch
+ """
+
+try:
+ # Only exists in Python 2.4+
+ from threading import local
+except ImportError:
+ # TODO: add the pure-python local implementation
+ class local(object):
+ pass
+
+class ClientFactory(object):
+
+ # unit tests should set this to True to enable the fake test cache
+ allowTestCache = False
+
+ @classmethod
+ def getClient(cls, servers, debug=0, pickleProtocol=0,
+ pickler=pickle.Pickler, unpickler=pickle.Unpickler,
+ pload=None, pid=None):
+
+ if cls.allowTestCache:
+ return TestClient(servers, debug=debug,
+ pickleProtocol=pickleProtocol, pickler=pickler,
+ unpickler=unpickler, pload=pload, pid=pid)
+ elif config.Memcached.Pools.Default.ClientEnabled:
+ return Client(servers, debug=debug, pickleProtocol=pickleProtocol,
+ pickler=pickler, unpickler=unpickler, pload=pload, pid=pid)
+ else:
+ return None
+
+
+class Client(local):
+ """
+ Object representing a pool of memcache servers.
+
+ See L{memcache} for an overview.
+
+ In all cases where a key is used, the key can be either:
+ 1. A simple hashable type (string, integer, etc.).
+ 2. A tuple of C{(hashvalue, key)}. This is useful if you want to avoid
+ making this module calculate a hash value. You may prefer, for
+ example, to keep all of a given user's objects on the same memcache
+ server, so you could use the user's unique id as the hash value.
+
+ @group Setup: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog
+ @group Insertion: set, add, replace, set_multi
+ @group Retrieval: get, get_multi
+ @group Integers: incr, decr
+ @group Removal: delete, delete_multi
+ @sort: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog,\
+ set, set_multi, add, replace, get, get_multi, incr, decr, delete, delete_multi
+ """
+ _FLAG_PICKLE = 1<<0
+ _FLAG_INTEGER = 1<<1
+ _FLAG_LONG = 1<<2
+ _FLAG_COMPRESSED = 1<<3
+
+ _SERVER_RETRIES = 10 # how many times to try finding a free server.
+
+ # exceptions for Client
+ class MemcachedKeyError(Exception):
+ pass
+ class MemcachedKeyLengthError(MemcachedKeyError):
+ pass
+ class MemcachedKeyCharacterError(MemcachedKeyError):
+ pass
+ class MemcachedKeyNoneError(MemcachedKeyError):
+ pass
+ class MemcachedKeyTypeError(MemcachedKeyError):
+ pass
+ class MemcachedStringEncodingError(Exception):
+ pass
+
+ def __init__(self, servers, debug=0, pickleProtocol=0,
+ pickler=pickle.Pickler, unpickler=pickle.Unpickler,
+ pload=None, pid=None):
+ """
+ Create a new Client object with the given list of servers.
+
+ @param servers: C{servers} is passed to L{set_servers}.
+ @param debug: whether to display error messages when a server can't be
+ contacted.
+ @param pickleProtocol: number to mandate protocol used by (c)Pickle.
+ @param pickler: optional override of default Pickler to allow subclassing.
+ @param unpickler: optional override of default Unpickler to allow subclassing.
+ @param pload: optional persistent_load function to call on pickle loading.
+ Useful for cPickle since subclassing isn't allowed.
+ @param pid: optional persistent_id function to call on pickle storing.
+ Useful for cPickle since subclassing isn't allowed.
+ """
+ local.__init__(self)
+ self.set_servers(servers)
+ self.debug = debug
+ self.stats = {}
+
+ # Allow users to modify pickling/unpickling behavior
+ self.pickleProtocol = pickleProtocol
+ self.pickler = pickler
+ self.unpickler = unpickler
+ self.persistent_load = pload
+ self.persistent_id = pid
+
+ # figure out the pickler style
+ file = StringIO()
+ try:
+ pickler = self.pickler(file, protocol = self.pickleProtocol)
+ self.picklerIsKeyword = True
+ except TypeError:
+ self.picklerIsKeyword = False
+
+ def set_servers(self, servers):
+ """
+ Set the pool of servers used by this client.
+
+ @param servers: an array of servers.
+ Servers can be passed in two forms:
+ 1. Strings of the form C{"host:port"}, which implies a default weight of 1.
+ 2. Tuples of the form C{("host:port", weight)}, where C{weight} is
+ an integer weight value.
+ """
+ self.servers = [_Host(s, self.debuglog) for s in servers]
+ self._init_buckets()
+
+ def get_stats(self):
+ '''Get statistics from each of the servers.
+
+ @return: A list of tuples ( server_identifier, stats_dictionary ).
+ The dictionary contains a number of name/value pairs specifying
+ the name of the status field and the string value associated with
+ it. The values are not converted from strings.
+ '''
+ data = []
+ for s in self.servers:
+ if not s.connect(): continue
+ if s.family == socket.AF_INET:
+ name = '%s:%s (%s)' % ( s.ip, s.port, s.weight )
+ else:
+ name = 'unix:%s (%s)' % ( s.address, s.weight )
+ s.send_cmd('stats')
+ serverData = {}
+ data.append(( name, serverData ))
+ readline = s.readline
+ while 1:
+ line = readline()
+ if not line or line.strip() == 'END': break
+ stats = line.split(' ', 2)
+ serverData[stats[1]] = stats[2]
+
+ return(data)
+
+ def get_slabs(self):
+ data = []
+ for s in self.servers:
+ if not s.connect(): continue
+ if s.family == socket.AF_INET:
+ name = '%s:%s (%s)' % ( s.ip, s.port, s.weight )
+ else:
+ name = 'unix:%s (%s)' % ( s.address, s.weight )
+ serverData = {}
+ data.append(( name, serverData ))
+ s.send_cmd('stats items')
+ readline = s.readline
+ while 1:
+ line = readline()
+ if not line or line.strip() == 'END': break
+ item = line.split(' ', 2)
+ #0 = STAT, 1 = ITEM, 2 = Value
+ slab = item[1].split(':', 2)
+ #0 = items, 1 = Slab #, 2 = Name
+ if not serverData.has_key(slab[1]):
+ serverData[slab[1]] = {}
+ serverData[slab[1]][slab[2]] = item[2]
+ return data
+
+ def flush_all(self):
+ 'Expire all data currently in the memcache servers.'
+ for s in self.servers:
+ if not s.connect(): continue
+ s.send_cmd('flush_all')
+ s.expect("OK")
+
+ def debuglog(self, str):
+ if self.debug:
+ sys.stderr.write("MemCached: %s\n" % str)
+
+ def _statlog(self, func):
+ if not self.stats.has_key(func):
+ self.stats[func] = 1
+ else:
+ self.stats[func] += 1
+
+ def forget_dead_hosts(self):
+ """
+ Reset every host in the pool to an "alive" state.
+ """
+ for s in self.servers:
+ s.deaduntil = 0
+
+ def _init_buckets(self):
+ self.buckets = []
+ for server in self.servers:
+ for i in range(server.weight):
+ self.buckets.append(server)
+
+ def _get_server(self, key):
+ if type(key) == types.TupleType:
+ serverhash, key = key
+ else:
+ serverhash = serverHashFunction(key)
+
+ for i in range(Client._SERVER_RETRIES):
+ server = self.buckets[serverhash % len(self.buckets)]
+ if server.connect():
+ #print("(using server %s)" % server, end="")
+ return server, key
+ serverhash = serverHashFunction(str(serverhash) + str(i))
+ log.error("Memcacheclient _get_server( ) failed to connect")
+ return None, None
+
+ def disconnect_all(self):
+ for s in self.servers:
+ s.close_socket()
+
+ def delete_multi(self, keys, time=0, key_prefix=''):
+ '''
+ Delete multiple keys in the memcache doing just one query.
+
+ >>> notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'})
+ >>> mc.get_multi(['key1', 'key2']) == {'key1' : 'val1', 'key2' : 'val2'}
+ 1
+ >>> mc.delete_multi(['key1', 'key2'])
+ 1
+ >>> mc.get_multi(['key1', 'key2']) == {}
+ 1
+
+
+ This method is recommended over iterated regular L{delete}s as it reduces total latency, since
+ your app doesn't have to wait for each round-trip of L{delete} before sending
+ the next one.
+
+ @param keys: An iterable of keys to clear
+ @param time: number of seconds any subsequent set / update commands should fail. Defaults to 0 for no delay.
+ @param key_prefix: Optional string to prepend to each key when sending to memcache.
+ See docs for L{get_multi} and L{set_multi}.
+
+ @return: 1 if no failure in communication with any memcacheds.
+ @rtype: int
+
+ '''
+
+ self._statlog('delete_multi')
+
+ server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(keys, key_prefix)
+
+ # send out all requests on each server before reading anything
+ dead_servers = []
+
+ rc = 1
+ for server in server_keys.iterkeys():
+ bigcmd = []
+ write = bigcmd.append
+ if time != None:
+ for key in server_keys[server]: # These are mangled keys
+ write("delete %s %d\r\n" % (key, time))
+ else:
+ for key in server_keys[server]: # These are mangled keys
+ write("delete %s\r\n" % key)
+ try:
+ server.send_cmds(''.join(bigcmd))
+ except socket.error, msg:
+ rc = 0
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ dead_servers.append(server)
+
+ # if any servers died on the way, don't expect them to respond.
+ for server in dead_servers:
+ del server_keys[server]
+
+ for server, keys in server_keys.iteritems():
+ try:
+ for key in keys:
+ server.expect("DELETED")
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ rc = 0
+ return rc
+
+ def delete(self, key, time=0):
+ '''Deletes a key from the memcache.
+
+ @return: Nonzero on success.
+ @param time: number of seconds any subsequent set / update commands should fail. Defaults to 0 for no delay.
+ @rtype: int
+ '''
+ check_key(key)
+ server, key = self._get_server(key)
+ if not server:
+ return 0
+ self._statlog('delete')
+ if time != None:
+ cmd = "delete %s %d" % (key, time)
+ else:
+ cmd = "delete %s" % key
+
+ try:
+ server.send_cmd(cmd)
+ server.expect("DELETED")
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ return 0
+ return 1
+
+ def incr(self, key, delta=1):
+ """
+ Sends a command to the server to atomically increment the value for C{key} by
+ C{delta}, or by 1 if C{delta} is unspecified. Returns None if C{key} doesn't
+ exist on server, otherwise it returns the new value after incrementing.
+
+ Note that the value for C{key} must already exist in the memcache, and it
+ must be the string representation of an integer.
+
+ >>> mc.set("counter", "20") # returns 1, indicating success
+ 1
+ >>> mc.incr("counter")
+ 21
+ >>> mc.incr("counter")
+ 22
+
+ Overflow on server is not checked. Be aware of values approaching
+ 2**32. See L{decr}.
+
+ @param delta: Integer amount to increment by (should be zero or greater).
+ @return: New value after incrementing.
+ @rtype: int
+ """
+ return self._incrdecr("incr", key, delta)
+
+ def decr(self, key, delta=1):
+ """
+ Like L{incr}, but decrements. Unlike L{incr}, underflow is checked and
+ new values are capped at 0. If server value is 1, a decrement of 2
+ returns 0, not -1.
+
+ @param delta: Integer amount to decrement by (should be zero or greater).
+ @return: New value after decrementing.
+ @rtype: int
+ """
+ return self._incrdecr("decr", key, delta)
+
+ def _incrdecr(self, cmd, key, delta):
+ check_key(key)
+ server, key = self._get_server(key)
+ if not server:
+ return 0
+ self._statlog(cmd)
+ cmd = "%s %s %d" % (cmd, key, delta)
+ try:
+ server.send_cmd(cmd)
+ line = server.readline()
+ return int(line)
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ return None
+
+ def add(self, key, val, time = 0, min_compress_len = 0):
+ '''
+ Add new key with value.
+
+ Like L{set}, but only stores in memcache if the key doesn't already exist.
+
+ @return: Nonzero on success.
+ @rtype: int
+ '''
+ return self._set("add", key, val, time, min_compress_len)
+
+ def append(self, key, val, time=0, min_compress_len=0):
+ '''Append the value to the end of the existing key's value.
+
+ Only stores in memcache if key already exists.
+ Also see L{prepend}.
+
+ @return: Nonzero on success.
+ @rtype: int
+ '''
+ return self._set("append", key, val, time, min_compress_len)
+
+ def prepend(self, key, val, time=0, min_compress_len=0):
+ '''Prepend the value to the beginning of the existing key's value.
+
+ Only stores in memcache if key already exists.
+ Also see L{append}.
+
+ @return: Nonzero on success.
+ @rtype: int
+ '''
+ return self._set("prepend", key, val, time, min_compress_len)
+
+ def replace(self, key, val, time=0, min_compress_len=0):
+ '''Replace existing key with value.
+
+ Like L{set}, but only stores in memcache if the key already exists.
+ The opposite of L{add}.
+
+ @return: Nonzero on success.
+ @rtype: int
+ '''
+ return self._set("replace", key, val, time, min_compress_len)
+
+ def set(self, key, val, time=0, min_compress_len=0, token=None):
+ '''Unconditionally sets a key to a given value in the memcache.
+
+ The C{key} can optionally be an tuple, with the first element
+ being the server hash value and the second being the key.
+ If you want to avoid making this module calculate a hash value.
+ You may prefer, for example, to keep all of a given user's objects
+ on the same memcache server, so you could use the user's unique
+ id as the hash value.
+
+ @return: Nonzero on success.
+ @rtype: int
+ @param time: Tells memcached the time which this value should expire, either
+ as a delta number of seconds, or an absolute unix time-since-the-epoch
+ value. See the memcached protocol docs section "Storage Commands"
+ for more info on <exptime>. We default to 0 == cache forever.
+ @param min_compress_len: The threshold length to kick in auto-compression
+ of the value using the zlib.compress() routine. If the value being cached is
+ a string, then the length of the string is measured, else if the value is an
+ , then the length of the pickle result is measured. If the resulting
+ attempt at compression yeilds a larger string than the input, then it is
+ discarded. For backwards compatability, this parameter defaults to 0,
+ indicating don't ever try to compress.
+ '''
+ return self._set("set", key, val, time, min_compress_len, token=token)
+
+
+ def _map_and_prefix_keys(self, key_iterable, key_prefix):
+ """Compute the mapping of server (_Host instance) -> list of keys to stuff onto that server, as well as the mapping of
+ prefixed key -> original key.
+
+
+ """
+ # Check it just once ...
+ key_extra_len=len(key_prefix)
+ if key_prefix:
+ check_key(key_prefix)
+
+ # server (_Host) -> list of unprefixed server keys in mapping
+ server_keys = {}
+
+ prefixed_to_orig_key = {}
+ # build up a list for each server of all the keys we want.
+ for orig_key in key_iterable:
+ if type(orig_key) is types.TupleType:
+ # Tuple of hashvalue, key ala _get_server(). Caller is essentially telling us what server to stuff this on.
+ # Ensure call to _get_server gets a Tuple as well.
+ str_orig_key = str(orig_key[1])
+ server, key = self._get_server((orig_key[0], key_prefix + str_orig_key)) # Gotta pre-mangle key before hashing to a server. Returns the mangled key.
+ else:
+ str_orig_key = str(orig_key) # set_multi supports int / long keys.
+ server, key = self._get_server(key_prefix + str_orig_key)
+
+ # Now check to make sure key length is proper ...
+ check_key(str_orig_key, key_extra_len=key_extra_len)
+
+ if not server:
+ continue
+
+ if not server_keys.has_key(server):
+ server_keys[server] = []
+ server_keys[server].append(key)
+ prefixed_to_orig_key[key] = orig_key
+
+ return (server_keys, prefixed_to_orig_key)
+
+ def set_multi(self, mapping, time=0, key_prefix='', min_compress_len=0):
+ '''
+ Sets multiple keys in the memcache doing just one query.
+
+ >>> notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'})
+ >>> mc.get_multi(['key1', 'key2']) == {'key1' : 'val1', 'key2' : 'val2'}
+ 1
+
+
+ This method is recommended over regular L{set} as it lowers the number of
+ total packets flying around your network, reducing total latency, since
+ your app doesn't have to wait for each round-trip of L{set} before sending
+ the next one.
+
+ @param mapping: A dict of key/value pairs to set.
+ @param time: Tells memcached the time which this value should expire, either
+ as a delta number of seconds, or an absolute unix time-since-the-epoch
+ value. See the memcached protocol docs section "Storage Commands"
+ for more info on <exptime>. We default to 0 == cache forever.
+ @param key_prefix: Optional string to prepend to each key when sending to memcache. Allows you to efficiently stuff these keys into a pseudo-namespace in memcache:
+ >>> notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'}, key_prefix='subspace_')
+ >>> len(notset_keys) == 0
+ True
+ >>> mc.get_multi(['subspace_key1', 'subspace_key2']) == {'subspace_key1' : 'val1', 'subspace_key2' : 'val2'}
+ True
+
+ Causes key 'subspace_key1' and 'subspace_key2' to be set. Useful in conjunction with a higher-level layer which applies namespaces to data in memcache.
+ In this case, the return result would be the list of notset original keys, prefix not applied.
+
+ @param min_compress_len: The threshold length to kick in auto-compression
+ of the value using the zlib.compress() routine. If the value being cached is
+ a string, then the length of the string is measured, else if the value is an
+ object, then the length of the pickle result is measured. If the resulting
+ attempt at compression yeilds a larger string than the input, then it is
+ discarded. For backwards compatability, this parameter defaults to 0,
+ indicating don't ever try to compress.
+ @return: List of keys which failed to be stored [ memcache out of memory, etc. ].
+ @rtype: list
+
+ '''
+
+ self._statlog('set_multi')
+
+
+
+ server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(mapping.iterkeys(), key_prefix)
+
+ # send out all requests on each server before reading anything
+ dead_servers = []
+
+ for server in server_keys.iterkeys():
+ bigcmd = []
+ write = bigcmd.append
+ try:
+ for key in server_keys[server]: # These are mangled keys
+ store_info = self._val_to_store_info(mapping[prefixed_to_orig_key[key]], min_compress_len)
+ write("set %s %d %d %d\r\n%s\r\n" % (key, store_info[0], time, store_info[1], store_info[2]))
+ server.send_cmds(''.join(bigcmd))
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ dead_servers.append(server)
+
+ # if any servers died on the way, don't expect them to respond.
+ for server in dead_servers:
+ del server_keys[server]
+
+ # short-circuit if there are no servers, just return all keys
+ if not server_keys: return(mapping.keys())
+
+ notstored = [] # original keys.
+ for server, keys in server_keys.iteritems():
+ try:
+ for key in keys:
+ line = server.readline()
+ if line == 'STORED':
+ continue
+ else:
+ notstored.append(prefixed_to_orig_key[key]) #un-mangle.
+ except (_Error, socket.error), msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ return notstored
+
+ def _val_to_store_info(self, val, min_compress_len):
+ """
+ Transform val to a storable representation, returning a tuple of the flags, the length of the new value, and the new value itself.
+ """
+ flags = 0
+ if isinstance(val, str):
+ pass
+ elif isinstance(val, int):
+ flags |= Client._FLAG_INTEGER
+ val = "%d" % val
+ # force no attempt to compress this silly string.
+ min_compress_len = 0
+ elif isinstance(val, long):
+ flags |= Client._FLAG_LONG
+ val = "%d" % val
+ # force no attempt to compress this silly string.
+ min_compress_len = 0
+ else:
+ flags |= Client._FLAG_PICKLE
+ file = StringIO()
+ if self.picklerIsKeyword:
+ pickler = self.pickler(file, protocol = self.pickleProtocol)
+ else:
+ pickler = self.pickler(file, self.pickleProtocol)
+ if self.persistent_id:
+ pickler.persistent_id = self.persistent_id
+ pickler.dump(val)
+ val = file.getvalue()
+
+ lv = len(val)
+ # We should try to compress if min_compress_len > 0 and we could
+ # import zlib and this string is longer than our min threshold.
+ if min_compress_len and _supports_compress and lv > min_compress_len:
+ comp_val = compress(val)
+ # Only retain the result if the compression result is smaller
+ # than the original.
+ if len(comp_val) < lv:
+ flags |= Client._FLAG_COMPRESSED
+ val = comp_val
+
+ # silently do not store if value length exceeds maximum
+ if len(val) >= SERVER_MAX_VALUE_LENGTH: return(0)
+
+ return (flags, len(val), val)
+
+ def _set(self, cmd, key, val, time, min_compress_len = 0, token=None):
+ check_key(key)
+ server, key = self._get_server(key)
+ if not server:
+ return 0
+
+ self._statlog(cmd)
+
+ store_info = self._val_to_store_info(val, min_compress_len)
+ if not store_info: return(0)
+
+ if token is not None:
+ cmd = "cas"
+ fullcmd = "cas %s %d %d %d %s\r\n%s" % (key, store_info[0], time, store_info[1], token, store_info[2])
+ else:
+ fullcmd = "%s %s %d %d %d\r\n%s" % (cmd, key, store_info[0], time, store_info[1], store_info[2])
+ try:
+ server.send_cmd(fullcmd)
+ result = server.expect("STORED")
+
+ if (result == "STORED"):
+ return True
+
+ if (result == "NOT_FOUND"):
+ raise NotFoundError(key)
+
+ if token and result == "EXISTS":
+ log.debug("Memcacheclient check-and-set failed")
+ raise TokenMismatchError(key)
+
+ log.error("Memcacheclient %s command failed with result (%s)" %
+ (cmd, result))
+
+ return False
+
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ return 0
+
+ def get(self, key):
+ '''Retrieves a key from the memcache.
+
+ @return: The value or None.
+ '''
+ check_key(key)
+ server, key = self._get_server(key)
+ if not server:
+ raise MemcacheError("Memcache connection error")
+
+ self._statlog('get')
+
+ try:
+ server.send_cmd("get %s" % key)
+ rkey, flags, rlen, = self._expectvalue(server)
+ if not rkey:
+ return None
+ value = self._recv_value(server, flags, rlen)
+ server.expect("END")
+ except (_Error, socket.error), msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ raise MemcacheError("Memcache connection error")
+ return value
+
+ def gets(self, key):
+ '''Retrieves a key from the memcache.
+
+ @return: The value or None.
+ '''
+ check_key(key)
+ server, key = self._get_server(key)
+ if not server:
+ raise MemcacheError("Memcache connection error")
+
+ self._statlog('get')
+
+ try:
+ server.send_cmd("gets %s" % key)
+ rkey, flags, rlen, cas_token = self._expectvalue_cas(server)
+ if not rkey:
+ return (None, None)
+ value = self._recv_value(server, flags, rlen)
+ server.expect("END")
+ except (_Error, socket.error), msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ raise MemcacheError("Memcache connection error")
+ return (value, cas_token)
+
+ def get_multi(self, keys, key_prefix=''):
+ '''
+ Retrieves multiple keys from the memcache doing just one query.
+
+ >>> success = mc.set("foo", "bar")
+ >>> success = mc.set("baz", 42)
+ >>> mc.get_multi(["foo", "baz", "foobar"]) == {"foo": "bar", "baz": 42}
+ 1
+ >>> mc.set_multi({'k1' : 1, 'k2' : 2}, key_prefix='pfx_') == []
+ 1
+
+ This looks up keys 'pfx_k1', 'pfx_k2', ... . Returned dict will just have unprefixed keys 'k1', 'k2'.
+ >>> mc.get_multi(['k1', 'k2', 'nonexist'], key_prefix='pfx_') == {'k1' : 1, 'k2' : 2}
+ 1
+
+ get_mult [ and L{set_multi} ] can take str()-ables like ints / longs as keys too. Such as your db pri key fields.
+ They're rotored through str() before being passed off to memcache, with or without the use of a key_prefix.
+ In this mode, the key_prefix could be a table name, and the key itself a db primary key number.
+
+ >>> mc.set_multi({42: 'douglass adams', 46 : 'and 2 just ahead of me'}, key_prefix='numkeys_') == []
+ 1
+ >>> mc.get_multi([46, 42], key_prefix='numkeys_') == {42: 'douglass adams', 46 : 'and 2 just ahead of me'}
+ 1
+
+ This method is recommended over regular L{get} as it lowers the number of
+ total packets flying around your network, reducing total latency, since
+ your app doesn't have to wait for each round-trip of L{get} before sending
+ the next one.
+
+ See also L{set_multi}.
+
+ @param keys: An array of keys.
+ @param key_prefix: A string to prefix each key when we communicate with memcache.
+ Facilitates pseudo-namespaces within memcache. Returned dictionary keys will not have this prefix.
+ @return: A dictionary of key/value pairs that were available. If key_prefix was provided, the keys in the retured dictionary will not have it present.
+
+ '''
+
+ self._statlog('get_multi')
+
+ server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(keys, key_prefix)
+
+ # send out all requests on each server before reading anything
+ dead_servers = []
+ for server in server_keys.iterkeys():
+ try:
+ server.send_cmd("get %s" % " ".join(server_keys[server]))
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ dead_servers.append(server)
+
+ # if any servers died on the way, don't expect them to respond.
+ for server in dead_servers:
+ del server_keys[server]
+
+ retvals = {}
+ for server in server_keys.iterkeys():
+ try:
+ line = server.readline()
+ while line and line != 'END':
+ rkey, flags, rlen = self._expectvalue(server, line)
+ # Bo Yang reports that this can sometimes be None
+ if rkey is not None:
+ val = self._recv_value(server, flags, rlen)
+ try:
+ retvals[prefixed_to_orig_key[rkey]] = val # un-prefix returned key.
+ except KeyError:
+ pass
+ line = server.readline()
+ except (_Error, socket.error), msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ return retvals
+
+ def gets_multi(self, keys, key_prefix=''):
+ '''
+ Retrieves multiple keys from the memcache doing just one query.
+ See also L{gets} and L{get_multi}.
+ '''
+
+ self._statlog('gets_multi')
+
+ server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(keys, key_prefix)
+
+ # send out all requests on each server before reading anything
+ dead_servers = []
+ for server in server_keys.iterkeys():
+ try:
+ server.send_cmd("gets %s" % " ".join(server_keys[server]))
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ dead_servers.append(server)
+
+ # if any servers died on the way, don't expect them to respond.
+ for server in dead_servers:
+ del server_keys[server]
+
+ retvals = {}
+ for server in server_keys.iterkeys():
+ try:
+ line = server.readline()
+ while line and line != 'END':
+ rkey, flags, rlen, cas_token = self._expectvalue_cas(server, line)
+ # Bo Yang reports that this can sometimes be None
+ if rkey is not None:
+ val = self._recv_value(server, flags, rlen)
+ try:
+ retvals[prefixed_to_orig_key[rkey]] = (val, cas_token) # un-prefix returned key.
+ except KeyError:
+ pass
+ line = server.readline()
+ except (_Error, socket.error), msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ server.mark_dead(msg)
+ return retvals
+
+ def _expectvalue(self, server, line=None):
+ if not line:
+ line = server.readline()
+
+ if line[:5] == 'VALUE':
+ resp, rkey, flags, len = line.split()
+ flags = int(flags)
+ rlen = int(len)
+ return (rkey, flags, rlen)
+ else:
+ return (None, None, None)
+
+ def _expectvalue_cas(self, server, line=None):
+ if not line:
+ line = server.readline()
+
+ if line[:5] == 'VALUE':
+ resp, rkey, flags, len, rtoken = line.split()
+ flags = int(flags)
+ rlen = int(len)
+ return (rkey, flags, rlen, rtoken)
+ else:
+ return (None, None, None, None)
+
+ def _recv_value(self, server, flags, rlen):
+ rlen += 2 # include \r\n
+ buf = server.recv(rlen)
+ if len(buf) != rlen:
+ raise _Error("received %d bytes when expecting %d" % (len(buf), rlen))
+
+ if len(buf) == rlen:
+ buf = buf[:-2] # strip \r\n
+
+ if flags & Client._FLAG_COMPRESSED:
+ buf = decompress(buf)
+
+
+ if flags == 0 or flags == Client._FLAG_COMPRESSED:
+ # Either a bare string or a compressed string now decompressed...
+ val = buf
+ elif flags & Client._FLAG_INTEGER:
+ val = int(buf)
+ elif flags & Client._FLAG_LONG:
+ val = long(buf)
+ elif flags & Client._FLAG_PICKLE:
+ try:
+ file = StringIO(buf)
+ unpickler = self.unpickler(file)
+ if self.persistent_load:
+ unpickler.persistent_load = self.persistent_load
+ val = unpickler.load()
+ except Exception, e:
+ self.debuglog('Pickle error: %s\n' % e)
+ val = None
+ else:
+ self.debuglog("unknown flags on get: %x\n" % flags)
+
+ return val
+
+
+
+class TestClient(Client):
+ """
+ Fake memcache client for unit tests
+
+ """
+
+ def __init__(self, servers, debug=0, pickleProtocol=0,
+ pickler=pickle.Pickler, unpickler=pickle.Unpickler,
+ pload=None, pid=None):
+
+ local.__init__(self)
+
+ super(TestClient, self).__init__(servers, debug=debug,
+ pickleProtocol=pickleProtocol, pickler=pickler, unpickler=unpickler,
+ pload=pload, pid=pid)
+
+ self.data = {}
+ self.token = 0
+
+
+
+ def get_stats(self):
+ raise NotImplementedError()
+
+ def get_slabs(self):
+ raise NotImplementedError()
+
+ def flush_all(self):
+ raise NotImplementedError()
+
+ def forget_dead_hosts(self):
+ raise NotImplementedError()
+
+ def delete_multi(self, keys, time=0, key_prefix=''):
+ '''
+ Delete multiple keys in the memcache doing just one query.
+
+ >>> notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'})
+ >>> mc.get_multi(['key1', 'key2']) == {'key1' : 'val1', 'key2' : 'val2'}
+ 1
+ >>> mc.delete_multi(['key1', 'key2'])
+ 1
+ >>> mc.get_multi(['key1', 'key2']) == {}
+ 1
+ '''
+
+ self._statlog('delete_multi')
+ for key in keys:
+ key = key_prefix + key
+ del self.data[key]
+ return 1
+
+ def delete(self, key, time=0):
+ '''Deletes a key from the memcache.
+
+ @return: Nonzero on success.
+ @param time: number of seconds any subsequent set / update commands should fail. Defaults to 0 for no delay.
+ @rtype: int
+ '''
+ check_key(key)
+ del self.data[key]
+ return 1
+
+
+ def incr(self, key, delta=1):
+ raise NotImplementedError()
+
+ def decr(self, key, delta=1):
+ raise NotImplementedError()
+
+ def add(self, key, val, time = 0, min_compress_len = 0):
+ raise NotImplementedError()
+
+ def append(self, key, val, time=0, min_compress_len=0):
+ raise NotImplementedError()
+
+ def prepend(self, key, val, time=0, min_compress_len=0):
+ raise NotImplementedError()
+
+ def replace(self, key, val, time=0, min_compress_len=0):
+ raise NotImplementedError()
+
+ def set(self, key, val, time=0, min_compress_len=0, token=None):
+ self._statlog('set')
+ return self._set("set", key, val, time, min_compress_len, token=token)
+
+ def set_multi(self, mapping, time=0, key_prefix='', min_compress_len=0):
+ self._statlog('set_multi')
+ for key, val in mapping.iteritems():
+ key = key_prefix + key
+ self._set("set", key, val, time, min_compress_len)
+ return []
+
+ def _set(self, cmd, key, val, time, min_compress_len = 0, token=None):
+ check_key(key)
+ self._statlog(cmd)
+
+ serialized = pickle.dumps(val, pickle.HIGHEST_PROTOCOL)
+
+ if token is not None:
+ if self.data.has_key(key):
+ stored_val, stored_token = self.data[key]
+ if token != stored_token:
+ raise TokenMismatchError(key)
+
+ self.data[key] = (serialized, str(self.token))
+ self.token += 1
+
+ return True
+
+ def get(self, key):
+ check_key(key)
+
+ self._statlog('get')
+ if self.data.has_key(key):
+ stored_val, stored_token = self.data[key]
+ val = pickle.loads(stored_val)
+ return val
+ return None
+
+
+ def gets(self, key):
+ check_key(key)
+ if self.data.has_key(key):
+ stored_val, stored_token = self.data[key]
+ val = pickle.loads(stored_val)
+ return (val, stored_token)
+ return (None, None)
+
+ def get_multi(self, keys, key_prefix=''):
+ self._statlog('get_multi')
+
+ results = {}
+ for key in keys:
+ key = key_prefix + key
+ val = self.get(key)
+ results[key] = val
+ return results
+
+ def gets_multi(self, keys, key_prefix=''):
+ self._statlog('gets_multi')
+ results = {}
+ for key in keys:
+ key = key_prefix + key
+ result = self.gets(key)
+ if result[1] is not None:
+ results[key] = result
+ return results
+
+
+class _Host:
+ _DEAD_RETRY = 1 # number of seconds before retrying a dead server.
+ _SOCKET_TIMEOUT = 3 # number of seconds before sockets timeout.
+
+ def __init__(self, host, debugfunc=None):
+ if isinstance(host, types.TupleType):
+ host, self.weight = host
+ else:
+ self.weight = 1
+
+ # parse the connection string
+ m = re.match(r'^(?P<proto>unix):(?P<path>.*)$', host)
+ if not m:
+ m = re.match(r'^(?P<proto>inet):'
+ r'(?P<host>[^:]+)(:(?P<port>[0-9]+))?$', host)
+ if not m: m = re.match(r'^(?P<host>[^:]+):(?P<port>[0-9]+)$', host)
+ if not m:
+ raise ValueError('Unable to parse connection string: "%s"' % host)
+
+ hostData = m.groupdict()
+ if hostData.get('proto') == 'unix':
+ self.family = socket.AF_UNIX
+ self.address = hostData['path']
+ else:
+ self.family = socket.AF_INET
+ self.ip = hostData['host']
+ self.port = int(hostData.get('port', 11211))
+ self.address = ( self.ip, self.port )
+
+ if not debugfunc:
+ debugfunc = lambda x: x
+ self.debuglog = debugfunc
+
+ self.deaduntil = 0
+ self.socket = None
+
+ self.buffer = ''
+
+ def _check_dead(self):
+ if self.deaduntil and self.deaduntil > time.time():
+ return 1
+ self.deaduntil = 0
+ return 0
+
+ def connect(self):
+ if self._get_socket():
+ return 1
+ return 0
+
+ def mark_dead(self, reason):
+ log.error("Memcacheclient socket marked dead (%s)" % (reason,))
+ self.debuglog("MemCache: %s: %s. Marking dead." % (self, reason))
+ self.deaduntil = time.time() + _Host._DEAD_RETRY
+ self.close_socket()
+
+ def _get_socket(self):
+ if self._check_dead():
+ log.error("Memcacheclient _get_socket() found dead socket")
+ return None
+ if self.socket:
+ return self.socket
+ s = socket.socket(self.family, socket.SOCK_STREAM)
+ if hasattr(s, 'settimeout'): s.settimeout(self._SOCKET_TIMEOUT)
+ try:
+ s.connect(self.address)
+ except socket.timeout, msg:
+ log.error("Memcacheclient _get_socket() connection timed out (%s)" %
+ (msg,))
+ self.mark_dead("connect: %s" % msg)
+ return None
+ except socket.error, msg:
+ if type(msg) is types.TupleType: msg = msg[1]
+ log.error("Memcacheclient _get_socket() connection error (%s)" %
+ (msg,))
+ self.mark_dead("connect: %s" % msg[1])
+ return None
+ self.socket = s
+ self.buffer = ''
+ return s
+
+ def close_socket(self):
+ if self.socket:
+ self.socket.close()
+ self.socket = None
+
+ def send_cmd(self, cmd):
+ self.socket.sendall(cmd + '\r\n')
+
+ def send_cmds(self, cmds):
+ """ cmds already has trailing \r\n's applied """
+ self.socket.sendall(cmds)
+
+ def readline(self):
+ buf = self.buffer
+ recv = self.socket.recv
+ while True:
+ index = buf.find('\r\n')
+ if index >= 0:
+ break
+ data = recv(4096)
+ if not data:
+ self.mark_dead('Connection closed while reading from %s'
+ % repr(self))
+ break
+ buf += data
+ if index >= 0:
+ self.buffer = buf[index+2:]
+ buf = buf[:index]
+ else:
+ self.buffer = ''
+ return buf
+
+ def expect(self, text):
+ line = self.readline()
+ if line != text:
+ self.debuglog("while expecting '%s', got unexpected response '%s'" % (text, line))
+ return line
+
+ def recv(self, rlen):
+ self_socket_recv = self.socket.recv
+ buf = self.buffer
+ while len(buf) < rlen:
+ foo = self_socket_recv(4096)
+ buf += foo
+ if len(foo) == 0:
+ raise _Error, ( 'Read %d bytes, expecting %d, '
+ 'read returned 0 length bytes' % ( len(buf), rlen ))
+ self.buffer = buf[rlen:]
+ return buf[:rlen]
+
+ def __str__(self):
+ d = ''
+ if self.deaduntil:
+ d = " (dead until %d)" % self.deaduntil
+
+ if self.family == socket.AF_INET:
+ return "inet:%s:%d%s" % (self.address[0], self.address[1], d)
+ else:
+ return "unix:%s%s" % (self.address, d)
+
+def check_key(key, key_extra_len=0):
+ """Checks sanity of key. Fails if:
+ Key length is > SERVER_MAX_KEY_LENGTH (Raises MemcachedKeyLength).
+ Contains control characters (Raises MemcachedKeyCharacterError).
+ Is not a string (Raises MemcachedStringEncodingError)
+ Is an unicode string (Raises MemcachedStringEncodingError)
+ Is not a string (Raises MemcachedKeyError)
+ Is None (Raises MemcachedKeyError)
+ """
+
+ return # Short-circuit this expensive method
+
+ if type(key) == types.TupleType: key = key[1]
+ if not key:
+ raise Client.MemcachedKeyNoneError, ("Key is None")
+ if isinstance(key, unicode):
+ raise Client.MemcachedStringEncodingError, ("Keys must be str()'s, not "
+ "unicode. Convert your unicode strings using "
+ "mystring.encode(charset)!")
+ if not isinstance(key, str):
+ raise Client.MemcachedKeyTypeError, ("Key must be str()'s")
+
+ if isinstance(key, basestring):
+ if len(key) + key_extra_len > SERVER_MAX_KEY_LENGTH:
+ raise Client.MemcachedKeyLengthError, ("Key length is > %s"
+ % SERVER_MAX_KEY_LENGTH)
+ for char in key:
+ if ord(char) < 32 or ord(char) == 127:
+ raise Client.MemcachedKeyCharacterError, "Control characters not allowed"
+
+def _doctest():
+ import doctest, memcacheclient
+ servers = ["127.0.0.1:11211"]
+ mc = Client(servers, debug=1)
+ globs = {"mc": mc}
+ return doctest.testmod(memcacheclient, globs=globs)
+
+if __name__ == "__main__":
+ print("Testing docstrings...")
+ _doctest()
+ print("Running tests:")
+ print
+ serverList = [["127.0.0.1:11211"]]
+ if '--do-unix' in sys.argv:
+ serverList.append([os.path.join(os.getcwd(), 'memcached.socket')])
+
+ for servers in serverList:
+ mc = Client(servers, debug=1)
+
+ def to_s(val):
+ if not isinstance(val, types.StringTypes):
+ return "%s (%s)" % (val, type(val))
+ return "%s" % val
+ def test_setget(key, val):
+ print("Testing set/get {'%s': %s} ..." % (to_s(key), to_s(val)), end="")
+ mc.set(key, val)
+ newval = mc.get(key)
+ if newval == val:
+ print("OK")
+ return 1
+ else:
+ print("FAIL")
+ return 0
+
+
+ class FooStruct:
+ def __init__(self):
+ self.bar = "baz"
+ def __str__(self):
+ return "A FooStruct"
+ def __eq__(self, other):
+ if isinstance(other, FooStruct):
+ return self.bar == other.bar
+ return 0
+
+ test_setget("a_string", "some random string")
+ test_setget("an_integer", 42)
+ if test_setget("long", long(1<<30)):
+ print("Testing delete ...", end="")
+ if mc.delete("long"):
+ print("OK")
+ else:
+ print("FAIL")
+ print("Testing get_multi ...", end="")
+ print(mc.get_multi(["a_string", "an_integer"]))
+
+ print("Testing get(unknown value) ...", end="")
+ print(to_s(mc.get("unknown_value")))
+
+ f = FooStruct()
+ test_setget("foostruct", f)
+
+ print("Testing incr ...", end="")
+ x = mc.incr("an_integer", 1)
+ if x == 43:
+ print("OK")
+ else:
+ print("FAIL")
+
+ print("Testing decr ...", end="")
+ x = mc.decr("an_integer", 1)
+ if x == 42:
+ print("OK")
+ else:
+ print("FAIL")
+
+ # sanity tests
+ print("Testing sending spaces...", end="")
+ try:
+ x = mc.set("this has spaces", 1)
+ except Client.MemcachedKeyCharacterError, msg:
+ print("OK")
+ else:
+ print("FAIL")
+
+ print("Testing sending control characters...", end="")
+ try:
+ x = mc.set("this\x10has\x11control characters\x02", 1)
+ except Client.MemcachedKeyCharacterError, msg:
+ print("OK")
+ else:
+ print("FAIL")
+
+ print("Testing using insanely long key...", end="")
+ try:
+ x = mc.set('a'*SERVER_MAX_KEY_LENGTH + 'aaaa', 1)
+ except Client.MemcachedKeyLengthError, msg:
+ print("OK")
+ else:
+ print("FAIL")
+
+ print("Testing sending a unicode-string key...", end="")
+ try:
+ x = mc.set(u'keyhere', 1)
+ except Client.MemcachedStringEncodingError, msg:
+ print("OK", end="")
+ else:
+ print("FAIL", end="")
+ try:
+ x = mc.set((u'a'*SERVER_MAX_KEY_LENGTH).encode('utf-8'), 1)
+ except:
+ print("FAIL", end="")
+ else:
+ print("OK", end="")
+ import pickle
+ s = pickle.loads('V\\u4f1a\np0\n.')
+ try:
+ x = mc.set((s*SERVER_MAX_KEY_LENGTH).encode('utf-8'), 1)
+ except Client.MemcachedKeyLengthError:
+ print("OK")
+ else:
+ print("FAIL")
+
+ print("Testing using a value larger than the memcached value limit...", end="")
+ x = mc.set('keyhere', 'a'*SERVER_MAX_VALUE_LENGTH)
+ if mc.get('keyhere') == None:
+ print("OK", end="")
+ else:
+ print("FAIL", end="")
+ x = mc.set('keyhere', 'a'*SERVER_MAX_VALUE_LENGTH + 'aaa')
+ if mc.get('keyhere') == None:
+ print("OK")
+ else:
+ print("FAIL")
+
+ print("Testing set_multi() with no memcacheds running", end="")
+ mc.disconnect_all()
+ errors = mc.set_multi({'keyhere' : 'a', 'keythere' : 'b'})
+ if errors != []:
+ print("FAIL")
+ else:
+ print("OK")
+
+ print("Testing delete_multi() with no memcacheds running", end="")
+ mc.disconnect_all()
+ ret = mc.delete_multi({'keyhere' : 'a', 'keythere' : 'b'})
+ if ret != 1:
+ print("FAIL")
+ else:
+ print("OK")
+
+# vim: ts=4 sw=4 et :
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,13 +18,14 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import Deferred, fail
</span><span class="cx"> from twisted.internet.protocol import ReconnectingClientFactory
</span><ins>+from twisted.protocols.memcache import MemCacheProtocol, NoSuchCommand
</ins><span class="cx">
</span><ins>+from twext.python.log import Logger
</ins><span class="cx"> from twext.internet.gaiendpoint import GAIEndpoint
</span><span class="cx"> from twext.internet.adaptendpoint import connect
</span><span class="cx">
</span><del>-from twext.python.log import Logger
-from twext.protocols.memcache import MemCacheProtocol, NoSuchCommand
</del><span class="cx">
</span><ins>+
</ins><span class="cx"> class PooledMemCacheProtocol(MemCacheProtocol):
</span><span class="cx"> """
</span><span class="cx"> A MemCacheProtocol that will notify a connectionPool that it is ready
</span><span class="lines">@@ -161,7 +162,9 @@
</span><span class="cx">
</span><span class="cx"> self.shutdown_deferred = None
</span><span class="cx"> self.shutdown_requested = False
</span><del>- reactor.addSystemEventTrigger('before', 'shutdown', self._shutdownCallback)
</del><ins>+ reactor.addSystemEventTrigger(
+ 'before', 'shutdown', self._shutdownCallback
+ )
</ins><span class="cx">
</span><span class="cx"> self._busyClients = set([])
</span><span class="cx"> self._freeClients = set([])
</span><span class="lines">@@ -191,8 +194,9 @@
</span><span class="cx">
</span><span class="cx"> @return: A L{Deferred} that fires with the L{IProtocol} instance.
</span><span class="cx"> """
</span><del>- self.log.debug("Initiating new client connection to: %r" % (
- self._endpoint,))
</del><ins>+ self.log.debug(
+ "Initiating new client connection to: %r" % (self._endpoint,)
+ )
</ins><span class="cx"> self._logClientStats()
</span><span class="cx">
</span><span class="cx"> self._pendingConnects += 1
</span><span class="lines">@@ -239,9 +243,12 @@
</span><span class="cx"> Upon memcache error, log the failed request along with the error
</span><span class="cx"> message and free the client.
</span><span class="cx"> """
</span><del>- self.log.error("Memcache error: %s; request: %s %s" %
- (failure.value, command,
- " ".join(args)[:self.REQUEST_LOGGING_SIZE],))
</del><ins>+ self.log.error(
+ "Memcache error: %s; request: %s %s" % (
+ failure.value, command,
+ " ".join(args)[:self.REQUEST_LOGGING_SIZE],
+ )
+ )
</ins><span class="cx"> self.clientFree(client)
</span><span class="cx">
</span><span class="cx"> self.clientBusy(client)
</span><span class="lines">@@ -276,11 +283,14 @@
</span><span class="cx"> d = self._performRequestOnClient(
</span><span class="cx"> client, command, *args, **kwargs)
</span><span class="cx">
</span><del>- elif len(self._busyClients) + self._pendingConnects >= self._maxClients:
</del><ins>+ elif (
+ len(self._busyClients) + self._pendingConnects >= self._maxClients
+ ):
</ins><span class="cx"> d = Deferred()
</span><span class="cx"> self._commands.append((d, command, args, kwargs))
</span><del>- self.log.debug("Command queued: %s, %r, %r" % (
- command, args, kwargs))
</del><ins>+ self.log.debug(
+ "Command queued: %s, %r, %r" % (command, args, kwargs)
+ )
</ins><span class="cx"> self._logClientStats()
</span><span class="cx">
</span><span class="cx"> else:
</span><span class="lines">@@ -292,12 +302,14 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> def _logClientStats(self):
</span><del>- self.log.debug("Clients #free: %d, #busy: %d, "
- "#pending: %d, #queued: %d" % (
</del><ins>+ self.log.debug(
+ "Clients #free: %d, #busy: %d, #pending: %d, #queued: %d" % (
</ins><span class="cx"> len(self._freeClients),
</span><span class="cx"> len(self._busyClients),
</span><span class="cx"> self._pendingConnects,
</span><del>- len(self._commands)))
</del><ins>+ len(self._commands),
+ )
+ )
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> def clientGone(self, client):
</span><span class="lines">@@ -349,8 +361,10 @@
</span><span class="cx"> if len(self._commands) > 0:
</span><span class="cx"> d, command, args, kwargs = self._commands.pop(0)
</span><span class="cx">
</span><del>- self.log.debug("Performing Queued Command: %s, %r, %r" % (
- command, args, kwargs))
</del><ins>+ self.log.debug(
+ "Performing Queued Command: %s, %r, %r"
+ % (command, args, kwargs)
+ )
</ins><span class="cx"> self._logClientStats()
</span><span class="cx">
</span><span class="cx"> _ign_d = self.performRequest(
</span><span class="lines">@@ -425,6 +439,8 @@
</span><span class="cx"> _memCachePools = {} # Maps a name to a pool object
</span><span class="cx"> _memCachePoolHandler = {} # Maps a handler id to a named pool
</span><span class="cx">
</span><ins>+
+
</ins><span class="cx"> def installPools(pools, maxClients=5, reactor=None):
</span><span class="cx"> if reactor is None:
</span><span class="cx"> from twisted.internet import reactor
</span><span class="lines">@@ -440,7 +456,9 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><del>-def _installPool(name, handleTypes, serverEndpoint, maxClients=5, reactor=None):
</del><ins>+def _installPool(
+ name, handleTypes, serverEndpoint, maxClients=5, reactor=None
+):
</ins><span class="cx"> pool = MemCachePool(serverEndpoint, maxClients=maxClients, reactor=None)
</span><span class="cx"> _memCachePools[name] = pool
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,14 +33,15 @@
</span><span class="cx"> from md5 import new as md5
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.python.memcacheclient import ClientFactory
-from twext.python.memcacheclient import MemcacheError, TokenMismatchError
</del><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
+
</ins><span class="cx"> from txdav.xml.base import encodeXMLName
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
</del><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config
</span><ins>+from twistedcaldav.memcacheclient import ClientFactory
+from twistedcaldav.memcacheclient import MemcacheError, TokenMismatchError
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodaclpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,9 +22,9 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodgetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,14 +21,14 @@
</span><span class="cx"> __all__ = ["http_GET"]
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError, StatusResponse
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.customxml import calendarserver_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,15 +23,15 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python.failure import Failure
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import MultiStatusResponse, PropertyStatusResponseQueue
-from twext.web2.dav.util import davXMLFromStream
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import MultiStatusResponse, PropertyStatusResponseQueue
+from txweb2.dav.util import davXMLFromStream
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,14 +25,14 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import Response
-from twext.web2.dav.http import ErrorResponse, PropertyStatusResponseQueue
-from twext.web2.dav.util import davXMLFromStream
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2.http import Response
+from txweb2.dav.http import ErrorResponse, PropertyStatusResponseQueue
+from txweb2.dav.util import davXMLFromStream
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError
+from txweb2.http import StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml, carddavxml, mkcolxml
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="lines">@@ -100,7 +100,7 @@
</span><span class="cx"> doc = (yield davXMLFromStream(request.stream))
</span><span class="cx"> except ValueError, e:
</span><span class="cx"> log.error("Error while handling MKCOL: %s" % (e,))
</span><del>- # TODO: twext.web2.dav 'MKCOL' tests demand this particular response
</del><ins>+ # TODO: txweb2.dav 'MKCOL' tests demand this particular response
</ins><span class="cx"> # code, but should we really be looking at the XML content or the
</span><span class="cx"> # content-type header? It seems to me like this ought to be considered
</span><span class="cx"> # a BAD_REQUEST if it claims to be XML but isn't, but an
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpostpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,8 +21,8 @@
</span><span class="cx">
</span><span class="cx"> __all__ = ["http_POST"]
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.http import StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpropfindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-# -*- test-case-name: twext.web2.dav.test.test_prop.PROP.test_PROPFIND -*-
</del><ins>+# -*- test-case-name: txweb2.dav.test.test_prop.PROP.test_PROPFIND -*-
</ins><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</span><span class="cx"> #
</span><span class="lines">@@ -29,13 +29,13 @@
</span><span class="cx">
</span><span class="cx"> from twisted.python.failure import Failure
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2.http import HTTPError
-from twext.web2 import responsecode
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2.http import HTTPError
+from txweb2 import responsecode
+from txweb2.http import StatusResponse
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import MultiStatusResponse, statusForFailure, \
</del><ins>+from txweb2.dav.http import MultiStatusResponse, statusForFailure, \
</ins><span class="cx"> ErrorResponse
</span><del>-from twext.web2.dav.util import normalizeURL, davXMLFromStream, parentForURL
</del><ins>+from txweb2.dav.util import normalizeURL, davXMLFromStream, parentForURL
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -29,15 +29,15 @@
</span><span class="cx"> import string
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.dav.util import davXMLFromStream
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
+from txweb2.dav.util import davXMLFromStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><span class="cx"> from txdav.xml.element import lookupElement
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_addressbook_querypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,12 +26,12 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import carddavxml
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_calendar_querypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,12 +24,12 @@
</span><span class="cx"> maybeDeferred
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import MultiStatusResponse
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import MultiStatusResponse
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace, MaxInstances, \
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -38,15 +38,15 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> from twisted.python.failure import Failure
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx">
</span><span class="cx"> from txdav.xml import element
</span><del>-from twext.web2.dav.http import statusForFailure
-from twext.web2.dav.method.propfind import propertyName
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.dav.method.report import max_number_of_matches
-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.dav.http import statusForFailure
+from txweb2.dav.method.propfind import propertyName
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.dav.method.report import max_number_of_matches
+from txweb2.dav.resource import AccessDeniedError
+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_freebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,12 +23,12 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.http import HTTPError, Response, StatusResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.http import HTTPError, Response, StatusResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.ical import Component
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_multiget_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,12 +23,12 @@
</span><span class="cx"> from urllib import unquote
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import dav_namespace
</span><del>-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.resource import AccessDeniedError
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_sync_collectionpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,13 +25,13 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml import element
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2 import responsecode
-from twext.web2.dav.http import MultiStatusResponse, statusForFailure
-from twext.web2.dav.method.prop_common import responseForHref
-from twext.web2.dav.method.propfind import propertyName
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2 import responsecode
+from txweb2.dav.http import MultiStatusResponse, statusForFailure
+from txweb2.dav.method.prop_common import responseForHref
+from txweb2.dav.method.propfind import propertyName
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavnotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> ]
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue,\
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -46,17 +46,17 @@
</span><span class="cx"> from txdav.xml import element
</span><span class="cx"> from txdav.xml.element import dav_namespace
</span><span class="cx">
</span><del>-from twext.web2 import responsecode, http, http_headers
-from twext.web2.dav.auth import AuthenticationWrapper as SuperAuthenticationWrapper
-from twext.web2.dav.idav import IDAVPrincipalCollectionResource
-from twext.web2.dav.resource import AccessDeniedError, DAVPrincipalCollectionResource, \
</del><ins>+from txweb2 import responsecode, http, http_headers
+from txweb2.dav.auth import AuthenticationWrapper as SuperAuthenticationWrapper
+from txweb2.dav.idav import IDAVPrincipalCollectionResource
+from txweb2.dav.resource import AccessDeniedError, DAVPrincipalCollectionResource, \
</ins><span class="cx"> davPrivilegeSet
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.dav.util import joinURL, parentForURL, normalizeURL
-from twext.web2.http import HTTPError, RedirectResponse, StatusResponse, Response
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.http_headers import MimeType, ETag
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.dav.util import joinURL, parentForURL, normalizeURL
+from txweb2.http import HTTPError, RedirectResponse, StatusResponse, Response
+from txweb2.dav.http import ErrorResponse
+from txweb2.http_headers import MimeType, ETag
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml, customxml
</span><span class="cx"> from twistedcaldav import carddavxml
</span><span class="lines">@@ -322,7 +322,7 @@
</span><span class="cx"> successfully rendered.
</span><span class="cx">
</span><span class="cx"> @param request: the request to generate a response for.
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> @param transaction: optional transaction to use instead of associated transaction
</span><span class="cx"> @type transaction: L{txdav.caldav.idav.ITransaction}
</span><span class="cx"> """
</span><span class="lines">@@ -1354,7 +1354,7 @@
</span><span class="cx"> if self.exists() and hasattr(self, "scheduleEtags"):
</span><span class="cx"> etags = self.scheduleEtags
</span><span class="cx"> if len(etags) > 1:
</span><del>- # This is almost verbatim from twext.web2.static.checkPreconditions
</del><ins>+ # This is almost verbatim from txweb2.static.checkPreconditions
</ins><span class="cx"> if request.method not in ("GET", "HEAD"):
</span><span class="cx">
</span><span class="cx"> # Always test against the current etag first just in case schedule-etags is out of sync
</span><span class="lines">@@ -1402,7 +1402,7 @@
</span><span class="cx"> @param request: the request used to look up parent resources to
</span><span class="cx"> validate.
</span><span class="cx">
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">
</span><span class="cx"> @return: a deferred that fires when a calendar collection has been
</span><span class="cx"> created in this resource.
</span><span class="lines">@@ -1488,7 +1488,7 @@
</span><span class="cx"> @param request: the request used to look up parent resources to
</span><span class="cx"> validate.
</span><span class="cx">
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">
</span><span class="cx"> @return: a deferred that fires when an addressbook collection has been
</span><span class="cx"> created in this resource.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,11 +33,11 @@
</span><span class="cx"> # around that for now.
</span><span class="cx"> __import__("twistedcaldav.stdconfig") # FIXME
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.resource import davPrivilegeSet
-from twext.web2.dav.util import joinURL, normalizeURL
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.resource import davPrivilegeSet
+from txweb2.dav.util import joinURL, normalizeURL
+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twisted.python.failure import Failure
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx">
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span><span class="cx">
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import HTTPError
</del><ins>+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> class Properties (StoreTestCase):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,11 +25,11 @@
</span><span class="cx"> "SharedHomeMixin",
</span><span class="cx"> ]
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, Response, XMLResponse
-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.dav.util import allDataFromStream, joinURL
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, Response, XMLResponse
+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.dav.util import allDataFromStream, joinURL
</ins><span class="cx">
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_OWN, \
</span><span class="cx"> _BIND_MODE_READ, _BIND_MODE_WRITE, _BIND_STATUS_INVITED, \
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx">
</span><span class="cx"> @return: the (asynchronous) HTTP result to respond to the direct-share
</span><span class="cx"> request.
</span><del>- @rtype: L{Deferred} firing L{twext.web2.http.Response}, failing with
</del><ins>+ @rtype: L{Deferred} firing L{txweb2.http.Response}, failing with
</ins><span class="cx"> L{HTTPError}
</span><span class="cx"> """
</span><span class="cx">
</span><span class="lines">@@ -299,13 +299,13 @@
</span><span class="cx"> underlying shared collection.
</span><span class="cx">
</span><span class="cx"> @param request: the request used to locate the owner resource.
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">
</span><span class="cx"> @param args: The arguments for
</span><del>- L{twext.web2.dav.idav.IDAVResource.accessControlList}
</del><ins>+ L{txweb2.dav.idav.IDAVResource.accessControlList}
</ins><span class="cx">
</span><span class="cx"> @param kwargs: The keyword arguments for
</span><del>- L{twext.web2.dav.idav.IDAVResource.accessControlList}, plus
</del><ins>+ L{txweb2.dav.idav.IDAVResource.accessControlList}, plus
</ins><span class="cx"> keyword-only arguments.
</span><span class="cx">
</span><span class="cx"> @return: the appropriate WebDAV ACL for the sharee
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsimpleresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,9 +26,9 @@
</span><span class="cx"> "SimpleDataResource",
</span><span class="cx"> ]
</span><span class="cx">
</span><del>-from twext.web2 import http
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import Response
</del><ins>+from txweb2 import http
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import Response
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstdconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,9 +22,9 @@
</span><span class="cx">
</span><span class="cx"> from twisted.python.runtime import platform
</span><span class="cx">
</span><del>-from twext.python.plistlib import PlistParser #@UnresolvedImport
</del><ins>+from plistlib import PlistParser #@UnresolvedImport
</ins><span class="cx"> from twext.python.log import Logger, InvalidLogLevelError, LogLevel
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
</ins><span class="cx">
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx">
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> from twistedcaldav.util import getPasswordFromKeychain
</span><span class="cx"> from twistedcaldav.util import KeychainAccessError, KeychainPasswordNotFound
</span><span class="cx"> from twistedcaldav.util import computeProcessCount
</span><ins>+from twistedcaldav.datafilters.peruserdata import PerUserDataFilter
</ins><span class="cx">
</span><span class="cx"> from calendarserver.push.util import getAPNTopicFromCertificate
</span><span class="cx"> from twistedcaldav import ical
</span><span class="lines">@@ -166,7 +167,7 @@
</span><span class="cx"> DEFAULT_RESOURCE_PARAMS = {
</span><span class="cx"> "twistedcaldav.directory.xmlfile.XMLDirectoryService": {
</span><span class="cx"> "xmlFile": "resources.xml",
</span><del>- "recordTypes" : ("locations", "resources"),
</del><ins>+ "recordTypes" : ("locations", "resources", "addresses"),
</ins><span class="cx"> },
</span><span class="cx"> "twistedcaldav.directory.appleopendirectory.OpenDirectoryService": {
</span><span class="cx"> "node": "/Search",
</span><span class="lines">@@ -588,10 +589,13 @@
</span><span class="cx">
</span><span class="cx"> "Calendars" : {
</span><span class="cx"> "Enabled" : True, # Calendar on/off switch
</span><ins>+ "IgnorePerUserProperties" : [
+ "X-APPLE-STRUCTURED-LOCATION",
+ ],
</ins><span class="cx"> },
</span><span class="cx"> "AddressBooks" : {
</span><span class="cx"> "Enabled" : False, # Address Books on/off switch
</span><del>- }
</del><ins>+ },
</ins><span class="cx"> },
</span><span class="cx">
</span><span class="cx"> "RestrictCalendarsToOneComponentType" : True, # Only allow calendars to be created with a single component type
</span><span class="lines">@@ -619,6 +623,8 @@
</span><span class="cx"> "EnableDefaultAlarms" : True, # Support for default alarms generated by the server
</span><span class="cx"> "RemoveDuplicateAlarms": True, # Remove duplicate alarms on PUT
</span><span class="cx">
</span><ins>+ "RemoveDuplicatePrivateComments": False, # Remove duplicate private comments on PUT
+
</ins><span class="cx"> # CardDAV Features
</span><span class="cx"> "DirectoryAddressBook": {
</span><span class="cx"> "Enabled": True,
</span><span class="lines">@@ -948,6 +954,7 @@
</span><span class="cx"> "DatabaseName": "caldav",
</span><span class="cx"> "ClusterName": "cluster",
</span><span class="cx"> "LogFile": "postgres.log",
</span><ins>+ "SocketDirectory": "",
</ins><span class="cx"> "ListenAddresses": [],
</span><span class="cx"> "SharedBuffers": 0, # BuffersToConnectionsRatio * MaxConnections
</span><span class="cx"> # Note: don't set this, it will be computed dynamically
</span><span class="lines">@@ -1004,7 +1011,7 @@
</span><span class="cx"> "FreeBusyIndexDelayedExpand": True,
</span><span class="cx">
</span><span class="cx"> # The RootResource uses a twext property store. Specify the class here
</span><del>- "RootResourcePropStoreClass": "twext.web2.dav.xattrprops.xattrPropertyStore",
</del><ins>+ "RootResourcePropStoreClass": "txweb2.dav.xattrprops.xattrPropertyStore",
</ins><span class="cx">
</span><span class="cx"> # Used in the command line utilities to specify which service class to
</span><span class="cx"> # use to carry out work.
</span><span class="lines">@@ -1557,7 +1564,16 @@
</span><span class="cx"> (direction,))
</span><span class="cx">
</span><span class="cx">
</span><ins>+def _updateSharing(configDict, reloading=False):
+ #
+ # Sharing
+ #
</ins><span class="cx">
</span><ins>+ # Transfer configured non-per-user property names to PerUserDataFilter
+ for propertyName in configDict.Sharing.Calendars.IgnorePerUserProperties:
+ PerUserDataFilter.IGNORE_X_PROPERTIES.append(propertyName)
+
+
</ins><span class="cx"> def _updateServers(configDict, reloading=False):
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
</span><span class="cx"> if configDict.Servers.Enabled:
</span><span class="lines">@@ -1635,6 +1651,7 @@
</span><span class="cx"> _updateNotifications,
</span><span class="cx"> _updateICalendar,
</span><span class="cx"> _updateScheduling,
</span><ins>+ _updateSharing,
</ins><span class="cx"> _updateServers,
</span><span class="cx"> _updateCompliance,
</span><span class="cx"> )
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstorebridgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,19 +17,22 @@
</span><span class="cx">
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx">
</span><ins>+from twext.enterprise.locking import LockTimeout
</ins><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse, ResponseQueue, MultiStatusResponse
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.dav.resource import TwistedACLInheritable, AccessDeniedError, \
</del><ins>+from txweb2 import responsecode, http_headers, http
+from txweb2.dav.http import ErrorResponse, ResponseQueue, MultiStatusResponse
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.dav.resource import TwistedACLInheritable, AccessDeniedError, \
</ins><span class="cx"> davPrivilegeSet
</span><del>-from twext.web2.dav.util import parentForURL, allDataFromStream, joinURL, davXMLFromStream
-from twext.web2.filter.location import addLocation
-from twext.web2.http import HTTPError, StatusResponse, Response
-from twext.web2.http_headers import ETag, MimeType, MimeDisposition
-from twext.web2.responsecode import \
</del><ins>+from txweb2.dav.util import parentForURL, allDataFromStream, joinURL, davXMLFromStream
+from txweb2.filter.location import addLocation
+from txweb2.http import HTTPError, StatusResponse, Response
+from txweb2.http_headers import ETag, MimeType, MimeDisposition
+from txweb2.iweb import IResponse
+from txweb2.responsecode import \
</ins><span class="cx"> FORBIDDEN, NO_CONTENT, NOT_FOUND, CREATED, CONFLICT, PRECONDITION_FAILED, \
</span><span class="cx"> BAD_REQUEST, OK, INSUFFICIENT_STORAGE_SPACE, SERVICE_UNAVAILABLE
</span><del>-from twext.web2.stream import ProducerStream, readStream, MemoryStream
</del><ins>+from txweb2.stream import ProducerStream, readStream, MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> from twisted.internet.protocol import Protocol
</span><span class="lines">@@ -41,14 +44,20 @@
</span><span class="cx"> MaxInstances, NoUIDConflict
</span><span class="cx"> from twistedcaldav.carddavxml import carddav_namespace, NoUIDConflict as NovCardUIDConflict
</span><span class="cx"> from twistedcaldav.config import config
</span><ins>+from twistedcaldav.customxml import calendarserver_namespace
</ins><span class="cx"> from twistedcaldav.directory.wiki import WikiDirectoryService, getWikiAccess
</span><span class="cx"> from twistedcaldav.ical import Component as VCalendar, Property as VProperty, \
</span><span class="cx"> InvalidICalendarDataError, iCalendarProductID, Component
</span><ins>+from twistedcaldav.instance import InvalidOverriddenInstanceError, \
+ TooManyInstancesError
</ins><span class="cx"> from twistedcaldav.memcachelock import MemcacheLockTimeoutError
</span><span class="cx"> from twistedcaldav.notifications import NotificationCollectionResource, NotificationResource
</span><span class="cx"> from twistedcaldav.resource import CalDAVResource, GlobalAddressBookResource, \
</span><span class="cx"> DefaultAlarmPropertyMixin
</span><span class="cx"> from twistedcaldav.scheduling_store.caldav.resource import ScheduleInboxResource
</span><ins>+from twistedcaldav.sharing import invitationBindStatusToXMLMap, \
+ invitationBindModeToXMLMap
+from twistedcaldav.util import bestAcceptType
</ins><span class="cx"> from twistedcaldav.vcard import Component as VCard, InvalidVCardDataError
</span><span class="cx">
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><span class="lines">@@ -58,7 +67,7 @@
</span><span class="cx"> TooManyAttendeesError, InvalidCalendarAccessError, ValidOrganizerError, \
</span><span class="cx"> InvalidPerUserDataMerge, \
</span><span class="cx"> AttendeeAllowedError, ResourceDeletedError, InvalidAttachmentOperation, \
</span><del>- ShareeAllowedError
</del><ins>+ ShareeAllowedError, DuplicatePrivateCommentsError
</ins><span class="cx"> from txdav.carddav.iaddressbookstore import KindChangeNotAllowedError, \
</span><span class="cx"> GroupWithUnsharedAddressNotAllowedError
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_READ, _BIND_MODE_WRITE, \
</span><span class="lines">@@ -74,19 +83,10 @@
</span><span class="cx"> from txdav.xml.base import dav_namespace, WebDAVUnknownElement, encodeXMLName
</span><span class="cx">
</span><span class="cx"> from urlparse import urlsplit, urljoin
</span><ins>+import collections
</ins><span class="cx"> import hashlib
</span><span class="cx"> import time
</span><span class="cx"> import uuid
</span><del>-from twext.web2 import responsecode, http_headers, http
-from twext.web2.iweb import IResponse
-from twistedcaldav.customxml import calendarserver_namespace
-from twistedcaldav.instance import InvalidOverriddenInstanceError, \
- TooManyInstancesError
-from twistedcaldav.util import bestAcceptType
-import collections
-from twistedcaldav.sharing import invitationBindStatusToXMLMap, \
- invitationBindModeToXMLMap
-
</del><span class="cx"> """
</span><span class="cx"> Wrappers to translate between the APIs in L{txdav.caldav.icalendarstore} and
</span><span class="cx"> L{txdav.carddav.iaddressbookstore} and those in L{twistedcaldav}.
</span><span class="lines">@@ -450,12 +450,12 @@
</span><span class="cx"> this is the request which I{triggered} the C{DELETE}, but which may
</span><span class="cx"> not actually be a C{DELETE} request itself.
</span><span class="cx">
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">
</span><span class="cx"> @return: an HTTP response suitable for sending to a client (or
</span><span class="cx"> including in a multi-status).
</span><span class="cx">
</span><del>- @rtype: something adaptable to L{twext.web2.iweb.IResponse}
</del><ins>+ @rtype: something adaptable to L{txweb2.iweb.IResponse}
</ins><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> # Check sharee collection first
</span><span class="lines">@@ -2291,11 +2291,53 @@
</span><span class="cx"> returnValue(response)
</span><span class="cx">
</span><span class="cx"> # The following are used to map store exceptions into HTTP error responses
</span><del>- StoreExceptionsStatusErrors = set()
</del><span class="cx"> StoreExceptionsErrors = {}
</span><del>- StoreMoveExceptionsStatusErrors = set()
</del><span class="cx"> StoreMoveExceptionsErrors = {}
</span><ins>+ StoreRemoveExceptionsErrors = {}
</ins><span class="cx">
</span><ins>+ @classmethod
+ def _storeExceptionStatus(cls, err, arg):
+ """
+ Raise a status error.
+
+ @param err: the actual exception that caused the error
+ @type err: L{Exception}
+ @param arg: description of error or C{None}
+ @type arg: C{str} or C{None}
+ """
+ raise HTTPError(StatusResponse(responsecode.FORBIDDEN, arg if arg is not None else str(err)))
+
+
+ @classmethod
+ def _storeExceptionError(cls, err, arg):
+ """
+ Raise a DAV:error error with the supplied error element.
+
+ @param err: the actual exception that caused the error
+ @type err: L{Exception}
+ @param arg: the error element
+ @type arg: C{tuple}
+ """
+ raise HTTPError(ErrorResponse(
+ responsecode.FORBIDDEN,
+ arg,
+ str(err),
+ ))
+
+
+ @classmethod
+ def _storeExceptionUnavailable(cls, err, arg):
+ """
+ Raise a service unavailable error.
+
+ @param err: the actual exception that caused the error
+ @type err: L{Exception}
+ @param arg: description of error or C{None}
+ @type arg: C{str} or C{None}
+ """
+ raise HTTPError(StatusResponse(responsecode.SERVICE_UNAVAILABLE, arg if arg is not None else str(err)))
+
+
</ins><span class="cx"> @requiresPermissions(fromParent=[davxml.Unbind()])
</span><span class="cx"> def http_DELETE(self, request):
</span><span class="cx"> """
</span><span class="lines">@@ -2387,15 +2429,9 @@
</span><span class="cx"> # Grab the current exception state here so we can use it in a re-raise - we need this because
</span><span class="cx"> # an inlineCallback might be called and that raises an exception when it returns, wiping out the
</span><span class="cx"> # original exception "context".
</span><del>- if type(err) in self.StoreMoveExceptionsStatusErrors:
- raise HTTPError(StatusResponse(responsecode.FORBIDDEN, str(err)))
-
- elif type(err) in self.StoreMoveExceptionsErrors:
- raise HTTPError(ErrorResponse(
- responsecode.FORBIDDEN,
- self.StoreMoveExceptionsErrors[type(err)],
- str(err),
- ))
</del><ins>+ if type(err) in self.StoreMoveExceptionsErrors:
+ error, arg = self.StoreMoveExceptionsErrors[type(err)]
+ error(err, arg)
</ins><span class="cx"> else:
</span><span class="cx"> # Return the original failure (exception) state
</span><span class="cx"> raise
</span><span class="lines">@@ -2438,15 +2474,9 @@
</span><span class="cx">
</span><span class="cx"> # Map store exception to HTTP errors
</span><span class="cx"> except Exception as err:
</span><del>- if type(err) in self.StoreExceptionsStatusErrors:
- raise HTTPError(StatusResponse(responsecode.FORBIDDEN, str(err)))
-
- elif type(err) in self.StoreExceptionsErrors:
- raise HTTPError(ErrorResponse(
- responsecode.FORBIDDEN,
- self.StoreExceptionsErrors[type(err)],
- str(err),
- ))
</del><ins>+ if type(err) in self.StoreExceptionsErrors:
+ error, arg = self.StoreExceptionsErrors[type(err)]
+ error(err, arg)
</ins><span class="cx"> else:
</span><span class="cx"> raise
</span><span class="cx">
</span><span class="lines">@@ -2457,7 +2487,7 @@
</span><span class="cx"> Move this object to a different parent.
</span><span class="cx">
</span><span class="cx"> @param request:
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> @param destinationparent: Parent to move to
</span><span class="cx"> @type destinationparent: L{CommonHomeChild}
</span><span class="cx"> @param destination_name: name of new resource
</span><span class="lines">@@ -2476,12 +2506,12 @@
</span><span class="cx"> @param request: Unused by this implementation; present for signature
</span><span class="cx"> compatibility with L{CalendarCollectionResource.storeRemove}.
</span><span class="cx">
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">
</span><span class="cx"> @return: an HTTP response suitable for sending to a client (or
</span><span class="cx"> including in a multi-status).
</span><span class="cx">
</span><del>- @rtype: something adaptable to L{twext.web2.iweb.IResponse}
</del><ins>+ @rtype: something adaptable to L{txweb2.iweb.IResponse}
</ins><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> # Do delete
</span><span class="lines">@@ -2491,6 +2521,14 @@
</span><span class="cx"> except NoSuchObjectResourceError:
</span><span class="cx"> raise HTTPError(NOT_FOUND)
</span><span class="cx">
</span><ins>+ # Map store exception to HTTP errors
+ except Exception as err:
+ if type(err) in self.StoreExceptionsErrors:
+ error, arg = self.StoreExceptionsErrors[type(err)]
+ error(err, arg)
+ else:
+ raise
+
</ins><span class="cx"> # Re-initialize to get stuff setup again now we have no object
</span><span class="cx"> self._initializeWithObject(None, self._newStoreParent)
</span><span class="cx">
</span><span class="lines">@@ -2624,50 +2662,51 @@
</span><span class="cx"> else:
</span><span class="cx"> return False
</span><span class="cx">
</span><del>- StoreExceptionsStatusErrors = set((
- ObjectResourceNameNotAllowedError,
- ObjectResourceNameAlreadyExistsError,
- ))
-
</del><span class="cx"> StoreExceptionsErrors = {
</span><del>- TooManyObjectResourcesError: customxml.MaxResources(),
- ObjectResourceTooBigError: (caldav_namespace, "max-resource-size"),
- InvalidObjectResourceError: (caldav_namespace, "valid-calendar-data"),
- InvalidComponentForStoreError: (caldav_namespace, "valid-calendar-object-resource"),
- InvalidComponentTypeError: (caldav_namespace, "supported-component"),
- TooManyAttendeesError: MaxAttendeesPerInstance.fromString(str(config.MaxAttendeesPerInstance)),
- InvalidCalendarAccessError: (calendarserver_namespace, "valid-access-restriction"),
- ValidOrganizerError: (calendarserver_namespace, "valid-organizer"),
- UIDExistsError: NoUIDConflict(),
- UIDExistsElsewhereError: (caldav_namespace, "unique-scheduling-object-resource"),
- InvalidUIDError: NoUIDConflict(),
- InvalidPerUserDataMerge: (caldav_namespace, "valid-calendar-data"),
- AttendeeAllowedError: (caldav_namespace, "attendee-allowed"),
- InvalidOverriddenInstanceError: (caldav_namespace, "valid-calendar-data"),
- TooManyInstancesError: MaxInstances.fromString(str(config.MaxAllowedInstances)),
- AttachmentStoreValidManagedID: (caldav_namespace, "valid-managed-id"),
- ShareeAllowedError: (calendarserver_namespace, "sharee-privilege-needed",),
</del><ins>+ ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+ ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+ TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+ ObjectResourceTooBigError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "max-resource-size"),),
+ InvalidObjectResourceError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "valid-calendar-data"),),
+ InvalidComponentForStoreError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "valid-calendar-object-resource"),),
+ InvalidComponentTypeError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "supported-component"),),
+ TooManyAttendeesError: (_CommonObjectResource._storeExceptionError, MaxAttendeesPerInstance.fromString(str(config.MaxAttendeesPerInstance)),),
+ InvalidCalendarAccessError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, "valid-access-restriction"),),
+ ValidOrganizerError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, "valid-organizer"),),
+ UIDExistsError: (_CommonObjectResource._storeExceptionError, NoUIDConflict(),),
+ UIDExistsElsewhereError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "unique-scheduling-object-resource"),),
+ InvalidUIDError: (_CommonObjectResource._storeExceptionError, NoUIDConflict(),),
+ InvalidPerUserDataMerge: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "valid-calendar-data"),),
+ AttendeeAllowedError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "attendee-allowed"),),
+ InvalidOverriddenInstanceError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "valid-calendar-data"),),
+ TooManyInstancesError: (_CommonObjectResource._storeExceptionError, MaxInstances.fromString(str(config.MaxAllowedInstances)),),
+ AttachmentStoreValidManagedID: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "valid-managed-id"),),
+ ShareeAllowedError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, "sharee-privilege-needed",),),
+ DuplicatePrivateCommentsError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, "no-duplicate-private-comments",),),
+ LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, "Lock timed out.",),
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- StoreMoveExceptionsStatusErrors = set((
- ObjectResourceNameNotAllowedError,
- ObjectResourceNameAlreadyExistsError,
- ))
-
</del><span class="cx"> StoreMoveExceptionsErrors = {
</span><del>- TooManyObjectResourcesError: customxml.MaxResources(),
- InvalidResourceMove: (calendarserver_namespace, "valid-move"),
- InvalidComponentTypeError: (caldav_namespace, "supported-component"),
</del><ins>+ ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+ ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+ TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+ InvalidResourceMove: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, "valid-move"),),
+ InvalidComponentTypeError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "supported-component"),),
+ LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, "Lock timed out.",),
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+ StoreRemoveExceptionsErrors = {
+ LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, "Lock timed out.",),
+ }
+
</ins><span class="cx"> StoreAttachmentValidErrors = set((
</span><span class="cx"> AttachmentStoreFailed,
</span><span class="cx"> InvalidAttachmentOperation,
</span><span class="cx"> ))
</span><span class="cx">
</span><span class="cx"> StoreAttachmentExceptionsErrors = {
</span><del>- AttachmentStoreValidManagedID: (caldav_namespace, "valid-managed-id-parameter",),
- AttachmentRemoveFailed: (caldav_namespace, "valid-attachment-remove",),
</del><ins>+ AttachmentStoreValidManagedID: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "valid-managed-id-parameter",),),
+ AttachmentRemoveFailed: (_CommonObjectResource._storeExceptionError, (caldav_namespace, "valid-attachment-remove",),),
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -2683,7 +2722,7 @@
</span><span class="cx"> if self.exists():
</span><span class="cx"> etags = self.scheduleEtags
</span><span class="cx"> if len(etags) > 1:
</span><del>- # This is almost verbatim from twext.web2.static.checkPreconditions
</del><ins>+ # This is almost verbatim from txweb2.static.checkPreconditions
</ins><span class="cx"> if request.method not in ("GET", "HEAD"):
</span><span class="cx">
</span><span class="cx"> # Always test against the current etag first just in case schedule-etags is out of sync
</span><span class="lines">@@ -2981,28 +3020,15 @@
</span><span class="cx"> except Exception as err:
</span><span class="cx">
</span><span class="cx"> if type(err) in self.StoreAttachmentValidErrors:
</span><del>- raise HTTPError(ErrorResponse(
- responsecode.FORBIDDEN,
- (caldav_namespace, valid_preconditions[action],),
- str(err),
- ))
</del><ins>+ self._storeExceptionError(err, (caldav_namespace, valid_preconditions[action],))
</ins><span class="cx">
</span><span class="cx"> elif type(err) in self.StoreAttachmentExceptionsErrors:
</span><del>- raise HTTPError(ErrorResponse(
- responsecode.FORBIDDEN,
- self.StoreAttachmentExceptionsErrors[type(err)],
- str(err),
- ))
</del><ins>+ error, arg = self.StoreAttachmentExceptionsErrors[type(err)]
+ error(err, arg)
</ins><span class="cx">
</span><del>- elif type(err) in self.StoreExceptionsStatusErrors:
- raise HTTPError(StatusResponse(responsecode.FORBIDDEN, str(err)))
-
</del><span class="cx"> elif type(err) in self.StoreExceptionsErrors:
</span><del>- raise HTTPError(ErrorResponse(
- responsecode.FORBIDDEN,
- self.StoreExceptionsErrors[type(err)],
- str(err),
- ))
</del><ins>+ error, arg = self.StoreExceptionsErrors[type(err)]
+ error(err, arg)
</ins><span class="cx">
</span><span class="cx"> else:
</span><span class="cx"> raise
</span><span class="lines">@@ -3300,32 +3326,32 @@
</span><span class="cx">
</span><span class="cx"> vCard = _CommonObjectResource.component
</span><span class="cx">
</span><del>- StoreExceptionsStatusErrors = set((
- ObjectResourceNameNotAllowedError,
- ObjectResourceNameAlreadyExistsError,
- ))
-
</del><span class="cx"> StoreExceptionsErrors = {
</span><del>- TooManyObjectResourcesError: customxml.MaxResources(),
- ObjectResourceTooBigError: (carddav_namespace, "max-resource-size"),
- InvalidObjectResourceError: (carddav_namespace, "valid-address-data"),
- InvalidComponentForStoreError: (carddav_namespace, "valid-addressbook-object-resource"),
- UIDExistsError: NovCardUIDConflict(),
- InvalidUIDError: NovCardUIDConflict(),
- InvalidPerUserDataMerge: (carddav_namespace, "valid-address-data"),
</del><ins>+ ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+ ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+ TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+ ObjectResourceTooBigError: (_CommonObjectResource._storeExceptionError, (carddav_namespace, "max-resource-size"),),
+ InvalidObjectResourceError: (_CommonObjectResource._storeExceptionError, (carddav_namespace, "valid-address-data"),),
+ InvalidComponentForStoreError: (_CommonObjectResource._storeExceptionError, (carddav_namespace, "valid-addressbook-object-resource"),),
+ UIDExistsError: (_CommonObjectResource._storeExceptionError, NovCardUIDConflict(),),
+ InvalidUIDError: (_CommonObjectResource._storeExceptionError, NovCardUIDConflict(),),
+ InvalidPerUserDataMerge: (_CommonObjectResource._storeExceptionError, (carddav_namespace, "valid-address-data"),),
+ LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, "Lock timed out.",),
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- StoreMoveExceptionsStatusErrors = set((
- ObjectResourceNameNotAllowedError,
- ObjectResourceNameAlreadyExistsError,
- ))
-
</del><span class="cx"> StoreMoveExceptionsErrors = {
</span><del>- TooManyObjectResourcesError: customxml.MaxResources(),
- InvalidResourceMove: (calendarserver_namespace, "valid-move"),
</del><ins>+ ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+ ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+ TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+ InvalidResourceMove: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, "valid-move"),),
+ LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, "Lock timed out.",),
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+ StoreRemoveExceptionsErrors = {
+ LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, "Lock timed out.",),
+ }
</ins><span class="cx">
</span><ins>+
</ins><span class="cx"> def resourceType(self):
</span><span class="cx"> if self.isShared():
</span><span class="cx"> return customxml.ResourceType.sharedownergroup
</span><span class="lines">@@ -3488,13 +3514,13 @@
</span><span class="cx"> "direct" shares are not supported.
</span><span class="cx">
</span><span class="cx"> @param request: the request used to locate the owner resource.
</span><del>- @type request: L{twext.web2.iweb.IRequest}
</del><ins>+ @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">
</span><span class="cx"> @param args: The arguments for
</span><del>- L{twext.web2.dav.idav.IDAVResource.accessControlList}
</del><ins>+ L{txweb2.dav.idav.IDAVResource.accessControlList}
</ins><span class="cx">
</span><span class="cx"> @param kwargs: The keyword arguments for
</span><del>- L{twext.web2.dav.idav.IDAVResource.accessControlList}, plus
</del><ins>+ L{txweb2.dav.idav.IDAVResource.accessControlList}, plus
</ins><span class="cx"> keyword-only arguments.
</span><span class="cx">
</span><span class="cx"> @return: the appropriate WebDAV ACL for the sharee
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_accountingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,9 +14,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.channel.http import HTTPLoggingChannelRequest
-from twext.web2 import http_headers
-from twext.web2.channel.http import HTTPChannel
</del><ins>+from txweb2.channel.http import HTTPLoggingChannelRequest
+from txweb2 import http_headers
+from txweb2.channel.http import HTTPChannel
</ins><span class="cx"> from twistedcaldav.accounting import emitAccounting
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> import twistedcaldav.test.util
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookmultigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,11 +16,11 @@
</span><span class="cx">
</span><span class="cx"> import os
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
-from twext.web2.dav.util import davXMLFromStream, joinURL
-from twext.web2.http_headers import Headers, MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
+from txweb2.dav.util import davXMLFromStream, joinURL
+from txweb2.http_headers import Headers, MimeType
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import carddavxml
</span><span class="cx"> from twistedcaldav import vcard
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,11 +16,11 @@
</span><span class="cx">
</span><span class="cx"> import os
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.util import davXMLFromStream, joinURL
</del><ins>+from txweb2.dav.util import davXMLFromStream, joinURL
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import carddavxml, vcard
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_cachepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,9 +20,9 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, maybeDeferred, inlineCallbacks
</span><span class="cx">
</span><del>-from twext.web2.dav.util import allDataFromStream
-from twext.web2.stream import MemoryStream
-from twext.web2.http_headers import Headers
</del><ins>+from txweb2.dav.util import allDataFromStream
+from txweb2.stream import MemoryStream
+from txweb2.http_headers import Headers
</ins><span class="cx">
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_calendarquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,11 +18,11 @@
</span><span class="cx">
</span><span class="cx"> from twisted.trial.unittest import SkipTest
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.util import davXMLFromStream
</del><ins>+from txweb2.dav.util import davXMLFromStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav import ical
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_collectioncontentspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,10 +16,10 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream, FileStream
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream, FileStream
+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.ical import Component
</span><span class="cx"> from twistedcaldav.memcachelock import MemcacheLock
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from txdav.caldav.datastore.sql import CalendarObject
</span><span class="cx">
</span><span class="cx"> class CollectionContents(StoreTestCase):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_configpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx">
</span><span class="cx"> import socket
</span><span class="cx">
</span><del>-from twext.python.plistlib import writePlist #@UnresolvedImport
</del><ins>+from plistlib import writePlist #@UnresolvedImport
</ins><span class="cx"> from twext.python.log import LogLevel
</span><span class="cx"> from twext.python.test.test_log import defaultLogLevel, logLevelForNamespace
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_extensionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,8 +16,8 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.web2.http_headers import MimeType
-from twext.web2.static import MetaDataMixin
</del><ins>+from txweb2.http_headers import MimeType
+from txweb2.static import MetaDataMixin
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, Deferred, succeed
</span><span class="cx"> from twisted.web.microdom import parseString
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_freebusyquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,11 +21,11 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav import caldavxml
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_icalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -10128,3 +10128,322 @@
</span><span class="cx"> ical2 = Component.fromString(calendar)
</span><span class="cx"> ical2.onlyPastInstances(rid)
</span><span class="cx"> self.assertEqual(str(ical2), split_past.replace("\n", "\r\n"), "Failed past: %s" % (title,))
</span><ins>+
+
+ def test_hasDuplicatePrivateComments(self):
+ """
+ Test that L{Component.hasDuplicatePrivateComments} correctly detects, but does not fix, duplicate private comments.
+ """
+
+ data = (
+ (
+ "No comments",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+
+ (
+ "One comment",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+
+ (
+ "Two different comments",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+
+ (
+ "Two duplicates, one different",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+""",
+ True,
+ ),
+
+ (
+ "No duplicates in two components",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user03";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message3
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+
+ (
+ "Two duplicates in one component, three different in another",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user03";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message3
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+""",
+ True,
+ ),
+ )
+
+ for title, txt, result in data:
+ component = Component.fromString(txt)
+ self.assertEqual(component.hasDuplicatePrivateComments(doFix=False), result, msg=title)
+ self.assertEqual(normalize_iCalStr(component), normalize_iCalStr(txt), msg=title)
+
+
+ def test_hasDuplicatePrivateComments_withFix(self):
+ """
+ Test that L{Component.hasDuplicatePrivateComments} correctly removes duplicate comments.
+ """
+
+ data = (
+ (
+ "No comments",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+END:VEVENT
+END:VCALENDAR
+""",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+
+ (
+ "One comment",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+""",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+
+ (
+ "Two different comments",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+""",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+
+ (
+ "Two duplicates, one different",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+""",
+ """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user01";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF="urn:uuid:user02";X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+""",
+ False,
+ ),
+ )
+
+ for title, txt, result, result_changed in data:
+ component = Component.fromString(txt)
+ changed = component.hasDuplicatePrivateComments(doFix=True)
+ self.assertEqual(sorted(normalize_iCalStr(component).splitlines()), sorted(normalize_iCalStr(result).splitlines()), msg=title)
+ self.assertEqual(changed, result_changed, msg=title)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_kerberospy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from twisted.cred.error import LoginFailed
</span><span class="cx"> from twisted.cred.error import UnauthorizedLogin
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import authkerb
</span><span class="cx"> import twistedcaldav.test.util
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_linkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,9 +14,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachelockpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -5,16 +5,17 @@
</span><span class="cx"> Test the memcache client protocol.
</span><span class="cx"> """
</span><span class="cx">
</span><del>-from twext.protocols.memcache import MemCacheProtocol
-
</del><span class="cx"> from twisted.test.proto_helpers import StringTransportWithDisconnection
</span><span class="cx"> from twisted.internet.task import Clock
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><ins>+from twisted.protocols.memcache import MemCacheProtocol
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
</span><span class="cx">
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx">
</span><ins>+
+
</ins><span class="cx"> class MemCacheTestCase(TestCase):
</span><span class="cx"> """
</span><span class="cx"> Test client protocol class L{MemCacheProtocol}.
</span><span class="lines">@@ -22,22 +23,32 @@
</span><span class="cx">
</span><span class="cx"> class FakedMemcacheLock(MemcacheLock):
</span><span class="cx">
</span><del>- def __init__(self, faked, namespace, locktoken, timeout=5.0, retry_interval=0.1, expire_time=0):
</del><ins>+ def __init__(
+ self, faked, namespace, locktoken,
+ timeout=5.0, retry_interval=0.1, expire_time=0
+ ):
</ins><span class="cx"> """
</span><del>-
</del><span class="cx"> @param namespace: a unique namespace for this lock's tokens
</span><span class="cx"> @type namespace: C{str}
</span><ins>+
</ins><span class="cx"> @param locktoken: the name of the locktoken
</span><span class="cx"> @type locktoken: C{str}
</span><del>- @param timeout: the maximum time in seconds that the lock should block
</del><ins>+
+ @param timeout: the maximum time in seconds that the lock should
+ block
</ins><span class="cx"> @type timeout: C{float}
</span><ins>+
</ins><span class="cx"> @param retry_interval: the interval to retry acquiring the lock
</span><span class="cx"> @type retry_interval: C{float}
</span><del>- @param expiryTime: the time in seconds for the lock to expire. Zero: no expiration.
</del><ins>+
+ @param expiryTime: the time in seconds for the lock to expire.
+ Zero: no expiration.
</ins><span class="cx"> @type expiryTime: C{float}
</span><span class="cx"> """
</span><span class="cx">
</span><del>- super(MemCacheTestCase.FakedMemcacheLock, self).__init__(namespace, locktoken, timeout, retry_interval, expire_time)
</del><ins>+ super(MemCacheTestCase.FakedMemcacheLock, self).__init__(
+ namespace, locktoken, timeout, retry_interval, expire_time
+ )
</ins><span class="cx"> self.faked = faked
</span><span class="cx">
</span><span class="cx"> def _getMemcacheProtocol(self):
</span><span class="lines">@@ -90,11 +101,16 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking")
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", "locking"
+ )
</ins><span class="cx"> return self._test(
</span><span class="cx"> lock.get("foo"),
</span><span class="cx"> "get lock:foo-acbd18db4cc2f85cedef654fccc4a4d8\r\n",
</span><del>- "VALUE lock:foo-acbd18db4cc2f85cedef654fccc4a4d8 0 3\r\nbar\r\nEND\r\n",
</del><ins>+ (
+ "VALUE lock:foo-acbd18db4cc2f85cedef654fccc4a4d8 0 3\r\n"
+ "bar\r\nEND\r\n"
+ ),
</ins><span class="cx"> "bar"
</span><span class="cx"> )
</span><span class="cx">
</span><span class="lines">@@ -105,7 +121,9 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking")
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", "locking"
+ )
</ins><span class="cx"> return self._test(
</span><span class="cx"> lock.set("foo", "bar"),
</span><span class="cx"> "set lock:foo-acbd18db4cc2f85cedef654fccc4a4d8 0 0 3\r\nbar\r\n",
</span><span class="lines">@@ -121,7 +139,9 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking")
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", "locking"
+ )
</ins><span class="cx"> yield self._test(
</span><span class="cx"> lock.acquire(),
</span><span class="cx"> "add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n",
</span><span class="lines">@@ -138,7 +158,9 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking", timeout=0)
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", "locking", timeout=0
+ )
</ins><span class="cx"> yield self._test(
</span><span class="cx"> lock.acquire(),
</span><span class="cx"> "add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n",
</span><span class="lines">@@ -155,11 +177,17 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking", timeout=0)
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", "locking", timeout=0
+ )
</ins><span class="cx"> try:
</span><span class="cx"> yield self._test(
</span><span class="cx"> lock.acquire(),
</span><del>- "add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n",
</del><ins>+ (
+ "add lock:"
+ "locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n"
+ "1\r\n"
+ ),
</ins><span class="cx"> "NOT_STORED\r\n",
</span><span class="cx"> True
</span><span class="cx"> )
</span><span class="lines">@@ -179,7 +207,9 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking")
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", "locking"
+ )
</ins><span class="cx"> yield self._test(
</span><span class="cx"> lock.acquire(),
</span><span class="cx"> "add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n",
</span><span class="lines">@@ -203,7 +233,9 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking")
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", "locking"
+ )
</ins><span class="cx"> yield self._test(
</span><span class="cx"> lock.acquire(),
</span><span class="cx"> "add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n",
</span><span class="lines">@@ -225,7 +257,9 @@
</span><span class="cx"> called back with the value and the flag associated with the given key
</span><span class="cx"> if the server returns a successful result.
</span><span class="cx"> """
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", u"locking")
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", u"locking"
+ )
</ins><span class="cx"> yield self._test(
</span><span class="cx"> lock.acquire(),
</span><span class="cx"> "add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n",
</span><span class="lines">@@ -253,7 +287,9 @@
</span><span class="cx"> self.fail("AssertionError not raised")
</span><span class="cx">
</span><span class="cx"> try:
</span><del>- lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", ("abc",))
</del><ins>+ lock = MemCacheTestCase.FakedMemcacheLock(
+ self.proto, "lock", ("abc",)
+ )
</ins><span class="cx"> yield lock.acquire()
</span><span class="cx"> self.fail("AssertionError not raised")
</span><span class="cx"> except AssertionError:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachepropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx">
</span><span class="cx"> import os
</span><span class="cx">
</span><del>-from twext.web2.http import HTTPError
</del><ins>+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_mkcalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,11 +18,11 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.fileop import rmdir
</del><ins>+from txweb2.dav.fileop import rmdir
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_multigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,11 +14,11 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import davXMLFromStream, joinURL
-from twext.web2.http_headers import Headers, MimeType
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import davXMLFromStream, joinURL
+from txweb2.http_headers import Headers, MimeType
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_optionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.iweb import IResponse
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.iweb import IResponse
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_propspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,10 +14,10 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2 import responsecode, http_headers
-from twext.web2.dav.util import davXMLFromStream
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode, http_headers
+from txweb2.dav.util import davXMLFromStream
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,8 +15,8 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from txdav.xml.element import HRef, Principal, Unauthenticated
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,10 +14,10 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http_headers import MimeType
-from twext.web2.iweb import IResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import allDataFromStream
+from txweb2.http_headers import MimeType
+from txweb2.iweb import IResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.http_headers import Headers
</del><ins>+from txweb2.http_headers import Headers
</ins><span class="cx">
</span><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav.util import bestAcceptType
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_wrappingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,41 +19,37 @@
</span><span class="cx"> """
</span><span class="cx">
</span><span class="cx">
</span><del>-from twext.web2.responsecode import UNAUTHORIZED
-from twext.web2.http_headers import Headers
</del><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><ins>+from twext.enterprise.locking import NamedLock
+from txweb2 import responsecode
+from txweb2.http import HTTPError
+from txweb2.http_headers import Headers, MimeType
+from txweb2.responsecode import INSUFFICIENT_STORAGE_SPACE
+from txweb2.responsecode import UNAUTHORIZED
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><del>-from txdav.xml import element as davxml
-from twistedcaldav.config import config
-
</del><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><ins>+from twisted.internet.defer import maybeDeferred
</ins><span class="cx">
</span><ins>+from twistedcaldav.config import config
+from twistedcaldav.directory.test.test_xmlfile import XMLFileBase
</ins><span class="cx"> from twistedcaldav.ical import Component as VComponent
</span><del>-from twistedcaldav.vcard import Component as VCComponent
-
</del><span class="cx"> from twistedcaldav.storebridge import DropboxCollection, \
</span><span class="cx"> CalendarCollectionResource
</span><del>-
</del><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span><ins>+from twistedcaldav.vcard import Component as VCComponent
</ins><span class="cx">
</span><del>-from txdav.idav import IDataStore
</del><ins>+from txdav.caldav.datastore.file import Calendar
</ins><span class="cx"> from txdav.caldav.datastore.test.test_file import test_event_text
</span><del>-
</del><ins>+from txdav.caldav.icalendarstore import ICalendarHome
</ins><span class="cx"> from txdav.carddav.datastore.test.test_file import vcard4_text
</span><del>-
</del><ins>+from txdav.carddav.iaddressbookstore import IAddressBookHome
</ins><span class="cx"> from txdav.common.datastore.test.util import assertProvides
</span><del>-
-
-from twext.web2.http import HTTPError
-from twext.web2.responsecode import INSUFFICIENT_STORAGE_SPACE
-from twext.web2.stream import MemoryStream
</del><span class="cx"> from txdav.common.datastore.test.util import deriveQuota
</span><del>-from twistedcaldav.directory.test.test_xmlfile import XMLFileBase
-from txdav.caldav.icalendarstore import ICalendarHome
-from txdav.carddav.iaddressbookstore import IAddressBookHome
</del><ins>+from txdav.idav import IDataStore
+from txdav.xml import element as davxml
</ins><span class="cx">
</span><del>-from twisted.internet.defer import maybeDeferred
-from txdav.caldav.datastore.file import Calendar
</del><ins>+import hashlib
</ins><span class="cx">
</span><span class="cx"> def _todo(f, why):
</span><span class="cx"> f.todo = why
</span><span class="lines">@@ -560,3 +556,90 @@
</span><span class="cx"> self.requestUnderTest = None
</span><span class="cx"> yield self.assertCalendarEmpty(wsanchez)
</span><span class="cx"> yield self.assertCalendarEmpty(cdaboo)
</span><ins>+
+
+
+class TimeoutTests(StoreTestCase):
+ """
+ Tests for L{twistedcaldav.storebridge} lock timeouts.
+ """
+
+ @inlineCallbacks
+ def test_timeoutOnPUT(self):
+ """
+ PUT gets a 503 on a lock timeout.
+ """
+
+ # Create a fake lock
+ txn = self.transactionUnderTest()
+ yield NamedLock.acquire(txn, "ImplicitUIDLock:%s" % (hashlib.md5("uid1").hexdigest(),))
+
+ # PUT fails
+ request = SimpleStoreRequest(
+ self,
+ "PUT",
+ "/calendars/users/wsanchez/calendar/1.ics",
+ headers=Headers({"content-type": MimeType.fromString("text/calendar")}),
+ authid="wsanchez"
+ )
+ request.stream = MemoryStream("""BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:uid1
+DTSTART;VALUE=DATE:20020101
+DTEND;VALUE=DATE:20020102
+DTSTAMP:20020101T121212Z
+SUMMARY:New Year's Day
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n"))
+ response = yield self.send(request)
+ self.assertEqual(response.code, responsecode.SERVICE_UNAVAILABLE)
+
+
+ @inlineCallbacks
+ def test_timeoutOnDELETE(self):
+ """
+ DELETE gets a 503 on a lock timeout.
+ """
+
+ # PUT works
+ request = SimpleStoreRequest(
+ self,
+ "PUT",
+ "/calendars/users/wsanchez/calendar/1.ics",
+ headers=Headers({"content-type": MimeType.fromString("text/calendar")}),
+ authid="wsanchez"
+ )
+ request.stream = MemoryStream("""BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:uid1
+DTSTART;VALUE=DATE:20020101
+DTEND;VALUE=DATE:20020102
+DTSTAMP:20020101T121212Z
+ORGANIZER:mailto:wsanchez@example.com
+ATTENDEE:mailto:wsanchez@example.com
+SUMMARY:New Year's Day
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n"))
+ response = yield self.send(request)
+ self.assertEqual(response.code, responsecode.CREATED)
+
+ # Create a fake lock
+ txn = self.transactionUnderTest()
+ yield NamedLock.acquire(txn, "ImplicitUIDLock:%s" % (hashlib.md5("uid1").hexdigest(),))
+
+ request = SimpleStoreRequest(
+ self,
+ "DELETE",
+ "/calendars/users/wsanchez/calendar/1.ics",
+ authid="wsanchez"
+ )
+ response = yield self.send(request)
+ self.assertEqual(response.code, responsecode.SERVICE_UNAVAILABLE)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,13 +26,13 @@
</span><span class="cx"> from twisted.internet.defer import succeed, fail, inlineCallbacks, returnValue
</span><span class="cx"> from twisted.internet.protocol import ProcessProtocol
</span><span class="cx">
</span><del>-from twext.python.memcacheclient import ClientFactory
</del><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-import twext.web2.dav.test.util
</del><ins>+import txweb2.dav.test.util
</ins><span class="cx"> from txdav.xml import element as davxml, element
</span><del>-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import memcacher
</span><ins>+from twistedcaldav.memcacheclient import ClientFactory
</ins><span class="cx"> from twistedcaldav.bind import doBind
</span><span class="cx"> from twistedcaldav.directory import augment
</span><span class="cx"> from twistedcaldav.directory.addressbook import DirectoryAddressBookHomeProvisioningResource
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.caldav.datastore.test.util import buildCalendarStore
</span><span class="cx"> from calendarserver.tap.util import getRootResource, directoryFromConfig
</span><del>-from twext.web2.dav.test.util import SimpleRequest
</del><ins>+from txweb2.dav.test.util import SimpleRequest
</ins><span class="cx"> from twistedcaldav.directory.util import transactionFromRequest
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><span class="cx">
</span><span class="lines">@@ -187,7 +187,7 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><del>-class StoreTestCase(CommonCommonTests, twext.web2.dav.test.util.TestCase):
</del><ins>+class StoreTestCase(CommonCommonTests, txweb2.dav.test.util.TestCase):
</ins><span class="cx"> """
</span><span class="cx"> A base class for tests that use the SQL store.
</span><span class="cx"> """
</span><span class="lines">@@ -268,7 +268,7 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><del>-class TestCase(twext.web2.dav.test.util.TestCase):
</del><ins>+class TestCase(txweb2.dav.test.util.TestCase):
</ins><span class="cx"> resource_class = RootResource
</span><span class="cx">
</span><span class="cx"> def createDataStore(self):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezoneservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,17 +22,17 @@
</span><span class="cx"> "TimezoneServiceResource",
</span><span class="cx"> ]
</span><span class="cx">
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx">
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.method.propfind import http_PROPFIND
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import HTTPError
-from twext.web2.http import Response
-from twext.web2.http import XMLResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.method.propfind import http_PROPFIND
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import HTTPError
+from txweb2.http import Response
+from txweb2.http import XMLResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezonestdservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,13 +26,13 @@
</span><span class="cx"> ]
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.method.propfind import http_PROPFIND
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import HTTPError, JSONResponse
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.method.propfind import http_PROPFIND
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import HTTPError, JSONResponse
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue, \
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavupgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml import element
</span><del>-from twext.web2.dav.fileop import rmdir
</del><ins>+from txweb2.dav.fileop import rmdir
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.directory import calendaruserproxy
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,14 +35,20 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> try:
</span><del>- from ctypes import *
- import ctypes.util
</del><ins>+ from ctypes import (
+ cdll,
+ c_int, c_uint64, c_ulong,
+ c_char_p, c_void_p,
+ addressof, sizeof, c_size_t,
+ connect,
+ )
+ from ctypes.util import find_library
</ins><span class="cx"> hasCtypes = True
</span><span class="cx"> except ImportError:
</span><span class="cx"> hasCtypes = False
</span><span class="cx">
</span><span class="cx"> if sys.platform == "darwin" and hasCtypes:
</span><del>- libc = cdll.LoadLibrary(ctypes.util.find_library("libc"))
</del><ins>+ libc = cdll.LoadLibrary(find_library("libc"))
</ins><span class="cx">
</span><span class="cx"> def getNCPU():
</span><span class="cx"> """
</span><span class="lines">@@ -56,8 +62,8 @@
</span><span class="cx"> ]
</span><span class="cx"> libc.sysctlbyname(
</span><span class="cx"> "hw.ncpu",
</span><del>- c_voidp(addressof(ncpu)),
- c_voidp(addressof(size)),
</del><ins>+ c_void_p(addressof(ncpu)),
+ c_void_p(addressof(size)),
</ins><span class="cx"> None,
</span><span class="cx"> 0
</span><span class="cx"> )
</span><span class="lines">@@ -77,8 +83,8 @@
</span><span class="cx"> ]
</span><span class="cx"> libc.sysctlbyname(
</span><span class="cx"> "hw.memsize",
</span><del>- c_voidp(addressof(memsize)),
- c_voidp(addressof(size)),
</del><ins>+ c_void_p(addressof(memsize)),
+ c_void_p(addressof(size)),
</ins><span class="cx"> None,
</span><span class="cx"> 0
</span><span class="cx"> )
</span><span class="lines">@@ -87,7 +93,7 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> elif sys.platform == "linux2" and hasCtypes:
</span><del>- libc = cdll.LoadLibrary(ctypes.util.find_library("libc"))
</del><ins>+ libc = cdll.LoadLibrary(find_library("libc"))
</ins><span class="cx">
</span><span class="cx"> def getNCPU():
</span><span class="cx"> return libc.get_nprocs()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavvcardpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,8 +28,8 @@
</span><span class="cx"> import codecs
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.stream import IStream
-from twext.web2.dav.util import allDataFromStream
</del><ins>+from txweb2.stream import IStream
+from txweb2.dav.util import allDataFromStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,3 @@
</span><span class="cx"> """
</span><span class="cx"> WebDAV support for Twisted.
</span><span class="cx"> """
</span><del>-
-# Make sure we have twext's required Twisted patches loaded before we do
-# anything at all.
-__import__("twext")
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
</ins><span class="cx"> from txdav.idav import IDataStoreObject
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><span class="cx"> from txdav.xml.element import GETContentType
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastoresubpostgrespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx"> def __init__(self, dataStoreDirectory, subServiceFactory,
</span><span class="cx"> schema, resetSchema=False, databaseName='subpostgres',
</span><span class="cx"> clusterName="cluster",
</span><del>- logFile="postgres.log", socketDir="/tmp",
</del><ins>+ logFile="postgres.log", socketDir="",
</ins><span class="cx"> listenAddresses=[], sharedBuffers=30,
</span><span class="cx"> maxConnections=20, options=[],
</span><span class="cx"> testMode=False,
</span><span class="lines">@@ -223,20 +223,15 @@
</span><span class="cx"> self.host, self.port = listenAddresses[0].split(":") if ":" in listenAddresses[0] else (listenAddresses[0], None,)
</span><span class="cx"> self.listenAddresses = [addr.split(":")[0] for addr in listenAddresses]
</span><span class="cx"> else:
</span><del>- if socketDir:
- # Unix socket length path limit
- self.socketDir = CachingFilePath("%s/ccs_postgres_%s/" %
- (socketDir, md5(dataStoreDirectory.path).hexdigest()))
- if len(self.socketDir.path) > 64:
- socketDir = "/tmp"
- self.socketDir = CachingFilePath("/tmp/ccs_postgres_%s/" %
- (md5(dataStoreDirectory.path).hexdigest()))
- self.host = self.socketDir.path
- self.port = None
- else:
- self.socketDir = None
- self.host = "localhost"
- self.port = None
</del><ins>+ if not socketDir:
+ # Socket directory was not specified, so come up with one
+ # in /tmp and based on a hash of the data store directory
+ digest = md5(dataStoreDirectory.path).hexdigest()
+ socketDir = "/tmp/ccs_postgres_" + digest
+
+ self.socketDir = CachingFilePath(socketDir)
+ self.host = self.socketDir.path
+ self.port = None
</ins><span class="cx"> self.listenAddresses = []
</span><span class="cx"> self.sharedBuffers = sharedBuffers if not testMode else 16
</span><span class="cx"> self.maxConnections = maxConnections if not testMode else 4
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorebasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5, \
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5, \
</ins><span class="cx"> TwistedQuotaRootProperty
</span><span class="cx">
</span><span class="cx"> from txdav.idav import IPropertyStore, IPropertyName
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorexattrpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">
</span><span class="cx"> # Mimic old xattr-prefix behavior by importing it directly.
</span><span class="cx"> deadPropertyXattrPrefix = namedAny(
</span><del>- "twext.web2.dav.xattrprops.xattrPropertyStore.deadPropertyXattrPrefix"
</del><ins>+ "txweb2.dav.xattrprops.xattrPropertyStore.deadPropertyXattrPrefix"
</ins><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> # There is a 127 character limit for xattr keys so we need to
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,11 +35,11 @@
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed, fail
</span><span class="cx">
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentType
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
-from twext.web2.http_headers import generateContentType, MimeType
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
+from txweb2.http_headers import generateContentType, MimeType
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml, customxml, ical
</span><span class="cx"> from twistedcaldav.caldavxml import ScheduleCalendarTransp, Opaque, Transparent
</span><span class="lines">@@ -78,6 +78,8 @@
</span><span class="cx">
</span><span class="cx"> IGNORE_NAMES = ('dropbox', 'notification', 'freebusy')
</span><span class="cx">
</span><ins>+
+
</ins><span class="cx"> class CalendarHome(CommonHome):
</span><span class="cx"> implements(ICalendarHome)
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,12 +15,12 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger, LogLevel
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twisted.python.failure import Failure
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,9 +15,9 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,9 +21,9 @@
</span><span class="cx">
</span><span class="cx"> from twext.enterprise.queue import inTransaction
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.http import HTTPError
</ins><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python.failure import Failure
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,7 +15,7 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx"> from twisted.internet.defer import succeed
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import RemoteCalendarUser
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimiptesttest_deliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twisted.trial import unittest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimplicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,11 +15,11 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,15 +20,15 @@
</span><span class="cx">
</span><span class="cx"> from twext.internet.gaiendpoint import GAIEndpoint
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.client.http import ClientRequest
-from twext.web2.client.http import HTTPClientProtocol
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.util import davXMLFromStream, joinURL, allDataFromStream
-from twext.web2.http import HTTPError
-from twext.web2.http_headers import Headers
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.client.http import ClientRequest
+from txweb2.client.http import HTTPClientProtocol
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.util import davXMLFromStream, joinURL, allDataFromStream
+from txweb2.http import HTTPError
+from txweb2.http_headers import Headers
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, DeferredList, returnValue
</span><span class="cx"> from twisted.internet.protocol import Factory
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledkimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,11 +15,11 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.client.http import ClientRequest
-from twext.web2.dav.util import allDataFromStream, joinURL
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.client.http import ClientRequest
+from txweb2.dav.util import allDataFromStream, joinURL
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twistedcaldav.client.geturl import getURL
</span><span class="lines">@@ -516,7 +516,7 @@
</span><span class="cx"> def __init__(self, headers, body, key_lookup=None, protocol_debug=False):
</span><span class="cx"> """
</span><span class="cx"> @param headers: The HTTP request headers to process
</span><del>- @type headers: L{twext.web2.http_headers.Headers}
</del><ins>+ @type headers: L{txweb2.http_headers.Headers}
</ins><span class="cx"> @param body: The HTTP request body to process
</span><span class="cx"> @type body: C{str}
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,12 +17,12 @@
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http import Response, HTTPError, StatusResponse, XMLResponse
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.dav.util import allDataFromStream
+from txweb2.http import Response, HTTPError, StatusResponse, XMLResponse
+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, returnValue, inlineCallbacks
</span><span class="cx"> from twisted.python.failure import Failure
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,9 +15,9 @@
</span><span class="cx"> ##
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, Response
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, Response
+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.abstract import isIPAddress
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_dkimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,9 +16,9 @@
</span><span class="cx">
</span><span class="cx"> from Crypto.PublicKey import RSA
</span><span class="cx">
</span><del>-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http_headers import Headers, MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.util import allDataFromStream
+from txweb2.http_headers import Headers, MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> from twisted.names import client
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_localserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twisted.trial import unittest
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2 import http_headers, responsecode
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2 import http_headers, responsecode
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx">
</span><span class="lines">@@ -28,10 +28,10 @@
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, \
</span><span class="cx"> CommonCommonTests
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-import twext.web2.dav.test.util
</del><ins>+import txweb2.dav.test.util
</ins><span class="cx"> from txdav.caldav.datastore.test.util import buildCalendarStore
</span><span class="cx">
</span><del>-class iSchedulePOST (CommonCommonTests, twext.web2.dav.test.util.TestCase):
</del><ins>+class iSchedulePOST (CommonCommonTests, txweb2.dav.test.util.TestCase):
</ins><span class="cx">
</span><span class="cx"> @inlineCallbacks
</span><span class="cx"> def setUp(self):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingitippy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -309,8 +309,8 @@
</span><span class="cx"> calendar_master.addProperty(Property("EXDATE", exdates))
</span><span class="cx">
</span><span class="cx"> # See if there are still components in the calendar - we might have deleted the last overridden instance
</span><del>- # in which case the calendar object is empty (except for VTIMEZONEs).
- if calendar.mainType() is None:
</del><ins>+ # in which case the calendar object is empty (except for VTIMEZONEs) or has only hidden components.
+ if calendar.mainType() is None or calendar.hasPropertyValueInAllComponents(Property(Component.HIDDEN_INSTANCE_PROPERTY, "T")):
</ins><span class="cx"> # Delete the now empty calendar object
</span><span class="cx"> return True, True, None
</span><span class="cx"> else:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingprocessingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,8 +19,8 @@
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,11 +19,11 @@
</span><span class="cx">
</span><span class="cx"> from twext.enterprise.locking import NamedLock
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, Response
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, Response
+from txweb2.http_headers import MimeType
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import messageForFailure, statusForFailure, \
</del><ins>+from txweb2.dav.http import messageForFailure, statusForFailure, \
</ins><span class="cx"> ErrorResponse
</span><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingtesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,8 +18,8 @@
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx">
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx">
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,6 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><del>-from txdav.xml import element
</del><span class="cx">
</span><span class="cx">
</span><span class="cx"> """
</span><span class="lines">@@ -41,9 +40,9 @@
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.python.vcomponent import VComponent
-from twext.web2.http_headers import MimeType, generateContentType
-from twext.web2.stream import readStream
</del><ins>+from twistedcaldav.ical import Component as VComponent
+from txweb2.http_headers import MimeType, generateContentType
+from txweb2.stream import readStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twisted.python import hashlib
</span><span class="lines">@@ -73,7 +72,7 @@
</span><span class="cx"> AttendeeAllowedError, InvalidPerUserDataMerge, ComponentUpdateState, \
</span><span class="cx"> ValidOrganizerError, ShareeAllowedError, ComponentRemoveState, \
</span><span class="cx"> InvalidDefaultCalendar, \
</span><del>- InvalidAttachmentOperation
</del><ins>+ InvalidAttachmentOperation, DuplicatePrivateCommentsError
</ins><span class="cx"> from txdav.caldav.icalendarstore import QuotaExceeded
</span><span class="cx"> from txdav.common.datastore.sql import CommonHome, CommonHomeChild, \
</span><span class="cx"> CommonObjectResource, ECALENDARTYPE
</span><span class="lines">@@ -89,6 +88,7 @@
</span><span class="cx"> ObjectResourceNameNotAllowedError, TooManyObjectResourcesError, \
</span><span class="cx"> InvalidUIDError, UIDExistsError, UIDExistsElsewhereError, \
</span><span class="cx"> InvalidResourceMove, InvalidComponentForStoreError
</span><ins>+from txdav.xml import element
</ins><span class="cx">
</span><span class="cx"> from txdav.idav import ChangeCategory
</span><span class="cx">
</span><span class="lines">@@ -109,6 +109,8 @@
</span><span class="cx">
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span><ins>+
+
</ins><span class="cx"> class CalendarStoreFeatures(object):
</span><span class="cx"> """
</span><span class="cx"> Manages store-wide operations specific to calendars.
</span><span class="lines">@@ -580,6 +582,14 @@
</span><span class="cx"> returnValue(self._cachedCalendarResourcesForUID[uid])
</span><span class="cx">
</span><span class="cx">
</span><ins>+ def removedCalendarResource(self, uid):
+ """
+ Clean-up cache when resource is removed.
+ """
+ if hasattr(self, "_cachedCalendarResourcesForUID") and uid in self._cachedCalendarResourcesForUID:
+ del self._cachedCalendarResourcesForUID[uid]
+
+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def calendarObjectWithDropboxID(self, dropboxID):
</span><span class="cx"> """
</span><span class="lines">@@ -1069,6 +1079,12 @@
</span><span class="cx"> returnValue(objectResource)
</span><span class="cx">
</span><span class="cx">
</span><ins>+ @inlineCallbacks
+ def removedObjectResource(self, child):
+ yield super(Calendar, self).removedObjectResource(child)
+ self.viewerHome().removedCalendarResource(child.uid())
+
+
</ins><span class="cx"> def calendarObjectsInTimeRange(self, start, end, timeZone):
</span><span class="cx"> raise NotImplementedError()
</span><span class="cx">
</span><span class="lines">@@ -1790,7 +1806,14 @@
</span><span class="cx">
</span><span class="cx"> self.hasPrivateComment = new_has_private_comments
</span><span class="cx">
</span><ins>+ # Some clients appear to be buggy and are duplicating the "X-CALENDARSERVER-ATTENDEE-COMMENT" comment. We want
+ # to raise an error to prevent that so the client bugs can be tracked down.
</ins><span class="cx">
</span><ins>+ # Look for properties with duplicate "X-CALENDARSERVER-ATTENDEE-REF" values in the same component
+ if component.hasDuplicatePrivateComments(doFix=config.RemoveDuplicatePrivateComments):
+ raise DuplicatePrivateCommentsError("Duplicate X-CALENDARSERVER-ATTENDEE-COMMENT properties present.")
+
+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def replaceMissingToDoProperties(self, calendar, inserting, internal_state):
</span><span class="cx"> """
</span><span class="lines">@@ -1970,6 +1993,43 @@
</span><span class="cx"> self._componentChanged = True
</span><span class="cx">
</span><span class="cx">
</span><ins>+ def addStructuredLocation(self, component):
+ """
+ Scan the component for ROOM attendees; if any are associated with an
+ address record which has street address and geo coordinates, add an
+ X-APPLE-STRUCTURED-LOCATION property and update the LOCATION property
+ to contain the name and street address.
+ """
+ for sub in component.subcomponents():
+ for attendee in sub.getAllAttendeeProperties():
+ if attendee.parameterValue("CUTYPE") == "ROOM":
+ value = attendee.value()
+ if value.startswith("urn:uuid:"):
+ guid = value[9:]
+ loc = self.directoryService().recordWithGUID(guid)
+ if loc is not None:
+ guid = loc.extras.get("associatedAddress",
+ None)
+ if guid is not None:
+ addr = self.directoryService().recordWithGUID(guid)
+ if addr is not None:
+ street = addr.extras.get("streetAddress", "")
+ geo = addr.extras.get("geo", "")
+ if street and geo:
+ title = attendee.parameterValue("CN")
+ params = {
+ "X-ADDRESS" : street,
+ "X-APPLE-RADIUS" : "71",
+ "X-TITLE" : title,
+ }
+ structured = Property("X-APPLE-STRUCTURED-LOCATION",
+ "geo:%s" % (geo,), params=params,
+ valuetype=Value.VALUETYPE_URI)
+ sub.replaceProperty(structured)
+ sub.replaceProperty(Property("LOCATION",
+ "%s\n%s" % (title, street)))
+
+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def doImplicitScheduling(self, component, inserting, internal_state, split_details=None):
</span><span class="cx">
</span><span class="lines">@@ -2182,6 +2242,9 @@
</span><span class="cx"> # Default/duplicate alarms
</span><span class="cx"> self.processAlarms(component, inserting)
</span><span class="cx">
</span><ins>+ # Process structured location
+ self.addStructuredLocation(component)
+
</ins><span class="cx"> # Do scheduling
</span><span class="cx"> implicit_result = (yield self.doImplicitScheduling(component, inserting, internal_state))
</span><span class="cx"> if isinstance(implicit_result, int):
</span><span class="lines">@@ -2242,7 +2305,7 @@
</span><span class="cx"> elif internal_state == ComponentUpdateState.ORGANIZER_ITIP_UPDATE:
</span><span class="cx"> category = ChangeCategory.organizerITIPUpdate
</span><span class="cx"> elif (internal_state == ComponentUpdateState.ATTENDEE_ITIP_UPDATE and
</span><del>- hasattr(self._txn, "doing_attende_refresh")):
</del><ins>+ hasattr(self._txn, "doing_attendee_refresh")):
</ins><span class="cx"> category = ChangeCategory.attendeeITIPUpdate
</span><span class="cx">
</span><span class="cx"> yield self._calendar.notifyChanged(category=category)
</span><span class="lines">@@ -2681,6 +2744,19 @@
</span><span class="cx"> yield scheduler.doImplicitScheduling()
</span><span class="cx">
</span><span class="cx">
</span><ins>+ def removeNotifyCategory(self):
+ """
+ Indicates what category to use when determining the priority of push
+ notifications when this object is removed.
+
+ @returns: The "inbox" category if this object is in the inbox, otherwise
+ the "default" category
+ @rtype: L{ChangeCategory}
+ """
+ return (ChangeCategory.inbox if self._calendar.isInbox() else
+ ChangeCategory.default)
+
+
</ins><span class="cx"> @classproperty
</span><span class="cx"> def _recurrenceMinMaxByIDQuery(cls): #@NoSelf
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestcommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx"> from twisted.python import hashlib
</span><span class="cx">
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_attachmentspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,8 +21,8 @@
</span><span class="cx">
</span><span class="cx"> from twext.enterprise.dal.syntax import Delete
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python.filepath import FilePath
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx">
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx">
</span><span class="cx"> from txdav.common.icommondatastore import HomeChildNameNotAllowedError
</span><span class="cx"> from txdav.common.icommondatastore import ObjectResourceNameNotAllowedError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx"> LocalCalendarUser
</span><span class="cx"> from txdav.caldav.datastore.scheduling.caldav.scheduler import CalDAVScheduler
</span><span class="cx"> from txdav.caldav.datastore.scheduling.scheduler import ScheduleResponseQueue
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.caldav.datastore.scheduling.itip import iTIPRequestStatus
</span><span class="cx"> from twistedcaldav.instance import InvalidOverriddenInstanceError
</span><span class="cx">
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx">
</span><span class="cx"> from twext.enterprise.dal.syntax import Select, Parameter, Insert, Delete, \
</span><span class="cx"> Update
</span><del>-from twext.python.vcomponent import VComponent
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from twistedcaldav.ical import Component as VComponent
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, DeferredList, \
</span><span class="lines">@@ -64,6 +64,7 @@
</span><span class="cx"> CommonCommonTests
</span><span class="cx"> from txdav.common.icommondatastore import NoSuchObjectResourceError
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentLanguage, ResourceType
</span><ins>+from txdav.idav import ChangeCategory
</ins><span class="cx">
</span><span class="cx"> import datetime
</span><span class="cx">
</span><span class="lines">@@ -915,6 +916,32 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> @inlineCallbacks
</span><ins>+ def test_removeNotifyCategoryInbox(self):
+ """
+ Inbox object removal should be categorized as ChangeCategory.inbox
+ """
+ home = yield self.homeUnderTest()
+ inbox = yield home.createCalendarWithName("inbox")
+ component = VComponent.fromString(test_event_text)
+ inboxItem = yield inbox.createCalendarObjectWithName("inbox.ics", component)
+ self.assertEquals(ChangeCategory.inbox, inboxItem.removeNotifyCategory())
+ yield self.commit()
+
+
+ @inlineCallbacks
+ def test_removeNotifyCategoryNonInbox(self):
+ """
+ Non-Inbox object removal should be categorized as ChangeCategory.default
+ """
+ home = yield self.homeUnderTest()
+ nonInbox = yield home.createCalendarWithName("noninbox")
+ component = VComponent.fromString(test_event_text)
+ nonInboxItem = yield nonInbox.createCalendarObjectWithName("inbox.ics", component)
+ self.assertEquals(ChangeCategory.default, nonInboxItem.removeNotifyCategory())
+ yield self.commit()
+
+
+ @inlineCallbacks
</ins><span class="cx"> def test_directShareCreateConcurrency(self):
</span><span class="cx"> """
</span><span class="cx"> Test that two concurrent attempts to create a direct shared calendar
</span><span class="lines">@@ -2050,7 +2077,82 @@
</span><span class="cx"> self.assertEqual(len(self.flushLoggedErrors(InvalidOverriddenInstanceError)), 1)
</span><span class="cx">
</span><span class="cx">
</span><ins>+ @inlineCallbacks
+ def test_setComponent_structuredLocation(self):
+ """
+ Verify ROOM attendees who have street address and geo information
+ within the directory will get X-APPLE-STRUCTURED-LOCATION properties
+ added, as well as updated LOCATION properties.
+ """
</ins><span class="cx">
</span><ins>+ data = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Apple Inc.//Mac OS X 10.9.1//EN
+BEGIN:VEVENT
+UID:561F5DBB-3F38-4B3A-986F-DD05CBAF554F
+DTSTART;TZID=America/Los_Angeles:20131211T164500
+DTEND;TZID=America/Los_Angeles:20131211T174500
+ATTENDEE;CN=Conference Room One;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
+ T;SCHEDULE-STATUS=2.0:urn:uuid:room1
+ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
+ CEPTED:urn:uuid:user01
+CREATED:20131211T221854Z
+DTSTAMP:20131211T230632Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RRULE:FREQ=DAILY;COUNT=5
+SEQUENCE:8
+SUMMARY:locations
+TRANSP:OPAQUE
+END:VEVENT
+BEGIN:VEVENT
+UID:561F5DBB-3F38-4B3A-986F-DD05CBAF554F
+RECURRENCE-ID;TZID=America/Los_Angeles:20131214T164500
+DTSTART;TZID=America/Los_Angeles:20131214T160000
+DTEND;TZID=America/Los_Angeles:20131214T170000
+ATTENDEE;CN=Conference Room Two;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
+ T;SCHEDULE-STATUS=2.0:urn:uuid:room2
+ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
+ CEPTED:urn:uuid:user01
+CREATED:20131211T221854Z
+DTSTAMP:20131211T230632Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+SEQUENCE:8
+SUMMARY:locations
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+""".replace("\n", "\r\n")
+
+ calendar = yield self.calendarUnderTest(name="calendar", home="user01")
+ yield calendar.createCalendarObjectWithName("structured.ics",
+ Component.fromString(data))
+ cobj = yield self.calendarObjectUnderTest(name="structured.ics",
+ calendar_name="calendar", home="user01")
+ comp = yield cobj.component()
+ components = list(comp.subcomponents())
+
+ # Check first component
+ locProp = components[0].getProperty("LOCATION")
+ self.assertEquals(locProp.value(),
+ "Conference Room One\n1 Infinite Loop, Cupertino, CA 95014")
+ structProp = components[0].getProperty("X-APPLE-STRUCTURED-LOCATION")
+ self.assertEquals(structProp.value(),
+ "geo:37.331741,-122.030333")
+
+ # Check second component
+ locProp = components[1].getProperty("LOCATION")
+ self.assertEquals(locProp.value(),
+ "Conference Room Two\n2 Infinite Loop, Cupertino, CA 95014")
+ structProp = components[1].getProperty("X-APPLE-STRUCTURED-LOCATION")
+ self.assertEquals(structProp.value(),
+ "geo:37.332633,-122.030502")
+
+ yield self.commit()
+
+
+
+
</ins><span class="cx"> class CalendarObjectSplitting(CommonCommonTests, unittest.TestCase):
</span><span class="cx"> """
</span><span class="cx"> CalendarObject splitting tests
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> import textwrap
</span><span class="cx">
</span><span class="cx"> from twisted.trial.unittest import TestCase as BaseTestCase
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -62,9 +62,11 @@
</span><span class="cx"> calendarUserAddresses,
</span><span class="cx"> cutype="INDIVIDUAL",
</span><span class="cx"> thisServer=True,
</span><ins>+ extras={},
</ins><span class="cx"> ):
</span><span class="cx">
</span><del>- super(TestCalendarStoreDirectoryRecord, self).__init__(uid, shortNames, fullName)
</del><ins>+ super(TestCalendarStoreDirectoryRecord, self).__init__(uid, shortNames,
+ fullName, extras=extras)
</ins><span class="cx"> self.uid = uid
</span><span class="cx"> self.shortNames = shortNames
</span><span class="cx"> self.fullName = fullName
</span><span class="lines">@@ -158,6 +160,36 @@
</span><span class="cx"> for uid in homes:
</span><span class="cx"> directory.addRecord(buildDirectoryRecord(uid))
</span><span class="cx">
</span><ins>+ # Structured Locations
+ directory.addRecord(TestCalendarStoreDirectoryRecord(
+ "il1", ("il1",), "1 Infinite Loop", [],
+ extras={
+ "geo" : "37.331741,-122.030333",
+ "streetAddress" : "1 Infinite Loop, Cupertino, CA 95014",
+ }
+ ))
+ directory.addRecord(TestCalendarStoreDirectoryRecord(
+ "il2", ("il2",), "2 Infinite Loop", [],
+ extras={
+ "geo" : "37.332633,-122.030502",
+ "streetAddress" : "2 Infinite Loop, Cupertino, CA 95014",
+ }
+ ))
+ directory.addRecord(TestCalendarStoreDirectoryRecord(
+ "room1", ("room1",), "Conference Room One",
+ frozenset(("urn:uuid:room1",)),
+ extras={
+ "associatedAddress" : "il1",
+ }
+ ))
+ directory.addRecord(TestCalendarStoreDirectoryRecord(
+ "room2", ("room2",), "Conference Room Two",
+ frozenset(("urn:uuid:room2",)),
+ extras={
+ "associatedAddress" : "il2",
+ }
+ ))
+
</ins><span class="cx"> return directory
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -32,10 +32,10 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx">
</span><del>-from twext.web2 import http_headers
</del><ins>+from txweb2 import http_headers
</ins><span class="cx">
</span><del>-from twext.python.vcomponent import InvalidICalendarDataError
-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import InvalidICalendarDataError
+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import ical
</span><span class="cx"> from twistedcaldav.datafilters.hiddeninstance import HiddenInstanceFilter
</span><span class="lines">@@ -283,7 +283,7 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><del>-# MIME helpers - mostly copied from twext.web2.static
</del><ins>+# MIME helpers - mostly copied from txweb2.static
</ins><span class="cx">
</span><span class="cx"> def loadMimeTypes(mimetype_locations=['/etc/mime.types']):
</span><span class="cx"> """
</span><span class="lines">@@ -507,7 +507,7 @@
</span><span class="cx"> def __init__(self, attachment, contentType, dispositionName):
</span><span class="cx"> """
</span><span class="cx"> Create a storage transport with a reference to an L{IAttachment} and a
</span><del>- L{twext.web2.http_headers.MimeType}.
</del><ins>+ L{txweb2.http_headers.MimeType}.
</ins><span class="cx"> """
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> self._clock = reactor
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavicalendarstorepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -658,7 +658,7 @@
</span><span class="cx">
</span><span class="cx"> @param contentType: The content type of the data which will be stored.
</span><span class="cx">
</span><del>- @type contentType: L{twext.web2.http_headers.MimeType}
</del><ins>+ @type contentType: L{txweb2.http_headers.MimeType}
</ins><span class="cx">
</span><span class="cx"> @return: A transport which stores the contents written to it.
</span><span class="cx">
</span><span class="lines">@@ -740,6 +740,13 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><ins>+class DuplicatePrivateCommentsError(CommonStoreError):
+ """
+ Calendar data cannot contain duplicate private comment properties.
+ """
+
+
+
</ins><span class="cx"> class InvalidPerUserDataMerge(CommonStoreError):
</span><span class="cx"> """
</span><span class="cx"> Per-user data merge failed.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml.base import dav_namespace
</span><del>-from twext.web2.http_headers import MimeType
-from twext.web2.http import RedirectResponse, Response
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.http_headers import MimeType
+from txweb2.http import RedirectResponse, Response
+from txweb2.stream import MemoryStream
</ins><span class="cx">
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -30,8 +30,8 @@
</span><span class="cx"> from errno import ENOENT
</span><span class="cx">
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentType
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.python import hashlib
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx"> Update, Union, Max, Select, utcNowSQL
</span><span class="cx"> from twext.enterprise.locking import NamedLock
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.http_headers import MimeType
-from twext.web2.responsecode import FORBIDDEN
</del><ins>+from txweb2.http import HTTPError
+from txweb2.http_headers import MimeType
+from txweb2.responsecode import FORBIDDEN
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python import hashlib
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoretestcommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,8 +20,8 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx">
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.responsecode import FORBIDDEN
</del><ins>+from txweb2.http import HTTPError
+from txweb2.responsecode import FORBIDDEN
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> from twisted.python import hashlib
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,8 +24,8 @@
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentType, HRef
</span><span class="cx"> from txdav.xml.rfc5842 import ResourceID
</span><del>-from twext.web2.http_headers import generateContentType, MimeType
-from twext.web2.dav.resource import TwistedGETContentMD5, \
</del><ins>+from txweb2.http_headers import generateContentType, MimeType
+from txweb2.dav.resource import TwistedGETContentMD5, \
</ins><span class="cx"> TwistedQuotaUsedProperty
</span><span class="cx">
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> from twext.internet.decorate import memoizedKey, Memoizable
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.internet import reactor
</span><span class="lines">@@ -4288,7 +4288,7 @@
</span><span class="cx"> if self._objectNames and child.name() in self._objectNames:
</span><span class="cx"> self._objectNames.remove(child.name())
</span><span class="cx"> yield self._deleteRevision(child.name())
</span><del>- yield self.notifyChanged()
</del><ins>+ yield self.notifyChanged(category=child.removeNotifyCategory())
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> @classproperty
</span><span class="lines">@@ -5095,6 +5095,18 @@
</span><span class="cx"> self._notificationData = None
</span><span class="cx">
</span><span class="cx">
</span><ins>+ def removeNotifyCategory(self):
+ """
+ Indicates what category to use when determining the priority of push
+ notifications when this object is removed.
+
+ @returns: The "default" category (but should be overridden to return
+ values such as "inbox")
+ @rtype: L{ChangeCategory}
+ """
+ return ChangeCategory.default
+
+
</ins><span class="cx"> def uid(self):
</span><span class="cx"> return self._uid
</span><span class="cx">
</span><span class="lines">@@ -5616,6 +5628,8 @@
</span><span class="cx"> child._notificationType = json.loads(child._notificationType)
</span><span class="cx"> except ValueError:
</span><span class="cx"> pass
</span><ins>+ if isinstance(child._notificationType, unicode):
+ child._notificationType = child._notificationType.encode("utf-8")
</ins><span class="cx"> child._loadPropertyStore(
</span><span class="cx"> props=propertyStores.get(child._resourceID, None)
</span><span class="cx"> )
</span><span class="lines">@@ -5664,6 +5678,8 @@
</span><span class="cx"> self._notificationType = json.loads(self._notificationType)
</span><span class="cx"> except ValueError:
</span><span class="cx"> pass
</span><ins>+ if isinstance(self._notificationType, unicode):
+ self._notificationType = self._notificationType.encode("utf-8")
</ins><span class="cx"> self._loadPropertyStore()
</span><span class="cx"> returnValue(self)
</span><span class="cx"> else:
</span><span class="lines">@@ -5777,6 +5793,8 @@
</span><span class="cx"> self._notificationData = json.loads(self._notificationData)
</span><span class="cx"> except ValueError:
</span><span class="cx"> pass
</span><ins>+ if isinstance(self._notificationData, unicode):
+ self._notificationData = self._notificationData.encode("utf-8")
</ins><span class="cx"> returnValue(self._notificationData)
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -38,10 +38,10 @@
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> from twext.enterprise.adbapi2 import ConnectionPool
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
</ins><span class="cx">
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.internet import reactor
</span><span class="lines">@@ -112,6 +112,11 @@
</span><span class="cx"> def recordWithUID(self, uid):
</span><span class="cx"> return self.records.get(uid)
</span><span class="cx">
</span><ins>+ def recordWithGUID(self, guid):
+ for record in self.records.itervalues():
+ if record.guid == guid:
+ return record
+ return None
</ins><span class="cx">
</span><span class="cx"> def addRecord(self, record):
</span><span class="cx"> self.records[record.uid] = record
</span><span class="lines">@@ -122,11 +127,13 @@
</span><span class="cx">
</span><span class="cx"> implements(IStoreDirectoryRecord)
</span><span class="cx">
</span><del>- def __init__(self, uid, shortNames, fullName):
</del><ins>+ def __init__(self, uid, shortNames, fullName, extras={}):
</ins><span class="cx"> self.uid = uid
</span><ins>+ self.guid = uid
</ins><span class="cx"> self.shortNames = shortNames
</span><span class="cx"> self.fullName = fullName
</span><span class="cx"> self.displayName = self.fullName if self.fullName else self.shortNames[0]
</span><ins>+ self.extras = extras
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_4_to_5py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,7 +15,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx">
</span><del>-from twext.web2.dav.resource import TwistedQuotaUsedProperty, TwistedGETContentMD5
</del><ins>+from txweb2.dav.resource import TwistedQuotaUsedProperty, TwistedGETContentMD5
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradetesttest_migratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx"> from twext.enterprise.adbapi2 import Pickle
</span><span class="cx"> from twext.enterprise.dal.syntax import Delete
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, Deferred, returnValue
</span><span class="cx"> from twisted.internet.protocol import Protocol
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommonidirectoryservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -39,8 +39,15 @@
</span><span class="cx"> @rtype: L{IStoreDirectoryRecord}
</span><span class="cx"> """
</span><span class="cx">
</span><ins>+ def recordWithGUID(guid): #@NoSelf
+ """
+ Return the record for the specified store guid.
</ins><span class="cx">
</span><ins>+ @return: the record.
+ @rtype: L{IStoreDirectoryRecord}
+ """
</ins><span class="cx">
</span><ins>+
</ins><span class="cx"> class IStoreDirectoryRecord(Interface):
</span><span class="cx"> """
</span><span class="cx"> Directory record object
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavidavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx"> using C{abort()}.
</span><span class="cx">
</span><span class="cx"> Also, keys must be L{IPropertyName} providers and values must be
</span><del>- L{twext.web2.element.dav.base.WeDAVElement}s.
</del><ins>+ L{txweb2.element.dav.base.WeDAVElement}s.
</ins><span class="cx"> """
</span><span class="cx"> # FIXME: the type for values isn't quite right, there should be some more
</span><span class="cx"> # specific interface for that.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavxmlbasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -51,7 +51,7 @@
</span><span class="cx"> import re
</span><span class="cx">
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.http_headers import parseDateTime
</del><ins>+from txweb2.http_headers import parseDateTime
</ins><span class="cx">
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavxmlrfc2518py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,8 +33,8 @@
</span><span class="cx"> __all__ = []
</span><span class="cx">
</span><span class="cx">
</span><del>-from twext.web2 import responsecode
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.http_headers import MimeType
</ins><span class="cx">
</span><span class="cx"> from txdav.xml.base import WebDAVElement, WebDAVTextElement, PCDATAElement
</span><span class="cx"> from txdav.xml.base import WebDAVEmptyElement, WebDAVOneShotElement
</span><span class="lines">@@ -366,7 +366,7 @@
</span><span class="cx"> def fromResponseCode(clazz, code):
</span><span class="cx"> """
</span><span class="cx"> code must be an integer response code in
</span><del>- twext.web2.responsecode.RESPONSES.keys()
</del><ins>+ txweb2.responsecode.RESPONSES.keys()
</ins><span class="cx"> """
</span><span class="cx"> if code not in responsecode.RESPONSES:
</span><span class="cx"> raise ValueError("Invalid response code: %r" % (code,))
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavxmltesttest_xml_rfc3744py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx"> from twisted.trial import unittest
</span><span class="cx">
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import davPrivilegeSet
</del><ins>+from txweb2.dav.resource import davPrivilegeSet
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> class XML_3744(unittest.TestCase):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxweb2"></a>
<div class="propset"><h4>Property changes: CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnignore"></a>
<div class="addfile"><h4>Added: svn:ignore</h4></div>
</div>
</body>
</html>