1<?php
2
3namespace Sabre\CalDAV\Principal;
4
5use Sabre\DAV;
6use Sabre\DAVACL;
7
8/**
9 * ProxyWrite principal
10 *
11 * This class represents a principal group, hosted under the main principal.
12 * This is needed to implement 'Calendar delegation' support. This class is
13 * instantiated by User.
14 *
15 * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
16 * @author Evert Pot (http://evertpot.com/)
17 * @license http://sabre.io/license/ Modified BSD License
18 */
19class ProxyWrite implements IProxyWrite {
20
21    /**
22     * Parent principal information
23     *
24     * @var array
25     */
26    protected $principalInfo;
27
28    /**
29     * Principal Backend
30     *
31     * @var DAVACL\PrincipalBackend\BackendInterface
32     */
33    protected $principalBackend;
34
35    /**
36     * Creates the object
37     *
38     * Note that you MUST supply the parent principal information.
39     *
40     * @param DAVACL\PrincipalBackend\BackendInterface $principalBackend
41     * @param array $principalInfo
42     */
43    function __construct(DAVACL\PrincipalBackend\BackendInterface $principalBackend, array $principalInfo) {
44
45        $this->principalInfo = $principalInfo;
46        $this->principalBackend = $principalBackend;
47
48    }
49
50    /**
51     * Returns this principals name.
52     *
53     * @return string
54     */
55    function getName() {
56
57        return 'calendar-proxy-write';
58
59    }
60
61    /**
62     * Returns the last modification time
63     *
64     * @return null
65     */
66    function getLastModified() {
67
68        return null;
69
70    }
71
72    /**
73     * Deletes the current node
74     *
75     * @throws DAV\Exception\Forbidden
76     * @return void
77     */
78    function delete() {
79
80        throw new DAV\Exception\Forbidden('Permission denied to delete node');
81
82    }
83
84    /**
85     * Renames the node
86     *
87     * @param string $name The new name
88     * @throws DAV\Exception\Forbidden
89     * @return void
90     */
91    function setName($name) {
92
93        throw new DAV\Exception\Forbidden('Permission denied to rename file');
94
95    }
96
97
98    /**
99     * Returns a list of alternative urls for a principal
100     *
101     * This can for example be an email address, or ldap url.
102     *
103     * @return array
104     */
105    function getAlternateUriSet() {
106
107        return [];
108
109    }
110
111    /**
112     * Returns the full principal url
113     *
114     * @return string
115     */
116    function getPrincipalUrl() {
117
118        return $this->principalInfo['uri'] . '/' . $this->getName();
119
120    }
121
122    /**
123     * Returns the list of group members
124     *
125     * If this principal is a group, this function should return
126     * all member principal uri's for the group.
127     *
128     * @return array
129     */
130    function getGroupMemberSet() {
131
132        return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl());
133
134    }
135
136    /**
137     * Returns the list of groups this principal is member of
138     *
139     * If this principal is a member of a (list of) groups, this function
140     * should return a list of principal uri's for it's members.
141     *
142     * @return array
143     */
144    function getGroupMembership() {
145
146        return $this->principalBackend->getGroupMembership($this->getPrincipalUrl());
147
148    }
149
150    /**
151     * Sets a list of group members
152     *
153     * If this principal is a group, this method sets all the group members.
154     * The list of members is always overwritten, never appended to.
155     *
156     * This method should throw an exception if the members could not be set.
157     *
158     * @param array $principals
159     * @return void
160     */
161    function setGroupMemberSet(array $principals) {
162
163        $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals);
164
165    }
166
167    /**
168     * Returns the displayname
169     *
170     * This should be a human readable name for the principal.
171     * If none is available, return the nodename.
172     *
173     * @return string
174     */
175    function getDisplayName() {
176
177        return $this->getName();
178
179    }
180
181}
182