You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2010-11-08 17:10:34

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Intégration GLPI (0.78) dans eGrouWare (1.8)

Bonjour,

j'ai réussi à intégrer glpi 0.72.4 dans egroupware 1.6 et 1.8.

Cependant, lorsque j'ai mis à jour GLPI à la dernière version, le code de la page login.php était complétement changé. J'avais du refaire un peu une configuration à ma sauce par rapport au tuto http://www.glpi-project.org/wiki/doku.p … egroupware mais là, c'est vraiment très différent.

Est-ce que vous pourriez m'aider à résoudre se problème de login dans l'intégration à egroupware ?

Je n'a pas eu de problème par contre avec index.php, tout semble bien fonctionner.

Merci par avance pour votre aide,

Wilfrid

Offline

#2 2010-11-08 17:26:56

wawa
GLPI-DEV
From: Montpellier / France
Registered: 2006-07-03
Posts: 6,019
Website

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

bonjour,

vous pouvez me rééexpliquer dans les grandes lignes les modifs que vous avez faites ? qu'est ce que egroupware vous envoie comme infos dans la requête http ?

on ne peut pas faire un truc comme tout système de SSO en rajoutant le champs de la requête HTTP à la liste des champs que glpi peut regarder pour voir si un user a été authentifié dans un système externe ?

Offline

#3 2010-11-09 10:12:39

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

Bonjour wawa,
Merci pour l'intérêt que tu portes à mon problème.
Voici un peu de code.

Dans glpi 0.72.4  (intégré à egroupware), sur la page login.php nous avons modifié presque rien, nous avons surtout commenté trois lignes pour éviter la vérification du mot de passe, puisque l'utilisateur est nécessairement "logué" sur egroupware via un ldap.

//Do login and checks
//$user_present = 1; 

if (!isset ($_POST['login_name'])){
        $_POST['login_name'] = ""; 
}
 
$identificat = new Identification();
$identificat->getAuthMethods();
$identificat->user_present=1;  
$identificat->auth_succeded = false;

if (isset ($_POST['login_password'])) {
        $_POST['login_password'] = unclean_cross_side_scripting_deep($_POST['login_password']);
}
 
//if (!isset ($_POST["noAUTO"]) && $auth_method=checkAlternateAuthSystems()) {
if (!isset ($_POST["noAUTO"])) {

//      if ($identificat->getAlternateAuthSystemsUserLogin($auth_method)&&!empty($identificat->user->fields['name'])){
//              $user=$identificat->user->fields['name'];
      // Used for log when login process failed (déjà commenté)
      //$_POST['login_name']=$user; (déjà commenté)
                $user=$_POST['login_name'];
                $identificat->extauth = 1; 
                $identificat->user_present = $identificat->user->getFromDBbyName(addslashes($user));
                $identificat->user->fields['auth_method'] = $auth_method; 

                // if LDAP enabled too, get user's infos from LDAP
                $identificat->user->fields["id_auth"]=$CFG_GLPI['extra_ldap_server'];
                if (canUseLdap() && $identificat->user_present){
                        if (isset($identificat->auth_methods["ldap"][$identificat->user->fields["id_auth"]])) {
                                $ldap_method = $identificat->auth_methods["ldap"][$identificat->user->fields["id_auth"]];
                                
                                $ds = connect_ldap($ldap_method["ldap_host"], $ldap_method["ldap_port"], $ldap_method["ldap_rootdn"], $ldap_method["ldap_pass"], $ldap_method["ldap_use_tls"],$ldap_method["ldap_opt_deref"]);
                                if ($ds) {
                                        $user_dn = ldap_search_user_dn($ds, $ldap_method["ldap_basedn"], $ldap_method["ldap_login"], $user, $ldap_method["ldap_condition"]);
                                        if ($user_dn) {
                                                $identificat->user->getFromLDAP($ds,$ldap_method, $user_dn, $user);
                                                $identificat->auth_succeded = true;
                                        }
                                }
                        }
                }
                // Reset to secure it
                $identificat->user->fields['name']=$user;
                $identificat->user->fields["last_login"] = $_SESSION["glpi_currenttime"];
/*      } else {
                $identificat->addToError($LANG['login'][8]);
        }*/
}

Le code dans la nouvelle version de GLPI (0.78) a considérablement changé, il semble plus épuré, mais je n'arrive pas à remettre en place ce lien qui permet de valider automatiquement la page d'identification.

