path == $folder) continue; $elemPath =str_replace(SLASH.'.'.SLASH,SLASH,Element::root().$element->path) ; $line = Element::fromPath($elemPath); $line->path = rtrim($line->path, SLASH); $osPath = Element::root().str_replace('/',SLASH,$line->path); if(!file_exists($osPath)){ Element::deleteById($line->id); continue; } $row = $line->toArray(); $row['updatedRelative'] = relative_time($line->updated); $row['sizeReadable'] = $row['type'] == 'directory' ? $line->childNumber.' élements' : readable_size($line->size); $row['updatedReadable'] = day_name(date('N',$line->updated)).' '. date('d ',$line->updated).month_name(date('m',$line->updated)).date(' Y à H:i',$line->updated); $row['thumbnail'] = $line->thumbnail(); $row['link'] = $line->link; $row['icon'] = $line->icon(); $row['childNumber'] = $line->childNumber; $elements[] = $row; } $response['rows'] = $elements; //recherche par arborescence }else{ if(isset($_['folder']) && !empty($_['folder'])){ $folder = str_replace('/',SLASH,$_['folder']); }else { $folder = '.'; if(isset($_['root'])) $folder = str_replace('/',SLASH,$_['root']); } $response['rows'] = array(); $scanned = Element::root().$folder.SLASH.'*'; //L'ui ne traite que les / quel que soit l'os foreach (Element::browse($scanned) as $line) { $line->path = str_replace('\\', '/', $line->path); $row = $line->toArray(); $row['updatedRelative'] = relative_time($line->updated); $row['sizeReadable'] = $row['type'] == 'directory' ? $line->childNumber.' élements' : readable_size($line->size); $row['updatedReadable'] = day_name(date('N',$line->updated)).' '. date('d ',$line->updated).month_name(date('m',$line->updated)).date(' Y à H:i',$line->updated); $row['thumbnail'] = $line->thumbnail(); $row['icon'] = $line->icon(); $row['link'] = $line->link; $row['childNumber'] = $line->childNumber; $response['rows'][] = $row; } //tri du résultat si demandé if(isset($_['sort'])){ $direction = $_['sort']['sort'] == 'asc' ? 1:-1 ; //le in_array permet de s'assurer qu'une colonne triable est spécifiée $attribute = in_array($_['sort']['sortable'],array('label','size','creator','updated'))? $_['sort']['sortable']: 'label'; usort($response['rows'],function($a,$b) use($attribute,$direction){ if($a[$attribute] > $b[$attribute]) return 1*$direction; if($a[$attribute] < $b[$attribute]) return -1*$direction; if($a[$attribute] == $b[$attribute]) return 0; }); } if($conf->get('document_enable_logs_verbose')) Log::put('Ouverture du dossier '.str_replace(array('/','\\',SLASH.'.'.SLASH.'*'),array(SLASH,SLASH,''),$scanned).' ','document'); } }); Action::register('document_element_tree_search',function(&$response){ global $_,$myUser; if(!$myUser->can('document','read')) return; require_once(__DIR__.SLASH.'Element.class.php'); if(isset($_['folder']) && !empty($_['folder'])){ $folder = str_replace('/',SLASH,$_['folder']); }else{ $folder = '.'; if(isset($_['root'])) $folder = str_replace('/',SLASH,$_['root']); } if(strlen($folder)>=2 && substr($folder, 0,2)=='./') $folder = substr($folder,2); //Récuperation de tous les dossiers pour l'arborescence $response['tree'] = array(); $parentFolder = dirname($folder); $parentFolder = $parentFolder == '.' ? '' : $parentFolder; $level = count(explode('/',$folder)); $parentLevel = $level-1 < 0 ? 0 : $level-1; $parts = explode('/',$folder); $path = ''; $level = 0; $query = 'SELECT * FROM {{table}} WHERE type = ? '; $data = array('directory'); $query .=' AND ( '; $query .= ' (`path` LIKE ? AND LENGTH(`path`) - LENGTH(REPLACE(`path`, \'/\', \'\')) = ?) '; $data[] = '%'; $data[] = 0; foreach($parts as $part){ $level++; $path.= ($level==1?'':'/').$part; $query .=' OR '; $query .= ' (`path` LIKE ? AND LENGTH(`path`) - LENGTH(REPLACE(`path`, \'/\', \'\')) = ?) '; $data[] = $path.'/%'; $data[] = $level; } $query .=' ) ORDER BY `path`'; $elements = Element::staticQuery($query,$data,true); foreach($elements as $directory){ $osPath = Element::root().str_replace('/',SLASH,$directory->path); //limitation a la root si existante if(!empty($_['root']) && strpos($directory->path,$_['root']) === false) continue; if(!file_exists($osPath)){ Element::deleteById($directory->id); continue; } $response['tree'][] =$directory->path; } }); Action::register('document_load_template',function(&$response){ global $myUser,$_; User::check_access('document','read'); require_once(__DIR__.SLASH.'template.document.php'); exit(); }); Action::register('document_widget_load',function(&$response){ global $myUser; User::check_access('document','read'); require_once(PLUGIN_PATH.'dashboard'.SLASH.'DashboardWidget.class.php'); $widget = DashboardWidget::current(); $root = $widget->data('widget-document-root'); $root = !empty($root) ? ': '.$root.'':''; $widget->title = 'Mes documents'.$root; ob_start(); require_once(__DIR__.SLASH.'widget.php'); $widget->content = ob_get_clean(); echo json_encode($widget); exit(); }); Action::register('document_widget_configure_save',function(&$response){ global $myUser,$_; require_once(PLUGIN_PATH.'dashboard'.SLASH.'DashboardWidget.class.php'); User::check_access('document','configure'); $widget = DashboardWidget::getById($_['id']); $widget->data('widget-document-tree',$_['widget-document-tree']); $widget->data('widget-document-detail',$_['widget-document-detail']); $widget->data('widget-document-search',$_['widget-document-search']); $root = str_replace(array('./','../'),'',$_['widget-document-root']); $widget->data('widget-document-root',$root); $widget->save(); }); Action::register('document_widget_configure',function(&$response){ global $myUser; require_once(PLUGIN_PATH.'dashboard'.SLASH.'DashboardWidget.class.php'); User::check_access('document_widget_configure','read'); $widget = DashboardWidget::current(); ob_start(); require_once(__DIR__.SLASH.'widget.configure.php'); $content = ob_get_clean(); echo $content ; exit(); }); Action::register('document_embedded',function(&$response){ User::check_access('document','read'); Plugin::addCss("/css/main.css"); Plugin::addJs("/js/main.js"); ob_start(); global $myUser,$_; $embedded = true; //l'ui de la ged prend en entrée / quel que soit l'os if(isset($_['data']['root'])) $_['data']['root'] = str_replace('\\', '/', $_['data']['root']); require_once(__DIR__.SLASH.'page.list.php'); $response['html'] = ob_get_clean(); }); Action::register('document_folder_create',function(&$response){ global $myUser,$_,$conf; User::check_access('document','edit'); require_once(__DIR__.SLASH.'Element.class.php'); $path = str_replace('/',SLASH,$_['path']); $path = Element::root().$path; $char = document_check_element_name(htmlspecialchars_decode(html_entity_decode($_['folder']), ENT_QUOTES)); if(!empty($char)) throw new Exception("Caractères interdits : ".$char); if(strlen($_['folder']) > 80) throw new Exception("Taille maximale autorisée de 80 caractères."); Element::addFolder($path); if($conf->get('document_enable_logs')) Log::put("Création d'un dossier : ".$path,'document'); }); Action::register('document_element_preview',function(&$response){ global $myUser,$_; User::check_access('document','read'); require_once(__DIR__.SLASH.'Element.class.php'); //l'ui ne renvois que les /, on les convertis par le separateur de l'os $_['path'] = str_replace('/', SLASH, $_['path']); $path = str_replace(SLASH.'.'.SLASH,SLASH,Element::root().$_['path']); $osPath = File::convert_decoding($path); if(!file_exists($osPath)) throw new Exception('Cet élément a peut-être été modifié ou déplacé par quelqu\'un d\'autre. Rafraîchissez la page et réessayez.'); $element = Element::fromPath($path); //L'ui ne traite que les / quel que soit l'os $element->path = str_replace('\\', '/', $element->path); $row = $element->toArray(); $row['updatedRelative'] = relative_time($element->updated); $row['sizeReadable'] = readable_size($element->size); $row['updatedReadable'] = day_name(date('N',$element->updated)).' '. date('d ',$element->updated).month_name(date('m',$element->updated)).date(' Y à H:i',$element->updated); $row['thumbnail'] = $element->thumbnail(); $row['icon'] = $element->icon(); $row['childNumber'] = $element->childNumber; $response['row'] = $row; }); Action::register('document_properties_show',function(&$response){ global $myUser,$_; User::check_access('document','read'); require_once(__DIR__.SLASH.'Element.class.php'); $element = Element::provide(); $element->path = str_replace('\\', '/', $element->path); $row = $element->toArray(); $filePath = Element::root().$element->path; $row['updatedLabel'] = date('d/m/Y H:i',filemtime($filePath)); $bundle = base64_encode(json_encode(array( 'root' => $element->path, 'folder' => '', ))); $row['rootUrl'] = ROOT_URL.'/index.php?module=document&data='.$bundle; $response['row'] = $row; }); Action::register('document_element_execute',function(&$response){ global $myUser,$_,$conf; User::check_access('document','read'); require_once(__DIR__.SLASH.'Element.class.php'); $isopath = Element::root().base64_decode(rawurldecode($_['path'])); $utf8Path = utf8_encode($isopath); $osPath = get_OS() === 'WIN' ? $isopath : $utf8Path; $stream = Element::download($utf8Path); $name = mt_basename($utf8Path); $mime = 'application/octet-stream'; if(is_dir($osPath)){ $mime = 'application/zip'; $name .= '.zip'; } if($conf->get('document_enable_logs_verbose')) Log::put('Téléchargement de '.$utf8Path,'document'); File::downloadStream($stream, $name, $mime); exit(); }); Action::register('document_element_move',function(&$response){ global $myUser,$_,$conf; User::check_access('document','edit'); require_once(__DIR__.SLASH.'Element.class.php'); //l'ui ne renvois que les /, on les convertis par le separateur de l'os $_['from'] = str_replace('/', SLASH, $_['from']); $_['to'] = str_replace('/', SLASH, $_['to']); $from = Element::root().$_['from']; $osFrom = File::convert_decoding($from); if(!file_exists($osFrom)) throw new Exception('Cet élément a peut-être été modifié ou déplacé par quelqu\'un d\'autre. Rafraîchissez la page et réessayez.'); /* nb: cette ligne permet d'eviter d'ajouter un ./ devant le path de la bdd pour ce fichier lorsqu'il est déplacé si le ./ est présent, la méthode browse (qui retourne le cehmin sans le ./) ne match pas avec la ligne en bdd et créé une nouvelle ligne, ce qui rend le proprietaire du fichier anonymous */ if($_['to']=='.') $_['to'] = ''; $to = Element::root().$_['to']; $osTo = File::convert_decoding($to); if(!is_dir($osTo)) return; $char = document_check_element_name(basename(htmlspecialchars_decode(html_entity_decode($to), ENT_QUOTES))); if(!empty($char)) throw new Exception("Caractères interdits : ".$char); $to .= SLASH.basename($from); $element = Element::move($from,$to); $response['element'] = $element; if($conf->get('document_enable_logs')) Log::put('Déplacement de '.$from.' dans '.$to,'document'); }); Action::register('document_element_rename',function(&$response){ global $myUser,$_,$conf; User::check_access('document','edit'); require_once(__DIR__.SLASH.'Element.class.php'); //les exception vides reset le champ de l'ui sans afficher d'erreur if(!isset($_['label']) || empty($_['label'])) throw new Exception("Le nom ne doit pas être vide"); if(strlen($_['label']) > 80) throw new Exception("Taille maximale autorisée de 80 caractères."); //l'ui ne renvois que les /, on les convertis par le separateur de l'os $_['path'] = str_replace('/', SLASH, $_['path']); $from = Element::root().$_['path']; $fromOs = File::convert_decoding($from); if(!file_exists($fromOs)) throw new Exception('Cet élément a peut-être été modifié ou déplacé par quelqu\'un d\'autre. Rafraîchissez la page et réessayez.'); if(is_dir($fromOs) && substr($_['label'], -1,1)=='.') throw new Exception("Les dossiers ne peuvent pas se terminer par un '.'"); $to = dirname($from).SLASH.$_['label']; if(file_exists($to)) throw new Exception('Action impossible, un élément existe déjà avec ce nom.'); $char = document_check_element_name(htmlspecialchars_decode(html_entity_decode($_['label']), ENT_QUOTES)); if(!empty($char)) throw new Exception("Caractères interdits : ".$char); $element = Element::move($from,$to); if(!$element) throw new Exception("Erreur lors de la récupération de l'élément renommé", 500); $element->path = str_replace('\\', '/', $element->path); $response['element'] = $element; if($conf->get('document_enable_logs') ) Log::put('Renommage de l\'élément : '.$from.' en '.$to,'document'); }); Action::register('document_element_delete',function(&$response){ global $myUser,$_,$conf; User::check_access('document','delete'); require_once(__DIR__.SLASH.'Element.class.php'); //l'ui ne renvois que les /, on les convertis par le separateur de l'os $path = Element::root().str_replace('/', SLASH,$_['path']); $osPath = File::convert_decoding($path); if(!file_exists($osPath)) throw new Exception('Cet élément a peut-être été modifié ou déplacé par quelqu\'un d\'autre. Rafraîchissez la page et réessayez.'); Element::remove($path); $extension = getExt($path); if(in_array($extension, array('jpg','jpeg','png','gif','bmp'))) { $thumbname = str_replace(array('\\'),array('/'),$_['path']); $thumbpath = Element::root().'.thumbnails'.SLASH.base64_encode($thumbname).'.'.$extension; if(file_exists($thumbpath)) unlink($thumbpath); } if($conf->get('document_enable_logs')) Log::put("Suppression d'un élément : ".$path,'document'); }); //edition d'un fichier (chargement) Action::register('document_element_edit',function(&$response){ global $myUser,$_,$conf; User::check_access('document','edit'); require_once(__DIR__.SLASH.'Element.class.php'); if(!isset($_['path'])) throw new Exception("Veuillez spécifier le chemin du fichier"); $path = str_replace(array('..'),'',$_['path']); $path = Element::root().$path; $osPath = File::convert_decoding($path); if(!file_exists($osPath)) throw new Exception("Impossible de trouver le fichier, peut-être a t-il été supprimé entre temps, veuillez recharger la page."); $response['path'] = $path; $response['label'] = mt_basename($path); $response['content'] = Element::download($path); if(in_array(getExt($path), array('html','htm'))) $response['wysiwyg'] = true; }); //edition d'un fichier (sauvegarde) Action::register('document_element_save',function(&$response){ global $myUser,$_,$conf; User::check_access('document','edit'); require_once(__DIR__.SLASH.'Element.class.php'); if(!isset($_['label'])) throw new Exception("Veuillez spécifier le nom du fichier"); $label = str_replace(array('..','/','\\'),'',$_['label']); $path = Element::root().$_['path'].SLASH; $osPath = File::convert_decoding($path); $content = html_entity_decode($_['content']); $maxSize = $conf->get('document_allowed_size'); if($maxSize=='') $maxSize = 28060000; $extensions = explode(',',str_replace(' ', '', $conf->get('document_allowed_extensions'))); $extension = getExt($_['label']); if(strlen($content) > $maxSize) throw new Exception("Taille du fichier ".$_['label']." trop grande, taille maximum :".readable_size($maxSize).' ('.$maxSize.' octets)'); if(!in_array($extension , $extensions)) throw new Exception("Extension '".$extension."' du fichier ".$_['label']." non permise, autorisé :".implode(', ',$extensions)); $filePath = $path.$_['label']; Element::addFile($filePath,$content); }); //upload d'un fichier Action::register('document_element_upload',function(&$response){ global $myUser,$_,$conf; User::check_access('document','edit'); require_once(__DIR__.SLASH.'Element.class.php'); $response['sort'] = $_['sort']; if(empty($_FILES)) throw new Exception("Aucun document à importer"); $path = Element::root().$_['path'].SLASH; $osPath = File::convert_decoding($path); if(!file_exists($osPath)) throw new Exception("Dossier ".$osPath." introuvable"); $maxSize = $conf->get('document_allowed_size'); $extensions = explode(',',str_replace(' ', '', $conf->get('document_allowed_extensions'))); $extension = getExt($_FILES['file']['name'][0]); if($_FILES['file']['size'][0] > $maxSize) throw new Exception("Taille du fichier ".$_FILES['file']['name'][0]." trop grande, taille maximum :".readable_size($maxSize).' ('.$maxSize.' octets)'); if(!in_array($extension , $extensions)) throw new Exception("Extension '".$extension."' du fichier ".$_FILES['file']['name'][0]." non permise, autorisé :".implode(', ',$extensions)); if(isset($_['method']) && $_['method'] == 'paste') $_FILES['file']['name'][0] = 'presse papier '.date('d-m-Y H-i-s').'.'.$extension; $filePath = $path.$_FILES['file']['name'][0]; if(!file_exists($_FILES['file']['tmp_name'][0])) throw new Exception("Fichier temporaire n°".$_['sort']." inexistant, verifiez la clause upload_max_size de PHP."); Element::addFile($filePath,file_get_contents($_FILES['file']['tmp_name'][0])); if($conf->get('document_enable_logs')) Log::put("Upload d'un élément : ".$filePath,'document'); }); //Sauvegarde des configurations de document Action::register('document_setting_save',function(&$response){ global $myUser,$_,$conf; User::check_access('document','configure'); foreach(Configuration::setting('document') as $key=>$value){ if(!is_array($value)) continue; $allowed[] = $key; } foreach ($_['fields'] as $key => $value) if(in_array($key, $allowed)) $conf->put($key,$value); }); /** ELEMENTRIGHT **/ //Récuperation d'une liste de elementright Action::register('document_right_search',function(&$response){ global $myUser,$_; User::check_access('document','read'); require_once(__DIR__.SLASH.'ElementRight.class.php'); $rights = ElementRight::loadAll(array('element'=>$_['id'])); foreach($rights as $right){ if($right->entity =='rank'){ $rank = Rank::getById($right->uid); if(!$rank) continue; $right->uid = $rank->label.' (rang)'; } $row = $right->toArray(); if($row['read'] == 0) unset($row['read']); if($row['edit'] == 0) unset($row['edit']); if($row['recursive'] == 0) unset($row['recursive']); $response['rows'][] = $row; } }); //Ajout ou modification d'élément elementright Action::register('document_right_save',function(&$response){ global $myUser,$_; User::check_access('document','edit'); require_once(__DIR__.SLASH.'ElementRight.class.php'); require_once(__DIR__.SLASH.'Element.class.php'); if(!isset($_['uid']) || empty($_['uid'])) throw new Exception("UID de partage non spécifié"); $element = Element::provide('element'); if(!$element) throw new Exception("Cet élément n'existe pas",404); if($element->creator != $myUser->login && !$myUser->can('document','configure') && !$myUser->superadmin) throw new Exception("Vous n'êtes pas propriétaire de cet élement",403); $item = ElementRight::provide(); $item->element = $element->id; $item->recursive = isset($_['recursive']) ? $_['recursive'] : 0 ; $item->edit = isset($_['edit']) ? $_['edit'] : 0 ; $item->read = isset($_['read']) ? $_['read'] : 0 ; $item->uid = $_['uid']; $item->entity = is_numeric($_['uid']) ? 'rank' : 'user'; //supression des anciens droits sur le même couple element / utilisateur si existants ElementRight::delete(array('element'=>$item->element,'entity'=>$item->entity,'uid'=>$item->uid)); $item->save(); }); //Suppression d'élement elementright Action::register('document_right_delete',function(&$response){ global $myUser,$_; User::check_access('document','delete'); require_once(__DIR__.SLASH.'ElementRight.class.php'); require_once(__DIR__.SLASH.'Element.class.php'); $right = ElementRight::provide('id',1); $element = $right->join('element'); if(!$element) throw new Exception("Cet élément n'existe pas",404); if($element->creator != $myUser->login && !$myUser->can('document','configure') && !$myUser->superadmin) throw new Exception("Vous n'etes pas propriétaire de cet élement",403); ElementRight::deleteById($right->id); }); ?>