From 1e151d9864ef18cf78c8149837f9fc608a429404 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@users.sourceforge.net>
Date: Sun, 19 Dec 2010 02:42:53 +0000
Subject: [PATCH] Fix: Fix a lot of regression. There still a lot of new bugs
 to fix (like compatibility through proxy, or restore performance by avoiding
 huge number of fil_exists).

---
 htdocs/admin/boxes.php                        | 28 ++-------
 htdocs/admin/modules.php                      |  4 +-
 htdocs/boxes.php                              | 23 ++------
 htdocs/compta/facture.php                     | 12 +---
 htdocs/core/class/commonobject.class.php      | 58 +++++--------------
 htdocs/core/class/conf.class.php              |  2 +-
 .../includes/menus/standard/auguria.lib.php   |  8 +--
 htdocs/includes/menus/standard/eldy.lib.php   |  8 +--
 htdocs/install/inc.php                        |  2 +-
 htdocs/lib/functions.lib.php                  | 12 ++++
 htdocs/lib/security.lib.php                   |  9 +--
 htdocs/main.inc.php                           | 11 +---
 htdocs/master.inc.php                         |  2 +-
 htdocs/user/passwordforgotten.php             | 10 +---
 14 files changed, 55 insertions(+), 134 deletions(-)

diff --git a/htdocs/admin/boxes.php b/htdocs/admin/boxes.php
index 1d07a786044..fe9547075b5 100644
--- a/htdocs/admin/boxes.php
+++ b/htdocs/admin/boxes.php
@@ -279,23 +279,15 @@ if ($resql)
 		{
 			$boxname = $regs[1];
 			$module = $regs[2];
-			
-			if (file_exists(DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php"))
-			{
-				$sourcefile = DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php";
-			}
-			else
-			{
-				$sourcefile = DOL_DOCUMENT_EXTMODULE."/".$module."/inc/boxes/".$boxname.".php";
-			}
+			$sourcefile = "/".$module."/inc/boxes/".$boxname.".php";
 		}
 		else
 		{
 			$boxname=preg_replace('/.php$/i','',$obj->file);
-			$sourcefile = DOL_DOCUMENT_ROOT."/includes/boxes/".$boxname.".php";
+			$sourcefile = "/includes/boxes/".$boxname.".php";
 		}
 
-		include_once($sourcefile);
+		dol_include_once($sourcefile);
 		$box=new $boxname($db,$obj->note);
 
 //		if (in_array($obj->rowid, $actives) && $box->box_multiple <> 1)
@@ -390,23 +382,15 @@ if ($resql)
 		{
 			$boxname = $regs[1];
 			$module = $regs[2];
-			
-			if (file_exists(DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php"))
-			{
-				$sourcefile = DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php";
-			}
-			else
-			{
-				$sourcefile = DOL_DOCUMENT_EXTMODULE."/".$module."/inc/boxes/".$boxname.".php";
-			}
+			$sourcefile = "/".$module."/inc/boxes/".$boxname.".php";
 		}
 		else
 		{
 			$boxname=preg_replace('/.php$/i','',$obj->file);
-			$sourcefile = DOL_DOCUMENT_ROOT."/includes/boxes/".$boxname.".php";
+			$sourcefile = "/includes/boxes/".$boxname.".php";
 		}
 
-		include_once($sourcefile);
+		dol_include_once($sourcefile);
 		$box=new $boxname($db,$obj->note);
 
 		if (preg_match('/^([^@]+)@([^@]+)$/i',$box->boximg))
diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php
index 86c6b0aefa8..80601ac6547 100644
--- a/htdocs/admin/modules.php
+++ b/htdocs/admin/modules.php
@@ -376,7 +376,7 @@ if ($mode != 4)
                             {
                             	if (preg_match('/^([^@]+)@([^@]+)$/i',$urlpage,$regs))
                             	{
-                            		if (file_exists(DOL_URL_ROOT.'/'.$regs[2].'/admin/'.$regs[1]))
+                            		if (! defined('DOL_URL_EXTMODULE') || ! DOL_URL_EXTMODULE || file_exists(DOL_URL_ROOT.'/'.$regs[2].'/admin/'.$regs[1]))
                             		{
                             			print '<a href="'.DOL_URL_ROOT.'/'.$regs[2].'/admin/'.$regs[1].'" title="'.$langs->trans("Setup").'">'.img_picto($langs->trans("Setup"),"setup").'</a>&nbsp;';
                             		}
@@ -395,7 +395,7 @@ if ($mode != 4)
                     }
                     else if (preg_match('/^([^@]+)@([^@]+)$/i',$objMod->config_page_url,$regs))
                     {
-                    	if (file_exists(DOL_URL_ROOT.'/'.$regs[2].'/admin/'.$regs[1]))
+                    	if (! defined('DOL_URL_EXTMODULE') || ! DOL_URL_EXTMODULE || file_exists(DOL_URL_ROOT.'/'.$regs[2].'/admin/'.$regs[1]))
                         {
                         	print '<td align="right" valign="top"><a href="'.DOL_URL_ROOT.'/'.$regs[2].'/admin/'.$regs[1].'" title="'.$langs->trans("Setup").'">'.img_picto($langs->trans("Setup"),"setup").'</a></td>';
                         }
diff --git a/htdocs/boxes.php b/htdocs/boxes.php
index 1f7ae1eac64..441c73f5b0f 100644
--- a/htdocs/boxes.php
+++ b/htdocs/boxes.php
@@ -220,14 +220,7 @@ class InfoBox
 						$boxname = $regs[1];
 						$module = $regs[2];
 						
-						if (file_exists(DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php"))
-						{
-							$sourcefile = DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php";
-						}
-						else
-						{
-							$sourcefile = DOL_DOCUMENT_EXTMODULE."/".$module."/inc/boxes/".$boxname.".php";
-						}
+						dol_include_once("/".$module."/inc/boxes/".$boxname.".php");
 					}
 					else
 					{
@@ -288,23 +281,15 @@ class InfoBox
 					{
 						$boxname = $regs[1];
 						$module = $regs[2];
-						
-						if (file_exists(DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php"))
-						{
-							$sourcefile = DOL_DOCUMENT_ROOT."/".$module."/inc/boxes/".$boxname.".php";
-						}
-						else
-						{
-							$sourcefile = DOL_DOCUMENT_EXTMODULE."/".$module."/inc/boxes/".$boxname.".php";
-						}
+						$sourcefile = "/".$module."/inc/boxes/".$boxname.".php";
 					}
 					else
 					{
 						$boxname=preg_replace('/.php$/i','',$obj->file);
-						$sourcefile = DOL_DOCUMENT_ROOT."/includes/boxes/".$boxname.".php";
+						$sourcefile = "/includes/boxes/".$boxname.".php";
 					}
 
-					include_once($sourcefile);
+					dol_include_once($sourcefile);
 					$box=new $boxname($db,$obj->note);
 
 					$box->rowid=$obj->rowid;
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index 6499e99025c..e9ffe392d4d 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -687,11 +687,7 @@ if ($_POST['action'] == 'add' && $user->rights->facture->creer)
 
 				if ($facid > 0)
 				{
-					if (file_exists(DOL_DOCUMENT_ROOT.'/'.$element.'/class/'.$subelement.'.class.php')) {
-						require_once(DOL_DOCUMENT_ROOT.'/'.$element.'/class/'.$subelement.'.class.php');
-					} else {
-						require_once(DOL_DOCUMENT_EXTMODULE.'/'.$element.'/class/'.$subelement.'.class.php');
-					}
+					dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
 
 					$classname = ucfirst($subelement);
 					$srcobject = new $classname($db);
@@ -1397,11 +1393,7 @@ if ($_GET['action'] == 'create')
     		if ($element == 'propal')   { $element = 'comm/propal'; $subelement = 'propal'; }
     		if ($element == 'contract') { $element = $subelement = 'contrat'; }
 
-    		if (file_exists(DOL_DOCUMENT_ROOT.'/'.$element.'/class/'.$subelement.'.class.php')) {
-    			require_once(DOL_DOCUMENT_ROOT.'/'.$element.'/class/'.$subelement.'.class.php');
-    		} else {
-    			require_once(DOL_DOCUMENT_EXTMODULE.'/'.$element.'/class/'.$subelement.'.class.php');
-    		}
+    		dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
 
     		$classname = ucfirst($subelement);
     		$objectsrc = new $classname($db);
diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index b367d9c3fd4..5240a60eb42 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -1284,38 +1284,22 @@ class CommonObject
 				$daofile 	= 'dao_'.$module.'.class.php';
 				$pathroot	= '';
 				
-				// Include class and library of thirdparty module
-				if (file_exists(DOL_DOCUMENT_ROOT.$path.$actionfile) &&	file_exists(DOL_DOCUMENT_ROOT.$path.$daofile))
-				{
-					$pathroot = DOL_DOCUMENT_ROOT;
-				}
-				else if (file_exists(DOL_DOCUMENT_EXTMODULE.$path.$actionfile) && file_exists(DOL_DOCUMENT_EXTMODULE.$path.$daofile))
-				{
-					$pathroot = DOL_DOCUMENT_EXTMODULE;
-				}
-				
-				if ($pathroot)
-				{
-					// Include actions class (controller)
-					require_once($pathroot.$path.$actionfile);
+				// Include actions class (controller)
+				dol_include_once($path.$actionfile);
 
-					// Include dataservice class (model)
-					require_once($pathroot.$path.$daofile);
+				// Include dataservice class (model)
+				dol_include_once($path.$daofile);
 
-					// Instantiate actions class (controller)
-					$controlclassname = 'Actions'.ucfirst($module);
-					$objModule = new $controlclassname($this->db);
-					$this->hooks[$objModule->module_number] = $objModule;
+				// Instantiate actions class (controller)
+				$controlclassname = 'Actions'.ucfirst($module);
+				$objModule = new $controlclassname($this->db);
+				$this->hooks[$objModule->module_number] = $objModule;
 
-					// Instantiate dataservice class (model)
-					$modelclassname = 'Dao'.ucfirst($module);
-					$this->hooks[$objModule->module_number]->object = new $modelclassname($this->db);
-				}
+				// Instantiate dataservice class (model)
+				$modelclassname = 'Dao'.ucfirst($module);
+				$this->hooks[$objModule->module_number]->object = new $modelclassname($this->db);
 
-				if (file_exists($pathroot.'/'.$module.'/lib/'.$module.'.lib.php'))
-				{
-					require_once($pathroot.'/'.$module.'/lib/'.$module.'.lib.php');
-				}
+				dol_include_once('/'.$module.'/lib/'.$module.'.lib.php');
 			}
 		}
 	}
@@ -1388,24 +1372,10 @@ class CommonObject
             //print $classfile." - ".$classpath." - ".$tplpath;
             if(!class_exists($classname))
             {
-            	if (file_exists(DOL_DOCUMENT_ROOT."/".$classpath."/".$classfile.".class.php"))
-            	{
-            		require(DOL_DOCUMENT_ROOT."/".$classpath."/".$classfile.".class.php");
-            	}
-            	else
-            	{
-            		require(DOL_DOCUMENT_EXTMODULE."/".$classpath."/".$classfile.".class.php");
-            	}
+            	dol_include_once("/".$classpath."/".$classfile.".class.php");
             }
 			$linkedObjectBlock = new $classname($this->db);
-			if (file_exists(DOL_DOCUMENT_ROOT.'/'.$tplpath.'/tpl/linkedobjectblock.tpl.php'))
-			{
-				include(DOL_DOCUMENT_ROOT.'/'.$tplpath.'/tpl/linkedobjectblock.tpl.php');
-			}
-			else
-			{
-				include(DOL_DOCUMENT_EXTMODULE.'/'.$tplpath.'/tpl/linkedobjectblock.tpl.php');
-			}
+			dol_include_once('/'.$tplpath.'/tpl/linkedobjectblock.tpl.php');
 			
 			return $num;
 		}
diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php
index 623504e8a88..1d4a1abdf42 100644
--- a/htdocs/core/class/conf.class.php
+++ b/htdocs/core/class/conf.class.php
@@ -143,7 +143,7 @@ class Conf
 						{
 							$modulename = strtolower($reg[1]);
 							if ($value == 1) $this->triggers_modules[] = DOL_DOCUMENT_ROOT.'/'.$modulename.'/inc/triggers/';
-							else if ($value == 2) $this->triggers_modules[] = DOL_DOCUMENT_EXTMODULE.'/'.$modulename.'/inc/triggers/';
+							else if ($value == 2) $this->triggers_modules[] = DOL_DOCUMENT_ROOT_ALT.'/'.$modulename.'/inc/triggers/';
 						}
 						// If this is constant for login method activated by a module
 						elseif (preg_match('/^MAIN_MODULE_([A-Z_]+)_LOGIN_METHOD$/i',$key,$reg))
diff --git a/htdocs/includes/menus/standard/auguria.lib.php b/htdocs/includes/menus/standard/auguria.lib.php
index 514e6089c02..313e5df77b6 100644
--- a/htdocs/includes/menus/standard/auguria.lib.php
+++ b/htdocs/includes/menus/standard/auguria.lib.php
@@ -64,8 +64,8 @@ function print_auguria_menu($db,$atarget,$type_user)
 				else
 				{
 					preg_match('/^([^<]+\.php)/i',$tabMenu[$i]['url'],$regs);
-					if (file_exists(DOL_DOCUMENT_ROOT.$regs[1])) $url=DOL_URL_ROOT.$tabMenu[$i]['url'];
-					else $url=DOL_URL_EXTMODULE.$tabMenu[$i]['url'];
+					$url=DOL_URL_ROOT.$tabMenu[$i]['url'];
+					if (defined('DOL_URL_EXTMODULE') && DOL_URL_EXTMODULE && ! file_exists(DOL_DOCUMENT_ROOT.$tabMenu[$i]['url'])) $url=DOL_URL_EXTMODULE.$tabMenu[$i]['url'];
 					if (! preg_match('/\?/',$url)) $url.='?';
 					else $url.='&';
 					if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url))
@@ -278,8 +278,8 @@ function print_left_auguria_menu($db,$menu_array_before,$menu_array_after)
 
             // Add mainmenu in GET url. This make to go back on correct menu even when using Back on browser.
             preg_match('/^([^<]+\.php)/i',$menu_array[$i]['url'],$regs);
-			if (file_exists(DOL_DOCUMENT_ROOT.$regs[1])) $url=DOL_URL_ROOT.$menu_array[$i]['url'];
-			else $url=DOL_URL_EXTMODULE.$menu_array[$i]['url'];
+			$url=DOL_URL_ROOT.$menu_array[$i]['url'];
+			if (defined('DOL_URL_EXTMODULE') && DOL_URL_EXTMODULE && ! file_exists(DOL_DOCUMENT_ROOT.$regs[1])) $url=DOL_URL_EXTMODULE.$menu_array[$i]['url'];
 			
             if (! preg_match('/mainmenu=/i',$menu_array[$i]['url']))
             {
diff --git a/htdocs/includes/menus/standard/eldy.lib.php b/htdocs/includes/menus/standard/eldy.lib.php
index aa49c3877cf..3942082e26d 100644
--- a/htdocs/includes/menus/standard/eldy.lib.php
+++ b/htdocs/includes/menus/standard/eldy.lib.php
@@ -453,8 +453,8 @@ function print_eldy_menu($db,$atarget,$type_user)
 				}
 				else
 				{
-					if (file_exists(DOL_DOCUMENT_ROOT.$tabMenu[$i]['url'])) $url=DOL_URL_ROOT.$tabMenu[$i]['url'];
-					else $url=DOL_URL_EXTMODULE.$tabMenu[$i]['url'];
+					$url=DOL_URL_ROOT.$tabMenu[$i]['url'];
+					if (defined('DOL_URL_EXTMODULE') && DOL_URL_EXTMODULE && ! file_exists(DOL_DOCUMENT_ROOT.$tabMenu[$i]['url'])) $url=DOL_URL_EXTMODULE.$tabMenu[$i]['url'];
 					if (! preg_match('/\?/',$url)) $url.='?';
 					else $url.='&';
 					if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url))
@@ -1387,8 +1387,8 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after)
             
             // For external modules
             preg_match('/^([^<]+\.php)/i',$menu_array[$i]['url'],$regs);
-			if (file_exists(DOL_DOCUMENT_ROOT.$regs[1])) $url=DOL_URL_ROOT.$menu_array[$i]['url'];
-			else $url=DOL_URL_EXTMODULE.$menu_array[$i]['url'];
+			$url=DOL_URL_ROOT.$menu_array[$i]['url'];
+			if (defined('DOL_URL_EXTMODULE') && DOL_URL_EXTMODULE && ! file_exists(DOL_DOCUMENT_ROOT.$regs[1])) $url=DOL_URL_EXTMODULE.$menu_array[$i]['url'];
 
             // Menu niveau 0
             if ($menu_array[$i]['level'] == 0)
diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php
index 61d8d1d9ec3..88d14386383 100644
--- a/htdocs/install/inc.php
+++ b/htdocs/install/inc.php
@@ -125,7 +125,7 @@ define('MAIN_DB_PREFIX',(isset($dolibarr_main_db_prefix)?$dolibarr_main_db_prefi
 
 define('DOL_DATA_ROOT',(isset($dolibarr_main_data_root)?$dolibarr_main_data_root:''));
 define('DOL_CLASS_PATH', 'class/');                             // Filsystem path to class dir
-define('DOL_DOCUMENT_EXTMODULE', (isset($dolibarr_main_document_root_alt)?$dolibarr_main_document_root_alt:''));	// Filesystem path to external modules dir
+define('DOL_DOCUMENT_ROOT_ALT', (isset($dolibarr_main_document_root_alt)?$dolibarr_main_document_root_alt:''));	// Filesystem path to external root dir (external modules)
 define('DOL_MAIN_URL_ROOT', (isset($dolibarr_main_url_root)?$dolibarr_main_url_root:''));           // URL relative root
 $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT'));  // $uri contains url without http*
 $suburi = strstr ($uri, '/');       // $suburi contains url without domain
diff --git a/htdocs/lib/functions.lib.php b/htdocs/lib/functions.lib.php
index 9fe2dfd07a5..a436021aa33 100644
--- a/htdocs/lib/functions.lib.php
+++ b/htdocs/lib/functions.lib.php
@@ -62,6 +62,18 @@ function GETPOST($paramname,$check='',$method=0)
     return $out;
 }
 
+/**
+ *	Make an include_once using default root and alternate root if it fails.
+ * 	@param			relpath		Relative path to file (Ie: mydir/myfile, ../myfile, ...)
+ *  @return         int			Result
+ */
+function dol_include_once($relpath)
+{
+	$res=@include_once(DOL_DOCUMENT_ROOT.$relpath);
+	if (! $res && defined('DOL_DOCUMENT_ROOT_ALT')) $res=@include_once(DOL_DOCUMENT_ROOT_ALT.$relpath);
+	return $res;
+}
+
 /**
  *	Create a clone of instance of object (new instance with same properties)
  * 	This function works for both PHP4 and PHP5.
diff --git a/htdocs/lib/security.lib.php b/htdocs/lib/security.lib.php
index a022a2e4f6f..059c64f4ca6 100644
--- a/htdocs/lib/security.lib.php
+++ b/htdocs/lib/security.lib.php
@@ -159,14 +159,7 @@ function dol_loginfunction($langs,$conf,$mysoc)
 	{
 		$rowspan++;
 
-		if(file_exists(DOL_DOCUMENT_ROOT.'/multicompany/class/actions_multicompany.class.php'))
-		{
-			$res=@include_once(DOL_DOCUMENT_ROOT.'/multicompany/class/actions_multicompany.class.php');
-		}
-		else
-		{
-			$res=@include_once(DOL_DOCUMENT_EXTMODULE.'/multicompany/class/actions_multicompany.class.php');
-		}
+		$res=dol_include_once('/multicompany/class/actions_multicompany.class.php');
 		if ($res)
 		{
 			$mc = new ActionsMulticompany($db);
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index 1b803046dd5..dd70e99e091 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -1068,15 +1068,8 @@ function top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $a
 	{
 		if ($user->admin && ! $user->entity)
 		{
-			if(file_exists(DOL_DOCUMENT_ROOT.'/multicompany/class/actions_multicompany.class.php'))
-			{
-				$res=@include_once(DOL_DOCUMENT_ROOT.'/multicompany/class/actions_multicompany.class.php');
-			}
-			else
-			{
-				$res=@include_once(DOL_DOCUMENT_EXTMODULE.'/multicompany/class/actions_multicompany.class.php');
-			}
-			
+			$res=@dol_include_once('/multicompany/class/actions_multicompany.class.php');
+		
 			if ($res)
 			{
 				//$mc = new ActionsMulticompany($db);
diff --git a/htdocs/master.inc.php b/htdocs/master.inc.php
index a1fce0a1360..aae5f3b937a 100644
--- a/htdocs/master.inc.php
+++ b/htdocs/master.inc.php
@@ -104,7 +104,7 @@ if (empty($dolibarr_main_data_root))
 define('DOL_DOCUMENT_ROOT', $dolibarr_main_document_root);			// Filesystem core php (htdocs)
 define('DOL_DATA_ROOT', $dolibarr_main_data_root);					// Filesystem data (documents)
 define('DOL_CLASS_PATH', 'class/');									// Filesystem path to class dir
-define('DOL_DOCUMENT_EXTMODULE', $dolibarr_main_document_root_alt);	// Filesystem path to external modules dir
+define('DOL_DOCUMENT_ROOT_ALT', $dolibarr_main_document_root_alt);	// Filesystem path to external modules dir
 // If dolibarr_main_url_root = auto (Hidden feature for developers only), we try to forge it.
 if ($dolibarr_main_url_root == 'auto' && ! empty($_SERVER["SCRIPT_URL"]) && ! empty($_SERVER["SCRIPT_URI"]))
 {
diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php
index fc2b07f21da..6b65b1163cd 100644
--- a/htdocs/user/passwordforgotten.php
+++ b/htdocs/user/passwordforgotten.php
@@ -216,15 +216,7 @@ if (! empty($conf->global->MAIN_MODULE_MULTICOMPANY)  && ! $disabled)
 {
 	global $db;
 	
-	if(file_exists(DOL_DOCUMENT_ROOT.'/multicompany/class/actions_multicompany.class.php'))
-	{
-		$res=@include_once(DOL_DOCUMENT_ROOT.'/multicompany/class/actions_multicompany.class.php');
-	}
-	else
-	{
-		$res=@include_once(DOL_DOCUMENT_EXTMODULE.'/multicompany/class/actions_multicompany.class.php');
-	}
-
+	$res=dol_include_once('/multicompany/class/actions_multicompany.class.php');
 	if ($res)
 	{
 		$mc = new ActionsMulticompany($db);
-- 
GitLab