define('GLPI_ROOT', '.');

include (GLPI_ROOT . "/inc/includes.php");


if (!isset($_SESSION["glpicookietest"]) || $_SESSION["glpicookietest"]!='testcookie') {
   if (!is_writable(GLPI_SESSION_DIR)) {
      glpi_header($CFG_GLPI['root_doc'] . "/index.php?error=2");
   } else {
      glpi_header($CFG_GLPI['root_doc'] . "/index.php?error=1");
   }
}   
    
$_POST = array_map('stripslashes', $_POST);

//Do login and checks
//$user_present = 1; 
if (!isset($_POST['login_name'])) {
   $_POST['login_name'] = '';
}
if (isset($_POST['login_password'])) {
   $_POST['login_password'] = unclean_cross_side_scripting_deep($_POST['login_password']);
} else {
   $_POST['login_password'] = '';
}
 
// Redirect management
$REDIRECT = "";
if (isset ($_POST['redirect']) && strlen($_POST['redirect'])>0) {
   $REDIRECT = "?redirect=" .$_POST['redirect'];
} else if (isset ($_GET['redirect']) && strlen($_GET['redirect'])>0) {
   $REDIRECT = "?redirect=" .$_GET['redirect'];
}
 
$auth = new Auth();


// now we can continue with the process...
if ($auth->Login($_POST['login_name'],
                        $_POST['login_password'],
                        (isset($_REQUEST["noAUTO"])?$_REQUEST["noAUTO"]:false))) {
 
 
   // Redirect to Command Central if not post-only
   if ($_SESSION["glpiactiveprofile"]["interface"] == "helpdesk") {
      glpi_header($CFG_GLPI['root_doc'] . "/front/helpdesk.public.php$REDIRECT");
   } else {
      glpi_header($CFG_GLPI['root_doc'] . "/front/central.php$REDIRECT");
   }

} else {

   // we have done at least a good login? No, we exit.
   nullHeader("Login", $CFG_GLPI["root_doc"] . '/index.php');
   echo '<div class="center b">' . $auth->getErr() . '<br><br>';
   // Logout whit noAUto to manage auto_login with errors
   echo '<a href="' . $CFG_GLPI["root_doc"] . '/logout.php?noAUTO=1'.str_replace("?","&",$REDIRECT).'">' .
          $LANG['login'][1] . '</a></div>';
   nullFooter();
   exit();
}
?>

J'ai essayé de voir du côté de cette partie de code :

...
// now we can continue with the process...
if ($auth->Login($_POST['login_name'],
                        $_POST['login_password'],
                        (isset($_REQUEST["noAUTO"])?$_REQUEST["noAUTO"]:false))) {
 
 
   // Redirect to Command Central if not post-only
   if ($_SESSION["glpiactiveprofile"]["interface"] == "helpdesk") {
      glpi_header($CFG_GLPI['root_doc'] . "/front/helpdesk.public.php$REDIRECT");
   } else {
      glpi_header($CFG_GLPI['root_doc'] . "/front/central.php$REDIRECT");
   }

}

mais je n'ai pas réussi.

Si tu peux apporter de l'eau à mon moulin, je suis preneur,
Merci par avance,

Offline

#4 2010-11-09 10:54:42

wawa
GLPI-DEV
From: Montpellier / France
Registered: 2006-07-03
Posts: 6,019
Website

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

qu'est ce que egroupware transmet comme info pour indiquer à glpi que le user est authentifié ?
il doit bien envoyer un parmatère dans la requête http non ?
c'est ça le truc, il faut que je sache de quelle manière vous récupérer le username.
à partir de là on peut voir s'il y a moyen de faire un truc propre dans glpi

Offline

#5 2010-11-09 14:05:42

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

On trouve les informations dans la page index.php, voici le code modifier au regard du tutoriel suivant :

http://www.glpi-project.org/wiki/doku.p … egroupware

Note : ce qui est commenté correspond au code original.

   echo "<fieldset>";

   echo '<legend>'.$LANG['login'][10].'</legend>';
// echo '<div class="row"><span class="label"><label>'.$LANG['login'][6].' :  </label></span>'; 
   echo "<div class='row'><span class='label'><label>".$lang["login"][6]." :  </label></span>"; 
// echo '<span class="formw"><input type="text" name="login_name" id="login_name" size="15" />';
   echo "<span class='formw'><input type='text' name='login_name' id='login_name' value='".$_REQUEST['last_loginid']."' size='15' />";
   echo '</span></div>';

