From 3c4aa3b085adafc41eefbfb171fba034759a5810 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@users.sourceforge.net>
Date: Sun, 30 May 2010 20:25:08 +0000
Subject: [PATCH] Fix: A lot of bugs in project permission

---
 htdocs/lib/project.lib.php                   | 14 +++++++++-----
 htdocs/projet/activity/index.php             |  5 +++++
 htdocs/projet/class/project.class.php        | 11 ++++++++---
 htdocs/projet/{tasks/fiche.php => tasks.php} |  6 +++---
 htdocs/projet/tasks/contact.php              |  2 ++
 htdocs/projet/tasks/document.php             |  7 +++++--
 htdocs/projet/tasks/index.php                |  8 ++++----
 htdocs/projet/tasks/note.php                 |  3 +++
 htdocs/projet/tasks/task.php                 |  3 +++
 htdocs/projet/tasks/time.php                 |  9 +++++++++
 10 files changed, 51 insertions(+), 17 deletions(-)
 rename htdocs/projet/{tasks/fiche.php => tasks.php} (98%)

diff --git a/htdocs/lib/project.lib.php b/htdocs/lib/project.lib.php
index 6095eeaf494..fabb11eaf21 100644
--- a/htdocs/lib/project.lib.php
+++ b/htdocs/lib/project.lib.php
@@ -80,7 +80,7 @@ function project_prepare_head($object)
     }
 
     // Then tab for sub level of projet, i mean tasks
-	$head[$h][0] = DOL_URL_ROOT.'/projet/tasks/fiche.php?id='.$object->id;
+	$head[$h][0] = DOL_URL_ROOT.'/projet/tasks.php?id='.$object->id;
 	$head[$h][1] = $langs->trans("Tasks");
     $head[$h][2] = 'tasks';
 	$h++;
@@ -349,8 +349,9 @@ function PLinesb(&$inc, $parent, $lines, &$level, &$projectsrole)
  * @param 	$var				Color
  * @param 	$showproject		Show project columns
  * @param	$taskrole			Array of roles of user for each tasks
+ * @param	$projectsListId		List of id of project allowed to user (separated with comma)
  */
