diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 1c26fbf591595c1033184de86ffe82250eb905f0..8ff9e6bbc47b9a0beda62e9d2adcf9496532a90b 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1235,13 +1235,16 @@ function dol_most_recent_file($dir,$regexfilter='',$excludefilter=array('\.meta$ * * @param string $modulepart Module of document * @param string $original_file Relative path with filename + * @param User $fuser User object (forced) * @param string $entity Restrict onto entity * @return mixed Array with access information : accessallowed & sqlprotectagainstexternals & original_file (as full path name) */ -function dol_check_secure_access_document($modulepart,$original_file,$entity) +function dol_check_secure_access_document($modulepart,$original_file,$entity,$fuser='') { global $user, $conf; + if (! is_object($fuser)) $fuser=$user; + if (empty($modulepart)) return 'ErrorBadParameter'; if (empty($entity)) $entity=0; dol_syslog('$modulepart='.$modulepart.' $original_file= '.$original_file); @@ -1271,101 +1274,101 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les apercu factures elseif ($modulepart == 'apercufacture') { - if ($user->rights->facture->lire) $accessallowed=1; + if ($fuser->rights->facture->lire) $accessallowed=1; $original_file=$conf->facture->dir_output.'/'.$original_file; } // Wrapping pour les apercu propal elseif ($modulepart == 'apercupropal') { - if ($user->rights->propale->lire) $accessallowed=1; + if ($fuser->rights->propale->lire) $accessallowed=1; $original_file=$conf->propal->dir_output.'/'.$original_file; } // Wrapping pour les apercu commande elseif ($modulepart == 'apercucommande') { - if ($user->rights->commande->lire) $accessallowed=1; + if ($fuser->rights->commande->lire) $accessallowed=1; $original_file=$conf->commande->dir_output.'/'.$original_file; } // Wrapping pour les apercu intervention elseif ($modulepart == 'apercufichinter') { - if ($user->rights->ficheinter->lire) $accessallowed=1; + if ($fuser->rights->ficheinter->lire) $accessallowed=1; $original_file=$conf->ficheinter->dir_output.'/'.$original_file; } // Wrapping pour les images des stats propales elseif ($modulepart == 'propalstats') { - if ($user->rights->propale->lire) $accessallowed=1; + if ($fuser->rights->propale->lire) $accessallowed=1; $original_file=$conf->propal->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats commandes elseif ($modulepart == 'orderstats') { - if ($user->rights->commande->lire) $accessallowed=1; + if ($fuser->rights->commande->lire) $accessallowed=1; $original_file=$conf->commande->dir_temp.'/'.$original_file; } elseif ($modulepart == 'orderstatssupplier') { - if ($user->rights->fournisseur->commande->lire) $accessallowed=1; + if ($fuser->rights->fournisseur->commande->lire) $accessallowed=1; $original_file=$conf->fournisseur->dir_output.'/commande/temp/'.$original_file; } // Wrapping pour les images des stats factures elseif ($modulepart == 'billstats') { - if ($user->rights->facture->lire) $accessallowed=1; + if ($fuser->rights->facture->lire) $accessallowed=1; $original_file=$conf->facture->dir_temp.'/'.$original_file; } elseif ($modulepart == 'billstatssupplier') { - if ($user->rights->fournisseur->facture->lire) $accessallowed=1; + if ($fuser->rights->fournisseur->facture->lire) $accessallowed=1; $original_file=$conf->fournisseur->dir_output.'/facture/temp/'.$original_file; } // Wrapping pour les images des stats expeditions elseif ($modulepart == 'expeditionstats') { - if ($user->rights->expedition->lire) $accessallowed=1; + if ($fuser->rights->expedition->lire) $accessallowed=1; $original_file=$conf->expedition->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats expeditions elseif ($modulepart == 'tripsexpensesstats') { - if ($user->rights->deplacement->lire) $accessallowed=1; + if ($fuser->rights->deplacement->lire) $accessallowed=1; $original_file=$conf->deplacement->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats expeditions elseif ($modulepart == 'memberstats') { - if ($user->rights->adherent->lire) $accessallowed=1; + if ($fuser->rights->adherent->lire) $accessallowed=1; $original_file=$conf->adherent->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats produits elseif (preg_match('/^productstats_/i',$modulepart)) { - if ($user->rights->produit->lire || $user->rights->service->lire) $accessallowed=1; + if ($fuser->rights->produit->lire || $fuser->rights->service->lire) $accessallowed=1; $original_file=(!empty($conf->product->multidir_temp[$entity])?$conf->product->multidir_temp[$entity]:$conf->service->multidir_temp[$entity]).'/'.$original_file; } // Wrapping for products or services elseif ($modulepart == 'tax') { - if ($user->rights->tax->charges->lire) $accessallowed=1; + if ($fuser->rights->tax->charges->lire) $accessallowed=1; $original_file=$conf->tax->dir_output.'/'.$original_file; } // Wrapping for products or services elseif ($modulepart == 'actions') { - if ($user->rights->agenda->myactions->read) $accessallowed=1; + if ($fuser->rights->agenda->myactions->read) $accessallowed=1; $original_file=$conf->agenda->dir_output.'/'.$original_file; } // Wrapping for categories elseif ($modulepart == 'category') { - if ($user->rights->categorie->lire) $accessallowed=1; + if ($fuser->rights->categorie->lire) $accessallowed=1; $original_file=$conf->categorie->multidir_output[$entity].'/'.$original_file; } // Wrapping pour les prelevements elseif ($modulepart == 'prelevement') { - if ($user->rights->prelevement->bons->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->prelevement->bons->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1408,7 +1411,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) elseif ($modulepart == 'scanner_user_temp') { $accessallowed=1; - $original_file=$conf->scanner->dir_temp.'/'.$user->id.'/'.$original_file; + $original_file=$conf->scanner->dir_temp.'/'.$fuser->id.'/'.$original_file; } // Wrapping pour les images fckeditor elseif ($modulepart == 'fckeditor') @@ -1420,7 +1423,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping for third parties else if ($modulepart == 'company' || $modulepart == 'societe') { - if ($user->rights->societe->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->societe->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1431,7 +1434,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping for invoices else if ($modulepart == 'facture' || $modulepart == 'invoice') { - if ($user->rights->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->facture->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1441,7 +1444,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) else if ($modulepart == 'unpaid') { - if ($user->rights->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->facture->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1451,7 +1454,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les fiches intervention else if ($modulepart == 'ficheinter') { - if ($user->rights->ficheinter->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->ficheinter->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1462,7 +1465,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les deplacements et notes de frais else if ($modulepart == 'deplacement') { - if ($user->rights->deplacement->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->deplacement->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1472,7 +1475,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les propales else if ($modulepart == 'propal') { - if ($user->rights->propale->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->propale->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1484,7 +1487,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les commandes else if ($modulepart == 'commande' || $modulepart == 'order') { - if ($user->rights->commande->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->commande->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1495,7 +1498,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les projets else if ($modulepart == 'project') { - if ($user->rights->projet->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->projet->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1506,7 +1509,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les commandes fournisseurs else if ($modulepart == 'commande_fournisseur' || $modulepart == 'order_supplier') { - if ($user->rights->fournisseur->commande->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->fournisseur->commande->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1517,7 +1520,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les factures fournisseurs else if ($modulepart == 'facture_fournisseur' || $modulepart == 'invoice_supplier') { - if ($user->rights->fournisseur->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->fournisseur->facture->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1528,18 +1531,18 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les rapport de paiements else if ($modulepart == 'facture_paiement') { - if ($user->rights->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->facture->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } - if ($user->societe_id > 0) $original_file=$conf->facture->dir_output.'/payments/private/'.$user->id.'/'.$original_file; + if ($fuser->societe_id > 0) $original_file=$conf->facture->dir_output.'/payments/private/'.$fuser->id.'/'.$original_file; else $original_file=$conf->facture->dir_output.'/payments/'.$original_file; } // Wrapping pour les exports de compta else if ($modulepart == 'export_compta') { - if ($user->rights->compta->ventilation->creer || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->compta->ventilation->creer || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1549,7 +1552,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les expedition else if ($modulepart == 'expedition') { - if ($user->rights->expedition->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->expedition->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1559,7 +1562,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les bons de livraison else if ($modulepart == 'livraison') { - if ($user->rights->expedition->livraison->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->expedition->livraison->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1569,7 +1572,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les actions else if ($modulepart == 'actions') { - if ($user->rights->agenda->myactions->read || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->agenda->myactions->read || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1579,7 +1582,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les actions else if ($modulepart == 'actionsreport') { - if ($user->rights->agenda->allactions->read || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->agenda->allactions->read || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1589,7 +1592,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les produits et services else if ($modulepart == 'product' || $modulepart == 'produit' || $modulepart == 'service') { - if (($user->rights->produit->lire || $user->rights->service->lire) || preg_match('/^specimen/i',$original_file)) + if (($fuser->rights->produit->lire || $fuser->rights->service->lire) || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1600,7 +1603,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les contrats else if ($modulepart == 'contract') { - if ($user->rights->contrat->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->contrat->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1610,7 +1613,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les dons else if ($modulepart == 'donation') { - if ($user->rights->don->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->don->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1620,7 +1623,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les remises de cheques else if ($modulepart == 'remisecheque') { - if ($user->rights->banque->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->banque->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1634,7 +1637,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Aucun test necessaire car on force le rep de download sur // le rep export qui est propre a l'utilisateur $accessallowed=1; - $original_file=$conf->export->dir_temp.'/'.$user->id.'/'.$original_file; + $original_file=$conf->export->dir_temp.'/'.$fuser->id.'/'.$original_file; } // Wrapping for import module @@ -1658,7 +1661,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour les backups else if ($modulepart == 'systemtools') { - if ($user->admin) + if ($fuser->admin) { $accessallowed=1; } @@ -1668,7 +1671,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping for upload file test else if ($modulepart == 'admin_temp') { - if ($user->admin) + if ($fuser->admin) $accessallowed=1; $original_file=$conf->admin->dir_temp.'/'.$original_file; } @@ -1685,7 +1688,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Wrapping pour Foundation module else if ($modulepart == 'member') { - if ($user->rights->adherent->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->adherent->lire || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1696,7 +1699,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) else if ($modulepart == 'scanner_user_temp') { $accessallowed=1; - $original_file=$conf->scanner->dir_temp.'/'.$user->id.'/'.$original_file; + $original_file=$conf->scanner->dir_temp.'/'.$fuser->id.'/'.$original_file; } // GENERIC Wrapping @@ -1709,18 +1712,18 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) // Define $accessallowed if (preg_match('/^([a-z]+)_user_temp$/i',$modulepart,$reg)) { - if ($user->rights->$reg[1]->lire || $user->rights->$reg[1]->read || ($user->rights->$reg[1]->download)) $accessallowed=1; - $original_file=$conf->$reg[1]->dir_temp.'/'.$user->id.'/'.$original_file; + if ($fuser->rights->$reg[1]->lire || $fuser->rights->$reg[1]->read || ($fuser->rights->$reg[1]->download)) $accessallowed=1; + $original_file=$conf->$reg[1]->dir_temp.'/'.$fuser->id.'/'.$original_file; } else if (preg_match('/^([a-z]+)_temp$/i',$modulepart,$reg)) { - if ($user->rights->$reg[1]->lire || $user->rights->$reg[1]->read || ($user->rights->$reg[1]->download)) $accessallowed=1; + if ($fuser->rights->$reg[1]->lire || $fuser->rights->$reg[1]->read || ($fuser->rights->$reg[1]->download)) $accessallowed=1; $original_file=$conf->$reg[1]->dir_temp.'/'.$original_file; } else if (preg_match('/^([a-z]+)_user$/i',$modulepart,$reg)) { - if ($user->rights->$reg[1]->lire || $user->rights->$reg[1]->read || ($user->rights->$reg[1]->download)) $accessallowed=1; - $original_file=$conf->$reg[1]->dir_output.'/'.$user->id.'/'.$original_file; + if ($fuser->rights->$reg[1]->lire || $fuser->rights->$reg[1]->read || ($fuser->rights->$reg[1]->download)) $accessallowed=1; + $original_file=$conf->$reg[1]->dir_output.'/'.$fuser->id.'/'.$original_file; } else { @@ -1728,24 +1731,24 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $subperm=GETPOST('subperm'); if ($perm || $subperm) { - if (($perm && ! $subperm && $user->rights->$modulepart->$perm) || ($perm && $subperm && $user->rights->$modulepart->$perm->$subperm)) $accessallowed=1; + if (($perm && ! $subperm && $fuser->rights->$modulepart->$perm) || ($perm && $subperm && $fuser->rights->$modulepart->$perm->$subperm)) $accessallowed=1; $original_file=$conf->$modulepart->dir_output.'/'.$original_file; } else { - if ($user->rights->$modulepart->lire || $user->rights->$modulepart->read) $accessallowed=1; + if ($fuser->rights->$modulepart->lire || $fuser->rights->$modulepart->read) $accessallowed=1; $original_file=$conf->$modulepart->dir_output.'/'.$original_file; } } if (preg_match('/^specimen/i',$original_file)) $accessallowed=1; // If link to a specimen - if ($user->admin) $accessallowed=1; // If user is admin + if ($fuser->admin) $accessallowed=1; // If user is admin // For modules who wants to manage different levels of permissions for documents $subPermCategoryConstName = strtoupper($modulepart).'_SUBPERMCATEGORY_FOR_DOCUMENTS'; if (! empty($conf->global->$subPermCategoryConstName)) { $subPermCategory = $conf->global->$subPermCategoryConstName; - if (! empty($subPermCategory) && (($user->rights->$modulepart->$subPermCategory->lire) || ($user->rights->$modulepart->$subPermCategory->read) || ($user->rights->$modulepart->$subPermCategory->download))) + if (! empty($subPermCategory) && (($fuser->rights->$modulepart->$subPermCategory->lire) || ($fuser->rights->$modulepart->$subPermCategory->read) || ($fuser->rights->$modulepart->$subPermCategory->download))) { $accessallowed=1; } @@ -1759,7 +1762,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) eval('$sqlprotectagainstexternals = "'.$conf->global->$sqlProtectConstName.'";'); } } - + $ret = array( 'accessallowed' => $accessallowed, 'sqlprotectagainstexternals'=>$sqlprotectagainstexternals, diff --git a/htdocs/webservices/server_other.php b/htdocs/webservices/server_other.php index bb296f567942c0346197b4deff7b6d768bfa7123..f0e304494049dfab47151bf09b39deb41ee55e5b 100644 --- a/htdocs/webservices/server_other.php +++ b/htdocs/webservices/server_other.php @@ -221,7 +221,7 @@ function getDocument($authentication, $modulepart, $file) $refname=basename(dirname($original_file)."/"); // Security check - $check_access = dol_check_secure_access_document($modulepart,$original_file,$conf->entity); + $check_access = dol_check_secure_access_document($modulepart,$original_file,$conf->entity,$fuser); $accessallowed = $check_access['accessallowed']; $sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals']; $original_file = $check_access['original_file'];