1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAVACL\FS; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\DAV\Exception\Forbidden; 6*a1a3b679SAndreas Boehleruse Sabre\DAVACL\AbstractPrincipalCollection; 7*a1a3b679SAndreas Boehleruse Sabre\DAVACL\IACL; 8*a1a3b679SAndreas Boehleruse Sabre\DAVACL\PrincipalBackend\BackendInterface; 9*a1a3b679SAndreas Boehleruse Sabre\Uri; 10*a1a3b679SAndreas Boehler 11*a1a3b679SAndreas Boehler/** 12*a1a3b679SAndreas Boehler * This collection contains a collection for every principal. 13*a1a3b679SAndreas Boehler * It is similar to /home on many unix systems. 14*a1a3b679SAndreas Boehler * 15*a1a3b679SAndreas Boehler * The per-user collections can only be accessed by the user who owns the 16*a1a3b679SAndreas Boehler * collection. 17*a1a3b679SAndreas Boehler * 18*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2007-2015 fruux GmbH. (https://fruux.com/) 19*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/) 20*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License 21*a1a3b679SAndreas Boehler */ 22*a1a3b679SAndreas Boehlerclass HomeCollection extends AbstractPrincipalCollection implements IACL { 23*a1a3b679SAndreas Boehler 24*a1a3b679SAndreas Boehler /** 25*a1a3b679SAndreas Boehler * Name of this collection. 26*a1a3b679SAndreas Boehler * 27*a1a3b679SAndreas Boehler * @var string 28*a1a3b679SAndreas Boehler */ 29*a1a3b679SAndreas Boehler public $collectionName = 'home'; 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas Boehler /** 32*a1a3b679SAndreas Boehler * Path to where the users' files are actually stored. 33*a1a3b679SAndreas Boehler * 34*a1a3b679SAndreas Boehler * @var string 35*a1a3b679SAndreas Boehler */ 36*a1a3b679SAndreas Boehler protected $storagePath; 37*a1a3b679SAndreas Boehler 38*a1a3b679SAndreas Boehler /** 39*a1a3b679SAndreas Boehler * Creates the home collection. 40*a1a3b679SAndreas Boehler * 41*a1a3b679SAndreas Boehler * @param BackendInterface $principalBackend 42*a1a3b679SAndreas Boehler * @param string $storagePath Where the actual files are stored. 43*a1a3b679SAndreas Boehler * @param string $principalPrefix list of principals to iterate. 44*a1a3b679SAndreas Boehler */ 45*a1a3b679SAndreas Boehler function __construct(BackendInterface $principalBackend, $storagePath, $principalPrefix = 'principals') { 46*a1a3b679SAndreas Boehler 47*a1a3b679SAndreas Boehler parent::__construct($principalBackend, $principalPrefix); 48*a1a3b679SAndreas Boehler $this->storagePath = $storagePath; 49*a1a3b679SAndreas Boehler 50*a1a3b679SAndreas Boehler } 51*a1a3b679SAndreas Boehler 52*a1a3b679SAndreas Boehler /** 53*a1a3b679SAndreas Boehler * Returns the name of the node. 54*a1a3b679SAndreas Boehler * 55*a1a3b679SAndreas Boehler * This is used to generate the url. 56*a1a3b679SAndreas Boehler * 57*a1a3b679SAndreas Boehler * @return string 58*a1a3b679SAndreas Boehler */ 59*a1a3b679SAndreas Boehler function getName() { 60*a1a3b679SAndreas Boehler 61*a1a3b679SAndreas Boehler return $this->collectionName; 62*a1a3b679SAndreas Boehler 63*a1a3b679SAndreas Boehler } 64*a1a3b679SAndreas Boehler 65*a1a3b679SAndreas Boehler /** 66*a1a3b679SAndreas Boehler * Returns a principals' collection of files. 67*a1a3b679SAndreas Boehler * 68*a1a3b679SAndreas Boehler * The passed array contains principal information, and is guaranteed to 69*a1a3b679SAndreas Boehler * at least contain a uri item. Other properties may or may not be 70*a1a3b679SAndreas Boehler * supplied by the authentication backend. 71*a1a3b679SAndreas Boehler * 72*a1a3b679SAndreas Boehler * @param array $principalInfo 73*a1a3b679SAndreas Boehler * @return void 74*a1a3b679SAndreas Boehler */ 75*a1a3b679SAndreas Boehler function getChildForPrincipal(array $principalInfo) { 76*a1a3b679SAndreas Boehler 77*a1a3b679SAndreas Boehler $owner = $principalInfo['uri']; 78*a1a3b679SAndreas Boehler $acl = [ 79*a1a3b679SAndreas Boehler [ 80*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}read', 81*a1a3b679SAndreas Boehler 'principal' => $owner, 82*a1a3b679SAndreas Boehler 'protected' => true, 83*a1a3b679SAndreas Boehler ], 84*a1a3b679SAndreas Boehler [ 85*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}write', 86*a1a3b679SAndreas Boehler 'principal' => $owner, 87*a1a3b679SAndreas Boehler 'protected' => true, 88*a1a3b679SAndreas Boehler ], 89*a1a3b679SAndreas Boehler ]; 90*a1a3b679SAndreas Boehler 91*a1a3b679SAndreas Boehler list(, $principalBaseName) = Uri\split($owner); 92*a1a3b679SAndreas Boehler 93*a1a3b679SAndreas Boehler $path = $this->storagePath . '/' . $principalBaseName; 94*a1a3b679SAndreas Boehler 95*a1a3b679SAndreas Boehler if (!is_dir($path)) { 96*a1a3b679SAndreas Boehler mkdir($path, 0777, true); 97*a1a3b679SAndreas Boehler } 98*a1a3b679SAndreas Boehler return new Collection( 99*a1a3b679SAndreas Boehler $path, 100*a1a3b679SAndreas Boehler $acl, 101*a1a3b679SAndreas Boehler $owner 102*a1a3b679SAndreas Boehler ); 103*a1a3b679SAndreas Boehler 104*a1a3b679SAndreas Boehler } 105*a1a3b679SAndreas Boehler 106*a1a3b679SAndreas Boehler /** 107*a1a3b679SAndreas Boehler * Returns the owner principal 108*a1a3b679SAndreas Boehler * 109*a1a3b679SAndreas Boehler * This must be a url to a principal, or null if there's no owner 110*a1a3b679SAndreas Boehler * 111*a1a3b679SAndreas Boehler * @return string|null 112*a1a3b679SAndreas Boehler */ 113*a1a3b679SAndreas Boehler function getOwner() { 114*a1a3b679SAndreas Boehler 115*a1a3b679SAndreas Boehler return null; 116*a1a3b679SAndreas Boehler 117*a1a3b679SAndreas Boehler } 118*a1a3b679SAndreas Boehler 119*a1a3b679SAndreas Boehler /** 120*a1a3b679SAndreas Boehler * Returns a group principal 121*a1a3b679SAndreas Boehler * 122*a1a3b679SAndreas Boehler * This must be a url to a principal, or null if there's no owner 123*a1a3b679SAndreas Boehler * 124*a1a3b679SAndreas Boehler * @return string|null 125*a1a3b679SAndreas Boehler */ 126*a1a3b679SAndreas Boehler function getGroup() { 127*a1a3b679SAndreas Boehler 128*a1a3b679SAndreas Boehler return null; 129*a1a3b679SAndreas Boehler 130*a1a3b679SAndreas Boehler } 131*a1a3b679SAndreas Boehler 132*a1a3b679SAndreas Boehler /** 133*a1a3b679SAndreas Boehler * Returns a list of ACE's for this node. 134*a1a3b679SAndreas Boehler * 135*a1a3b679SAndreas Boehler * Each ACE has the following properties: 136*a1a3b679SAndreas Boehler * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are 137*a1a3b679SAndreas Boehler * currently the only supported privileges 138*a1a3b679SAndreas Boehler * * 'principal', a url to the principal who owns the node 139*a1a3b679SAndreas Boehler * * 'protected' (optional), indicating that this ACE is not allowed to 140*a1a3b679SAndreas Boehler * be updated. 141*a1a3b679SAndreas Boehler * 142*a1a3b679SAndreas Boehler * @return array 143*a1a3b679SAndreas Boehler */ 144*a1a3b679SAndreas Boehler function getACL() { 145*a1a3b679SAndreas Boehler 146*a1a3b679SAndreas Boehler return [ 147*a1a3b679SAndreas Boehler [ 148*a1a3b679SAndreas Boehler 'principal' => '{DAV:}authenticated', 149*a1a3b679SAndreas Boehler 'privilege' => '{DAV:}read', 150*a1a3b679SAndreas Boehler 'protected' => true, 151*a1a3b679SAndreas Boehler ] 152*a1a3b679SAndreas Boehler ]; 153*a1a3b679SAndreas Boehler 154*a1a3b679SAndreas Boehler } 155*a1a3b679SAndreas Boehler 156*a1a3b679SAndreas Boehler /** 157*a1a3b679SAndreas Boehler * Updates the ACL 158*a1a3b679SAndreas Boehler * 159*a1a3b679SAndreas Boehler * This method will receive a list of new ACE's as an array argument. 160*a1a3b679SAndreas Boehler * 161*a1a3b679SAndreas Boehler * @param array $acl 162*a1a3b679SAndreas Boehler * @return void 163*a1a3b679SAndreas Boehler */ 164*a1a3b679SAndreas Boehler function setACL(array $acl) { 165*a1a3b679SAndreas Boehler 166*a1a3b679SAndreas Boehler throw new Forbidden('Setting ACL is not allowed here'); 167*a1a3b679SAndreas Boehler 168*a1a3b679SAndreas Boehler } 169*a1a3b679SAndreas Boehler 170*a1a3b679SAndreas Boehler /** 171*a1a3b679SAndreas Boehler * Returns the list of supported privileges for this node. 172*a1a3b679SAndreas Boehler * 173*a1a3b679SAndreas Boehler * The returned data structure is a list of nested privileges. 174*a1a3b679SAndreas Boehler * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple 175*a1a3b679SAndreas Boehler * standard structure. 176*a1a3b679SAndreas Boehler * 177*a1a3b679SAndreas Boehler * If null is returned from this method, the default privilege set is used, 178*a1a3b679SAndreas Boehler * which is fine for most common usecases. 179*a1a3b679SAndreas Boehler * 180*a1a3b679SAndreas Boehler * @return array|null 181*a1a3b679SAndreas Boehler */ 182*a1a3b679SAndreas Boehler function getSupportedPrivilegeSet() { 183*a1a3b679SAndreas Boehler 184*a1a3b679SAndreas Boehler return null; 185*a1a3b679SAndreas Boehler 186*a1a3b679SAndreas Boehler } 187*a1a3b679SAndreas Boehler 188*a1a3b679SAndreas Boehler} 189