-function PLines(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole)
+function PLines(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole, $projectsListId='')
 {
 	global $user, $bc, $langs;
 
@@ -359,6 +360,8 @@ function PLines(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole
 	$projectstatic = new Project($db);
 	$taskstatic = new Task($db);
 
+	$projectsArrayId=explode(',',$projectsListId);
+
 	for ($i = 0 ; $i < sizeof($lines) ; $i++)
 	{
 		if ($parent == 0) $level = 0;
@@ -413,7 +416,8 @@ function PLines(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole
 					$projectstatic->id=$lines[$i]->fk_project;
 					$projectstatic->ref=$lines[$i]->projectref;
 					$projectstatic->public=$lines[$i]->public;
-					print $projectstatic->getNomUrl(1);
+					if ($lines[$i]->public || in_array($lines[$i]->fk_project,$projectsArrayId)) print $projectstatic->getNomUrl(1);
+					else print $projectstatic->getNomUrl(1,'nolink');
 					if ($showlineingray) print '</i>';
 					print "</td>";
 				}
@@ -436,7 +440,7 @@ function PLines(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole
 				// Title of task
 				print "<td>";
 				if ($showlineingray) print '<i>';
-				else print '<a href="task.php?id='.$lines[$i]->id.'">';
+				else print '<a href="'.DOL_URL_ROOT.'/projet/tasks/task.php?id='.$lines[$i]->id.'">';
 				for ($k = 0 ; $k < $level ; $k++)
 				{
 					print "&nbsp; &nbsp; &nbsp;";
@@ -466,7 +470,7 @@ function PLines(&$inc, $parent, &$lines, &$level, $var, $showproject, &$taskrole
 				if (! $showlineingray) $inc++;
 
 				$level++;
-				if ($lines[$i]->id) PLines($inc, $lines[$i]->id, $lines, $level, $var, $showproject, $taskrole);
+				if ($lines[$i]->id) PLines($inc, $lines[$i]->id, $lines, $level, $var, $showproject, $taskrole, $projectsListId);
 				$level--;
 			}
 		}
diff --git a/htdocs/projet/activity/index.php b/htdocs/projet/activity/index.php
index f2eb598999a..d8149b1be43 100644
--- a/htdocs/projet/activity/index.php
+++ b/htdocs/projet/activity/index.php
@@ -89,6 +89,7 @@ $sql.= " AND p.entity = ".$conf->entity;
 $sql.= " AND tt.fk_task = t.rowid";
 $sql.= " AND tt.fk_user = ".$user->id;
 $sql.= " AND date_format(task_date,'%d%m%y') = ".strftime("%d%m%y",time());
+$sql.= " AND p.rowid in ('".$projectsListId."')";
 $sql.= " GROUP BY p.rowid";
 
 $resql = $db->query($sql);
@@ -139,6 +140,7 @@ $sql.= " AND p.entity = ".$conf->entity;
 $sql.= " AND tt.fk_task = t.rowid";
 $sql.= " AND tt.fk_user = ".$user->id;
 $sql.= " AND date_format(date_add(task_date, INTERVAL 1 DAY),'%d%m%y') = ".strftime("%d%m%y",time());
+$sql.= " AND p.rowid in ('".$projectsListId."')";
 $sql.= " GROUP BY p.rowid";
 
 $resql = $db->query($sql);
@@ -191,6 +193,7 @@ $sql.= " AND p.entity = ".$conf->entity;
 $sql.= " AND tt.fk_task = t.rowid";
 $sql.= " AND tt.fk_user = ".$user->id;
 $sql.= " AND week(task_date) = ".strftime("%W",time());
+$sql.= " AND p.rowid in ('".$projectsListId."')";
 $sql.= " GROUP BY p.rowid";
 
 $resql = $db->query($sql);
@@ -241,6 +244,7 @@ $sql.= " AND p.entity = ".$conf->entity;
 $sql.= " AND tt.fk_task = t.rowid";
 $sql.= " AND tt.fk_user = ".$user->id;
 $sql.= " AND month(task_date) = ".strftime("%m",$now);
+$sql.= " AND p.rowid in ('".$projectsListId."')";
 $sql.= " GROUP BY p.rowid";
 
 $resql = $db->query($sql);
@@ -284,6 +288,7 @@ $sql.= " AND p.entity = ".$conf->entity;
 $sql.= " AND tt.fk_task = t.rowid";
 $sql.= " AND tt.fk_user = ".$user->id;
 $sql.= " AND YEAR(task_date) = ".strftime("%Y",$now);
+$sql.= " AND p.rowid in ('".$projectsListId."')";
 $sql.= " GROUP BY p.rowid";
 
 $var=false;
diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php
index 56c38c70fda..b2214687a20 100644
--- a/htdocs/projet/class/project.class.php
+++ b/htdocs/projet/class/project.class.php
@@ -592,7 +592,7 @@ class Project extends CommonObject
 	/**
 	 *	\brief      Renvoie nom clicable (avec eventuellement le picto)
 	 *	\param		withpicto		0=Pas de picto, 1=Inclut le picto dans le lien, 2=Picto seul
-	 *	\param		option			Sur quoi pointe le lien
+	 *	\param		option			Variante ('', 'nolink')
 	 *	\return		string			Chaine avec URL
 	 */
 	function getNomUrl($withpicto=0,$option='')
@@ -600,9 +600,14 @@ class Project extends CommonObject
 		global $langs;
 
 		$result='';
+		$lien='';
+		$lienfin='';
 
-		$lien = '<a href="'.DOL_URL_ROOT.'/projet/fiche.php?id='.$this->id.'">';
-		$lienfin='</a>';
+		if ($option != 'nolink')
+		{
+			$lien = '<a href="'.DOL_URL_ROOT.'/projet/fiche.php?id='.$this->id.'">';
+			$lienfin='</a>';
+		}
 
 		$picto='projectpub';
 		if (! $this->public) $picto='project';
diff --git a/htdocs/projet/tasks/fiche.php b/htdocs/projet/tasks.php
similarity index 98%
rename from htdocs/projet/tasks/fiche.php
rename to htdocs/projet/tasks.php
index 95e183707fb..29e6e98d77f 100644
--- a/htdocs/projet/tasks/fiche.php
+++ b/htdocs/projet/tasks.php
@@ -19,13 +19,13 @@
  */
 
 /**
- *	\file       htdocs/projet/tasks/fiche.php
+ *	\file       htdocs/projet/tasks.php
  *	\ingroup    projet
- *	\brief      Fiche taches d'un projet
+ *	\brief      List all tasks of a project
  *	\version    $Id$
  */
 
-require ("../../main.inc.php");
+require ("../main.inc.php");
 require_once(DOL_DOCUMENT_ROOT."/projet/class/project.class.php");
 require_once(DOL_DOCUMENT_ROOT."/projet/class/task.class.php");
 require_once(DOL_DOCUMENT_ROOT."/lib/project.lib.php");
diff --git a/htdocs/projet/tasks/contact.php b/htdocs/projet/tasks/contact.php
index 8c1106e531d..887e969b878 100644
--- a/htdocs/projet/tasks/contact.php
+++ b/htdocs/projet/tasks/contact.php
@@ -196,6 +196,8 @@ if ($id > 0 || ! empty($ref))
 
 		// Ref
 		print '<tr><td width="30%">'.$langs->trans('Ref').'</td><td colspan="3">';
+		$projectsListId = $project->getProjectsAuthorizedForUser($user,$mine,1);
+		$task->next_prev_filter=" fk_projet in (".$projectsListId.")";
 		print $html->showrefnav($task,'id','',1,'rowid','ref','','');
 		print '</td></tr>';
 
diff --git a/htdocs/projet/tasks/document.php b/htdocs/projet/tasks/document.php
index 28ff56c6e77..9c986038f00 100644
--- a/htdocs/projet/tasks/document.php
+++ b/htdocs/projet/tasks/document.php
@@ -128,9 +128,10 @@ if ($action=='delete')
  * View
  */
 
-llxHeader('',$langs->trans('Project'));
-
 $form = new Form($db);
+$project = new Project($db);
+
+llxHeader('',$langs->trans('Project'));
 
 if ($id > 0 || ! empty($ref))
 {
@@ -154,6 +155,8 @@ if ($id > 0 || ! empty($ref))
 	print '<tr><td width="30%">';
 	print $langs->trans("Ref");
 	print '</td><td colspan="3">';
+	$projectsListId = $project->getProjectsAuthorizedForUser($user,$mine,1);
+	$task->next_prev_filter=" fk_projet in (".$projectsListId.")";
 	print $form->showrefnav($task,'id','',1,'rowid','ref','','');
 	print '</td>';
 	print '</tr>';
diff --git a/htdocs/projet/tasks/index.php b/htdocs/projet/tasks/index.php
index 2b23b7e5ce9..58662d8c83f 100644
--- a/htdocs/projet/tasks/index.php
+++ b/htdocs/projet/tasks/index.php
@@ -32,6 +32,7 @@ require_once(DOL_DOCUMENT_ROOT."/lib/project.lib.php");
 require_once(DOL_DOCUMENT_ROOT."/lib/date.lib.php");
 
 $langs->load('projects');
+$langs->load('users');
 
 // Security check
 $socid=0;
@@ -77,9 +78,8 @@ else
 	else print $langs->trans("ProjectsPublicDesc").'<br><br>';
 }
 
-
-//$projectsListId = $project->getProjectsAuthorizedForUser($user,$mine,1);
-
+// Get list of project id allowed to user
+$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1);
 // Get list of tasks in tasksarray and taskarrayfiltered
 // We need all tasks (even not limited to a user because a task to user
 // can have a parent that is not affected to him).
@@ -97,7 +97,7 @@ print '<td align="right">'.$langs->trans("TimeSpent").'</td>';
 print "</tr>\n";
 // Show all lines in taskarray (recursive function to go down on tree)
 $j=0; $level=0;
-$nboftaskshown=PLines($j, 0, $tasksarray, $level, true, 1, $tasksrole);
+$nboftaskshown=PLines($j, 0, $tasksarray, $level, true, 1, $tasksrole, $projectsListId);
 print "</table>";
 
 print '</div>';
diff --git a/htdocs/projet/tasks/note.php b/htdocs/projet/tasks/note.php
index 351d238db0f..621a0039656 100644
--- a/htdocs/projet/tasks/note.php
+++ b/htdocs/projet/tasks/note.php
@@ -90,6 +90,7 @@ if ($_POST['action'] == 'update_private' && $user->rights->projet->creer)
 llxHeader();
 
 $html = new Form($db);
+$project = new Project($db);
 
 $id = $_GET['id'];
 $ref= $_GET['ref'];
@@ -120,6 +121,8 @@ if ($id > 0 || ! empty($ref))
 
 		// Ref
 		print '<tr><td width="30%">'.$langs->trans("Ref").'</td><td>';
+		$projectsListId = $project->getProjectsAuthorizedForUser($user,$mine,1);
+		$task->next_prev_filter=" fk_projet in (".$projectsListId.")";
 		print $html->showrefnav($task,'id','',1,'rowid','ref','','');
 		print '</td></tr>';
 
diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php
index 76c15fa93f4..816f5e6a319 100644
--- a/htdocs/projet/tasks/task.php
+++ b/htdocs/projet/tasks/task.php
@@ -115,6 +115,7 @@ llxHeader("",$langs->trans("Task"));
 
 $html = new Form($db);
 $formother = new FormOther($db);
+$project = new Project($db);
 
 if ($taskid)
 {
@@ -215,6 +216,8 @@ if ($taskid)
 			print '<tr><td width="30%">';
 			print $langs->trans("Ref");
 			print '</td><td colspan="3">';
+			$projectsListId = $project->getProjectsAuthorizedForUser($user,$mine,1);
+			$task->next_prev_filter=" fk_projet in (".$projectsListId.")";
 			print $html->showrefnav($task,'id','',1,'rowid','ref','','');
 			print '</td>';
 			print '</tr>';
diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php
index 38fde85ce6d..5767d33e454 100644
--- a/htdocs/projet/tasks/time.php
+++ b/htdocs/projet/tasks/time.php
@@ -51,6 +51,11 @@ if ($_POST["action"] == 'addtimespent' && $user->rights->projet->creer)
 		$mesg='<div class="error">'.$langs->trans('ErrorFieldRequired',$langs->transnoentitiesnoconv("Duration")).'</div>';
 		$error++;
 	}
+	if (empty($_POST["userid"]))
+	{
+		$mesg='<div class="error">'.$langs->trans('ErrorUserNotAffectedToTask').'</div>';
+		$error++;
+	}
 
 	if (! $error)
 	{
@@ -137,6 +142,8 @@ if ($_REQUEST["action"] == 'confirm_delete' && $_REQUEST["confirm"] == "yes" &&
  * View
  */
 
+$project=new Project($db);
+
 llxHeader("",$langs->trans("Task"));
 
 $html = new Form($db);
@@ -177,6 +184,8 @@ if ($_GET["id"] > 0)
 		print '<tr><td width="30%">';
 		print $langs->trans("Ref");
 		print '</td><td colspan="3">';
+		$projectsListId = $project->getProjectsAuthorizedForUser($user,$mine,1);
+		$task->next_prev_filter=" fk_projet in (".$projectsListId.")";
 		print $html->showrefnav($task,'id','',1,'rowid','ref','','');
 		print '</td></tr>';
 
-- 
GitLab