diff --git a/build/generate_filecheck_xml.php b/build/generate_filecheck_xml.php new file mode 100644 index 0000000000000000000000000000000000000000..47b15f4dec01c24c497e51f7254f74586a631571 --- /dev/null +++ b/build/generate_filecheck_xml.php @@ -0,0 +1,29 @@ +<?php +parse_str($argv[1]); +$fp = fopen(dirname(__FILE__).'/../htdocs/core/filelist-'.$release.'.xml','w'); +fputs($fp, '<?xml version="1.0" encoding="UTF-8" ?>'."\n"); +fputs($fp, '<checksum_list>'."\n"); +fputs($fp, '<dolibarr_root_dir version="'.$release.'">'."\n"); +$dir_iterator = new RecursiveDirectoryIterator(dirname(__FILE__).'/../htdocs/'); +$iterator = new RecursiveIteratorIterator($dir_iterator); +// need to ignore document custom etc +$files = new RegexIterator($iterator, '#^(?:[A-Z]:)?(?:/(?!(?:custom|documents|conf|install))[^/]+)+/[^/]+\.(?:php|html|js|json|tpl|jpg|png|gif|sql|lang)$#i'); +$dir=''; +$needtoclose=0; +foreach ($files as $file) { + $newdir = str_replace(dirname(__FILE__).'/../htdocs', '', dirname($file)); + if ($newdir!=$dir) { + if ($needtoclose) + fputs($fp, '</dir>'."\n"); + fputs($fp, '<dir name="'.$newdir.'" >'."\n"); + $dir = $newdir; + $needtoclose=1; + } + if (filetype($file)=="file") { + fputs($fp, '<md5file name="'.basename($file).'">'.md5_file($file).'</md5file>'."\n"); + } +} +fputs($fp, '</dir>'."\n"); +fputs($fp, '</dolibarr_root_dir>'."\n"); +fputs($fp, '</checksum_list>'."\n"); +fclose($fp); diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index c14fb86a1047e856ea7aa5bbb30db76151995398..3de531902f4fbbb7300920fadbaf692f3ba426c6 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -204,6 +204,9 @@ else { my $NUM_SCRIPT; my $cpt=0; while (! $found) { + $cpt=-1; + printf(" %2d - %-14s (%s)\n",$cpt,"XML Filecheck","Done in all case"); + $cpt=0; printf(" %2d - %-14s (%s)\n",$cpt,"ALL (1..9)","Need ".join(",",values %REQUIREMENTTARGET)); foreach my $target (@LISTETARGET) { $cpt++; @@ -297,7 +300,7 @@ foreach my $target (keys %CHOOSEDTARGET) { print "\n"; -# Check if there is at least on target to build +# Check if there is at least one target to build #---------------------------------------------- $nboftargetok=0; $nboftargetneedbuildroot=0; @@ -319,6 +322,12 @@ foreach my $target (keys %CHOOSEDPUBLISH) { if ($nboftargetok) { + # Build xml check file + #----------------------- + print 'Create xml check file with md5 checksum'."\n"; + $FULLDIRECTORY = cwd(); + $ret=`php $FULLDIRECTORY/generate_filecheck_xml.php release=$MAJOR.$MINOR.$BUILD`; + # Update CVS if required #----------------------- if ($nbofpublishneedtag) diff --git a/htdocs/admin/system/filecheck.php b/htdocs/admin/system/filecheck.php new file mode 100644 index 0000000000000000000000000000000000000000..278aae8ea5bd26ef1f6c33282b87aed871c08d7f --- /dev/null +++ b/htdocs/admin/system/filecheck.php @@ -0,0 +1,138 @@ +<?php +/* Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net> + * Copyright (C) 2007 Rodolphe Quiedeville <rodolphe@quiedeville.org> + * Copyright (C) 2007-2012 Regis Houssin <regis.houssin@capnetworks.com> + * Copyright (C) 2015 Frederic France <frederic.france@free.fr> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * \file htdocs/admin/system/filecheck.php + * \brief Page to check Dolibarr files integrity + */ + +require '../../main.inc.php'; + +$langs->load("admin"); + +if (!$user->admin) + accessforbidden(); + + +/* + * View + */ + +llxHeader(); + +print_fiche_titre($langs->trans("FileCheckDolibarr"),'','setup'); + +// Version +$var = true; +print '<table class="noborder" width="100%">'; +print '<tr class="liste_titre"><td>'.$langs->trans("Version").'</td><td>'.$langs->trans("Value").'</td></tr>'."\n"; +$var = ! $var; +print '<tr '.$bc[$var].'><td width="300">'.$langs->trans("VersionLastInstall").'</td><td>'.$conf->global->MAIN_VERSION_LAST_INSTALL.'</td></tr>'."\n"; +$var = ! $var; +print '<tr '.$bc[$var].'><td width="300">'.$langs->trans("VersionLastUpgrade").'</td><td>'.$conf->global->MAIN_VERSION_LAST_UPGRADE.'</td></tr>'."\n"; +$var = ! $var; +print '<tr '.$bc[$var].'><td width="300">'.$langs->trans("VersionProgram").'</td><td>'.DOL_VERSION; +// If current version differs from last upgrade +if (empty($conf->global->MAIN_VERSION_LAST_UPGRADE)) { + // Compare version with last install database version (upgrades never occured) + if (DOL_VERSION != $conf->global->MAIN_VERSION_LAST_INSTALL) + print ' '.img_warning($langs->trans("RunningUpdateProcessMayBeRequired",DOL_VERSION,$conf->global->MAIN_VERSION_LAST_INSTALL)); +} else { + // Compare version with last upgrade database version + if (DOL_VERSION != $conf->global->MAIN_VERSION_LAST_UPGRADE) + print ' '.img_warning($langs->trans("RunningUpdateProcessMayBeRequired",DOL_VERSION,$conf->global->MAIN_VERSION_LAST_UPGRADE)); +} +print '</td></tr>'."\n"; +print '</table>'; +print '<br>'; + + +// Modified or missing files +$file_list = array('missing' => array(), 'updated' => array()); +$xmlfile = DOL_DOCUMENT_ROOT.'/core/filelist-'.DOL_VERSION.'.xml'; +if (file_exists($xmlfile)) { + $xml = simplexml_load_file($xmlfile); + if ($xml) { + $ret = getFilesUpdated($xml->dolibarr_root_dir[0]); + print '<table class="noborder">'; + print '<tr class="liste_titre">'; + print '<td>' . $langs->trans("FilesMissing") . '</td>'; + print '</tr>'."\n"; + $var = true; + foreach ($file_list['missing'] as $file) { + $var = !$var; + print '<tr ' . $bc[$var] . '>'; + print '<td>'.$file.'</td>' . "\n"; + print "</tr>\n"; + } + print '</table>'; + print '<table class="noborder">'; + print '<tr class="liste_titre">'; + print '<td>' . $langs->trans("FilesUpdated") . '</td>'; + print '</tr>'."\n"; + $var = true; + foreach ($file_list['updated'] as $file) { + $var = !$var; + print '<tr ' . $bc[$var] . '>'; + print '<td>'.$file.'</td>' . "\n"; + print "</tr>\n"; + } + print '</table>'; + } +} else { + print $langs->trans('XmlNotFound') . ': ' . DOL_DOCUMENT_ROOT . '/core/filelist-' . DOL_VERSION . '.xml'; +} + +llxFooter(); + +$db->close(); + + +/** + * Function to get list of updated or modified files + * + * @param object $dir SimpleXMLElement of files to test + * @param string $path Path of file + * @return array Array of filenames + */ +function getFilesUpdated(SimpleXMLElement $dir, $path = '') +{ + global $file_list; + $exclude = 'install'; + + foreach ($dir->md5file as $file) { + $filename = $path.$file['name']; + + if (preg_match('#'.$exclude.'#', $filename)) + continue; + + if (!file_exists(DOL_DOCUMENT_ROOT.'/'.$filename)) { + $file_list['missing'][] = $filename; + } else { + $md5_local = md5_file(DOL_DOCUMENT_ROOT.'/'.$filename); + if ($md5_local != (string) $file) + $file_list['updated'][] = $filename; + } + } + + foreach ($dir->dir as $subdir) + getFilesUpdated($subdir, $path.$subdir['name'].'/'); +return $file_list; +} diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 417e02738b3fd748b607719db47ff0ddde482f5c..236669273a15ee21e4c56ca8e3ddedde6b453de8 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -39,10 +39,11 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 201__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/dolibarr.php?leftmenu=admintools', 'InfoDolibarr', 1, 'admin', '', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 202__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/system/modules.php?leftmenu=admintools', 'Modules', 2, 'admin', '', '', 2, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 203__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/triggers.php?leftmenu=admintools', 'Triggers', 2, 'admin', '', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 204__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/browser.php?leftmenu=admintools', 'InfoBrowser', 1, 'admin', '', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 205__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/os.php?leftmenu=admintools', 'InfoOS', 1, 'admin', '', '', 2, 2, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 206__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/web.php?leftmenu=admintools', 'InfoWebServer', 1, 'admin', '', '', 2, 3, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 207__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/phpinfo.php?leftmenu=admintools', 'InfoPHP', 1, 'admin', '', '', 2, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 204__+MAX_llx_menu__, 'home', '', 201__+MAX_llx_menu__, '/admin/system/filecheck.php?leftmenu=admintools', 'FileCheck', 2, 'admin', '', '', 2, 4, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 205__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/browser.php?leftmenu=admintools', 'InfoBrowser', 1, 'admin', '', '', 2, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 206__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/os.php?leftmenu=admintools', 'InfoOS', 1, 'admin', '', '', 2, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 207__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/web.php?leftmenu=admintools', 'InfoWebServer', 1, 'admin', '', '', 2, 3, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 208__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/phpinfo.php?leftmenu=admintools', 'InfoPHP', 1, 'admin', '', '', 2, 4, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 210__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/system/database.php?leftmenu=admintools', 'InfoDatabase', 1, 'admin', '', '', 2, 5, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 301__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/tools/dolibarr_export.php?leftmenu=admintools', 'Backup', 1, 'admin', '', '', 2, 6, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$leftmenu=="admintools"', __HANDLER__, 'left', 302__+MAX_llx_menu__, 'home', '', 300__+MAX_llx_menu__, '/admin/tools/dolibarr_import.php?leftmenu=admintools', 'Restore', 1, 'admin', '', '', 2, 7, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index bfab2db051a866554d8d876d54526a5920a54082..5e6ce3cc63bd4edec2174f9c3fbf968c9e3b927f 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -503,6 +503,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add('/admin/system/dolibarr.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('InfoDolibarr'), 1); if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/system/modules.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Modules'), 2); if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/triggers.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Triggers'), 2); + if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/system/filecheck.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('FileCheck'), 2); $newmenu->add('/admin/system/browser.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoBrowser'), 1); $newmenu->add('/admin/system/os.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoOS'), 1); $newmenu->add('/admin/system/web.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoWebServer'), 1); diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index e16a0a30cccf1de7e03c0fb62bab94c24e93a5a0..5305c1c62ba0d5ecc0c2bcec33d3e58461d8b7d9 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -8,6 +8,11 @@ VersionExperimental=Experimental VersionDevelopment=Development VersionUnknown=Unknown VersionRecommanded=Recommended +FileCheck=Files Integrity +FilesMissing=Missing Files +FilesUpdated=Updated Files +FileCheckDolibarr=Check Dolibarr Files Integrity +XmlNotFound=Xml File of Dolibarr Integrity Not Found SessionId=Session ID SessionSaveHandler=Handler to save sessions SessionSavePath=Storage session localization