source: pmb4.2/trunk/fuentes/pmb/admin/connecteurs/out/webdav/lib/Sabre/DAVACL/Property/Acl.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 6.3 KB
Line 
1<?php
2
3namespace Sabre\DAVACL\Property;
4
5use Sabre\DAV;
6
7/**
8 * This class represents the {DAV:}acl property
9 *
10 * @copyright Copyright (C) 2007-2013 Rooftop Solutions. All rights reserved.
11 * @author Evert Pot (http://www.rooftopsolutions.nl/)
12 * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
13 */
14class Acl extends DAV\Property {
15
16    /**
17     * List of privileges
18     *
19     * @var array
20     */
21    private $privileges;
22
23    /**
24     * Whether or not the server base url is required to be prefixed when
25     * serializing the property.
26     *
27     * @var boolean
28     */
29    private $prefixBaseUrl;
30
31    /**
32     * Constructor
33     *
34     * This object requires a structure similar to the return value from
35     * Sabre\DAVACL\Plugin::getACL().
36     *
37     * Each privilege is a an array with at least a 'privilege' property, and a
38     * 'principal' property. A privilege may have a 'protected' property as
39     * well.
40     *
41     * The prefixBaseUrl should be set to false, if the supplied principal urls
42     * are already full urls. If this is kept to true, the servers base url
43     * will automatically be prefixed.
44     *
45     * @param bool $prefixBaseUrl
46     * @param array $privileges
47     */
48    public function __construct(array $privileges, $prefixBaseUrl = true) {
49
50        $this->privileges = $privileges;
51        $this->prefixBaseUrl = $prefixBaseUrl;
52
53    }
54
55    /**
56     * Returns the list of privileges for this property
57     *
58     * @return array
59     */
60    public function getPrivileges() {
61
62        return $this->privileges;
63
64    }
65
66    /**
67     * Serializes the property into a DOMElement
68     *
69     * @param DAV\Server $server
70     * @param \DOMElement $node
71     * @return void
72     */
73    public function serialize(DAV\Server $server,\DOMElement $node) {
74
75        $doc = $node->ownerDocument;
76        foreach($this->privileges as $ace) {
77
78            $this->serializeAce($doc, $node, $ace, $server);
79
80        }
81
82    }
83
84    /**
85     * Unserializes the {DAV:}acl xml element.
86     *
87     * @param \DOMElement $dom
88     * @return Acl
89     */
90    static public function unserialize(\DOMElement $dom) {
91
92        $privileges = array();
93        $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace');
94        for($ii=0; $ii < $xaces->length; $ii++) {
95
96            $xace = $xaces->item($ii);
97            $principal = $xace->getElementsByTagNameNS('urn:DAV','principal');
98            if ($principal->length !== 1) {
99                throw new DAV\Exception\BadRequest('Each {DAV:}ace element must have one {DAV:}principal element');
100            }
101            $principal = Principal::unserialize($principal->item(0));
102
103            switch($principal->getType()) {
104                case Principal::HREF :
105                    $principal = $principal->getHref();
106                    break;
107                case Principal::AUTHENTICATED :
108                    $principal = '{DAV:}authenticated';
109                    break;
110                case Principal::UNAUTHENTICATED :
111                    $principal = '{DAV:}unauthenticated';
112                    break;
113                case Principal::ALL :
114                    $principal = '{DAV:}all';
115                    break;
116
117            }
118
119            $protected = false;
120
121            if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) {
122                $protected = true;
123            }
124
125            $grants = $xace->getElementsByTagNameNS('urn:DAV','grant');
126            if ($grants->length < 1) {
127                throw new DAV\Exception\NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported');
128            }
129            $grant = $grants->item(0);
130
131            $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege');
132            for($jj=0; $jj<$xprivs->length; $jj++) {
133
134                $xpriv = $xprivs->item($jj);
135
136                $privilegeName = null;
137
138                for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) {
139
140                    $childNode = $xpriv->childNodes->item($kk);
141                    if ($t = DAV\XMLUtil::toClarkNotation($childNode)) {
142                        $privilegeName = $t;
143                        break;
144                    }
145                }
146                if (is_null($privilegeName)) {
147                    throw new DAV\Exception\BadRequest('{DAV:}privilege elements must have a privilege element contained within them.');
148                }
149
150                $privileges[] = array(
151                    'principal' => $principal,
152                    'protected' => $protected,
153                    'privilege' => $privilegeName,
154                );
155
156            }
157
158        }
159
160        return new self($privileges);
161
162    }
163
164    /**
165     * Serializes a single access control entry.
166     *
167     * @param \DOMDocument $doc
168     * @param \DOMElement $node
169     * @param array $ace
170     * @param DAV\Server $server
171     * @return void
172     */
173    private function serializeAce($doc,$node,$ace, DAV\Server $server) {
174
175        $xace  = $doc->createElementNS('DAV:','d:ace');
176        $node->appendChild($xace);
177
178        $principal = $doc->createElementNS('DAV:','d:principal');
179        $xace->appendChild($principal);
180        switch($ace['principal']) {
181            case '{DAV:}authenticated' :
182                $principal->appendChild($doc->createElementNS('DAV:','d:authenticated'));
183                break;
184            case '{DAV:}unauthenticated' :
185                $principal->appendChild($doc->createElementNS('DAV:','d:unauthenticated'));
186                break;
187            case '{DAV:}all' :
188                $principal->appendChild($doc->createElementNS('DAV:','d:all'));
189                break;
190            default:
191                $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/'));
192        }
193
194        $grant = $doc->createElementNS('DAV:','d:grant');
195        $xace->appendChild($grant);
196
197        $privParts = null;
198
199        preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts);
200
201        $xprivilege = $doc->createElementNS('DAV:','d:privilege');
202        $grant->appendChild($xprivilege);
203
204        $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2]));
205
206        if (isset($ace['protected']) && $ace['protected'])
207            $xace->appendChild($doc->createElement('d:protected'));
208
209    }
210
211}
Note: See TracBrowser for help on using the repository browser.