privileges = $privileges; $this->prefixBaseUrl = $prefixBaseUrl; } /** * Returns the list of privileges for this property. * * @return array */ public function getPrivileges() { return $this->privileges; } /** * The xmlSerialize method 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 XmlSerializable 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 */ public 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 */ public 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 statically, 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 */ public 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 ('{DAV:}ace' !== $element['name']) { 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 ('{DAV:}privilege' !== $elem['name']) { 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 */ 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 } }