示例#1
0
 /**
  * beforeGetProperties
  *
  * This method handler is invoked before any after properties for a
  * resource are fetched. This allows us to add in any CalDAV specific
  * properties.
  *
  * @param string $path
  * @param Sabre_DAV_INode $node
  * @param array $requestedProperties
  * @param array $returnedProperties
  * @return void
  */
 public function beforeGetProperties($path, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties)
 {
     if ($node instanceof Sabre_DAVACL_IPrincipal) {
         // calendar-home-set property
         $calHome = '{' . self::NS_CALDAV . '}calendar-home-set';
         if (in_array($calHome, $requestedProperties)) {
             $principalId = $node->getName();
             $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/';
             unset($requestedProperties[$calHome]);
             $returnedProperties[200][$calHome] = new Sabre_DAV_Property_Href($calendarHomePath);
         }
         // schedule-outbox-URL property
         $scheduleProp = '{' . self::NS_CALDAV . '}schedule-outbox-URL';
         if (in_array($scheduleProp, $requestedProperties)) {
             $principalId = $node->getName();
             $outboxPath = self::CALENDAR_ROOT . '/' . $principalId . '/outbox';
             unset($requestedProperties[$scheduleProp]);
             $returnedProperties[200][$scheduleProp] = new Sabre_DAV_Property_Href($outboxPath);
         }
         // calendar-user-address-set property
         $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set';
         if (in_array($calProp, $requestedProperties)) {
             $addresses = $node->getAlternateUriSet();
             $addresses[] = $this->server->getBaseUri() . $node->getPrincipalUrl();
             unset($requestedProperties[$calProp]);
             $returnedProperties[200][$calProp] = new Sabre_DAV_Property_HrefList($addresses, false);
         }
         // These two properties are shortcuts for ical to easily find
         // other principals this principal has access to.
         $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for';
         $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for';
         if (in_array($propRead, $requestedProperties) || in_array($propWrite, $requestedProperties)) {
             $membership = $node->getGroupMembership();
             $readList = array();
             $writeList = array();
             foreach ($membership as $group) {
                 $groupNode = $this->server->tree->getNodeForPath($group);
                 // If the node is either ap proxy-read or proxy-write
                 // group, we grab the parent principal and add it to the
                 // list.
                 if ($groupNode instanceof Sabre_CalDAV_Principal_ProxyRead) {
                     list($readList[]) = Sabre_DAV_URLUtil::splitPath($group);
                 }
                 if ($groupNode instanceof Sabre_CalDAV_Principal_ProxyWrite) {
                     list($writeList[]) = Sabre_DAV_URLUtil::splitPath($group);
                 }
             }
             if (in_array($propRead, $requestedProperties)) {
                 unset($requestedProperties[$propRead]);
                 $returnedProperties[200][$propRead] = new Sabre_DAV_Property_HrefList($readList);
             }
             if (in_array($propWrite, $requestedProperties)) {
                 unset($requestedProperties[$propWrite]);
                 $returnedProperties[200][$propWrite] = new Sabre_DAV_Property_HrefList($writeList);
             }
         }
     }
     // instanceof IPrincipal
     if ($node instanceof Sabre_CalDAV_ICalendarObject) {
         // The calendar-data property is not supposed to be a 'real'
         // property, but in large chunks of the spec it does act as such.
         // Therefore we simply expose it as a property.
         $calDataProp = '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}calendar-data';
         if (in_array($calDataProp, $requestedProperties)) {
             unset($requestedProperties[$calDataProp]);
             $val = $node->get();
             if (is_resource($val)) {
                 $val = stream_get_contents($val);
             }
             // Taking out \r to not screw up the xml output
             $returnedProperties[200][$calDataProp] = str_replace("\r", "", $val);
         }
     }
 }
示例#2
0
 /**
  * Triggered before properties are looked up in specific nodes. 
  * 
  * @param string $uri 
  * @param Sabre_DAV_INode $node 
  * @param array $requestedProperties 
  * @param array $returnedProperties
  * @TODO really should be broken into multiple methods, or even a class. 
  * @return void
  */
 public function beforeGetProperties($uri, Sabre_DAV_INode $node, &$requestedProperties, &$returnedProperties)
 {
     // Checking the read permission
     if (!$this->checkPrivileges($uri, '{DAV:}read', self::R_PARENT, false)) {
         // User is not allowed to read properties
         if ($this->hideNodesFromListings) {
             return false;
         }
         // Marking all requested properties as '403'.
         foreach ($requestedProperties as $key => $requestedProperty) {
             unset($requestedProperties[$key]);
             $returnedProperties[403][$requestedProperty] = null;
         }
         return;
     }
     /* Adding principal properties */
     if ($node instanceof Sabre_DAVACL_IPrincipal) {
         if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) {
             unset($requestedProperties[$index]);
             $returnedProperties[200]['{DAV:}alternate-URI-set'] = new Sabre_DAV_Property_HrefList($node->getAlternateUriSet());
         }
         if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) {
             unset($requestedProperties[$index]);
             $returnedProperties[200]['{DAV:}principal-URL'] = new Sabre_DAV_Property_Href($node->getPrincipalUrl() . '/');
         }
         if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) {
             unset($requestedProperties[$index]);
             $returnedProperties[200]['{DAV:}group-member-set'] = new Sabre_DAV_Property_HrefList($node->getGroupMemberSet());
         }
         if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) {
             unset($requestedProperties[$index]);
             $returnedProperties[200]['{DAV:}group-membership'] = new Sabre_DAV_Property_HrefList($node->getGroupMembership());
         }
         if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) {
             $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName();
         }
     }
     if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) {
         unset($requestedProperties[$index]);
         $val = $this->principalCollectionSet;
         // Ensuring all collections end with a slash
         foreach ($val as $k => $v) {
             $val[$k] = $v . '/';
         }
         $returnedProperties[200]['{DAV:}principal-collection-set'] = new Sabre_DAV_Property_HrefList($val);
     }
     if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) {
         unset($requestedProperties[$index]);
         if ($url = $this->getCurrentUserPrincipal()) {
             $returnedProperties[200]['{DAV:}current-user-principal'] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::HREF, $url . '/');
         } else {
             $returnedProperties[200]['{DAV:}current-user-principal'] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::UNAUTHENTICATED);
         }
     }
     if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) {
         unset($requestedProperties[$index]);
         $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Sabre_DAVACL_Property_SupportedPrivilegeSet($this->getSupportedPrivilegeSet());
     }
     if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) {
         if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) {
             $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null;
             unset($requestedProperties[$index]);
         } else {
             $val = $this->getCurrentUserPrivilegeSet($node);
             if (!is_null($val)) {
                 unset($requestedProperties[$index]);
                 $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Sabre_DAVACL_Property_CurrentUserPrivilegeSet($val);
             }
         }
     }
     /* The ACL property contains all the permissions */
     if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) {
         if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) {
             unset($requestedProperties[$index]);
             $returnedProperties[403]['{DAV:}acl'] = null;
         } else {
             $acl = $this->getACL($node);
             if (!is_null($acl)) {
                 unset($requestedProperties[$index]);
                 $returnedProperties[200]['{DAV:}acl'] = new Sabre_DAVACL_Property_Acl($this->getACL($node));
             }
         }
     }
 }