ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
class.ilObjFileAccess.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */
4
5include_once("./Services/Object/classes/class.ilObjectAccess.php");
6require_once('./Services/WebAccessChecker/interfaces/interface.ilWACCheckingClass.php');
7
18{
19
25 protected function checkAccessToObjectId($obj_id)
26 {
27 global $DIC;
28 $ilAccess = $DIC['ilAccess'];
32 foreach (ilObject::_getAllReferences($obj_id) as $ref_id) {
33 if ($ilAccess->checkAccess('read', '', $ref_id)) {
34 return true;
35 }
36 }
37
38 return false;
39 }
40
41
47 public function canBeDelivered(ilWACPath $ilWACPath)
48 {
49 switch ($ilWACPath->getSecurePathId()) {
50 case 'previews':
51 $re = '/\/previews\/[\d\/]{0,}\/preview_([\d]{0,})\//uU';
52 break;
53 }
54 preg_match($re, $ilWACPath->getPath(), $matches);
55
56 return $this->checkAccessToObjectId($matches[1]);
57 }
58
59
60
61 // BEGIN WebDAV cache inline file extensions
62
63
72 // END WebDAV cache inline file extensions
73
74 protected static $preload_list_gui_data; // [array]
75
76
89 public static function _getCommands()
90 {
91 $commands = array();
92 $commands[] = array(
93 "permission" => "read",
94 "cmd" => "sendfile",
95 "lang_var" => "download",
96 "default" => true,
97 );
98 $commands[] = array(
99 "permission" => "write",
100 "cmd" => "versions",
101 "lang_var" => "versions",
102 );
103 $commands[] = array(
104 "permission" => "write",
105 "cmd" => "edit",
106 "lang_var" => "settings",
107 );
108
109 return $commands;
110 }
111
112
116 public static function _checkGoto($a_target)
117 {
118 global $DIC;
119 $ilAccess = $DIC['ilAccess'];
120
121 $t_arr = explode("_", $a_target);
122
123 // personal workspace context: do not force normal login
124 if (isset($t_arr[2]) && $t_arr[2] == "wsp") {
125 include_once "Services/PersonalWorkspace/classes/class.ilSharedResourceGUI.php";
126
127 return ilSharedResourceGUI::hasAccess($t_arr[1]);
128 }
129
130 if ($t_arr[0] != "file" || ((int) $t_arr[1]) <= 0) {
131 return false;
132 }
133
134 if ($ilAccess->checkAccess("visible", "", $t_arr[1])
135 || $ilAccess->checkAccess("read", "", $t_arr[1])
136 ) {
137 return true;
138 }
139
140 return false;
141 }
142
143
148 public static function _lookupFileData($a_id)
149 {
150 global $DIC;
151 $ilDB = $DIC['ilDB'];
152
153 $q = "SELECT * FROM file_data WHERE file_id = " . $ilDB->quote($a_id, 'integer');
154 $r = $ilDB->query($q);
155 $row = $r->fetchRow(ilDBConstants::FETCHMODE_ASSOC);
156
157 return $row;
158 }
159
160
164 public static function _lookupVersion($a_id)
165 {
166 global $DIC;
167 $ilDB = $DIC['ilDB'];
168
169 $q = "SELECT version FROM file_data WHERE file_id = " . $ilDB->quote($a_id, 'integer');
170 $r = $ilDB->query($q);
171 $row = $r->fetchRow(ilDBConstants::FETCHMODE_OBJECT);
172
173 $striped = ilUtil::stripSlashes($row->version);
174
175 return $striped > 0 ? $striped : 1;
176 }
177
178
183 public static function _lookupFileSize($a_id)
184 {
185 global $DIC;
186 $ilDB = $DIC['ilDB'];
187
188 $q = "SELECT file_size FROM file_data WHERE file_id = " . $ilDB->quote($a_id, 'integer');
189 $r = $ilDB->query($q);
190 $row = $r->fetchRow(ilDBConstants::FETCHMODE_OBJECT);
191
192 $size = $row->file_size;
193
194 return $size;
195 }
196
197
204 public static function _lookupFileSizeFromFilesystem($a_id)
205 {
206 global $DIC;
207 $ilDB = $DIC['ilDB'];
208
209 $q = "SELECT * FROM file_data WHERE file_id = " . $ilDB->quote($a_id, 'integer');
210 $r = $ilDB->query($q);
211 $row = $r->fetchRow(ilDBConstants::FETCHMODE_OBJECT);
212
213 require_once('Modules/File/classes/class.ilFSStorageFile.php');
214 $fss = new ilFSStorageFile($a_id);
215 $file = $fss->getAbsolutePath() . '/' . $row->file_name;
216
217 if (@!is_file($file)) {
218 $version_subdir = "/" . sprintf("%03d", ilObjFileAccess::_lookupVersion($a_id));
219 $file = $fss->getAbsolutePath() . '/' . $version_subdir . '/' . $row->file_name;
220 }
221
222 if (is_file($file)) {
223 $size = filesize($file);
224 } else {
225 $size = 0;
226 }
227
228 return $size;
229 }
230
231
235 public static function _lookupSuffix($a_id)
236 {
237 include_once('Modules/File/classes/class.ilFSStorageFile.php');
238
239 global $DIC;
240 $ilDB = $DIC['ilDB'];
241
242 // BEGIN WebDAV: Filename suffix is determined by file title
243 $q = "SELECT * FROM object_data WHERE obj_id = " . $ilDB->quote($a_id, 'integer');
244 $r = $ilDB->query($q);
245 $row = $r->fetchRow(ilDBConstants::FETCHMODE_OBJECT);
246 require_once 'Modules/File/classes/class.ilObjFile.php';
247
248 return self::_getFileExtension($row->title);
249 // END WebDAV: Filename suffix is determined by file title
250 }
251
252
259 public static function _lookupDiskUsage($a_id)
260 {
261 include_once('Modules/File/classes/class.ilFSStorageFile.php');
262 $fileStorage = new ilFSStorageFile($a_id);
263 $dir = $fileStorage->getAbsolutePath();
264
265 return ilUtil::dirsize($dir);
266 }
267
268 // BEGIN WebDAV: Get file extension, determine if file is inline, guess file type.
269
270
274 public static function _isFileInline($a_file_name)
275 {
276 if (self::$_inlineFileExtensionsArray
277 === null
278 ) { // the === makes a huge difference, if the array is empty
279 require_once 'Services/Administration/classes/class.ilSetting.php';
280 $settings = new ilSetting('file_access');
281 self::$_inlineFileExtensionsArray = preg_split('/ /', $settings->get('inline_file_extensions'), -1, PREG_SPLIT_NO_EMPTY);
282 }
283 $extension = self::_getFileExtension($a_file_name);
284
285 return in_array($extension, self::$_inlineFileExtensionsArray);
286 }
287
288
301 public static function _getFileExtension($a_file_name)
302 {
303 if (preg_match('/\.([a-z0-9]+)\z/i', $a_file_name, $matches) == 1) {
304 return strtolower($matches[1]);
305 } else {
306 return '';
307 }
308 }
309
310
320 public static function _isFileHidden($a_file_name)
321 {
322 return substr($a_file_name, 0, 1) == '.' || substr($a_file_name, -1, 1) == '~'
323 || substr($a_file_name, 0, 2) == '~$'
324 || $a_file_name == 'Thumbs.db';
325 }
326 // END WebDAV: Get file extension, determine if file is inline, guess file type.
327
328
356 public static function _appendNumberOfCopyToFilename($a_file_name, $nth_copy = null, $a_handle_extension = false)
357 {
358 global $DIC;
359 $lng = $DIC['lng'];
360
361 $filenameWithoutExtension = $a_file_name;
362
363 $extension = null;
364 if ($a_handle_extension) {
365 // Get the extension and the filename without the extension
366 $extension = ilObjFileAccess::_getFileExtension($a_file_name);
367 if (strlen($extension) > 0) {
368 $extension = '.' . $extension;
369 $filenameWithoutExtension = substr($a_file_name, 0, -strlen($extension));
370 }
371 }
372
373 // create a regular expression from the language text copy_n_of_suffix, so that
374 // we can match it against $filenameWithoutExtension, and retrieve the number of the copy.
375 // for example, if copy_n_of_suffix is 'Copy (%1s)', this creates the regular
376 // expression '/ Copy \\‍([0-9]+)\\‍)$/'.
377 $nthCopyRegex = preg_replace('/([\^$.\[\]|()?*+{}])/', '\\\\${1}', ' '
378 . $lng->txt('copy_n_of_suffix'));
379 $nthCopyRegex = '/' . preg_replace('/%1\\\\\$s/', '([0-9]+)', $nthCopyRegex) . '$/';
380
381 // Get the filename without any previously added number of copy.
382 // Determine the number of copy, if it has not been specified.
383 if (preg_match($nthCopyRegex, $filenameWithoutExtension, $matches)) {
384 // this is going to be at least the third copy of the filename
385 $filenameWithoutCopy = substr($filenameWithoutExtension, 0, -strlen($matches[0]));
386 if ($nth_copy == null) {
387 $nth_copy = $matches[1] + 1;
388 }
389 } else {
390 if (substr($filenameWithoutExtension, -strlen(' ' . $lng->txt('copy_of_suffix')))
391 == ' ' . $lng->txt('copy_of_suffix')
392 ) {
393 // this is going to be the second copy of the filename
394 $filenameWithoutCopy = substr($filenameWithoutExtension, 0, -strlen(' '
395 . $lng->txt('copy_of_suffix')));
396 if ($nth_copy == null) {
397 $nth_copy = 2;
398 }
399 } else {
400 // this is going to be the first copy of the filename
401 $filenameWithoutCopy = $filenameWithoutExtension;
402 if ($nth_copy == null) {
403 $nth_copy = 1;
404 }
405 }
406 }
407
408 // Construct the new filename
409 if ($nth_copy > 1) {
410 // this is at least the second copy of the filename, append " - Copy ($nth_copy)"
411 $newFilename = $filenameWithoutCopy . sprintf(' '
412 . $lng->txt('copy_n_of_suffix'), $nth_copy)
413 . $extension;
414 } else {
415 // this is the first copy of the filename, append " - Copy"
416 $newFilename = $filenameWithoutCopy . ' ' . $lng->txt('copy_of_suffix') . $extension;
417 }
418
419 return $newFilename;
420 }
421
422
430 public static function _getPermanentDownloadLink($ref_id)
431 {
432 return ilLink::_getStaticLink($ref_id, "file", true, "_download");
433 }
434
435
440 public static function _preloadData($a_obj_ids, $a_ref_ids)
441 {
442 global $DIC;
443
444 self::$preload_list_gui_data = array();
445
446 $set = $DIC->database()->query("SELECT obj_id,max(hdate) latest" . " FROM history"
447 . " WHERE obj_type = " . $DIC->database()->quote("file", "text") . " AND "
448 . $DIC->database()->in("obj_id", $a_obj_ids, "", "integer") . " GROUP BY obj_id");
449 while ($row = $DIC->database()->fetchAssoc($set)) {
450 self::$preload_list_gui_data[$row["obj_id"]]["date"] = $row["latest"];
451 }
452
453 $set = $DIC->database()->query("SELECT file_size, version, file_id, page_count" . " FROM file_data" . " WHERE "
454 . $DIC->database()->in("file_id", $a_obj_ids, "", "integer"));
455 while ($row = $DIC->database()->fetchAssoc($set)) {
456 self::$preload_list_gui_data[$row["file_id"]]["size"] = $row["file_size"];
457 self::$preload_list_gui_data[$row["file_id"]]["version"] = $row["version"];
458 self::$preload_list_gui_data[$row["file_id"]]["page_count"] = $row["page_count"];
459 }
460 }
461
462
468 public static function getListGUIData($a_obj_id)
469 {
470 if (isset(self::$preload_list_gui_data[$a_obj_id])) {
471 return self::$preload_list_gui_data[$a_obj_id];
472 }
473 }
474}
$size
Definition: RandomTest.php:84
An exception for terminatinating execution or to throw for unit testing.
Class ilFSStorageFile.
Access class for file objects.
static _lookupFileSize($a_id)
Quickly looks up the file size from the database and returns the number of bytes.
static _checkGoto($a_target)
check whether goto script will succeed
static _lookupFileSizeFromFilesystem($a_id)
Looks up the file size by retrieving it from the filesystem.
static _getCommands()
get commands
static _lookupVersion($a_id)
lookup version
static _getFileExtension($a_file_name)
Gets the file extension of the specified file name.
static _isFileHidden($a_file_name)
Returns true, if a file with the specified name, is usually hidden from the user.
canBeDelivered(ilWACPath $ilWACPath)
static _isFileInline($a_file_name)
Returns true, if the specified file shall be displayed inline in the browser.
static _lookupFileData($a_id)
looks up the file_data for the file object with the specified object id as an associative array.
static _getPermanentDownloadLink($ref_id)
Gets the permanent download link for the file.
static _preloadData($a_obj_ids, $a_ref_ids)
static getListGUIData($a_obj_id)
static _appendNumberOfCopyToFilename($a_file_name, $nth_copy=null, $a_handle_extension=false)
Appends the text " - Copy" to a filename in the language of the current user.
static $_inlineFileExtensionsArray
Contains an array of extensions separated by space.
static _lookupSuffix($a_id)
lookup suffix
static _lookupDiskUsage($a_id)
Returns the number of bytes used on the harddisk by the file object with the specified object id.
Class ilObjectAccess.
static _getAllReferences($a_id)
get all reference ids of object
ILIAS Setting Class.
static hasAccess($a_node_id, $a_is_portfolio=false)
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
static dirsize($directory)
get size of a directory or a file.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilWACCheckingClass.
$lng
global $ilDB
$DIC
Definition: xapitoken.php:46