privileges = $privileges; $this->prefixBaseUrl = $prefixBaseUrl; } /** * Returns the list of privileges for this property * * @return array */ function getPrivileges() { return $this->privileges; } /** * The xmlSerialize metod is called during xml writing. * * Use the $writer argument to write its own xml serialization. * * An important note: do _not_ create a parent element. Any element * implementing XmlSerializble should only ever write what's considered * its 'inner xml'. * * The parent of the current element is responsible for writing a * containing element. * * This allows serializers to be re-used for different element names. * * If you are opening new elements, you must also close them again. * * @param Writer $writer * @return void */ function xmlSerialize(Writer $writer) { foreach ($this->privileges as $ace) { $this->serializeAce($writer, $ace); } } /** * Generate html representation for this value. * * The html output is 100% trusted, and no effort is being made to sanitize * it. It's up to the implementor to sanitize user provided values. * * The output must be in UTF-8. * * The baseUri parameter is a url to the root of the application, and can * be used to construct local links. * * @param HtmlOutputHelper $html * @return string */ function toHtml(HtmlOutputHelper $html) { ob_start(); echo ""; echo ""; foreach ($this->privileges as $privilege) { echo ''; // if it starts with a {, it's a special principal if ($privilege['principal'][0] === '{') { echo ''; } else { echo ''; } echo ''; echo ''; echo ''; } echo "
PrincipalPrivilege
', $html->xmlName($privilege['principal']), '', $html->link($privilege['principal']), '', $html->xmlName($privilege['privilege']), ''; if (!empty($privilege['protected'])) echo '(protected)'; echo '
"; return ob_get_clean(); } /** * The deserialize method is called during xml parsing. * * This method is called statictly, this is because in theory this method * may be used as a type of constructor, or factory method. * * Often you want to return an instance of the current class, but you are * free to return other data as well. * * Important note 2: You are responsible for advancing the reader to the * next element. Not doing anything will result in a never-ending loop. * * If you just want to skip parsing for this element altogether, you can * just call $reader->next(); * * $reader->parseInnerTree() will parse the entire sub-tree, and advance to * the next element. * * @param Reader $reader * @return mixed */ static function xmlDeserialize(Reader $reader) { $elementMap = [ '{DAV:}ace' => 'Sabre\Xml\Element\KeyValue', '{DAV:}privilege' => 'Sabre\Xml\Element\Elements', '{DAV:}principal' => 'Sabre\DAVACL\Xml\Property\Principal', ]; $privileges = []; foreach ((array)$reader->parseInnerTree($elementMap) as $element) { if ($element['name'] !== '{DAV:}ace') { continue; } $ace = $element['value']; if (empty($ace['{DAV:}principal'])) { throw new DAV\Exception\BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); } $principal = $ace['{DAV:}principal']; switch ($principal->getType()) { case Principal::HREF : $principal = $principal->getHref(); break; case Principal::AUTHENTICATED : $principal = '{DAV:}authenticated'; break; case Principal::UNAUTHENTICATED : $principal = '{DAV:}unauthenticated'; break; case Principal::ALL : $principal = '{DAV:}all'; break; } $protected = array_key_exists('{DAV:}protected', $ace); if (!isset($ace['{DAV:}grant'])) { throw new DAV\Exception\NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); } foreach ($ace['{DAV:}grant'] as $elem) { if ($elem['name'] !== '{DAV:}privilege') { continue; } foreach ($elem['value'] as $priv) { $privileges[] = [ 'principal' => $principal, 'protected' => $protected, 'privilege' => $priv, ]; } } } return new self($privileges); } /** * Serializes a single access control entry. * * @param Writer $writer * @param array $ace * @return void */ private function serializeAce(Writer $writer, array $ace) { $writer->startElement('{DAV:}ace'); switch ($ace['principal']) { case '{DAV:}authenticated' : $principal = new Principal(Principal::AUTHENTICATED); break; case '{DAV:}unauthenticated' : $principal = new Principal(Principal::UNAUTHENTICATED); break; case '{DAV:}all' : $principal = new Principal(Principal::ALL); break; default: $principal = new Principal(Principal::HREF, $ace['principal']); break; } $writer->writeElement('{DAV:}principal', $principal); $writer->startElement('{DAV:}grant'); $writer->startElement('{DAV:}privilege'); $writer->writeElement($ace['privilege']); $writer->endElement(); // privilege $writer->endElement(); // grant if (!empty($ace['protected'])) { $writer->writeElement('{DAV:}protected'); } $writer->endElement(); // ace } }