1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108 |
- <?php
- /**
- * All helper functions are bundled here
- */
- /**
- * Get the extension of an ElggFile
- *
- * @param ElggFile $file the file to check
- *
- * @return string
- */
- function file_tools_get_file_extension($file) {
- $result = '';
-
- if ($file->getSubtype() == 'file') {
- if ($filename = $file->getFilename()) {
- $exploded_filename = explode('.', $filename);
-
- $result = end($exploded_filename);
- }
- }
-
- return strtolower($result);
- }
- /**
- * Read a folder structure for a zip file
- *
- * @param ElggObject $folder the folder to read
- * @param string $prepend current prefix
- *
- * @return array
- */
- function file_tools_get_zip_structure($folder, $prepend) {
- $entries = array();
-
- if ($prepend) {
- $prepend .= '/';
- }
-
- if (!$folder) {
- $parent_guid = 0;
- } else {
- $parent_guid = $folder->getGUID();
- }
-
- $options = array(
- "type" => "object",
- "subtype" => FILE_TOOLS_SUBTYPE,
- "limit" => false,
- "metadata_name" => "parent_guid",
- "metadata_value" => $parent_guid,
- );
-
- // voor de hoogste map de sub bestanden nog ophalen
- if ($entities = elgg_get_entities_from_metadata($options)) {
- foreach ($entities as $subfolder) {
- $title = $prepend . $subfolder->title;
- $entries[] = array('directory' => $title, 'files' => file_tools_has_files($subfolder->getGUID()));
-
- $entries = array_merge($entries, file_tools_get_zip_structure($subfolder, $title));
- }
- }
-
- return $entries;
- }
- /**
- * Check if a folder has files
- *
- * @param ElggObject $folder the folder to check
- *
- * @return bool|array
- */
- function file_tools_has_files($folder) {
- $files_options = array(
- "type" => "object",
- "subtype" => "file",
- "limit" => false,
- //"container_guid" => get_loggedin_userid(),
- "relationship" => FILE_TOOLS_RELATIONSHIP,
- "relationship_guid" => $folder,
- "inverse_relationship" => false
- );
-
- $file_guids = array();
-
- if ($files = elgg_get_entities_from_relationship($files_options)) {
- foreach ($files as $file) {
- $file_guids[] = $file->getGUID();
- }
-
- return $file_guids;
- }
-
- return false;
- }
- /**
- * Get the folders in a container
- *
- * @param int $container_guid the container to check
- *
- * @return bool|ElggObject[]
- */
- function file_tools_get_folders($container_guid = 0) {
- $result = false;
-
- if (empty($container_guid)) {
- $container_guid = elgg_get_page_owner_guid();
- }
-
- if (!empty($container_guid)) {
- $options = array(
- "type" => "object",
- "subtype" => FILE_TOOLS_SUBTYPE,
- "container_guid" => $container_guid,
- "limit" => false
- );
- if ($folders = elgg_get_entities($options)) {
- $parents = array();
- foreach ($folders as $folder) {
- $parent_guid = (int) $folder->parent_guid;
-
- if (!empty($parent_guid)) {
- if ($temp = get_entity($parent_guid)) {
- if ($temp->getSubtype() != FILE_TOOLS_SUBTYPE) {
- $parent_guid = 0;
- }
- } else {
- $parent_guid = 0;
- }
- } else {
- $parent_guid = 0;
- }
-
- if (!array_key_exists($parent_guid, $parents)) {
- $parents[$parent_guid] = array();
- }
-
- $parents[$parent_guid][] = $folder;
- }
-
- $result = file_tools_sort_folders($parents, 0);
- }
- }
-
- return $result;
- }
- /**
- * Make folder select options
- *
- * @param array $folders folders to make the options for
- * @param int $depth current depth
- *
- * @return string
- */
- function file_tools_build_select_options($folders, $depth = 0) {
- $result = array();
-
- if (!empty($folders)) {
- foreach ($folders as $index => $level) {
- /**
- * $level contains
- * folder: the folder on this level
- * children: potential children
- *
- */
- if ($folder = elgg_extract("folder", $level)) {
- $result[$folder->getGUID()] = str_repeat("-", $depth) . $folder->title;
- }
-
- if ($childen = elgg_extract("children", $level)) {
- $result += file_tools_build_select_options($childen, $depth + 1);
- }
- }
- }
-
- return $result;
- }
- /**
- * Get folder selection options for widgets
- *
- * @param array $folder the folder to create for
- * @param string $internalname the name of the input field
- * @param array $selected the current selected values
- *
- * @return string
- */
- function file_tools_build_widget_options($folder, $internalname = "", $selected = array()) {
- $result = "";
-
- if (is_array($folder) && !array_key_exists("children", $folder)) {
- foreach ($folder as $folder_item) {
- $result .= "<ul>";
- $result .= file_tools_build_widget_options($folder_item, $internalname, $selected);
- $result .= "</ul>";
- }
- } else {
- $folder_item = $folder["folder"];
-
- $result .= "<li>";
- if (in_array($folder_item->getGUID(), $selected)) {
- $result .= "<input type='checkbox' name='" . $internalname . "' value='" . $folder_item->getGUID() . "' checked='checked'> " . $folder_item->title;
- } else {
- $result .= "<input type='checkbox' name='" . $internalname . "' value='" . $folder_item->getGUID() . "'> " . $folder_item->title;
- }
-
- if (!empty($folder["children"])) {
- $result .= file_tools_build_widget_options($folder["children"], $internalname, $selected);
- }
- $result .= "</li>";
- }
-
- return $result;
- }
- /**
- * Folder folders by their order
- *
- * @param array $folders the folders to sort
- * @param int $parent_guid the parent to sort for
- *
- * @return bool|array
- */
- function file_tools_sort_folders($folders, $parent_guid = 0) {
- $result = false;
-
- if (array_key_exists($parent_guid, $folders)) {
- $result = array();
-
- foreach ($folders[$parent_guid] as $subfolder) {
- $children = file_tools_sort_folders($folders, $subfolder->getGUID());
-
- $order = $subfolder->order;
- if (empty($order)) {
- $order = 0;
- }
-
- while (array_key_exists($order, $result)) {
- $order++;
- }
-
- $result[$order] = array(
- "folder" => $subfolder,
- "children" => $children
- );
- }
-
- ksort($result);
- }
-
- return $result;
- }
- /**
- * Get the subfolders of a folder
- *
- * @param ElggObject $folder the folder to get the subfolders for
- * @param bool $list output a list (default: false)
- *
- * @return bool|array|string
- */
- function file_tools_get_sub_folders($folder = false, $list = false) {
- $result = false;
-
- if (!empty($folder) && elgg_instanceof($folder, "object", FILE_TOOLS_SUBTYPE)) {
- $container_guid = $folder->getContainerGUID();
- $parent_guid = $folder->getGUID();
- } else {
- $container_guid = elgg_get_page_owner_guid();
- $parent_guid = 0;
- }
-
- $options = array(
- "type" => "object",
- "subtype" => FILE_TOOLS_SUBTYPE,
- "container_guid" => $container_guid,
- "limit" => false,
- "metadata_name" => "parent_guid",
- "metadata_value" => $parent_guid,
- "order_by_metadata" => array('name' => 'order', 'direction' => 'ASC', 'as' => 'integer'),
- "full_view" => false,
- "pagination" => false
- );
-
- if ($list) {
- $folders = elgg_list_entities_from_metadata($options);
- } else {
- $folders = elgg_get_entities_from_metadata($options);
- }
-
- if ($folders) {
- $result = $folders;
- }
-
- return $result;
- }
- /**
- * Create a folder menu
- *
- * @param array $folders the folders to create the menu for
- *
- * @return bool|ElggMenuItem[]
- */
- function file_tools_make_menu_items($folders) {
- $result = false;
-
- if (!empty($folders) && is_array($folders)) {
- $result = array();
-
- foreach ($folders as $index => $level) {
- if ($folder = elgg_extract("folder", $level)) {
- $folder_title = $folder->title;
- if (empty($folder_title)) {
- $folder_title = elgg_echo("untitled");
- }
-
- $folder_menu = ElggMenuItem::factory(array(
- "name" => "folder_" . $folder->getGUID(),
- "text" => $folder_title,
- "href" => "#" . $folder->getGUID(),
- "priority" => $folder->order
- ));
-
- if ($children = elgg_extract("children", $level)) {
- $folder_menu->setChildren(file_tools_make_menu_items($children));
- }
-
- $result[] = $folder_menu;
- }
- }
- }
-
- return $result;
- }
- /**
- * Recursivly change the access of subfolders (and files)
- *
- * @param ElggObject $folder the folder to change the access for
- * @param bool $change_files include files in this folder (default: false)
- *
- * @return void
- */
- function file_tools_change_children_access($folder, $change_files = false) {
-
- if (!empty($folder) && ($folder instanceof ElggObject)) {
- if ($folder->getSubtype() == FILE_TOOLS_SUBTYPE) {
- // get children folders
- $options = array(
- "type" => "object",
- "subtype" => FILE_TOOLS_SUBTYPE,
- "container_guid" => $folder->getContainerGUID(),
- "limit" => false,
- "metadata_name" => "parent_guid",
- "metadata_value" => $folder->getGUID()
- );
-
- if ($children = elgg_get_entities_from_metadata($options)) {
- foreach ($children as $child) {
- $child->access_id = $folder->access_id;
- $child->save();
-
- file_tools_change_children_access($child, $change_files);
- }
- }
-
- if ($change_files) {
- // change access on files in this folder
- file_tools_change_files_access($folder);
- }
- }
- }
- }
- /**
- * Change the access of all file in a folder
- *
- * @param ElggObject $folder the folder to change the file access for
- *
- * @return void
- */
- function file_tools_change_files_access($folder) {
-
- if (!empty($folder) && ($folder instanceof ElggObject)) {
- if ($folder->getSubtype() == FILE_TOOLS_SUBTYPE) {
- // change access on files in this folder
- $options = array(
- "type" => "object",
- "subtype" => "file",
- "container_guid" => $folder->getContainerGUID(),
- "limit" => false,
- "relationship" => FILE_TOOLS_RELATIONSHIP,
- "relationship_guid" => $folder->getGUID()
- );
-
- if ($files = elgg_get_entities_from_relationship($options)) {
- // need to unregister an event listener
- elgg_unregister_event_handler("update", "object", "file_tools_object_handler");
-
- foreach ($files as $file) {
- $file->access_id = $folder->access_id;
-
- $file->save();
- }
- }
- }
- }
- }
- /**
- * Get the allowed extensions for uploading
- *
- * @param bool $zip return zip upload dialog format
- *
- * @return bool|string
- */
- function file_tools_allowed_extensions($zip = false) {
-
- $allowed_extensions_settings = elgg_get_plugin_setting('allowed_extensions', 'file_tools');
- $allowed_extensions_settings = string_to_tag_array($allowed_extensions_settings);
-
- if (!empty($allowed_extensions_settings)) {
- $result = $allowed_extensions_settings;
- } else {
- $result = array('txt','jpg','jpeg','png','bmp','gif','pdf','doc','docx','xls','xlsx','ppt','pptx','odt','ods','odp');
- }
-
- if (!$zip) {
- return $result;
- }
-
- $result = implode(";*.", $result);
-
- return "*." . $result;
- }
- if (!function_exists("mime_content_type")) {
- // @codingStandardsIgnoreStart
- function mime_content_type($fn) {
- static $mime_magic_data;
-
- #-- fallback
- $type = false;
-
- #-- read in first 3K of given file
- if (is_dir($fn)) {
- return("httpd/unix-directory");
- } elseif (is_resource($fn) || ($fn = @fopen($fn, "rb"))) {
- $bin = fread($fn, $maxlen=3072);
- fclose($fn);
- } elseif (!file_exists($fn)) {
- return false;
- } else {
- return("application/octet-stream"); // give up
- }
-
- #-- use PECL::fileinfo when available
- if (function_exists("finfo_buffer")) {
- if (!isset($mime_magic_data)) {
- $mime_magic_data = finfo_open(MAGIC_MIME);
- }
- $type = finfo_buffer($bin);
- return($type);
- }
-
- #-- read in magic data, when called for the very first time
- if (!isset($mime_content_type)) {
-
- if ((file_exists($fn = ini_get("mime_magic.magicfile")))
- or (file_exists($fn = "/usr/share/misc/magic.mime"))
- or (file_exists($fn = "/etc/mime-magic")) ) {
- $mime_magic_data = array();
-
- #-- read in file
- $f = fopen($fn, "r");
- $fd = fread($f, 1<<20);
- fclose($f);
- $fd = str_replace(" ", "\t", $fd);
-
- #-- look at each entry
- foreach (explode("\n", $fd) as $line) {
-
- #-- skip empty lines
- if (!strlen($line) or ($line[0] == "#") or ($line[0] == "\n")) {
- continue;
- }
-
- #-- break into four fields at tabs
- $l = preg_split("/\t+/", $line);
- @list($pos, $typestr, $magic, $ct) = $l;
- #print_r($l);
-
- #-- ignore >continuing lines
- if ($pos[0] == ">") {
- continue;
- }
-
- #-- real mime type string?
- $ct = strtok($ct, " ");
- if (!strpos($ct, "/")) {
- continue;
- }
-
- #-- mask given?
- $mask = 0;
- if (strpos($typestr, "&")) {
- $typestr = strtok($typestr, "&");
- $mask = strtok(" ");
- if ($mask[0] == "0") {
- $mask = ($mask[1] == "x") ? hexdec(substr($mask, 2)) : octdec($mask);
- } else {
- $mask = (int)$mask;
- }
- }
-
- #-- strip prefixes
- if ($magic[0] == "=") {
- $magic = substr($magic, 1);
- }
-
- #-- convert type
- if ($typestr == "string") {
- $magic = stripcslashes($magic);
- $len = strlen($magic);
- if ($mask) {
- continue;
- }
- }
- #-- numeric values
- else {
-
- if ((ord($magic[0]) < 48) or (ord($magic[0]) > 57)) {
- #echo "\nmagicnumspec=$line\n";
- #var_dump($l);
- continue; #-- skip specials like >, x, <, ^, &
- }
-
- #-- convert string representation into int
- if ((strlen($magic) >= 4) && ($magic[1] == "x")) {
- $magic = hexdec(substr($magic, 2));
- } elseif ($magic[0]) {
- $magic = octdec($magic);
- } else {
- $magic = (int) $magic;
- if (!$magic) {
- continue;
- } // zero is not a good magic value anyhow
- }
-
- #-- different types
- switch ($typestr) {
- case "byte":
- $len = 1;
- break;
- case "beshort":
- $magic = ($magic >> 8) | (($magic & 0xFF) << 8);
- case "leshort":
- case "short":
- $len = 2;
- break;
- case "belong":
- $magic = (($magic >> 24) & 0xFF)
- | (($magic >> 8) & 0xFF00)
- | (($magic & 0xFF00) << 8)
- | (($magic & 0xFF) << 24);
- case "lelong":
- case "long":
- $len = 4;
- break;
- default:
- //date, ldate, ledate, leldate, beldate, lebelbe...
- continue;
- }
- }
-
- #-- add to list
- $mime_magic_data[] = array($pos, $len, $mask, $magic, trim($ct));
- }
- }
- #print_r($mime_magic_data);
- }
-
- #-- compare against each entry from the mime magic database
- foreach ($mime_magic_data as $def) {
-
- #-- entries are organized as follows
- list($pos, $len, $mask, $magic, $ct) = $def;
-
- #-- ignored entries (we only read first 3K of file for opt. speed)
- if ($pos >= $maxlen) {
- continue;
- }
-
- $slice = substr($bin, $pos, $len);
- #-- integer comparison value
- if ($mask) {
- $value = hexdec(bin2hex($slice));
- if (($value & $mask) == $magic) {
- $type = $ct;
- break;
- }
- }
- #-- string comparison
- else {
- if ($slice == $magic) {
- $type = $ct;
- break;
- }
- }
- } // foreach
-
- #-- built-in defaults
- if (!$type) {
-
- #-- some form of xml
- if (strpos($bin, "<"."?xml ") !== false) {
- return("text/xml");
- }
- #-- html
- elseif ((strpos($bin, "<html>") !== false) || (strpos($bin, "<HTML>") !== false)
- || strpos($bin, "<title>") || strpos($bin, "<TITLE>")
- || (strpos($bin, "<!--") !== false) || (strpos($bin, "<!DOCTYPE HTML ") !== false)) {
-
- $type = "text/html";
- }
- #-- mail msg
- elseif ((strpos($bin, "\nReceived: ") !== false) || strpos($bin, "\nSubject: ")
- || strpos($bin, "\nCc: ") || strpos($bin, "\nDate: ")) {
-
- $type = "message/rfc822";
- }
- #-- php scripts
- elseif (strpos($bin, "<"."?php") !== false) {
- return("application/x-httpd-php");
- }
- #-- plain text, C source or so
- elseif (strpos($bin, "function ") || strpos($bin, " and ")
- || strpos($bin, " the ") || strpos($bin, "The ")
- || (strpos($bin, "/*") !== false) || strpos($bin, "#include ")) {
-
- return("text/plain");
- }
- #-- final fallback
- else {
- $type = "application/octet-stream";
- }
- }
-
- #-- done
- return $type;
- }
- // @codingStandardsIgnoreEnd
- }
- /**
- * Check for unique folder names
- *
- * @param string $title the title to check
- * @param int $container_guid the container to limit the search to
- * @param int $parent_guid optional parent guid
- *
- * @return bool|ElggObject
- */
- function file_tools_check_foldertitle_exists($title, $container_guid, $parent_guid = 0) {
- $result = false;
-
- $entities_options = array(
- 'type' => 'object',
- 'subtype' => FILE_TOOLS_SUBTYPE,
- 'container_guid' => $container_guid,
- 'limit' => 1,
- 'joins' => array(
- "JOIN " . elgg_get_config("dbprefix") . "objects_entity oe ON e.guid = oe.guid"
- ),
- 'wheres' => array(
- "oe.title = '" . sanitise_string($title) . "'"
- ),
- "order_by_metadata" => array(
- "name" => "order",
- "direction" => "ASC",
- "as" => "integer"
- )
- );
-
- if (!empty($parent_guid)) {
- $entities_options["metadata_name_value_pairs"] = array("parent_guid" => $parent_guid);
- }
-
- if ($entities = elgg_get_entities_from_metadata($entities_options)) {
- $result = $entities[0];
- }
-
- return $result;
- }
- /**
- * Create folders from a zip file structure
- *
- * @param zip_entry $zip_entry the zip file entry
- * @param int $container_guid the container where the folders need to be created
- * @param int $parent_guid the parent folder
- *
- * @return void
- */
- function file_tools_create_folders($zip_entry, $container_guid, $parent_guid = 0) {
- $zip_entry_name = zip_entry_name($zip_entry);
- $filename = basename($zip_entry_name);
-
- if (substr($zip_entry_name, -1) != '/') {
- $zip_base = str_replace($filename, "", $zip_entry_name);
- } else {
- $zip_base = $zip_entry_name;
- }
-
- $zdir = substr($zip_base, 0, -1);
-
- if (!empty($zdir)) {
- $container_entity = get_entity($container_guid);
-
- $access_id = get_input("access_id", false);
- if ($access_id === false) {
- if ($parent_guid != 0) {
- $access_id = get_entity($parent_guid)->access_id;
- } else {
- if (elgg_instanceof($container_entity, "group")) {
- $access_id = $container_entity->group_acl;
- } else {
- $access_id = get_default_access($container_entity);
- }
- }
- }
-
- $sub_folders = explode("/", $zdir);
- if (count($sub_folders) == 1) {
- $entity = file_tools_check_foldertitle_exists($zdir, $container_guid, $parent_guid);
- if (!$entity) {
- $directory = new ElggObject();
- $directory->subtype = FILE_TOOLS_SUBTYPE;
- $directory->owner_guid = elgg_get_logged_in_user_guid();
- $directory->container_guid = $container_guid;
-
- $directory->access_id = $access_id;
-
- $directory->title = $zdir;
- $directory->parent_guid = $parent_guid;
-
- $order = elgg_get_entities_from_metadata(array(
- "type" => "object",
- "subtype" => FILE_TOOLS_SUBTYPE,
- "metadata_name_value_pairs" => array(
- "name" => "parent_guid",
- "value" => $parent_guid
- ),
- "count" => true
- ));
-
- $directory->order = $order;
-
- $directory->save();
- }
- } else {
- $parent = $parent_guid;
-
- foreach ($sub_folders as $folder) {
- if ($entity = file_tools_check_foldertitle_exists($folder, $container_guid, $parent)) {
- $parent = $entity->getGUID();
- } else {
- $directory = new ElggObject();
- $directory->subtype = FILE_TOOLS_SUBTYPE;
- $directory->owner_guid = elgg_get_logged_in_user_guid();
- $directory->container_guid = $container_guid;
-
- $directory->access_id = $access_id;
-
- $directory->title = $folder;
- $directory->parent_guid = $parent;
-
- $order = elgg_get_entities_from_metadata(array(
- "type" => "object",
- "subtype" => FILE_TOOLS_SUBTYPE,
- "metadata_name_value_pairs" => array(
- "name" => "parent_guid",
- "value" => $parent
- ),
- "count" => true
- ));
-
- $directory->order = $order;
-
- $parent = $directory->save();
- }
- }
- }
- }
- }
- /**
- * Unzip an uploaded zip file
- *
- * @param array $file the $_FILES information
- * @param int $container_guid the container to put the files/folders under
- * @param int $parent_guid the parrent folder
- *
- * @return bool
- */
- function file_tools_unzip($file, $container_guid, $parent_guid = 0) {
- $extracted = false;
-
- if (!empty($file) && !empty($container_guid)) {
- $allowed_extensions = file_tools_allowed_extensions();
-
- $zipfile = elgg_extract("tmp_name", $file);
-
- $container_entity = get_entity($container_guid);
-
- $access_id = get_input("access_id", false);
-
- if ($access_id === false) {
- if (!empty($parent_guid) && ($parent_folder = get_entity($parent_guid)) && elgg_instanceof($parent_folder, "object", FILE_TOOLS_SUBTYPE)) {
- $access_id = $parent_folder->access_id;
- } else {
- if (elgg_instanceof($container_entity, "group")) {
- $access_id = $container_entity->group_acl;
- } else {
- $access_id = get_default_access($container_entity);
- }
- }
- }
-
- // open the zip file
- $zip = zip_open($zipfile);
- while ($zip_entry = zip_read($zip)) {
- // open the zip entry
- zip_entry_open($zip, $zip_entry);
-
- // set some variables
- $zip_entry_name = zip_entry_name($zip_entry);
- $filename = basename($zip_entry_name);
-
- // check for folder structure
- if (strlen($zip_entry_name) != strlen($filename)) {
- // there is a folder structure, check it and create missing items
- file_tools_create_folders($zip_entry, $container_guid, $parent_guid);
- }
-
- // extract the folder structure from the zip entry
- $folder_array = explode("/", $zip_entry_name);
-
- $parent = $parent_guid;
- foreach ($folder_array as $folder) {
- $folder = utf8_encode($folder);
-
- if ($entity = file_tools_check_foldertitle_exists($folder, $container_guid, $parent)) {
- $parent = $entity->getGUID();
- } else {
- if ($folder == end($folder_array)) {
- $prefix = "file/";
- $extension_array = explode('.', $folder);
-
- $file_extension = end($extension_array);
-
- if (in_array(strtolower($file_extension), $allowed_extensions)) {
- $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
-
- // create the file
- $filehandler = new ElggFile();
- $filehandler->setFilename($prefix . $folder);
-
- $filehandler->title = $folder;
- $filehandler->originalfilename = $folder;
- $filehandler->owner_guid = elgg_get_logged_in_user_guid();
-
- $filehandler->container_guid = $container_guid;
- $filehandler->access_id = $access_id;
-
- $filehandler->open("write");
- $filehandler->write($buf);
- $filehandler->close();
-
- $mime_type = $filehandler->detectMimeType($filehandler->getFilenameOnFilestore());
-
- // hack for Microsoft zipped formats
- $info = pathinfo($folder);
- $office_formats = array("docx", "xlsx", "pptx");
- if ($mime_type == "application/zip" && in_array($info["extension"], $office_formats)) {
- switch ($info["extension"]) {
- case "docx":
- $mime_type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
- break;
- case "xlsx":
- $mime_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
- break;
- case "pptx":
- $mime_type = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
- break;
- }
- }
-
- // check for bad ppt detection
- if ($mime_type == "application/vnd.ms-office" && $info["extension"] == "ppt") {
- $mime_type = "application/vnd.ms-powerpoint";
- }
-
- $simple_type = elgg_get_file_simple_type($mime_type);
-
- $filehandler->setMimeType($mime_type);
- $filehandler->simpletype = $simple_type;
-
- if ($simple_type == "image") {
- $filestorename = elgg_strtolower(time() . $folder);
-
- $thumb = new ElggFile();
- $thumb->owner_guid = elgg_get_logged_in_user_guid();
-
- $thumbnail = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(), 60, 60, true);
- if ($thumbnail) {
-
- $thumb->setFilename($prefix . "thumb" . $filestorename);
- $thumb->open("write");
- $thumb->write($thumbnail);
- $thumb->close();
-
- $filehandler->thumbnail = $prefix . "thumb" . $filestorename;
- unset($thumbnail);
- }
-
- $thumbsmall = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(), 153, 153, true);
- if ($thumbsmall) {
- $thumb->setFilename($prefix . "smallthumb" . $filestorename);
-
- $thumb->open("write");
- $thumb->write($thumbsmall);
- $thumb->close();
-
- $filehandler->smallthumb = $prefix . "smallthumb" . $filestorename;
- unset($thumbsmall);
- }
-
- $thumblarge = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(), 600, 600, false);
- if ($thumblarge) {
- $thumb->setFilename($prefix . "largethumb" . $filestorename);
-
- $thumb->open("write");
- $thumb->write($thumblarge);
- $thumb->close();
-
- $filehandler->largethumb = $prefix . "largethumb" . $filestorename;
- unset($thumblarge);
- }
-
- unset($thumb);
- }
-
- set_input('folder_guid', $parent);
-
- $filehandler->save();
-
- $extracted = true;
-
- if (!empty($parent)) {
- add_entity_relationship($parent, FILE_TOOLS_RELATIONSHIP, $filehandler->getGUID());
- }
- }
- }
- }
- }
-
- zip_entry_close($zip_entry);
- }
-
- zip_close($zip);
- }
-
- return $extracted;
- }
- /**
- * Helper function to check if we use a folder structure
- * Result is cached to increase performance
- *
- * @return bool
- */
- function file_tools_use_folder_structure() {
- static $result;
-
- if (!isset($result)) {
- $result = false;
-
- // this plugin setting has a typo, should be use_folder_struture
- // @todo: update the plugin setting name
- if (elgg_get_plugin_setting("user_folder_structure", "file_tools") == "yes") {
- $result = true;
- }
- }
-
- return $result;
- }
- /**
- * Add a folder to a zip file
- *
- * @param ZipArchive &$zip_archive the zip file to add files/folder to
- * @param ElggObject $folder the folder to add
- * @param string $folder_path the path of the current folder
- *
- * @return void
- */
- function file_tools_add_folder_to_zip(ZipArchive &$zip_archive, ElggObject $folder, $folder_path = "") {
-
- if (!empty($zip_archive) && !empty($folder) && elgg_instanceof($folder, "object", FILE_TOOLS_SUBTYPE)) {
- $folder_title = elgg_get_friendly_title($folder->title);
-
- $zip_archive->addEmptyDir($folder_path . $folder_title);
- $folder_path .= $folder_title . DIRECTORY_SEPARATOR;
-
- $file_options = array(
- "type" => "object",
- "subtype" => "file",
- "limit" => false,
- "relationship" => FILE_TOOLS_RELATIONSHIP,
- "relationship_guid" => $folder->getGUID()
- );
-
- // add files from this folder to the zip
- if ($files = elgg_get_entities_from_relationship($file_options)) {
- foreach ($files as $file) {
- // check if the file exists
- if ($zip_archive->statName($folder_path . $file->originalfilename) === false) {
- // doesn't exist, so add
- $zip_archive->addFile($file->getFilenameOnFilestore(), $folder_path . $file->originalfilename);
- } else {
- // file name exists, so create a new one
- $ext_pos = strrpos($file->originalfilename, ".");
- $file_name = substr($file->originalfilename, 0, $ext_pos) . "_" . $file->getGUID() . substr($file->originalfilename, $ext_pos);
-
- $zip_archive->addFile($file->getFilenameOnFilestore(), $folder_path . $file_name);
- }
- }
- }
-
- // check if there are subfolders
- $folder_options = array(
- "type" => "object",
- "subtype" => FILE_TOOLS_SUBTYPE,
- "limit" => false,
- "metadata_name_value_pairs" => array("parent_guid" => $folder->getGUID())
- );
-
- if ($sub_folders = elgg_get_entities_from_metadata($folder_options)) {
- foreach ($sub_folders as $sub_folder) {
- file_tools_add_folder_to_zip($zip_archive, $sub_folder, $folder_path);
- }
- }
- }
- }
- /**
- * Get a readable byte count
- *
- * @return string
- */
- function file_tools_get_readable_file_size_limit() {
-
- $size_units = array("B", "KB", "MB", "GB", "TB", "PB");
- $i = 0;
-
- $file_size_limit = elgg_get_ini_setting_in_bytes("upload_max_filesize");
- while ($file_size_limit > 1024) {
- $i++;
- $file_size_limit /= 1024;
- }
-
- $result = $file_size_limit . $size_units[$i];
-
- return $result;
- }
- /**
- * Get the listing max length from the plugin settings
- *
- * @return int
- */
- function file_tools_get_list_length() {
- static $result;
-
- if (!isset($result)) {
- $result = 50;
-
- $setting = (int) elgg_get_plugin_setting("list_length", "file_tools");
- if ($setting < 0) {
- $result = false;
- } elseif ($setting > 0) {
- $result = $setting;
- }
- }
-
- return $result;
- }
|