1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\CardDAV; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\DAV; 6*a1a3b679SAndreas Boehleruse Sabre\DAV\MkCol; 7*a1a3b679SAndreas Boehleruse Sabre\DAVACL; 8*a1a3b679SAndreas Boehleruse Sabre\Uri; 9*a1a3b679SAndreas Boehler 10*a1a3b679SAndreas Boehler/** 11*a1a3b679SAndreas Boehler * AddressBook Home class 12*a1a3b679SAndreas Boehler * 13*a1a3b679SAndreas Boehler * This collection contains a list of addressbooks associated with one user. 14*a1a3b679SAndreas Boehler * 15*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/). 16*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/) 17*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License 18*a1a3b679SAndreas Boehler */ 19*a1a3b679SAndreas Boehlerclass AddressBookHome extends DAV\Collection implements DAV\IExtendedCollection, DAVACL\IACL { 20*a1a3b679SAndreas Boehler 21*a1a3b679SAndreas Boehler /** 22*a1a3b679SAndreas Boehler * Principal uri 23*a1a3b679SAndreas Boehler * 24*a1a3b679SAndreas Boehler * @var array 25*a1a3b679SAndreas Boehler */ 26*a1a3b679SAndreas Boehler protected $principalUri; 27*a1a3b679SAndreas Boehler 28*a1a3b679SAndreas Boehler /** 29*a1a3b679SAndreas Boehler * carddavBackend 30*a1a3b679SAndreas Boehler * 31*a1a3b679SAndreas Boehler * @var Backend\BackendInterface 32*a1a3b679SAndreas Boehler */ 33*a1a3b679SAndreas Boehler protected $carddavBackend; 34*a1a3b679SAndreas Boehler 35*a1a3b679SAndreas Boehler /** 36*a1a3b679SAndreas Boehler * Constructor 37*a1a3b679SAndreas Boehler * 38*a1a3b679SAndreas Boehler * @param Backend\BackendInterface $carddavBackend 39*a1a3b679SAndreas Boehler * @param string $principalUri 40*a1a3b679SAndreas Boehler */ 41*a1a3b679SAndreas Boehler function __construct(Backend\BackendInterface $carddavBackend, $principalUri) { 42*a1a3b679SAndreas Boehler 43*a1a3b679SAndreas Boehler $this->carddavBackend = $carddavBackend; 44*a1a3b679SAndreas Boehler $this->principalUri = $principalUri; 45*a1a3b679SAndreas Boehler 46*a1a3b679SAndreas Boehler } 47*a1a3b679SAndreas Boehler 48*a1a3b679SAndreas Boehler /** 49*a1a3b679SAndreas Boehler * Returns the name of this object 50*a1a3b679SAndreas Boehler * 51*a1a3b679SAndreas Boehler * @return string 52*a1a3b679SAndreas Boehler */ 53*a1a3b679SAndreas Boehler function getName() { 54*a1a3b679SAndreas Boehler 55*a1a3b679SAndreas Boehler list(, $name) = Uri\split($this->principalUri); 56*a1a3b679SAndreas Boehler return $name; 57*a1a3b679SAndreas Boehler 58*a1a3b679SAndreas Boehler } 59*a1a3b679SAndreas Boehler 60*a1a3b679SAndreas Boehler /** 61*a1a3b679SAndreas Boehler * Updates the name of this object 62*a1a3b679SAndreas Boehler * 63*a1a3b679SAndreas Boehler * @param string $name 64*a1a3b679SAndreas Boehler * @return void 65*a1a3b679SAndreas Boehler */ 66*a1a3b679SAndreas Boehler function setName($name) { 67*a1a3b679SAndreas Boehler 68*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed(); 69*a1a3b679SAndreas Boehler 70*a1a3b679SAndreas Boehler } 71*a1a3b679SAndreas Boehler 72*a1a3b679SAndreas Boehler /** 73*a1a3b679SAndreas Boehler * Deletes this object 74*a1a3b679SAndreas Boehler * 75*a1a3b679SAndreas Boehler * @return void 76*a1a3b679SAndreas Boehler */ 77*a1a3b679SAndreas Boehler function delete() { 78*a1a3b679SAndreas Boehler 79*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed(); 80*a1a3b679SAndreas Boehler 81*a1a3b679SAndreas Boehler } 82*a1a3b679SAndreas Boehler 83*a1a3b679SAndreas Boehler /** 84*a1a3b679SAndreas Boehler * Returns the last modification date 85*a1a3b679SAndreas Boehler * 86*a1a3b679SAndreas Boehler * @return int 87*a1a3b679SAndreas Boehler */ 88*a1a3b679SAndreas Boehler function getLastModified() { 89*a1a3b679SAndreas Boehler 90*a1a3b679SAndreas Boehler return null; 91*a1a3b679SAndreas Boehler 92*a1a3b679SAndreas Boehler } 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler /** 95*a1a3b679SAndreas Boehler * Creates a new file under this object. 96*a1a3b679SAndreas Boehler * 97*a1a3b679SAndreas Boehler * This is currently not allowed 98*a1a3b679SAndreas Boehler * 99*a1a3b679SAndreas Boehler * @param string $filename 100*a1a3b679SAndreas Boehler * @param resource $data 101*a1a3b679SAndreas Boehler * @return void 102*a1a3b679SAndreas Boehler */ 103*a1a3b679SAndreas Boehler function createFile($filename, $data = null) { 104*a1a3b679SAndreas Boehler 105*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); 106*a1a3b679SAndreas Boehler 107*a1a3b679SAndreas Boehler } 108*a1a3b679SAndreas Boehler 109*a1a3b679SAndreas Boehler /** 110*a1a3b679SAndreas Boehler * Creates a new directory under this object. 111*a1a3b679SAndreas Boehler * 112*a1a3b679SAndreas Boehler * This is currently not allowed. 113*a1a3b679SAndreas Boehler * 114*a1a3b679SAndreas Boehler * @param string $filename 115*a1a3b679SAndreas Boehler * @return void 116*a1a3b679SAndreas Boehler */ 117*a1a3b679SAndreas Boehler function createDirectory($filename) { 118*a1a3b679SAndreas Boehler 119*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); 120*a1a3b679SAndreas Boehler 121*a1a3b679SAndreas Boehler } 122*a1a3b679SAndreas Boehler 123*a1a3b679SAndreas Boehler /** 124*a1a3b679SAndreas Boehler * Returns a single addressbook, by name 125*a1a3b679SAndreas Boehler * 126*a1a3b679SAndreas Boehler * @param string $name 127*a1a3b679SAndreas Boehler * @todo needs optimizing 128*a1a3b679SAndreas Boehler * @return \AddressBook 129*a1a3b679SAndreas Boehler */ 130*a1a3b679SAndreas Boehler function getChild($name) { 131*a1a3b679SAndreas Boehler 132*a1a3b679SAndreas Boehler foreach ($this->getChildren() as $child) { 133*a1a3b679SAndreas Boehler if ($name == $child->getName()) 134*a1a3b679SAndreas Boehler return $child; 135*a1a3b679SAndreas Boehler 136*a1a3b679SAndreas Boehler } 137*a1a3b679SAndreas Boehler throw new DAV\Exception\NotFound('Addressbook with name \'' . $name . '\' could not be found'); 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler } 140*a1a3b679SAndreas Boehler 141*a1a3b679SAndreas Boehler /** 142*a1a3b679SAndreas Boehler * Returns a list of addressbooks 143*a1a3b679SAndreas Boehler * 144*a1a3b679SAndreas Boehler * @return array 145*a1a3b679SAndreas Boehler */ 146*a1a3b679SAndreas Boehler function getChildren() { 147*a1a3b679SAndreas Boehler 148*a1a3b679SAndreas Boehler $addressbooks = $this->carddavBackend->getAddressBooksForUser($this->principalUri); 149*a1a3b679SAndreas Boehler $objs = []; 150*a1a3b679SAndreas Boehler foreach ($addressbooks as $addressbook) { 151*a1a3b679SAndreas Boehler $objs[] = new AddressBook($this->carddavBackend, $addressbook); 152*a1a3b679SAndreas Boehler } 153*a1a3b679SAndreas Boehler return $objs; 154*a1a3b679SAndreas Boehler 155*a1a3b679SAndreas Boehler } 156*a1a3b679SAndreas Boehler 157*a1a3b679SAndreas Boehler /** 158*a1a3b679SAndreas Boehler * Creates a new address book. 159*a1a3b679SAndreas Boehler * 160*a1a3b679SAndreas Boehler * @param string $name 161*a1a3b679SAndreas Boehler * @param MkCol $mkCol 162*a1a3b679SAndreas Boehler * @throws DAV\Exception\InvalidResourceType 163*a1a3b679SAndreas Boehler * @return void 164*a1a3b679SAndreas Boehler */ 165*a1a3b679SAndreas Boehler function createExtendedCollection($name, MkCol $mkCol) { 166*a1a3b679SAndreas Boehler 167*a1a3b679SAndreas Boehler if (!$mkCol->hasResourceType('{' . Plugin::NS_CARDDAV . '}addressbook')) { 168*a1a3b679SAndreas Boehler throw new DAV\Exception\InvalidResourceType('Unknown resourceType for this collection'); 169*a1a3b679SAndreas Boehler } 170*a1a3b679SAndreas Boehler $properties = $mkCol->getRemainingValues(); 171*a1a3b679SAndreas Boehler $mkCol->setRemainingResultCode(201); 172*a1a3b679SAndreas Boehler $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties); 173*a1a3b679SAndreas Boehler 174*a1a3b679SAndreas Boehler } 175*a1a3b679SAndreas Boehler 176*a1a3b679SAndreas Boehler /** 177*a1a3b679SAndreas Boehler * Returns the owner principal 178*a1a3b679SAndreas Boehler * 179*a1a3b679SAndreas Boehler * This must be a url to a principal, or null if there's no owner 180*a1a3b679SAndreas Boehler * 181*a1a3b679SAndreas Boehler * @return string|null 182*a1a3b679SAndreas Boehler */ 183*a1a3b679SAndreas Boehler function getOwner() { 184*a1a3b679SAndreas Boehler 185*a1a3b679SAndreas Boehler return $this->principalUri; 186*a1a3b679SAndreas Boehler 187*a1a3b679SAndreas Boehler } 188*a1a3b679SAndreas Boehler 189*a1a3b679SAndreas Boehler /** 190*a1a3b679SAndreas Boehler * Returns a group principal 191*a1a3b679SAndreas Boehler * 192*a1a3b679SAndreas Boehler * This must be a url to a principal, or null if there's no owner 193*a1a3b679SAndreas Boehler * 194*a1a3b679SAndreas Boehler * @return string|null 195*a1a3b679SAndreas Boehler */ 196*a1a3b679SAndreas Boehler function getGroup() { 197*a1a3b679SAndreas Boehler 198*a1a3b679SAndreas Boehler return null; 199*a1a3b679SAndreas Boehler 200*a1a3b679SAndreas Boehler } 201*a1a3b679SAndreas Boehler 202*a1a3b679SAndreas Boehler /** 203*a1a3b679SAndreas Boehler * Returns a list of ACE's for this node. 204*a1a3b679SAndreas Boehler * 205*a1a3b679SAndreas Boehler * Each ACE has the following properties: 206*a1a3b679SAndreas Boehler * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are 207*a1a3b679SAndreas Boehler * currently the only supported privileges 208*a1a3b679SAndreas Boehler * * 'principal', a url to the principal who owns the node 209*a1a3b679SAndreas Boehler * * 'protected' (optional), indicating that this ACE is not allowed to 210*a1a3b679SAndreas Boehler * be updated. 211*a1a3b679SAndreas Boehler * 212*a1a3b679SAndreas Boehler * @return array 213*a1a3b679SAndreas Boehler */ 214*a1a3b679SAndreas Boehler function getACL() { 215*a1a3b679SAndreas Boehler 216*a1a3b679SAndreas Boehler return [ 217*a1a3b679SAndreas Boehler [ 218*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}read', 219*a1a3b679SAndreas Boehler 'principal' => $this->principalUri, 220*a1a3b679SAndreas Boehler 'protected' => true, 221*a1a3b679SAndreas Boehler ], 222*a1a3b679SAndreas Boehler [ 223*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}write', 224*a1a3b679SAndreas Boehler 'principal' => $this->principalUri, 225*a1a3b679SAndreas Boehler 'protected' => true, 226*a1a3b679SAndreas Boehler ], 227*a1a3b679SAndreas Boehler ]; 228*a1a3b679SAndreas Boehler 229*a1a3b679SAndreas Boehler } 230*a1a3b679SAndreas Boehler 231*a1a3b679SAndreas Boehler /** 232*a1a3b679SAndreas Boehler * Updates the ACL 233*a1a3b679SAndreas Boehler * 234*a1a3b679SAndreas Boehler * This method will receive a list of new ACE's. 235*a1a3b679SAndreas Boehler * 236*a1a3b679SAndreas Boehler * @param array $acl 237*a1a3b679SAndreas Boehler * @return void 238*a1a3b679SAndreas Boehler */ 239*a1a3b679SAndreas Boehler function setACL(array $acl) { 240*a1a3b679SAndreas Boehler 241*a1a3b679SAndreas Boehler throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); 242*a1a3b679SAndreas Boehler 243*a1a3b679SAndreas Boehler } 244*a1a3b679SAndreas Boehler 245*a1a3b679SAndreas Boehler /** 246*a1a3b679SAndreas Boehler * Returns the list of supported privileges for this node. 247*a1a3b679SAndreas Boehler * 248*a1a3b679SAndreas Boehler * The returned data structure is a list of nested privileges. 249*a1a3b679SAndreas Boehler * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple 250*a1a3b679SAndreas Boehler * standard structure. 251*a1a3b679SAndreas Boehler * 252*a1a3b679SAndreas Boehler * If null is returned from this method, the default privilege set is used, 253*a1a3b679SAndreas Boehler * which is fine for most common usecases. 254*a1a3b679SAndreas Boehler * 255*a1a3b679SAndreas Boehler * @return array|null 256*a1a3b679SAndreas Boehler */ 257*a1a3b679SAndreas Boehler function getSupportedPrivilegeSet() { 258*a1a3b679SAndreas Boehler 259*a1a3b679SAndreas Boehler return null; 260*a1a3b679SAndreas Boehler 261*a1a3b679SAndreas Boehler } 262*a1a3b679SAndreas Boehler 263*a1a3b679SAndreas Boehler} 264