ILIAS  release_7 Revision v7.30-3-g800a261c036
All Data Structures Namespaces Files Functions Variables Modules Pages
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 
60  public function createFile($name, $data = null)
61  {
62  if ($this->repo_helper->checkCreateAccessForType($this->obj->getRefId(), 'file')) {
63  $size = $this->request->getHeader("Content-Length")[0] ?? 0;
65  throw new Exception\Forbidden('File is too big');
66  }
67 
68  // Check if file has valid extension
69  if ($this->dav_helper->isValidFileNameWithValidFileExtension($name)) {
70  if ($this->childExists($name)) {
71  $file_dav = $this->getChild($name);
72  return $file_dav->put($data);
73  } else {
74  $file_obj = new ilObjFile();
75  $file_obj->setTitle($name);
76  $file_obj->setFileName($name);
77  $file_obj->setVersion(1);
78  $file_obj->setMaxVersion(1);
79  $file_obj->createDirectory();
80  $file_obj->create();
81 
82  $file_obj->createReference();
83  $file_obj->putInTree($this->obj->getRefId());
84  $file_obj->setPermissions($this->ref_id);
85 
86  $file_dav = new ilObjFileDAV($file_obj, $this->repo_helper, $this->dav_helper);
87  return $file_dav->handleFileUpload($data, "create");
88  }
89  } else {
90  // Throw forbidden if invalid extension or filename. As far as we know, it is sadly not
91  // possible to inform the user why his upload was "forbidden".
92  throw new Forbidden('Invalid file name or file extension');
93  }
94  } else {
95  throw new Forbidden('No write access');
96  }
97  }
98 
106  public function createDirectory($name)
107  {
108  global $DIC;
109 
110  $type = $this->getChildCollectionType();
111  if ($this->repo_helper->checkCreateAccessForType($this->getRefId(), $type) && $this->dav_helper->isDAVableObjTitle($name)) {
112  switch ($type) {
113  case 'cat':
114  $new_obj = new ilObjCategory();
115  break;
116 
117  case 'fold':
118  $new_obj = new ilObjFolder();
119  break;
120 
121  default:
122  ilLoggerFactory::getLogger('WebDAV')->info(get_class($this) . ' ' . $this->obj->getTitle() . " -> $type is not supported as webdav directory");
123  throw new NotImplemented("Create type '$type' as collection is not implemented yet");
124  }
125 
126  $new_obj->setType($type);
127  $new_obj->setOwner($DIC->user()->getId());
128  $new_obj->setTitle($name);
129  $new_obj->create();
130 
131  $new_obj->createReference();
132  $new_obj->putInTree($this->obj->getRefId());
133  $new_obj->setPermissions($this->obj->getRefId());
134  $new_obj->update();
135  } else {
136  throw new Forbidden();
137  }
138  }
139 
150  public function getChild($name)
151  {
152  $child_node = null;
153  $child_exists = false;
154 
155  // Early exit if the problem info file is opened
157  return new ilProblemInfoFileDAV($this, $this->repo_helper, $this->dav_helper);
158  }
159 
160  // Search for the desired file
161  foreach ($this->repo_helper->getChildrenOfRefId($this->obj->getRefId()) as $child_ref) {
162  // Check if a DAV Object exists for this type
163  if ($this->dav_helper->isDAVableObject($child_ref, true)) {
164  // Check if names matches
165  if ($this->repo_helper->getObjectTitleFromRefId($child_ref, true) == $name) {
166  $child_exists = true;
167 
168  // Check if user has permission to read this object
169  if ($this->checkReadAndVisibleAccessForObj($child_ref)) {
170  $child_node = $this->dav_helper->createDAVObjectForRefId($child_ref);
171  }
172  }
173  }
174  }
175 
176  // There exists 1 or more nodes with this name. Return last found node.
177  if (!is_null($child_node)) {
178  return $child_node;
179  }
180 
181  // There is no davable object with the same name. Sorry for you...
182  throw new Sabre\DAV\Exception\NotFound("$name not found");
183  }
184 
190  public function getChildren()
191  {
192  $child_nodes = array();
193  $already_seen_titles = array();
194  $problem_info_file_needed = false;
195 
196  foreach ($this->repo_helper->getChildrenOfRefId($this->obj->getRefId()) as $child_ref) {
197  // Check if is davable object types
198  if ($this->dav_helper->isDAVableObject($child_ref, true)) {
199  // Check for duplicates
200  $title = $this->repo_helper->getObjectTitleFromRefId($child_ref);
201  if (in_array($title, $already_seen_titles)) {
202  $problem_info_file_needed = true;
203  continue;
204  }
205 
206  $already_seen_titles[] = $title;
207 
208  // Check if read permission is given
209  if ($this->checkReadAndVisibleAccessForObj($child_ref)) {
210  // Create DAV-object out of ILIAS-object
211  $child_nodes[$child_ref] = $this->dav_helper->createDAVObjectForRefId($child_ref);
212  }
213  }
214  // if title is not davable because of forbidden characters in title -> problem info file will be created
215  elseif (!$problem_info_file_needed
216  && $this->dav_helper->isDAVableObjType($this->repo_helper->getObjectTypeFromRefId($child_ref))
217  && $this->dav_helper->hasTitleForbiddenChars($this->repo_helper->getObjectTitleFromRefId($child_ref))) {
218  $problem_info_file_needed = true;
219  }
220  }
221 
222  if ($problem_info_file_needed) {
223  $child_nodes[] = new ilProblemInfoFileDAV($this, $this->repo_helper, $this->dav_helper);
224  }
225 
226  return $child_nodes;
227  }
228 
235  public function childExists($name)
236  {
237  foreach ($this->repo_helper->getChildrenOfRefId($this->obj->getRefId()) as $child_ref) {
238  // Only davable object types
239  if ($this->dav_helper->isDAVableObject($child_ref, true)) {
240  // Check if names are the same
241  if ($this->repo_helper->getObjectTitleFromRefId($child_ref, true) == $name) {
242  // Check if read permission is given
243  if ($this->checkReadAndVisibleAccessForObj($child_ref)) {
244  return true;
245  } else {
246  /*
247  * This is an interesting edge case. What happens if there are 2 objects with the same name
248  * but User1 only has access to the first and user2 has only access to the second?
249  */
250  return false;
251  }
252  }
253  }
254  }
255 
256  return false;
257  }
258 
259  protected function checkReadAndVisibleAccessForObj($child_ref)
260  {
261  return $this->repo_helper->checkAccess("visible", $child_ref) && $this->repo_helper->checkAccess("read", $child_ref);
262  }
263 
271  abstract public function getChildCollectionType();
272 }
createDirectory($name)
Creates a new subdirectory.
$size
Definition: RandomTest.php:84
Class ilObjFolder.
$data
Definition: storeScorm.php:23
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.
Class ilWebDAVRepositoryHelper.
childExists($name)
Checks if a child-node with the specified name exists.
Class ilWebDAVObjDAVHelper.
if($format !==null) $name
Definition: metadata.php:230
checkReadAndVisibleAccessForObj($child_ref)
createFile($name, $data=null)
Creates a new file in the directory.
static getUploadSizeLimitBytes()
global $DIC
Definition: goto.php:24
Class ilContainer.
Class ilObjectDAV.
Class ilObjCategory.
getChild($name)
Returns a specific child node, referenced by its name.
Class ilObjContainerDAV.
__construct(Container $dic, ilPlugin $plugin)
__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.