ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilObjContainerDAV.php
Go to the documentation of this file.
1 <?php
2 
3 use Sabre\DAV;
9 
21 abstract class ilObjContainerDAV extends ilObjectDAV implements Sabre\DAV\ICollection
22 {
29  {
30  parent::__construct($a_obj, $repo_helper, $dav_helper);
31  }
32 
33 
61  public function createFile($name, $data = null)
62  {
63  if ($this->repo_helper->checkCreateAccessForType($this->obj->getRefId(), 'file')) {
64  // Check if file has valid extension
65  if ($this->dav_helper->isValidFileNameWithValidFileExtension($name)) {
66  if ($this->childExists($name)) {
67  $file_dav = $this->getChild($name);
68  $file_dav->handleFileUpload($data);
69  } else {
70  $file_obj = new ilObjFile();
71  $file_obj->setTitle($name);
72  $file_obj->setFileName($name);
73  $file_obj->setVersion(1);
74  $file_obj->setMaxVersion(1);
75  $file_obj->createDirectory();
76  $file_obj->create();
77 
78  $file_obj->createReference();
79  $file_obj->putInTree($this->obj->getRefId());
80  $file_obj->setPermissions($this->ref_id);
81  $file_obj->update();
82 
83  $file_dav = new ilObjFileDAV($file_obj, $this->repo_helper, $this->dav_helper);
84  $file_dav->handleFileUpload($data);
85  }
86  } else {
87  // Throw forbidden if invalid extension or filename. As far as we know, it is sadly not
88  // possible to inform the user why his upload was "forbidden".
89  throw new Forbidden('Invalid file name or file extension');
90  }
91  } else {
92  throw new Forbidden('No write access');
93  }
94 
95  return $file_dav->getETag();
96  }
97 
105  public function createDirectory($name)
106  {
107  global $DIC;
108 
109  $type = $this->getChildCollectionType();
110  if ($this->repo_helper->checkCreateAccessForType($this->getRefId(), $type) && $this->dav_helper->isDAVableObjTitle($name)) {
111  switch ($type) {
112  case 'cat':
113  $new_obj = new ilObjCategory();
114  break;
115 
116  case 'fold':
117  $new_obj = new ilObjFolder();
118  break;
119 
120  default:
121  ilLoggerFactory::getLogger('WebDAV')->info(get_class($this) . ' ' . $this->obj->getTitle() . " -> $type is not supported as webdav directory");
122  throw new NotImplemented("Create type '$type' as collection is not implemented yet");
123  }
124 
125  $new_obj->setType($type);
126  $new_obj->setOwner($DIC->user()->getId());
127  $new_obj->setTitle($name);
128  $new_obj->create();
129 
130  $new_obj->createReference();
131  $new_obj->putInTree($this->obj->getRefId());
132  $new_obj->setPermissions($this->obj->getRefId());
133  $new_obj->update();
134  } else {
135  throw new Forbidden();
136  }
137  }
138 
149  public function getChild($name)
150  {
151  $child_node = null;
152  $child_exists = false;
153  foreach ($this->repo_helper->getChildrenOfRefId($this->obj->getRefId()) as $child_ref) {
154  // Check if a DAV Object exists for this type
155  if ($this->dav_helper->isDAVableObject($child_ref, true)) {
156  // Check if names matches
157  if ($this->repo_helper->getObjectTitleFromRefId($child_ref, true) == $name) {
158  $child_exists = true;
159 
160  // Check if user has permission to read this object
161  if ($this->repo_helper->checkAccess("read", $child_ref)) {
162  $child_node = $this->dav_helper->createDAVObjectForRefId($child_ref);
163  }
164  }
165  }
166  }
167 
168  // There exists 1 or more nodes with this name. Return last found node.
169  if (!is_null($child_node)) {
170  return $child_node;
171  }
172 
173  // There is no davable object with the same name. Sorry for you...
174  throw new Sabre\DAV\Exception\NotFound("$name not found");
175  }
176 
182  public function getChildren()
183  {
184  $child_nodes = array();
185  foreach ($this->repo_helper->getChildrenOfRefId($this->obj->getRefId()) as $child_ref) {
186  // Check if is davable object types
187  if ($this->dav_helper->isDAVableObject($child_ref, true)) {
188  // Check if read permission is given
189  if ($this->repo_helper->checkAccess("read", $child_ref)) {
190  // Create DAV-object out of ILIAS-object
191  $child_nodes[$child_ref] = $this->dav_helper->createDAVObjectForRefId($child_ref);
192  }
193  }
194  }
195  return $child_nodes;
196  }
197 
204  public function childExists($name)
205  {
206  foreach ($this->repo_helper->getChildrenOfRefId($this->obj->getRefId()) as $child_ref) {
207  // Only davable object types
208  if ($this->dav_helper->isDAVableObject($child_ref, true)) {
209  // Check if names are the same
210  if ($this->repo_helper->getObjectTitleFromRefId($child_ref, true) == $name) {
211  // Check if read permission is given
212  if ($this->repo_helper->checkAccess("read", $child_ref)) {
213  return true;
214  } else {
215  /*
216  * This is an interesting edge case. What happens if there are 2 objects with the same name
217  * but User1 only has access to the first and user2 has only access to the second?
218  */
219  return false;
220  }
221  }
222  }
223  }
224 
225  return false;
226  }
227 
235  abstract public function getChildCollectionType();
236 }
createDirectory($name)
Creates a new subdirectory.
Class ilObjFolder.
Class ilObjFileDAV.
getChildCollectionType()
Return the type for child collections of this collection For courses, groups and folders the type is ...
$type
getChildren()
Returns an array with all the child nodes.
global $DIC
Definition: saml.php:7
Class ilWebDAVRepositoryHelper.
childExists($name)
Checks if a child-node with the specified name exists.
Class ilWebDAVObjDAVHelper.
createFile($name, $data=null)
Creates a new file in the directory.
Class ilContainer.
Class ilObjectDAV.
Class ilObjCategory.
getChild($name)
Returns a specific child node, referenced by its name.
Class ilObjContainerDAV.
__construct(ilContainer $a_obj, ilWebDAVRepositoryHelper $repo_helper, ilWebDAVObjDAVHelper $dav_helper)
Check if given object has valid type and calls parent constructor.
static getLogger($a_component_id)
Get component logger.
$data
Definition: bench.php:6