New: Ajout des droits sur le module user.

Les modules "base" (requis) sont actifs par dfaut (a l'install) et non dsactivables.
This commit is contained in:
Laurent Destailleur 2005-10-22 13:48:19 +00:00
parent 0745c647fc
commit 3607852e56
11 changed files with 159 additions and 72 deletions

View File

@ -55,9 +55,10 @@ if ($_GET["action"] == 'reset' && $user->admin)
/** \brief Active un module
\param value Nom du module a activer
\param value Nom du module a activer
\param withdeps Active/désactive aussi les dépendances
*/
function Activate($value)
function Activate($value,$withdeps=1)
{
global $db, $modules, $langs;
@ -67,7 +68,7 @@ function Activate($value)
if ($modName)
{
$file = $modName . ".class.php";
include_once("../includes/modules/$file");
include_once(DOL_DOCUMENT_ROOT."/includes/modules/$file");
$objMod = new $modName($db);
// Test si version PHP ok
@ -81,18 +82,21 @@ function Activate($value)
$objMod->init();
}
// Activation des modules dont le module dépend
for ($i = 0; $i < sizeof($objMod->depends); $i++)
if ($withdeps)
{
Activate($objMod->depends[$i]);
// Activation des modules dont le module dépend
for ($i = 0; $i < sizeof($objMod->depends); $i++)
{
Activate($objMod->depends[$i]);
}
// Desactivation des modules qui entrent en conflit
for ($i = 0; $i < sizeof($objMod->conflictwith); $i++)
{
UnActivate($objMod->conflictwith[$i],0);
}
}
// Desactivation des modules qui entrent en conflit
for ($i = 0; $i < sizeof($objMod->conflictwith); $i++)
{
UnActivate($objMod->conflictwith[$i],0);
}
return 0;
}
@ -111,7 +115,7 @@ function UnActivate($value,$requiredby=1)
if ($modName)
{
$file = $modName . ".class.php";
include_once("../includes/modules/$file");
include_once(DOL_DOCUMENT_ROOT."/includes/modules/$file");
$objMod = new $modName($db);
$objMod->remove();
}
@ -181,6 +185,7 @@ print "</tr>\n";
$dir = DOL_DOCUMENT_ROOT . "/includes/modules/";
// Charge tableaux modules, nom, numero, orders depuis répertoire dir
$handle=opendir($dir);
$modules = array();
$orders = array();
@ -209,7 +214,6 @@ while (($file = readdir($handle))!==false)
$modules[$i] = $objMod;
$nom[$i] = $modName;
$numero[$i] = $j;
$orders[$i] = "$objMod->family"."_".$j; // Tri par famille puis numero module
$j++;
$i++;
@ -221,7 +225,7 @@ asort($orders);
$var=True;
$familylib=array(
'base'=>$langs->trans("ModuleBase"),
'base'=>$langs->trans("ModuleFamilyBase"),
'crm'=>$langs->trans("ModuleFamilyCrm"),
'products'=>$langs->trans("ModuleFamilyProducts"),
'hr'=>$langs->trans("ModuleFamilyHr"),
@ -295,8 +299,8 @@ foreach ($orders as $key => $value)
if ($conf->global->$const_name == 1)
{
// Module actif
print "<a href=\"modules.php?id=".$objMod->numero."&amp;action=reset&amp;value=" . $modName . "&amp;spe=" . $_GET["spe"] . "\">" . $langs->trans("Disable") . "</a></td>\n";
if ($family == 'base') print $langs->trans("Required");
else print "<a href=\"modules.php?id=".$objMod->numero."&amp;action=reset&amp;value=" . $modName . "&amp;spe=" . $_GET["spe"] . "\">" . $langs->trans("Disable") . "</a></td>\n";
if ($objMod->config_page_url)
{
@ -331,6 +335,11 @@ foreach ($orders as $key => $value)
}
else
{
if ($family == 'base')
{
// Ne devrait pas arriver.
}
// Module non actif
print "<a href=\"modules.php?id=".$objMod->numero."&amp;action=set&amp;value=" . $modName . "&amp;spe=" . $_GET["spe"] . "\">" . $langs->trans("Activate") . "</a></td>\n <td>&nbsp;</td>\n";
}

View File

@ -24,7 +24,7 @@
/**
\file htdocs/install/etape5.php
\brief Page de fin d'installation
\brief Page de fin d'installation ou de migration
\version $Revision$
*/
@ -40,6 +40,8 @@ $success=0;
if (file_exists($conffile))
{
include($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
}
@ -96,6 +98,13 @@ if ($_POST["action"] == "set" || $_POST["action"] == "upgrade")
$db = new DoliDb($conf->db->type,$conf->db->host,$conf->db->user,$conf->db->pass,$conf->db->name);
$ok = 0;
// Active module user
$modName='modUser';
$file = $modName . ".class.php";
include_once("../includes/modules/$file");
$objMod = new $modName($db);
$objMod->init();
// If first install
if ($_POST["action"] == "set")
{

View File

@ -52,6 +52,8 @@ pHeader($langs->trans("MigrateScript"),"etape5","upgrade");
if (file_exists($conffile))
{
include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
}
if($dolibarr_main_db_type == "mysql")

View File

@ -42,6 +42,8 @@ ActiveOn=Activated on
SourceFile=Source file
TriggersAvailable=Triggers available
TriggersDesc=Triggers are components that modify, once activated, the behaviour of Dolibarr workflow. They add new actions, activated on Dolibarr events (new company creation, invoice validation, ...).
Required=Required
ModuleFamilyBase=System
ModuleFamilyCrm=Customer Ressource Management (CRM)
ModuleFamilyProducts=Products Management
ModuleFamilyHr=Human Ressource Management
@ -50,6 +52,8 @@ ModuleFamilyOther=Other
ModuleFamilyTechnic=Technical Modules
ModuleFamilyExperimental=Experimental modules
ModuleFamilyFinancial=Financial Modules (Accountancy/Treasury)
Module0Name=Users & groups
Module0Desc=Users and groups management
Module1Name=Companies
Module1Desc=Companies and contacts' management
Module2Name=Commercial
@ -187,6 +191,12 @@ Permission229=Delete emailings
Permission231=Read supplier invoices
Permission232=Create/modify supplier invoices
Permission233=Delete supplier invoices
Permission251=Read other users and groups
Permission252=Create/modify other users, their groups and permisssions
Permission253=Modify other users password
Permission254=Delete or disable other users
Permission255=Create/modify his own user informations
Permission256=Modify his own password
Permission300=Read bar codes
Permission301=Create/modify bar codes
Permission302=Delete bar codes

View File

@ -68,4 +68,5 @@ CreateDolibarrLogin=Create Dolibarr account
LoginAccountDisable=Account disabled, put a new login to activate it.
UsePersonalValue=Use personal value
ErrorFailedToSaveFile=Error - Failed to save file
GuiLanguage=Interface language
GuiLanguage=Interface language
InternalUser=Internal user

View File

@ -42,6 +42,8 @@ ActiveOn=Active sur
SourceFile=Fichier source
TriggersAvailable=Triggers disponibles
TriggersDesc=Les triggers sont des composants qui, une fois activés, modifient le comportement du workflow de Dolibarr. Ils réalisent des actions suplémentaires, déclenchées par les événements Dolibarr (création société, validation facture, clôture contrat...).
Required=Requis
ModuleFamilyBase=Système
ModuleFamilyCrm=Gestion client (CRM)
ModuleFamilyProducts=Gestion produits
ModuleFamilyHr=Ressources humaines
@ -50,6 +52,8 @@ ModuleFamilyOther=Autre
ModuleFamilyTechnic=Modules techniques, interfaces
ModuleFamilyExperimental=Modules expérimentaux (ne pas utiliser en production)
ModuleFamilyFinancial=Modules financiers (Compta/trésorerie)
Module0Name=Utilisateurs & groupes
Module0Desc=Gestion des utilisateurs et groupes
Module1Name=Sociétés
Module1Desc=Gestion des sociétés et contacts
Module2Name=Commercial
@ -187,6 +191,12 @@ Permission229=Supprimer les mailings
Permission231=Consulter les factures fournisseurs
Permission232=Créer/modifier les facture fournisseurs
Permission233=Supprimer les factures fournisseurs
Permission251=Consulter les autres utilisateurs, leurs groupes et permissions
Permission252=Créer/modifier les autres utilisateurs, leurs groupes et permissions
Permission253=Modifier mot de passe des autres utilisateurs
Permission254=Supprimer ou désactiver les autres utilisateurs
Permission255=Créer/modifier ses propres infos utilisateur
Permission256=Modifier son propre mot de passe
Permission300=Consulter les codes barres
Permission301=Créer/modifier les codes barres
Permission302=Supprimer les codes barres

View File

@ -69,3 +69,4 @@ LoginAccountDisable=Le compte est d
UsePersonalValue=Utiliser valeur personalisée
ErrorFailedToSaveFile=Erreur - l'enregistrement du fichier a échoué
GuiLanguage=Langage de l'interface
InternalUser=Utilisateur interne

View File

@ -34,11 +34,16 @@ require("./pre.inc.php");
require_once(DOL_DOCUMENT_ROOT."/contact.class.php");
// Defini si peux lire/modifier utilisateurs et permisssions
$canreadperms=($user->admin || $user->rights->user->user->lire);
$caneditperms=($user->admin || $user->rights->user->user->creer);
$candisableperms=($user->admin || $user->rights->user->user->supprimer);
if ($user->id <> $_GET["id"])
{
if (! $user->rights->user->user->lire && ! $user->admin)
if (! $canreadperms)
{
accessforbidden();
accessforbidden();
}
}
@ -54,13 +59,13 @@ $action=isset($_GET["action"])?$_GET["action"]:$_POST["action"];
/**
* Actions
*/
if ($_GET["subaction"] == 'addrights' && $user->admin)
if ($_GET["subaction"] == 'addrights' && $caneditperms)
{
$edituser = new User($db,$_GET["id"]);
$edituser->addrights($_GET["rights"]);
}
if ($_GET["subaction"] == 'delrights' && $user->admin)
if ($_GET["subaction"] == 'delrights' && $caneditperms)
{
$edituser = new User($db,$_GET["id"]);
$edituser->delrights($_GET["rights"]);
@ -74,6 +79,7 @@ if ($_POST["action"] == 'confirm_disable' && $_POST["confirm"] == "yes")
$edituser->fetch($_GET["id"]);
$edituser->disable();
Header("Location: ".DOL_URL_ROOT.'/user/fiche.php?id='.$_GET["id"]);
exit;
}
}
@ -85,11 +91,12 @@ if ($_POST["action"] == 'confirm_delete' && $_POST["confirm"] == "yes")
$edituser->fetch($_GET["id"]);
$edituser->delete();
Header("Location: index.php");
exit;
}
}
// Action ajout user
if ($_POST["action"] == 'add' && $user->admin)
if ($_POST["action"] == 'add' && $caneditperms)
{
$message="";
if (! $_POST["nom"]) {
@ -130,6 +137,7 @@ if ($_POST["action"] == 'add' && $user->admin)
$db->commit();
Header("Location: fiche.php?id=$id");
exit;
}
else
{
@ -143,7 +151,7 @@ if ($_POST["action"] == 'add' && $user->admin)
}
// Action ajout groupe utilisateur
if ($_POST["action"] == 'addgroup' && $user->admin)
if ($_POST["action"] == 'addgroup' && $caneditperms)
{
if ($_POST["group"])
{
@ -151,10 +159,11 @@ if ($_POST["action"] == 'addgroup' && $user->admin)
$edituser->SetInGroup($_POST["group"]);
Header("Location: fiche.php?id=".$_GET["id"]);
exit;
}
}
if ($_GET["action"] == 'removegroup' && $user->admin)
if ($_GET["action"] == 'removegroup' && $caneditperms)
{
if ($_GET["group"])
{
@ -162,10 +171,11 @@ if ($_GET["action"] == 'removegroup' && $user->admin)
$edituser->RemoveFromGroup($_GET["group"]);
Header("Location: fiche.php?id=".$_GET["id"]);
exit;
}
}
if ($_POST["action"] == 'update' && $user->admin)
if ($_POST["action"] == 'update' && $caneditperms)
{
$message="";
@ -201,18 +211,21 @@ if ($_POST["action"] == 'update' && $user->admin)
if ($ret >= 0 && isset($_POST["password"]) && $_POST["password"] !='' )
{
$ret=$edituser->password($user,$password,$conf->password_encrypted);
if ($ret < 0) {
if ($ret < 0)
{
$message.='<div class="error">'.$edituser->error.'</div>';
}
}
if ($_FILES['photo']['tmp_name']) {
if (isset($_FILES['photo']['tmp_name']) && trim($_FILES['photo']['tmp_name']))
{
// Si une photo est fournie avec le formulaire
if (! is_dir($conf->users->dir_output))
{
create_exdir($conf->users->dir_output);
}
if (is_dir($conf->users->dir_output)) {
if (is_dir($conf->users->dir_output))
{
$newfile=$conf->users->dir_output . "/" . $edituser->id . ".jpg";
if (! doliMoveFileUpload($_FILES['photo']['tmp_name'],$newfile))
{
@ -221,10 +234,12 @@ if ($_POST["action"] == 'update' && $user->admin)
}
}
if ($ret >= 0) {
if ($ret >= 0)
{
$message.='<div class="ok">'.$langs->trans("UserModified").'</div>';
$db->commit();
} else {
} else
{
$db->rollback;
}
@ -232,7 +247,7 @@ if ($_POST["action"] == 'update' && $user->admin)
// Action modif mot de passe
if ((($_POST["action"] == 'confirm_password' && $_POST["confirm"] == 'yes')
|| $_GET["action"] == 'confirm_passwordsend') && $user->admin)
|| $_GET["action"] == 'confirm_passwordsend') && $caneditperms)
{
$edituser = new User($db, $_GET["id"]);
$edituser->fetch();
@ -346,6 +361,9 @@ else
$fuser->fetch();
$fuser->getrights();
$caneditpassword=( (($user->id == $fuser->id) && $user->rights->user->self->password)
|| (($user->id != $fuser->id) && $user->rights->user->user->password) );
/*
* Affichage onglets
*/
@ -432,7 +450,7 @@ else
print '<tr><td width="25%" valign="top">'.$langs->trans("Lastname").'</td>';
print '<td width="50%" class="valeur">'.$fuser->nom.'</td>';
print '<td align="center" valign="middle" width="25%" rowspan="13">';
print '<td align="center" valign="middle" width="25%" rowspan="14">';
if (file_exists($conf->users->dir_output."/".$fuser->id.".jpg"))
{
print '<img width="100" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=userphoto&file='.$fuser->id.'.jpg">';
@ -525,7 +543,7 @@ else
print "</tr>\n";
print "<tr>".'<td width="25%" valign="top">'.$langs->trans("Note").'</td>';
print '<td colspan="2" class="valeur">'.nl2br($fuser->note).'&nbsp;</td>';
print '<td class="valeur">'.nl2br($fuser->note).'&nbsp;</td>';
print "</tr>\n";
// Autres caractéristiques issus des autres modules
@ -548,27 +566,27 @@ else
*/
print '<div class="tabsAction">';
if ($user->admin || ($user->id == $fuser->id))
if ($caneditperms || ($user->id == $fuser->id))
{
print '<a class="butAction" href="fiche.php?id='.$fuser->id.'&amp;action=edit">'.$langs->trans("Edit").'</a>';
}
if (($user->id != $_GET["id"] && $user->admin) && $fuser->login)
if (($user->id != $_GET["id"] && $caneditpassword) && $fuser->login)
{
print '<a class="butAction" href="fiche.php?id='.$fuser->id.'&amp;action=password">'.$langs->trans("ReinitPassword").'</a>';
}
if (($user->id != $_GET["id"] && $user->admin) && $fuser->email && $fuser->login)
if (($user->id != $_GET["id"] && $caneditpassword) && $fuser->email && $fuser->login)
{
print '<a class="butAction" href="fiche.php?id='.$fuser->id.'&amp;action=passwordsend">'.$langs->trans("SendNewPassword").'</a>';
}
if ($user->id <> $_GET["id"] && $user->admin && $fuser->login)
if ($user->id <> $_GET["id"] && $candisableperms && $fuser->login)
{
print '<a class="butActionDelete" href="fiche.php?action=disable&amp;id='.$fuser->id.'">'.$langs->trans("DisableUser").'</a>';
}
if ($user->id <> $_GET["id"] && $user->admin)
if ($user->id <> $_GET["id"] && $candisableperms)
{
print '<a class="butActionDelete" href="fiche.php?action=delete&amp;id='.$fuser->id.'">'.$langs->trans("DeleteUser").'</a>';
}
@ -611,7 +629,7 @@ else
dolibarr_print_error($db);
}
if ($user->admin)
if ($caneditperms)
{
$form = new Form($db);
print '<form action="fiche.php?id='.$_GET["id"].'" method="post">'."\n";
@ -663,7 +681,7 @@ else
print '</td>';
print '<td>';
if ($user->admin)
if ($caneditperms)
{
print '<a href="fiche.php?id='.$_GET["id"].'&amp;action=removegroup&amp;group='.$obj->rowid.'">';
@ -694,15 +712,14 @@ else
/*
* Fiche en mode edition
*/
if ($_GET["action"] == 'edit' && ($user->admin || ($user->id == $fuser->id)))
if ($_GET["action"] == 'edit' && ($caneditperms || ($user->id == $fuser->id)))
{
print '<form action="fiche.php?id='.$fuser->id.'" method="post" name="updateuser" enctype="multipart/form-data">';
print '<input type="hidden" name="action" value="update">';
print '<table width="100%" class="border">';
$rowspan=11;
if ($conf->global->USER_ALLOW_PASSWORD_CHANGE) $rowspan++;
$rowspan=12;
print '<tr><td width="25%" valign="top">'.$langs->trans("Lastname").'</td>';
print '<td width="50%" class="valeur"><input class="flat" size="30" type="text" name="nom" value="'.$fuser->nom.'"></td>';
@ -729,11 +746,17 @@ else
print '</td></tr>';
// Pass
if ($conf->global->USER_ALLOW_PASSWORD_CHANGE)
if ($caneditpassword)
{
print "<tr>".'<td valign="top">'.$langs->trans("Password").'</td>';
print '<td><input size="12" maxlength="8" type="password" class="flat" name="pass" value="'.$fuser->pass.'"></td></tr>';
}
else
{
print '<tr><td width="25%" valign="top">'.$langs->trans("Password").'</td>';
print '<td width="50%" class="valeur">'.eregi_replace('.','*',$fuser->pass).'</td>';
print "</tr>\n";
}
// Administrateur
print "<tr>".'<td valign="top">'.$langs->trans("Administrator").'</td>';
@ -799,7 +822,7 @@ else
print '<td><input size="40" type="text" name="email" class="flat" value="'.$fuser->email.'"></td></tr>';
print "<tr>".'<td valign="top">'.$langs->trans("Note").'</td><td>';
print '<textarea class="flat" name="note" rows="4" cols="40">';
print '<textarea class="flat" name="note" rows="'.ROWS_3.'" cols="70">';
print $fuser->note;
print "</textarea></td></tr>";

View File

@ -28,7 +28,9 @@
require("./pre.inc.php");
if (! $user->rights->user->group->lire && !$user->admin) accessforbidden();
$user->getrights();
if (! $user->rights->user->user->lire && ! $user->admin) accessforbidden();
$langs->load("users");

View File

@ -28,7 +28,9 @@
require("./pre.inc.php");
if (! $user->rights->user->user->lire && !$user->admin) accessforbidden();
$user->getrights();
if (! $user->rights->user->user->lire && ! $user->admin) accessforbidden();
$langs->load("users");
@ -37,7 +39,6 @@ $sall=isset($_GET["sall"])?$_GET["sall"]:$_POST["sall"];
$sortfield = isset($_GET["sortfield"])?$_GET["sortfield"]:$_POST["sortfield"];
$sortorder = isset($_GET["sortorder"])?$_GET["sortorder"]:$_POST["sortorder"];
$page=isset($_GET["page"])?$_GET["page"]:$_POST["page"];
$page = $_GET["page"];
if ($page < 0) $page = 0;
$limit = $conf->liste_limit;

View File

@ -38,17 +38,21 @@ $form = new Form($db);
$module=isset($_GET["module"])?$_GET["module"]:$_POST["module"];
// Defini si peux modifier utilisateurs et permisssions
$caneditperms=($user->admin || $user->rights->user->user->creer);
/**
* Actions
*/
if ($_GET["action"] == 'addrights' && $user->admin)
if ($_GET["action"] == 'addrights' && $caneditperms)
{
$edituser = new User($db,$_GET["id"]);
$edituser->addrights($_GET["rights"],$module);
}
if ($_GET["action"] == 'delrights' && $user->admin)
if ($_GET["action"] == 'delrights' && $caneditperms)
{
$edituser = new User($db,$_GET["id"]);
$edituser->delrights($_GET["rights"],$module);
@ -196,7 +200,7 @@ if ($_GET["id"])
print '<table width="100%" class="noborder">';
print '<tr class="liste_titre">';
print '<td>'.$langs->trans("Module").'</td>';
if ($user->admin) print '<td width="24">&nbsp</td>';
if ($caneditperms) print '<td width="24">&nbsp</td>';
print '<td align="center" width="24">&nbsp;</td>';
print '<td>'.$langs->trans("Permissions").'</td>';
print '</tr>';
@ -232,16 +236,20 @@ if ($_GET["id"])
$objMod=$modules[$obj->module];
$picto=($objMod->picto?$objMod->picto:'generic');
print '<tr '. $bc[$var].'>';
print '<td>'.img_object('',$picto).' '.$objMod->getName();
print '<a name="'.$objMod->getName().'">&nbsp;</a></td>';
print '<td align="center" nowrap>';
print '<a title='.$langs->trans("All").' alt='.$langs->trans("All").' href="perms.php?id='.$fuser->id.'&amp;action=addrights&amp;module='.$obj->module.'">'.$langs->trans("All")."</a>";
print '/';
print '<a title='.$langs->trans("None").' alt='.$langs->trans("None").' href="perms.php?id='.$fuser->id.'&amp;action=delrights&amp;module='.$obj->module.'">'.$langs->trans("None")."</a>";
print '</td>';
print '<td colspan="2">&nbsp;</td>';
print '</tr>';
if ($caneditperms && ($obj->module != 'user' || ! $user->admin))
{
// On affiche ligne pour modifier droits
print '<tr '. $bc[$var].'>';
print '<td>'.img_object('',$picto).' '.$objMod->getName();
print '<a name="'.$objMod->getName().'">&nbsp;</a></td>';
print '<td align="center" nowrap>';
print '<a title='.$langs->trans("All").' alt='.$langs->trans("All").' href="perms.php?id='.$fuser->id.'&amp;action=addrights&amp;module='.$obj->module.'">'.$langs->trans("All")."</a>";
print '/';
print '<a title='.$langs->trans("None").' alt='.$langs->trans("None").' href="perms.php?id='.$fuser->id.'&amp;action=delrights&amp;module='.$obj->module.'">'.$langs->trans("None")."</a>";
print '</td>';
print '<td colspan="2">&nbsp;</td>';
print '</tr>';
}
}
print '<tr '. $bc[$var].'>';
@ -249,10 +257,21 @@ if ($_GET["id"])
print '<td>'.img_object('',$picto).' '.$objMod->getName();
print '</td>';
if (in_array($obj->id, $permsuser))
if ($fuser->admin && $obj->module == 'user')
{
// Own permission by user
if ($user->admin)
// Permission own because admin
if ($caneditperms)
{
print '<td align="center">'.img_picto($langs->trans("Administrator"),'star').'</td>';
}
print '<td align="center" nowrap>';
print img_tick();
print '</td>';
}
else if (in_array($obj->id, $permsuser))
{
// Permission own by user
if ($caneditperms)
{
print '<td align="center"><a href="perms.php?id='.$fuser->id.'&amp;action=delrights&amp;rights='.$obj->id.'">'.img_edit_remove($langs->trans("Remove")).'</a></td>';
}
@ -261,19 +280,19 @@ if ($_GET["id"])
print '</td>';
}
else if (in_array($obj->id, $permsgroup)) {
// Own permission by group
if ($user->admin)
// Permission own by group
if ($caneditperms)
{
print '<td align="center">'.$langs->trans("Group").'</td>';
}
print '<td align="left" nowrap>';
print '<td align="center" nowrap>';
print img_tick();
print '</td>';
}
else
{
// Do not own permission
if ($user->admin)
if ($caneditperms)
{
print '<td align="center"><a href="perms.php?id='.$fuser->id.'&amp;action=addrights&amp;rights='.$obj->id.'">'.img_edit_add($langs->trans("Add")).'</a></td>';
}