// echo '<div class="row"><span class="label"><label>'.$LANG['login'][7].' : </label></span>';
   echo "<div class='row'><span class='label'><label>".$lang["login"][7]." : </label></span>";
      
// echo '<span class="formw">';
   echo "<span class='formw'>";

// echo '<input type="password" name="login_password" id="login_password" size="15" /></span></div>';
   echo "<input type='password' name='login_password' id='login_password' value='x' size='15' /> </span></div>";

   echo "</fieldset>";
// echo '<p><span>';  
   echo "<p><span>";  
// echo '<input type="submit" name="submit" value="'.$LANG['buttons'][2].'" class="submit"/>';
   echo "<input type='submit' name='submit' value='".$lang["buttons"][2]."' class='submit'/>";
// echo '</span></p>';
   echo "</span></p>";
   echo "</form>";

   echo "<script type='text/javascript'>\n";
// echo "document.getElementById('login_name').focus();";
   echo "document.connexion.submit.click();";
// echo "</script>";
   echo "</script>\n";

   echo "</div>";  // end login box

Donc l'information qui est envoyé se trouve dans ces lignes :

echo "<span class='formw'><input type='text' name='login_name' id='login_name' value='".$_REQUEST['last_loginid']."' size='15' />";
echo "<input type='password' name='login_password' id='login_password' value='x' size='15' /> </span></div>";

Merci,
wilfrid

Last edited by wilfrid (2010-11-09 14:07:18)

Offline

#6 2010-11-09 14:18:58

wawa
GLPI-DEV
From: Montpellier / France
Registered: 2006-07-03
Posts: 6,019
Website

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

essayez ce patch :

Index: inc/setup.function.php
===================================================================
--- inc/setup.function.php    (révision 12994)
+++ inc/setup.function.php    (copie de travail)
@@ -171,6 +171,9 @@
    echo "<option value='REDIRECT_REMOTE_USER' " .
           ($CFG_GLPI["existing_auth_server_field"]=="REDIRECT_REMOTE_USER" ? " selected " : "") .">".
           "REDIRECT_REMOTE_USER</option>\n";
+   echo "<option value='last_loginid' " .
+          ($CFG_GLPI["existing_auth_server_field"]=="last_loginid" ? " selected " : "") .">".
+          "last_loginid</option>\n";
    echo "</select>";
    echo "</td></tr>\n";


une fois appliqué, allez dans la configuration de l'authentification, ensuite dans autres puis sélectionnez dans la liste déroulante Champ de stockage de l'identifiant dans la variable _SERVER la valeur last_loginid
ça devrait faire l'affaire non ?

Offline

#7 2010-11-10 10:21:25

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

Bonjour,

Je vois ce que tu me proposes. Je l'ai mis en place, mais ça ne fonctionne pas.

Je pense que la fonction mis en place ne peux fonctionner de cette manière, parce que last_loginid ne récupère pas le login de egroupware, mais de glpi. Or avec la modification faite dans le fichier index.php, le mot de passe est purement fictif. L'ouverture de sessions s'appuie essentiellement sur le login qui est récupéré dans glpi à partir d'une base ldap (AD) commune avec egroupware.

J'ai remis le fichier index.php à l'original, et cela ne fonctionne pas mieux, il ne me reprend pas le login de egroupware, et encore moins son mot de passe.

Il dernier point non moins important. Avant, lorsque nous ouvrions glpi par l'interface de egroupware, il validait automatiquement l'ouverture de session. Actuellement il faut valider pour ouvrir la session. Je vais regardé du côté de index.php, je pense que c'est à ce niveau là que ça ce passe.

Pour le clic automatique sur la validation voici ce qui est proposé dans la configuration précédente :

-   echo "document.getElementById('login_name').focus();";
+  echo "document.connexion.submit.click();";

Merci encore pour ces bonnes idées, car la manière que tu proposes pourrait être une option pérenne à l'avenir dans la configuration de glpi. Ainsi, les personnes souhaitant associer glpi à egroupware pourront effectuer la mise en place de façon plus simple.

A bientôt,
Wilfrid

Last edited by wilfrid (2010-11-10 10:26:39)

Offline

#8 2010-11-11 11:26:21

wawa
GLPI-DEV
From: Montpellier / France
Registered: 2006-07-03
Posts: 6,019
Website

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

ok je vois
si la base est commune et est un LDAP, cela veut dire donc que l'identifiant de connexion est identique ?

