public function GetCalendarProperties(CDavResource $resource, $siteId, $account = null, $arPath = null, $options = 0) { $resource->AddProperty('resourcetype', array(array('collection', ''), array('calendar', '', CDavGroupDav::CALDAV))); $resource->AddProperty('component-set', 'VEVENT', CDavGroupDav::GROUPDAV); $resource->AddProperty('supported-calendar-component-set', array(array('comp', array('name' => 'VCALENDAR'), CDavGroupDav::CALDAV), array('comp', array('name' => 'VTIMEZONE'), CDavGroupDav::CALDAV), array('comp', array('name' => 'VEVENT'), CDavGroupDav::CALDAV)), CDavGroupDav::CALDAV); $resource->AddProperty('supported-report-set', array('supported-report', array(CDavResource::MakeProp('report', array(CDavResource::MakeProp('calendar-multiget', '', CDavGroupDav::CALDAV)))))); $resource->AddProperty('supported-calendar-data', array(array('calendar-data', array('content-type' => 'text/calendar', 'version' => '2.0'), CDavGroupDav::CALDAV), array('calendar-data', array('content-type' => 'text/x-calendar', 'version' => '1.0'), CDavGroupDav::CALDAV)), CDavGroupDav::CALDAV); $calendarId = $this->GetCalendarId($siteId, $account, $arPath); $arCalendarList = CCalendar::GetCalendarList($calendarId); if (count($arCalendarList) > 0) { $resource->AddProperty('displayname', $arCalendarList[0]["NAME"], CDavGroupDav::DAV); $resource->AddProperty('calendar-description', $arCalendarList[0]["DESCRIPTION"], CDavGroupDav::CALDAV); $resource->AddProperty('calendar-color', $arCalendarList[0]["COLOR"], CDavGroupDav::ICAL); } $request = $this->groupdav->GetRequest(); $resource->AddProperty('getctag', $this->GetCTag($siteId, $account, $arPath), CDavGroupDav::CALENDARSERVER); $arAccount = null; if ($account != null) { $arAccount = CDavAccount::GetAccountById($account); $resource->AddProperty('calendar-user-address-set', array(array('href', 'MAILTO:' . $arAccount['EMAIL']), array('href', $request->GetBaseUri() . '/principals/' . $arAccount["TYPE"] . '/' . $arAccount["CODE"] . '/'), array('href', 'urn:uuid:' . $arAccount["ID"])), CDavGroupDav::CALDAV); } }
public function GetAddressbookProperties(CDavResource $resource, $siteId, $account = null, $arPath = null, $options = 0) { $resource->AddProperty('resourcetype', array(array('collection', ''), array('vcard-collection', '', CDavGroupDav::GROUPDAV), array('addressbook', '', CDavGroupDav::CARDDAV))); $resource->AddProperty('component-set', 'VCARD', CDavGroupDav::GROUPDAV); $resource->AddProperty('supported-report-set', array(array('supported-report', array(CDavResource::MakeProp('report', array(CDavResource::MakeProp('addressbook-query', '', CDavGroupDav::CARDDAV))))), array('supported-report', array(CDavResource::MakeProp('report', array(CDavResource::MakeProp('addressbook-multiget', '', CDavGroupDav::CARDDAV))))))); $resource->AddProperty('getctag', $this->GetCTag($siteId, $account, $arPath), CDavGroupDav::CALENDARSERVER); $arAccount = null; if ($account != null) { $arAccount = CDavAccount::GetAccountById($account); $resource->AddProperty('addressbook-description', $arAccount["NAME"], CDavGroupDav::CARDDAV); } }
protected function AddUser(&$arResources, $siteId, $arUser) { $request = $this->groupdav->GetRequest(); $resource = new CDavResource('/principals/user/' . $arUser['CODE'] . '/'); $resource->AddProperty('displayname', $arUser["NAME"]); $resource->AddProperty('getetag', $this->GetETag($arUser)); $resource->AddProperty('resourcetype', array(array('principal', '', CDavGroupDav::DAV))); $resource->AddProperty('alternate-URI-set', array(array('href', 'MAILTO:' . $arUser['EMAIL']))); $resource->AddProperty('principal-URL', array(array('href', $request->GetBaseUri() . '/principals/user/' . $arUser['CODE'] . '/'))); $resource->AddProperty('calendar-home-set', array(array('href', $request->GetBaseUri() . "/" . $siteId . "/" . $arUser["CODE"] . "/calendar/")), CDavGroupDav::CALDAV); $resource->AddProperty('calendar-user-address-set', array(array('href', 'MAILTO:' . $arUser['EMAIL']), array('href', $request->GetBaseUri() . '/principals/user/' . $arUser['CODE'] . '/'), array('href', 'urn:uuid:' . $arUser['ID'])), CDavGroupDav::CALDAV); $resource->AddProperty('schedule-outbox-URL', array(array('href', $request->GetBaseUri() . "/" . $siteId . "/" . $arUser["CODE"] . "/calendar/", CDavGroupDav::DAV)), CDavGroupDav::CALDAV); $resource->AddProperty('email-address-set', array(array('email-address', $arUser['EMAIL'], CDavGroupDav::CALENDARSERVER)), CDavGroupDav::CALENDARSERVER); $resource->AddProperty('last-name', $arUser['LAST_NAME'], CDavGroupDav::CALENDARSERVER); $resource->AddProperty('first-name', $arUser['FIRST_NAME'], CDavGroupDav::CALENDARSERVER); $resource->AddProperty('record-type', 'user', CDavGroupDav::CALENDARSERVER); $resource->AddProperty('calendar-user-type', 'INDIVIDUAL', CDavGroupDav::CALDAV); $resource->AddProperty('addressbook-home-set', array(array('href', $request->GetBaseUri() . "/" . $siteId . "/" . $arUser["CODE"] . "/")), CDavGroupDav::CARDDAV); $resource->AddProperty('supported-report-set', array('supported-report', array(CDavResource::MakeProp('report', array(CDavResource::MakeProp('acl-principal-prop-set', '')))))); //$memberships = array(); //$arUserGroups = CUser::GetUserGroup($arUser["ID"]); //foreach ($arUserGroups as $groupId) // $memberships[] = CDavWebDav::MakeProp('href', $this->baseUri.'/principals/groups/'.$groupId); //$resource->AddProperty('group-member-ship', $memberships); $arResources[] = $resource; }
protected function PROPFINDWrapper($handler = 'PROPFIND') { /** @var CDavRequest $request */ $request = $this->request; $response = $this->response; try { $requestDocument = $request->GetXmlDocument(); } catch (CDavXMLParsingException $e) { $response->GenerateError("400 Error", $e->getMessage()); return; } catch (Exception $e) { $response->SetHttpStatus("400 Error"); return; } $arResources = array(); $retVal = $this->{$handler}($arResources); if ($retVal === false) { if (method_exists($this, "CheckLock")) { $arLock = $this->CheckLock($request->GetPath()); if (is_array($arLock) && count($arLock) > 0) { $resource = new CDavResource(); $resource->ExtractFromLock($request->GetPath(), $arLock); $arResources[] = $resource; } } if (count($arResources) == 0) { $response->SetHttpStatus("404 Not Found"); return; } } elseif (is_string($retVal)) { $message = ""; if (substr($retVal, 0, 3) == '501') { $message .= "The requested feature is not supported by this server.\n"; } $response->GenerateError($retVal, $message); return; } $response->SetHttpStatus('207 Multi-Status'); $dav = array(1); $allow = false; if (method_exists($this, 'OPTIONS')) { $this->OPTIONS($dav, $allow); } $response->AddHeader("DAV: " . join(",", $dav)); $response->AddHeader('Content-Type: text/xml; charset="utf-8"'); $response->AddLine("<D:multistatus xmlns:D=\"DAV:\"" . ($this instanceof CDavWebDavServer ? " xmlns:Office=\"urn:schemas-microsoft-com:office:office\" xmlns:Repl=\"http://schemas.microsoft.com/repl/\" xmlns:Z=\"urn:schemas-microsoft-com:\"" : "") . ">"); $bRequestedAllProp = count($requestDocument->GetPath('/*/DAV::allprop')) > 0; if ($this instanceof CDavWebDavServer) { $bRequestedAllProp = true; } $bRequestedPropName = count($requestDocument->GetPath('/*/DAV::propname')) > 0; $arRequestedPropsList = array(); if (!$bRequestedAllProp) { $ar = $requestDocument->GetPath('/*/DAV::prop/*'); foreach ($ar as $pw) { $arRequestedPropsList[] = array("xmlns" => $pw->GetXmlNS(), "tagname" => $pw->GetTag()); } } foreach ($arResources as $resource) { /** @var CDavResource $resource */ $arResourceProps = $resource->GetProperties(); $arRequestedProps =& $arRequestedPropsList; if ($bRequestedAllProp) { $arRequestedProps =& $arResourceProps; } $xmlnsHash = array('DAV:' => 'D'); $xmlnsDefs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"'; $arPropStat = array("200" => array(), "404" => array()); foreach ($arRequestedProps as &$requestedProp) { $bFound = false; foreach ($arResourceProps as &$prop) { if ($requestedProp["tagname"] == $prop["tagname"] && $requestedProp["xmlns"] == $prop["xmlns"]) { $arPropStat["200"][] =& $prop; $bFound = true; break; } } if (!$bFound) { if ($requestedProp["xmlns"] === "DAV:" && $requestedProp["tagname"] === "lockdiscovery") { $arPropStat["200"][] = CDavResource::MakeProp("lockdiscovery", $this->LockDiscovery($resource->GetPath()), "DAV:"); $bFound = true; } elseif ($request->GetParameter('HTTP_BRIEF') != 't') { $arPropStat["404"][] = CDavResource::MakeProp($requestedProp["tagname"], "", $requestedProp["xmlns"]); } } if (!empty($requestedProp["xmlns"]) && ($bFound || $request->GetParameter('HTTP_BRIEF') != 't')) { $xmlns = $requestedProp["xmlns"]; if (!isset($xmlnsHash[$xmlns])) { $n = "ns" . (count($xmlnsHash) + 1); $xmlnsHash[$xmlns] = $n; $xmlnsDefs .= " xmlns:{$n}=\"{$xmlns}\""; } } } $response->AddLine(" <D:response %s>", $xmlnsDefs); $href = $this->UrlEncode($response->Encode(rtrim($request->GetBaseUri(), '/') . "/" . ltrim($resource->GetPath(), '/'))); $response->AddLine(" <D:href>%s</D:href>", $href); if (count($arPropStat["200"]) > 0) { $response->AddLine(" <D:propstat>"); $response->AddLine(" <D:prop>"); foreach ($arPropStat["200"] as &$p) { CDavResource::RenderProperty($p, $xmlnsHash, $response, $request); } $response->AddLine(" </D:prop>"); $response->AddLine(" <D:status>HTTP/1.1 200 OK</D:status>"); $response->AddLine(" </D:propstat>"); } if (count($arPropStat["404"]) > 0) { $response->AddLine(" <D:propstat>"); $response->AddLine(" <D:prop>"); foreach ($arPropStat["404"] as &$p) { CDavResource::RenderProperty($p, $xmlnsHash, $response, $request); } $response->AddLine(" </D:prop>"); $response->AddLine(" <D:status>HTTP/1.1 404 Not Found</D:status>"); $response->AddLine(" </D:propstat>"); } $response->AddLine(" </D:response>"); } $response->AddLine("</D:multistatus>"); }