Bonjour à toutes et à tous,
Je viens de découvrir Piwigo et je suis vraiment admiratif du travail qui a été effectué.
Le site internet de mon association était sur Coppermine auparavant. L'authentification des utilisateurs se faisait via un site internet distant. Une modification du fichier "login.php" avait été faite
En résumé:
Lors de l'authentification d'un utilisateur, si celui ci n'existait pas dans la base de données de coppermine, une demande d'authentification était faite sur le site distant. Dans le cas ou l'utilisateur était connu, celui-ci avait un droit d'accès "normal", sinon la demande était refusée.
Vous trouverez ci-dessous une partie du fichier "login.php" de Coppermine:
if (isset($HTTP_POST_VARS['submitted'])) { $ok=0; if($HTTP_POST_VARS['username']=="photo"){ mysql_select_db($CONFIG['dbname']); $results = db_query("SELECT user_id, user_name, user_password FROM {$CONFIG['TABLE_USERS']} WHERE user_name = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY user_password = '" . addslashes($HTTP_POST_VARS['password']) . "' AND user_active = 'YES'"); $lastvisit = db_query("UPDATE {$CONFIG['TABLE_USERS']} SET user_lastvisit = NOW() WHERE user_name = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY user_password = '" . addslashes($HTTP_POST_VARS['password']) . "' AND user_active = 'YES'"); if (mysql_num_rows($results)) { $USER_DATA = mysql_fetch_array($results); $okl=1; } $USER_DATA['id']=$CONFIG['id_magique']; } else{ $fp = fopen('http://nom_de_mon_site/api.php?user='. addslashes($HTTP_POST_VARS['username']).'&pass='. md5(addslashes($HTTP_POST_VARS['password'])).'&type=echodata','r'); $d=fgets($fp); $g = split("//",$d); fclose($fp); if((int)($g[0])>0){ $USER_DATA['id']=$g[0]; $USER_DATA['surnom']=$g[1]; $okl=1; } }
Actuellement, le site de l'association est sous Piwigo mais l'authentification des utilisateurs via ce même site distant n'est toujours pas géré et je peine à trouver la solution.
En regardant le fichier "identification.php" ligne 50 de Piwigo (voir-ci dessous), il me semble avoir trouvé une partie intéressante.
if ( try_log_user($_POST['username'], $_POST['password'], $remember_me) ) { redirect(empty($redirect_to) ? make_index_url() : $redirect_to); } else { array_push( $errors, l10n('invalid_pwd') ); }
Vais je devoir modifier la fonction "try_log_user" ? Dans ce cas, pouvez vous m'indiquer comment? (J'ai un bon livre de PHP mais je ne connais pas encore ce langage... :/)
Sinon à votre avis, est ce que je pars dans un mauvais chemin?
D'avance merci !!
Dernière modification par Canta! (2009-12-28 00:31:04)
Hors ligne
1 - Ce n'est pas le bon endroit.
2 - Est-ce que tu veux combiner la tentative de connexion au système de Piwigo puis celui distant ou bien simplement utiliser le distant?
- Utiliser un contrôle combiné des 2: complexe mais faisable par plugin + petite modif du core.
- Utiliser le systeme externe seul: c'est du standard on peut t'expliquer.
A suivre
Hors ligne
Merci pour ta réactivité VDigital !
Auparavant, il y avait uniquement le compte administrateur sous Coppermine et l'authentification des autres utilisateurs se faisait via un site distant comme vous avez pu le constater précédemment.
Petite précision, je ne gère absolument pas le serveur distant contenant les logins et mots de passes des utilisateurs (j'ai également un login et un mot de passe sur ce serveur comme les autres).
Je ne sais pas si l'utilistation du système d'authentification externe seul permettra de gérer les droits des utilisateurs sous Piwigo.
D'avance merci pour votre aide
Hors ligne
Gérer les autorisations n'est pas un gros pb, cela reste dans Piwigo.
Mais je ne comprends pas bien tes indications.
Niveau détail
Je lis ton code: $CONFIG['dbname']
Le tableau $CONFIG n'étant pas initialisé pour l'instant
=> cela ne peut pas fonctionner.
Niveau général sur le principe
Comment peut-on confier les inscriptions à un site externe?
Est-ce que les membres étaient informés de ça?
Je veux bien m'inscrire sur un site mais si je veux accéder à un site, je ne vois pas pourquoi je dois être inscrit sur un autre site, surtout si ce n'est pas toi qui le gère.
Bref, pourrais-tu être plus précis? De quel site tu parles (URL)? Comment s'inscrivait-on? Comment savait-on que cela donnait un accès à ton site? Comment savait-on ce quel usage pouvait-être fait des emails?
Essaie de répondre aux questions des 2 niveaux pour que je sois certain de comprendre.
Hors ligne
Réponse : Niveau général sur le principe
Effectivement, voici quelques précisions: Je fais partie d'une école.
Chaque élève en entrant dans l'école crée un compte avec un login et un mot de passe sur le "site internet principal" de l'école. Chaque association de l'école dont la mienne, a un site internet qui lui est propre.
Pour des raisons de confidentialité, nous sommes parfois amenés à demander l'authentification des élèves.
Pour leurs éviter de créer un nouveau compte sur chaque site internet des associations, le site internet principal est là entre autres pour centraliser les comptes des élèves.
Chaque site internet des associations fait donc appel au "site internet principal" lorsqu'une personne souhaite s'identifier sur son site.
Je souhaite donc utiliser cette même fonctionnalité avec Piwigo
Réponse : Niveau détail
Honnêtement, je ne peux pas vraiment t'aider concernant le code PHP. Je sais qu'il y a quelques années, uniquement le fichier login.php de coppermine à été modifié pour donner la possibilité aux élèves de se connecter sur l'ancien site internet de l'association (le nouveau étant sous Piwigo).
A l'origine, le fichier login.php était le suivant:
<?php // ------------------------------------------------------------------------- // // Coppermine Photo Gallery 1.3.2 // // ------------------------------------------------------------------------- // // Copyright (C) 2002-2004 Gregory DEMAR // // http://www.chezgreg.net/coppermine/ // // ------------------------------------------------------------------------- // // Updated by the Coppermine Dev Team // // (http://coppermine.sf.net/team/) // // see /docs/credits.html for details // // ------------------------------------------------------------------------- // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation; either version 2 of the License, or // // (at your option) any later version. // // ------------------------------------------------------------------------- // // CVS version: $Id: login.php,v 1.5 2004/07/24 15:03:53 gaugau Exp $ // ------------------------------------------------------------------------- // define('IN_COPPERMINE', true); define('LOGIN_PHP', true); require('include/init.inc.php'); if (USER_ID) cpg_die(ERROR, $lang_login_php['err_already_logged_in'], __FILE__, __LINE__); if (defined('UDB_INTEGRATION')) udb_login_page(); $referer = $HTTP_GET_VARS['referer'] ? $HTTP_GET_VARS['referer'] : 'index.php'; $login_failed = ''; $cookie_warning = ''; if (isset($HTTP_POST_VARS['submitted'])) { if($HTTP_POST_VARS['username']=="photo"){ mysql_select_db($CONFIG['dbname']); $results = db_query("SELECT user_id, user_name, user_password FROM {$CONFIG['TABLE_USERS']} WHERE user_name = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY user_password = '" . addslashes($HTTP_POST_VARS['password']) . "' AND user_active = 'YES'"); $lastvisit = db_query("UPDATE {$CONFIG['TABLE_USERS']} SET user_lastvisit = NOW() WHERE user_name = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY user_password = '" . addslashes($HTTP_POST_VARS['password']) . "' AND user_active = 'YES'"); } else{ mysql_select_db($CONFIG['dbname2']); // $results = db_query("SELECT id_membre, login, mdp FROM membres WHERE login = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY mdp = '" . md5(addslashes($HTTP_POST_VARS['password'])) . "'");} $results = db_query("SELECT id, surnom, mdp FROM 2007_utilisateurs WHERE pseudo = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY mdp = '" . md5(addslashes($HTTP_POST_VARS['password'])) . "'");} if (mysql_num_rows($results)) { $USER_DATA = mysql_fetch_array($results); if (isset($HTTP_POST_VARS['remember_me'])) { $cookie_life_time = 86400 * 30; } else { $cookie_life_time = 86400; } setcookie($CONFIG['cookie_name'] . '_uid', $USER_DATA['id'], time() + $cookie_life_time, $CONFIG['cookie_path']); setcookie($CONFIG['cookie_name'] . '_pass', md5($HTTP_POST_VARS['password']), time() + $cookie_life_time, $CONFIG['cookie_path']); pageheader($lang_login_php['login'], "<META http-equiv=\"refresh\" content=\"3;url=$referer\">"); msg_box($lang_login_php['login'], sprintf($lang_login_php['welcome'], $USER_DATA['surnom']), $lang_continue, $referer); pagefooter(); exit; } else { $login_failed = <<<EOT <tr> <td colspan="2" align="center" class="tableh2"> <font size="1" color="red"><b>{$lang_login_php['err_login']}<b></font> </td> </tr> EOT; } } if (!isset($HTTP_COOKIE_VARS[$CONFIG['cookie_name'] . '_data'])) { $cookie_warning = <<<EOT <tr> <td colspan="2" align="center" class="tableh2"> <font size="1" color="red"><b>Warning your browser does not accept script's cookies<b></font> </td> </tr> EOT; } pageheader($lang_login_php['login']); $referer = urlencode($referer); starttable('-1', $lang_login_php['enter_login_pswd'], 2); echo <<< EOT $login_failed $cookie_warning <tr> <form action="login.php?referer=$referer" method="post" name="loginbox"> <td class="tableb" width="40%">{$lang_login_php['username']}</td> <td class="tableb" width="60%"><input type="text" class="textinput" name="username" style="width: 100%"></td> <script language="javascript" type="text/javascript"> <!-- document.loginbox.username.focus(); --> </script> </tr> <tr> <td class="tableb">{$lang_login_php['password']}</td> <td class="tableb"><input type="password" class="textinput" name="password" style="width: 100%"></td> </tr> <tr> <td colspan="2" align="center" class="tableb">{$lang_login_php['remember_me']} <input name="remember_me" type="checkbox" class="checkbox" value="1"></td> </tr> <tr> <td align="left" class="tablef"><input name="submitted" type="submit" class="button" value="{$lang_login_php['login']}"></td> </form> </tr> EOT; endtable(); pagefooter(); ob_end_flush(); ?>
Après modification, pour l'ajout de la fonctionnalité d'authentification auprès du site internet principal, le fichier login.php ressemblait à cela:
<?php // ------------------------------------------------------------------------- // // Coppermine Photo Gallery 1.3.2 // // ------------------------------------------------------------------------- // // Copyright (C) 2002-2004 Gregory DEMAR // // http://www.chezgreg.net/coppermine/ // // ------------------------------------------------------------------------- // // Updated by the Coppermine Dev Team // // (http://coppermine.sf.net/team/) // // see /docs/credits.html for details // // ------------------------------------------------------------------------- // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation; either version 2 of the License, or // // (at your option) any later version. // // ------------------------------------------------------------------------- // // CVS version: $Id: login.php,v 1.5 2004/07/24 15:03:53 gaugau Exp $ // ------------------------------------------------------------------------- // define('IN_COPPERMINE', true); define('LOGIN_PHP', true); require('include/init.inc.php'); if (USER_ID) cpg_die(ERROR, $lang_login_php['err_already_logged_in'], __FILE__, __LINE__); if (defined('UDB_INTEGRATION')) udb_login_page(); $referer = $HTTP_GET_VARS['referer'] ? $HTTP_GET_VARS['referer'] : 'index.php'; $login_failed = ''; $cookie_warning = ''; if (isset($HTTP_POST_VARS['submitted'])) { $ok=0; if($HTTP_POST_VARS['username']=="photo"){ mysql_select_db($CONFIG['dbname']); $results = db_query("SELECT user_id, user_name, user_password FROM {$CONFIG['TABLE_USERS']} WHERE user_name = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY user_password = '" . addslashes($HTTP_POST_VARS['password']) . "' AND user_active = 'YES'"); $lastvisit = db_query("UPDATE {$CONFIG['TABLE_USERS']} SET user_lastvisit = NOW() WHERE user_name = '" . addslashes($HTTP_POST_VARS['username']) . "' AND BINARY user_password = '" . addslashes($HTTP_POST_VARS['password']) . "' AND user_active = 'YES'"); if (mysql_num_rows($results)) { $USER_DATA = mysql_fetch_array($results); $okl=1; } $USER_DATA['id']=$CONFIG['id_magique']; } else{ $fp = fopen('http://nomdusiteprincipal.fr/api.php?user='. addslashes($HTTP_POST_VARS['username']).'&pass='. md5(addslashes($HTTP_POST_VARS['password'])).'&type=echodata','r'); $d=fgets($fp); $g = split("//",$d); fclose($fp); if((int)($g[0])>0){ $USER_DATA['id']=$g[0]; $USER_DATA['surnom']=$g[1]; $okl=1; } } if ($okl) { if (isset($HTTP_POST_VARS['remember_me'])) { $cookie_life_time = 86400 * 30; } else { $cookie_life_time = 86400; } setcookie($CONFIG['cookie_name'] . '_uid', $USER_DATA['id'], time() + $cookie_life_time, $CONFIG['cookie_path']); setcookie($CONFIG['cookie_name'] . '_pass', md5($HTTP_POST_VARS['password']), time() + $cookie_life_time, $CONFIG['cookie_path']); setcookie($CONFIG['cookie_name'] . '_uname', $HTTP_POST_VARS['username'], time() + $cookie_life_time, $CONFIG['cookie_path']); pageheader($lang_login_php['login'], "<META http-equiv=\"refresh\" content=\"3;url=$referer\">"); msg_box($lang_login_php['login'], sprintf($lang_login_php['welcome'], $USER_DATA['surnom']), $lang_continue, $referer); pagefooter(); exit; } else { $login_failed = <<<EOT <tr> <td colspan="2" align="center" class="tableh2"> <font size="1" color="red"><b>{$lang_login_php['err_login']}<b></font> </td> </tr> EOT; } } if (!isset($HTTP_COOKIE_VARS[$CONFIG['cookie_name'] . '_data'])) { $cookie_warning = <<<EOT <tr> <td colspan="2" align="center" class="tableh2"> <font size="1" color="red"><b>Warning your browser does not accept script's cookies<b></font> </td> </tr> EOT; } pageheader($lang_login_php['login']); $referer = urlencode($referer); starttable('-1', $lang_login_php['enter_login_pswd'], 2); echo <<< EOT $login_failed $cookie_warning <tr> <form action="login.php?referer=$referer" method="post" name="loginbox"> <td class="tableb" width="40%">{$lang_login_php['username']}</td> <td class="tableb" width="60%"><input type="text" class="textinput" name="username" style="width: 100%"></td> <script language="javascript" type="text/javascript"> <!-- document.loginbox.username.focus(); --> </script> </tr> <tr> <td class="tableb">{$lang_login_php['password']}</td> <td class="tableb"><input type="password" class="textinput" name="password" style="width: 100%"></td> </tr> <tr> <td colspan="2" align="center" class="tableb">{$lang_login_php['remember_me']} <input name="remember_me" type="checkbox" class="checkbox" value="1"></td> </tr> <tr> <td align="left" class="tablef"><input name="submitted" type="submit" class="button" value="{$lang_login_php['login']}"></td> </form> </tr> EOT; endtable(); pagefooter(); ob_end_flush(); ?>
Je vous ai mis le code en entier pour vous donner le maximum de chance de comprendre et j'ai juste remplacé le nom du site internet par "nomdusiteprincipal.fr" tout en conservant la même syntaxe .
J'utilise winMerge ou Windiff pour visualiser la différence entre les deux fichiers.
J'espère avoir été clair :)
Hors ligne
Parfait maintenant nous avons de bonnes raisons pour réfléchir un peu plus.
Ce qui ne veut pas dire que nous n'aurons plus de question.
;-)
[inutile]Contenu de include/init.inc.php
au moins par MP ou identifiants masqués. ??? Merci.[/inutile]
C'est devenu inutile après relecture.
;-)
Dernière modification par VDigital (2009-12-29 11:56:27)
Hors ligne
J'avais prévenu qu'il y aurait des questions.
Le secret de la solution passe par quelques lignes de code.
Pour les experts:
J'ai beau tourner 10 fois le code dans tous les sens et je n'ai pas de belle solution.
http://code.piwigo.org/repositories/ent … .php#L1034
Les déclencheurs de plugins se trouvent après le test du password et ils sont suivi d'un return true ou d'un return false en dur dans le code.
C'est bigrement regrettable.
Il aurait suffit de pas grand chose pour que cela soit beaucoup plus simple.
@Canta!
Je vais te proposer une solution mais pour moi cela nécessitera des tests.
Les grandes lignes:
- Je vais jouer sur le test du mot de passe, le :
if ($row['password'] == $conf['pass_convert']($password))
1 - Si je ne trouve pas le user sur le site principal, on vérifiera le mot de mot de passe par rapport à la table de piwigo ainsi la connexion standard fonctionnera peut-être ou pas.
2 - Si je trouve le user sur le site principal... Je te propose la solution suivante:
2.1 - Si le user n'existe pas dans la base de Piwigo, je l'enregistre avec le même identifiant, pseudo et mot de passe que pour le site principal. (Renvoi d'une valeur nulle pour matcher avec l'absence du coté de Piwigo).
2.2 - Si le user existe et que l'id est le même et le mot de passe est différent, j'actualise le mot de passe dans la base de Piwigo. (Renvoi du MD5 de l'ancien mot de passe et résultat de la query précédente).
2.3 - Si le user existe et que l'id est différent, je supprime l'ancien user, j'enregistre le nouveau user, son nouvel id, et son mot de passe. (Renvoi du MD5 du mot de passe de l'ancien user et résultat de la query précédente).
Dans tous les cas cela va fonctionner en restant standard (sans modifier le code de base).
Mais j'ai juste un problème avec les users spéciaux (Webmaster / Guest) pour Piwigo ils ont besoin d'exister.
En standard dans Piwigo, c'est respectivement les ids 1 et 2.
Sur ton site principal:
$fp = fopen('http://nomdusiteprincipal.fr/api.php?user='. addslashes($HTTP_POST_VARS['username']).'&pass='. md5(addslashes($HTTP_POST_VARS['password'])).'&type=echodata','r');
$d=fgets($fp);
$g = split("//",$d);
fclose($fp);
if((int)($g[0])>0){
$USER_DATA['id']=$g[0];
$USER_DATA['surnom']=$g[1];
$okl=1;
}
Quid de $USER_DATA['id']=$g[0]; ???
Mes nouvelles questions:
Est-ce qu'il existe un 'id' à 1 (est-ce ton id)?
Est-ce que le 'id' à 2 est attribué (si oui, pourrait-on avoir un autre id bidon pour le guest)?
Hors ligne
Vincent, c'est à mon avis exactement ce qu'il faut faire...
Il suffit de quelques lignes de codes en plugin perso pour arriver à ca.
Mais pourquoi l'id de l'utilisateur sur la base externe t'embete-t-elle?
On a absolument pas besoin du $USER_DATA['id'], puisqu'on va créer un nouvel utilisateur sur la base locale (donc avec un nouvel id)
On a juste besoin du pseudo et du hash du mot de passe (et éventuellement ll'adresse email, mais je ne sais pas si l'API du site la fournit).
A mon avis, pas besoin de s'embeter avec les points 2.2 et 2.3....
Hors ligne
Je suis face à une école...
Le pseudo va changer ou être repris au fil des ans (le pat (id=17423) de 1998 n'est pas le pat (20218) de 2003, ni le pat (23741) de 2009).
L'id de la base de l'école doit par contre être conservé et lève tout ambigüité.
Si je me base sur le pseudo, je peux avoir un pat en CE1 et un pat en CM2, et un ancien pat à l'INSA de Lyon, et un autre qui fait de la musique sur les plages de la côte d'Azur.
2.3 je supprime les users inactifs. (AND user_active = 'YES' dans Coppermine)
Mais je dois effectivement réfléchir un peu plus à ton idée (il y a peut-être quelque chose de plus simple à faire).
Merci de m'aider dans cette réflexion.
Hors ligne
VDigital a écrit:
...sur les plages de la côte d'Azur.
Dire que j'avais cru qu'il était dans une institution tout à fait respectable ! ... dans une fosse, certes ;)
Hors ligne
VDigital a écrit:
Est-ce qu'il existe un 'id' à 1 (est-ce ton id)?
Actuellement, il existe dans Piwigo un compte Webmestre (moi même) et un compte Administrateur qui permet à une autre personne de l'association de gérer également le site si je suis absent.
VDigital a écrit:
Est-ce que le 'id' à 2 est attribué (si oui, pourrait-on avoir un autre id bidon pour le guest)?
Il y a un compte invité actuellement dans Piwigo, c'est celui par défaut et je ne l'utilise pas.
---
Sinon, concernant le principe, c'est parfait !
Merci pour votre réactivité !!
Hors ligne
Canta! a écrit:
VDigital a écrit:
Est-ce qu'il existe un 'id' à 1 (est-ce ton id)?
Actuellement, il existe dans Piwigo un compte Webmestre (moi même) et un compte Administrateur qui permet à une autre personne de l'association de gérer également le site si je suis absent.
VDigital a écrit:
Est-ce que le 'id' à 2 est attribué (si oui, pourrait-on avoir un autre id bidon pour le guest)?
Il y a un compte invité actuellement dans Piwigo, c'est celui par défaut et je ne l'utilise pas.
---
Sinon, concernant le principe, c'est parfait !
Merci pour votre réactivité !!
Je peux me tromper mais je pense que VDigital perlais de l'ID dans la BDD de Copermine.
Hors ligne
Gotcha a écrit:
Je peux me tromper mais je pense que VDigital perlais de l'ID dans la BDD de Copermine.
Dans ce cas:
VDigital a écrit:
Est-ce qu'il existe un 'id' à 1 (est-ce ton id)?
Il y avait dans Coppermine uniquement un compte Administrateur avec un login et mot de passe différents de mes identifiants personnels.
VDigital a écrit:
Est-ce que le 'id' à 2 est attribué (si oui, pourrait-on avoir un autre id bidon pour le guest)?
Comme énoncé précédemment, il n'y avait pas de compte invité sous coppermine
Hors ligne
Je ne veux pas savoir coté Coppermine (ni coté Piwigo, je crois connaitre un peu) mais dans la base de l'école.
Quel id (de l'école, et pas son pseudo) qui deviendrait le Webmaster de la partie Piwigo?
afin de se substituer au 1 (standard) de Piwigo.
Et dans la base de l'école toujours, un id bidon qui pourrait nous servir de guest?
afin de se substituer au 2 (standard) de Piwigo.
Hors ligne
J'ai fait la demande pour connaître les ids en question mais la réponse tarde un peu à arriver, je suis dsl.
En attendant, est t'il tout de même possible de tester une solution avec des ids provisoires ?
D'avance merci
Hors ligne