diff --git a/htdocs/core/actions_linkedfiles.inc.php b/htdocs/core/actions_linkedfiles.inc.php index ea5d6c3db26..ac0769bf67b 100644 --- a/htdocs/core/actions_linkedfiles.inc.php +++ b/htdocs/core/actions_linkedfiles.inc.php @@ -18,35 +18,58 @@ * or see http://www.gnu.org/ */ -// Variable $upload_dir must be defined when entering here +// Variable $upload_dir must be defined when entering here. // Variable $upload_dirold may also exists. +// Variable $confirm must be defined. //var_dump($upload_dir); //var_dump($upload_dirold); + // Submit file/link -if (GETPOST('sendit') && ! empty($conf->global->MAIN_UPLOAD_DOC)) +if (GETPOST('sendit','none') && ! empty($conf->global->MAIN_UPLOAD_DOC)) { - if ($object->id) - { - if (! empty($upload_dirold) && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) - $result = dol_add_file_process($upload_dirold, 0, 1, 'userfile', GETPOST('savingdocmask', 'alpha')); - else - $result = dol_add_file_process($upload_dir, 0, 1, 'userfile', GETPOST('savingdocmask', 'alpha')); - } + if (! empty($_FILES)) + { + if (is_array($_FILES['userfile']['tmp_name'])) $userfiles=$_FILES['userfile']['tmp_name']; + else $userfiles=array($_FILES['userfile']['tmp_name']); + + foreach($userfiles as $key => $userfile) + { + if (empty($_FILES['userfile']['tmp_name'][$key])) + { + $error++; + if ($_FILES['userfile']['error'][$key] == 1 || $_FILES['userfile']['error'][$key] == 2){ + setEventMessages($langs->trans('ErrorFileSizeTooLarge'), null, 'errors'); + } + else { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("File")), null, 'errors'); + } + } + } + + if (! $error) + { + if (! empty($upload_dirold) && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO)) + { + $result = dol_add_file_process($upload_dirold, 0, 1, 'userfile', GETPOST('savingdocmask', 'alpha')); + } + elseif (! empty($upload_dir)) + { + $result = dol_add_file_process($upload_dir, 0, 1, 'userfile', GETPOST('savingdocmask', 'alpha')); + } + } + } } -elseif (GETPOST('linkit') && ! empty($conf->global->MAIN_UPLOAD_DOC)) +elseif (GETPOST('linkit','none') && ! empty($conf->global->MAIN_UPLOAD_DOC)) { - if ($object->id) + $link = GETPOST('link', 'alpha'); + if ($link) { - $link = GETPOST('link', 'alpha'); - if ($link) - { - if (substr($link, 0, 7) != 'http://' && substr($link, 0, 8) != 'https://' && substr($link, 0, 7) != 'file://') { - $link = 'http://' . $link; - } - dol_add_file_process($upload_dir, 0, 1, 'userfile', null, $link); + if (substr($link, 0, 7) != 'http://' && substr($link, 0, 8) != 'https://' && substr($link, 0, 7) != 'file://') { + $link = 'http://' . $link; } + dol_add_file_process($upload_dir, 0, 1, 'userfile', null, $link); } } @@ -54,8 +77,6 @@ elseif (GETPOST('linkit') && ! empty($conf->global->MAIN_UPLOAD_DOC)) // Delete file/link if ($action == 'confirm_deletefile' && $confirm == 'yes') { - if ($object->id) - { $urlfile = GETPOST('urlfile', 'alpha', 0, null, null, 1); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). if (GETPOST('section', 'alpha')) $file = $upload_dir . "/" . $urlfile; // For a delete of GED module urlfile contains full path from upload_dir else // For documents pages, upload_dir contains already path to file from module dir, so we clean path into urlfile. @@ -71,8 +92,8 @@ if ($action == 'confirm_deletefile' && $confirm == 'yes') $dir = dirname($file).'/'; // Chemin du dossier contenant l'image d'origine $dirthumb = $dir.'/thumbs/'; // Chemin du dossier contenant la vignette - $ret = dol_delete_file($file, 0, 0, 0, $object); - if (! empty($fileold)) dol_delete_file($fileold, 0, 0, 0, $object); // Delete file using old path + $ret = dol_delete_file($file, 0, 0, 0, (is_object($object)?$object:null)); + if (! empty($fileold)) dol_delete_file($fileold, 0, 0, 0, (is_object($object)?$object:null)); // Delete file using old path // Si elle existe, on efface la vignette if (preg_match('/(\.jpg|\.jpeg|\.bmp|\.gif|\.png|\.tiff)$/i',$file,$regs)) @@ -112,9 +133,20 @@ if ($action == 'confirm_deletefile' && $confirm == 'yes') } } } - header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id.(!empty($withproject)?'&withproject=1':'')); - exit; - } + + if (is_object($object) && $object->id > 0) + { + if ($backtopage) + { + header('Location: ' . $backtopage); + exit; + } + else + { + header('Location: ' . $_SERVER["PHP_SELF"] . '?id=' . $object->id.(!empty($withproject)?'&withproject=1':'')); + exit; + } + } } elseif ($action == 'confirm_updateline' && GETPOST('save','alpha') && GETPOST('link', 'alpha')) { @@ -142,45 +174,44 @@ elseif ($action == 'confirm_updateline' && GETPOST('save','alpha') && GETPOST('l //error fetching } } -elseif ($action == 'renamefile' && GETPOST('renamefilesave')) +elseif ($action == 'renamefile' && GETPOST('renamefilesave','alpha')) { - if ($object->id) + // For documents pages, upload_dir contains already path to file from module dir, so we clean path into urlfile. + if (! empty($upload_dir)) { - // For documents pages, upload_dir contains already path to file from module dir, so we clean path into urlfile. - //var_dump($upload_dir);exit; - if (! empty($upload_dir)) + $filenamefrom=dol_sanitizeFileName(GETPOST('renamefilefrom','alpha')); + $filenameto=dol_sanitizeFileName(GETPOST('renamefileto','alpha')); + + // Security: + // Disallow file with some extensions. We rename them. + // Because if we put the documents directory into a directory inside web root (very bad), this allows to execute on demand arbitrary code. + if (preg_match('/\.htm|\.html|\.php|\.pl|\.cgi$/i',$filenameto) && empty($conf->global->MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED)) { - $filenamefrom=dol_sanitizeFileName(GETPOST('renamefilefrom','alpha')); - $filenameto=dol_sanitizeFileName(GETPOST('renamefileto','alpha')); + $filenameto.= '.noexe'; + } - // Security: - // Disallow file with some extensions. We rename them. - // Because if we put the documents directory into a directory inside web root (very bad), this allows to execute on demand arbitrary code. - if (preg_match('/\.htm|\.html|\.php|\.pl|\.cgi$/i',$filenameto) && empty($conf->global->MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED)) + if ($filenamefrom && $filenameto) + { + $srcpath = $upload_dir.'/'.$filenamefrom; + $destpath = $upload_dir.'/'.$filenameto; + + $result = dol_move($srcpath, $destpath); + if ($result) { - $filenameto.= '.noexe'; + if ($object->id) + { + $object->addThumbs($destpath); + } + + // TODO Add revert function of addThumbs to remove for old name + //$object->delThumbs($srcpath); + + setEventMessages($langs->trans("FileRenamed"), null); } - - if ($filenamefrom && $filenameto) + else { - $srcpath = $upload_dir.'/'.$filenamefrom; - $destpath = $upload_dir.'/'.$filenameto; - - $result = dol_move($srcpath, $destpath); - if ($result) - { - $object->addThumbs($destpath); - - // TODO Add revert function of addThumbs - //$object->delThumbs($srcpath); - - setEventMessages($langs->trans("FileRenamed"), null); - } - else - { - $langs->load("errors"); // key must be loaded because we can't rely on loading during output, we need var substitution to be done now. - setEventMessages($langs->trans("ErrorFailToRenameFile", $filenamefrom, $filenameto), null, 'errors'); - } + $langs->load("errors"); // key must be loaded because we can't rely on loading during output, we need var substitution to be done now. + setEventMessages($langs->trans("ErrorFailToRenameFile", $filenamefrom, $filenameto), null, 'errors'); } } } diff --git a/htdocs/core/ajax/ajaxdirpreview.php b/htdocs/core/ajax/ajaxdirpreview.php index 90e5bc1521f..eec21e63db6 100644 --- a/htdocs/core/ajax/ajaxdirpreview.php +++ b/htdocs/core/ajax/ajaxdirpreview.php @@ -229,7 +229,7 @@ if ($type == 'directory') $relativepath=GETPOST('file','alpha'); if ($relativepath && $relativepath!= '/') $relativepath.='/'; $upload_dir = $dolibarr_main_data_root.'/'.$module.'/'.$relativepath; - if (GETPOSTISSET('website')) + if (GETPOSTISSET('website') || GETPOSTISSET('file_manager')) { $param.='&file_manager=1'; if (!preg_match('/website=/',$param)) $param.='&website='.urlencode(GETPOST('website','alpha')); @@ -289,40 +289,70 @@ if ($type == 'directory') } -//if ($section) -//{ - $useajax=1; - if (! empty($conf->dol_use_jmobile)) $useajax=0; - if (empty($conf->use_javascript_ajax)) $useajax=0; - if (! empty($conf->global->MAIN_ECM_DISABLE_JS)) $useajax=0; - //$param.=($param?'?':'').(preg_replace('/^&/','',$param)); +// Bottom of page +$useajax=1; +if (! empty($conf->dol_use_jmobile)) $useajax=0; +if (empty($conf->use_javascript_ajax)) $useajax=0; +if (! empty($conf->global->MAIN_ECM_DISABLE_JS)) $useajax=0; - if ($useajax || $action == 'delete') +//$param.=($param?'?':'').(preg_replace('/^&/','',$param)); + +if ($useajax || $action == 'delete') +{ + $urlfile=''; + if ($action == 'delete') $urlfile=GETPOST('urlfile','alpha'); + + if (empty($section_dir)) $section_dir=GETPOST("file","alpha"); + $section_id=$section; + + require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; + $useglobalvars=1; + $form = new Form($db); + $formquestion['urlfile']=array('type'=>'hidden','value'=>$urlfile,'name'=>'urlfile'); // We must always put field, even if empty because it is fille by javascript later + $formquestion['section']=array('type'=>'hidden','value'=>$section,'name'=>'section'); // We must always put field, even if empty because it is fille by javascript later + $formquestion['section_id']=array('type'=>'hidden','value'=>$section_id,'name'=>'section_id'); // We must always put field, even if empty because it is fille by javascript later + $formquestion['section_dir']=array('type'=>'hidden','value'=>$section_dir,'name'=>'section_dir'); // We must always put field, even if empty because it is fille by javascript later + if (! empty($action) && $action == 'file_manager') $formquestion['file_manager']=array('type'=>'hidden','value'=>1,'name'=>'file_manager'); + if (! empty($website)) $formquestion['website']=array('type'=>'hidden','value'=>$website,'name'=>'website'); + if (! empty($pageid) && $pageid > 0) $formquestion['pageid']=array('type'=>'hidden','value'=>$pageid,'name'=>'pageid'); + + print $form->formconfirm($url,$langs->trans("DeleteFile"),$langs->trans("ConfirmDeleteFile"),'confirm_deletefile',$formquestion,"no",($useajax?'deletefile':0)); +} + +if ($useajax) +{ + print ''."\n"; - } -//} + // Enable jquery handlers button to delete files + print 'jQuery(document).ready(function() {'."\n"; + print ' jQuery(".deletefilelink").click(function(e) { '."\n"; + print ' console.log("We click on button with class deletefilelink, param='.$param.', we set urlfile to "+jQuery(this).attr("rel"));'."\n"; + print ' jQuery("#urlfile").val(jQuery(this).attr("rel"));'."\n"; + //print ' jQuery("#section_dir").val(\'aaa\');'."\n"; + print ' jQuery("#dialog-confirm-deletefile").dialog("open");'."\n"; + print ' return false;'."\n"; + print ' });'."\n"; + print '});'."\n"; + print ''."\n"; +} // Close db if mode is not noajax if ((! isset($mode) || $mode != 'noajax') && is_object($db)) $db->close(); diff --git a/htdocs/core/ajax/ajaxdirtree.php b/htdocs/core/ajax/ajaxdirtree.php index ae2f349a644..0475dabbdfa 100644 --- a/htdocs/core/ajax/ajaxdirtree.php +++ b/htdocs/core/ajax/ajaxdirtree.php @@ -230,7 +230,7 @@ if (! empty($conf->use_javascript_ajax) && empty($conf->global->MAIN_ECM_DISABLE } } - // Enable jquery handlers on new generated HTML objects + // Enable jquery handlers on new generated HTML objects (same code than into lib_footer.js.php) // Because the content is reloaded by ajax call, we must also reenable some jquery hooks print "\n\n"; print ''."\n"; * - * @param string $page Url of page to call if confirmation is OK + * @param string $page Url of page to call if confirmation is OK. Can contains paramaters (param 'action' and 'confirm' will be reformated) * @param string $title Title * @param string $question Question * @param string $action Action diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index ee49d15cfac..9b090ed109c 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -55,24 +55,25 @@ class FormFile /** - * Show form to upload a new file + * Show form to upload a new file. * * @param string $url Url * @param string $title Title zone (Title or '' or 'none') - * @param int $addcancel 1=Add 'Cancel' button - * @param int $sectionid If upload must be done inside a particular ECM section - * @param int $perm Value of permission to allow upload - * @param int $size Length of input file area. Deprecated. + * @param int $addcancel 1=Add 'Cancel' button + * @param int $sectionid If upload must be done inside a particular ECM section (is sectionid defined, sectiondir must not be) + * @param int $perm Value of permission to allow upload + * @param int $size Length of input file area. Deprecated. * @param Object $object Object to use (when attachment is done on an element) * @param string $options Add an option column - * @param integer $useajax Use fileupload ajax (0=never, 1=if enabled, 2=always whatever is option). 2 should never be used. + * @param integer $useajax Use fileupload ajax (0=never, 1=if enabled, 2=always whatever is option). @deprecated 2 should never be used and if 1 is used, option should no be enabled. * @param string $savingdocmask Mask to use to define output filename. For example 'XXXXX-__YYYYMMDD__-__file__' * @param integer $linkfiles 1=Also add form to link files, 0=Do not show form to link files * @param string $htmlname Name and id of HTML form ('formuserfile' by default, 'formuserfileecm' when used to upload a file in ECM) * @param string $accept Specifies the types of files accepted (This is not a security check but an user interface facility. eg '.pdf,image/*' or '.png,.jpg' or 'video/*') - * @return int <0 if KO, >0 if OK + * @param string $sectiondir If upload must be done inside a particular directory (is sectiondir defined, sectionid must not be) + * @return int <0 if KO, >0 if OK */ - function form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50, $object='', $options='', $useajax=1, $savingdocmask='', $linkfiles=1, $htmlname='formuserfile', $accept='') + function form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50, $object='', $options='', $useajax=1, $savingdocmask='', $linkfiles=1, $htmlname='formuserfile', $accept='', $sectiondir='') { global $conf,$langs, $hookmanager; $hookmanager->initHooks(array('formfile')); @@ -103,7 +104,7 @@ class FormFile if ($title != 'none') $out.=load_fiche_titre($title, null, null); $out .= '