concernant l'ouverture de session, pour moi nous sommes dans le cas de glpi utilisé en SSO.
glpi au moment du chargement de l'index.php va chercher dans la variable de requête http définie dans la config le login. il n'authentifie pas le user, mais fait une requête LDAP (si besoin, si configuré) afin de calculer les habilitations.
il ne devrait pas y avoir de pb de click et soumission de formulaire en théorie

Offline

#9 2010-11-16 11:33:18

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

Salut,
Excuse de ne pas avoir pu répondre plus tôt.

Oui, la base d'authentification est commune à GLPI et eGroupware
oui, mais avant, il prenait en compte l'authentification qui était effectuée dans eGroupware et il reprenait le valeur (login) pour vérifier si l'utilisateur est bien valide et il ouvrait la session.
Je viens de voir qu'il y a encore une nouvelle version 0.78.1, je vais faire la mise à jour et je vais reprendre tout depuis le départ, car il y a une chose qui semble nous échapper.

à tout à l'heure
Wilfrid

Offline

#10 2010-11-16 11:54:37

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

Je viens de passer à la version 0.78.1. La mise à jour s'est très bien passée.
Je me pose la question suivante.

Est-ce qu'il est nécessaire que je modifie comme précédemment le code de la page 'index.php' ou bien dois-je passer par la configuration de GLPI comme tu me l'as indiqué précédemment, c'est-à-dire :

wawa wrote:

...dans la configuration de l'authentification, ensuite dans autres puis sélectionnez dans la liste déroulante Champ de stockage de l'identifiant dans la variable _SERVER...

mais alors quelle valeur dois-je choisir ?

Je trouve qu'il serait intéressant d'intégrer une option ou un module pour ce regroupement GLPI/eGroupware et que c'est l'occasion d'y travailler pour deux raisons. Cela permettrait de résoudre mon problème puis de faciliter la mise à jour pour tous ceux qui ont regrouper GLPI et eGrouware.

A tout à l'heure,
Wilfrid

Offline

#11 2010-11-16 16:02:49

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

Pour cette histoire de clic.
En fait, dans la ligne 91 du fichier 'index.php'

echo "<form action='".$CFG_GLPI["root_doc"]."/login.php' method='post'>";

il faut ajouter

 name='connexion' 

pour que le javascript puisse avoir son effet dans le remplacement du script qui sert à valider la connexion.

-   echo "<script type='text/javascript' >\n";
-   echo "document.getElementById('login_name').focus();";
-   echo "</script>";

+     echo "<script type='text/javascript'>\n";
+    echo "document.connexion.submit.click();";
+    echo "</script>\n";

Ça c'est fait ;-)
Maintenant, il reste tout le reste, c'est-à-dire le login récupéré d'eGroupware pour valider la session.

Offline

#12 2010-11-17 17:23:58

wilfrid
Member
Registered: 2010-09-28
Posts: 17

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

Je pense que c'est au niveau du passwd que ça bloque. Avec le patch que tu proposes ci-dessus, ça ne change pas la valeur du passwd puisque dans login.php il exige toujours le passwd qu'il vérifie sur LDAP :

if ($auth->Login($_POST['login_name'],
                        $_POST['login_password'], 
                        (isset($_REQUEST["noAUTO"])?$_REQUEST["noAUTO"]:true))) {


   // Redirect to Command Central if not post-only
   if ($_SESSION["glpiactiveprofile"]["interface"] == "helpdesk") {
      glpi_header($CFG_GLPI['root_doc'] . "/front/helpdesk.public.php$REDIRECT");
   } else {
      glpi_header($CFG_GLPI['root_doc'] . "/front/central.php$REDIRECT");
   }

}

Le truc c'est qu'on n'a pas de SSO pour le moment et j'ai l'impression que ton patch peut fonctionner s'il y a un SSO derrière.
Qu'en penses-tu ?

Last edited by wilfrid (2010-11-17 17:26:51)

Offline

#13 2010-11-17 17:36:06

wawa
GLPI-DEV
From: Montpellier / France
Registered: 2006-07-03
Posts: 6,019
Website

Re: Intégration GLPI (0.78) dans eGrouWare (1.8)

as-tu la possibilité de passer sur notre canal de discussion irc pour qu'en en parle en direct ?
#glpi sur irc.freenode.net (il y a une appli web http://webchat.freenode.net)

Offline

Board footer

Powered by FluxBB