Super !
J'ai suivi tes conseils, grum : J'ai utilisé le trigger "register_user_check" et maintenant tout fonctionne nikel !!
Merci beaucoup pour le coup de main et la leçon. J'ai encore beaucoup appris aujourd'hui, grâce à toi.
8-)
Eric a écrit:
Pourtant, si je fais :
Code:
$lang['reg_err_login1'] = l10n('reg_err_login4')."'".$conf_nbc_UserAdvManager[15]."'";Je passe "password" à blanc pour forcer l'arrêt de la procédure d'inscription par la génération d'une erreur standard de Piwigo dans ce cas. Le but étant bien qu'un visiteur qui s'inscrit ne puisse pas le faire sans préciser un mot de passe fort.
reg_err_login1 ne devrait-il pas prendre la valeur l10n('reg_err_login4')."'".$conf_nbc_UserAdvManager[15]."'" ??
si, il prends bien cette valeur.
sauf que, ce n'est pas ce message qui est affiché lorsque le password est à blanc, mais c'est le message "reg_err_pass".
Tu auras beau modifier "reg_err_login1", s'il n'est pas affiché, ben il n'est pas affiché ;)
à la lecture du code, à noter deux choses :
- le trigger "register_user" est déclenché dans la fonction "register_user" (pas con çà) après les tests de validité du login et de l'email (donc potentiellement, tu récupères déjà des erreurs dans le paramètre $err => attention à ne pas les 'zapper)
- la fonction "register_user" est déclenchée alors qu'un premier contrôle de mot de passe a déjà été effectué (si les deux mots de passes renseignés sont identiques)
=> si ces contrôles ne sont pas validé, le trigger se déclenche quand même
=> si le mot de passe n'est pas renseigné, pas de contrôle
register.php lignes 40-91
$errors = array(); if (isset($_POST['submit'])) { if ($_POST['password'] != $_POST['password_conf']) { array_push($errors, l10n('reg_err_pass')); } $errors = register_user($_POST['login'], $_POST['password'], $_POST['mail_address'], true, $errors); if (count($errors) == 0) { $user_id = get_userid($_POST['login']); log_user($user_id, false); redirect(make_index_url()); } }
Topic déplacé ;-)
grum a écrit:
[hs]
Eric a écrit:
J'ai pensé que cela pourrait servir à d'autre développeur de plugin qui seraient dans le même besoin global que moi. D'où ce post dans "Truc et astuces".
Ben dans l'idée (et c'est pour çà qu'il est précisé dans la section "On vient donner des astuces, pas poser des questions") cette section a surtout pour but de regrouper des astuces que l'on peut appliquer immédiatement : que çà soit au niveau dev, style, mise en page, configuration, autres...
C'est une section ou l'on explique comment on à fait quelque chose.
Quand j'ai proposé cette section, c'était avant tout afin de permettre aux personnes qui la consultent de se dire "tiens, on peut faire çà".
Si on y pose des questions, autant fermer la section et en reporter le contenu dans les autres sections.
Par rapport à ton besoin, la section "plugin" (ou l'on peut y lire "Besoin d'aide pour utiliser un plugin ou de conseils pour en développer un ? ") aurait été plus appropriée ;)
[/hs]
[hs] Après réflexion et lecture de tes remarques, j'admets avoir fait une erreur de poster dans cette section. Je suis OK pour que l'on déplace ce topic dans la section "plugins". ;)[/hs]
grum a écrit:
Eric a écrit:
Ai-je été plus clair ?
Non pas tout à fait :o)
:-(
grum a écrit:
Mais comme un bon exemple vaut mieux qu'une longue explication, j'ai codé ton cas dans un plugin personnel (delta prêt que toutes les variable "nbc" sont remplacées par des valeurs en dur).
Le résultat n'est pas des plus optimisé :
- la fonction est appellée systématiquement, que l'on soit en mode "enregistrement" ou pas
- le test fonctionne plutôt bien : la valeur "password" est bien forcée à blanc,mais avec pour conséquence l'impossibilité de logger par la suite si le mot de passe initial n'est pas assez fort
- le message d'erreur que tu utilise n'est pas le bon : reg_err_login1 = "S'il vous plaît, entrer un nom utilisateur" => ce message n'est pas celui qui est restitué lorsque le mot de passe n'est pas renseigné : utilise "reg_err_pass"
Pourtant, si je fais :
$lang['reg_err_login1'] = l10n('reg_err_login4')."'".$conf_nbc_UserAdvManager[15]."'";
Je passe "password" à blanc pour forcer l'arrêt de la procédure d'inscription par la génération d'une erreur standard de Piwigo dans ce cas. Le but étant bien qu'un visiteur qui s'inscrit ne puisse pas le faire sans préciser un mot de passe fort.
reg_err_login1 ne devrait-il pas prendre la valeur l10n('reg_err_login4')."'".$conf_nbc_UserAdvManager[15]."'" ??
En fait, l'idée n'est pas vraiment d'afficher le message d'erreur originel de reg_err_login1 mais un message d'erreur propre à l'action du plugin.
grum a écrit:
Au final, l'évènement "init" bien qu'il fonctionne correctement et permet de gérer ton besoin, ne permet pas de le gérer de façon optimisée (tu vas devoir mettre un tas de contrôle pour éviter les pb que je cite).
L'évènement "register_user_check" est bien le plus apprioprié.
Un exemple de l'usage de ce trigger :
[snip...]
Effectivement, ce trigger "register_user_check" éviterai à la fonction d'être appelée en permanence. Je vais tester çà.
Merci grum !!
[hs]
Eric a écrit:
J'ai pensé que cela pourrait servir à d'autre développeur de plugin qui seraient dans le même besoin global que moi. D'où ce post dans "Truc et astuces".
Ben dans l'idée (et c'est pour çà qu'il est précisé dans la section "On vient donner des astuces, pas poser des questions") cette section a surtout pour but de regrouper des astuces que l'on peut appliquer immédiatement : que çà soit au niveau dev, style, mise en page, configuration, autres...
C'est une section ou l'on explique comment on à fait quelque chose.
Quand j'ai proposé cette section, c'était avant tout afin de permettre aux personnes qui la consultent de se dire "tiens, on peut faire çà".
Si on y pose des questions, autant fermer la section et en reporter le contenu dans les autres sections.
Par rapport à ton besoin, la section "plugin" (ou l'on peut y lire "Besoin d'aide pour utiliser un plugin ou de conseils pour en développer un ? ") aurait été plus appropriée ;)
[/hs]
Eric a écrit:
Ai-je été plus clair ?
Non pas tout à fait :o)
Mais comme un bon exemple vaut mieux qu'une longue explication, j'ai codé ton cas dans un plugin personnel (delta prêt que toutes les variable "nbc" sont remplacées par des valeurs en dur).
Le résultat n'est pas des plus optimisé :
- la fonction est appellée systématiquement, que l'on soit en mode "enregistrement" ou pas
- le test fonctionne plutôt bien : la valeur "password" est bien forcée à blanc,mais avec pour conséquence l'impossibilité de logger par la suite si le mot de passe initial n'est pas assez fort
- le message d'erreur que tu utilise n'est pas le bon : reg_err_login1 = "S'il vous plaît, entrer un nom utilisateur" => ce message n'est pas celui qui est restitué lorsque le mot de passe n'est pas renseigné : utilise "reg_err_pass"
Au final, l'évènement "init" bien qu'il fonctionne correctement et permet de gérer ton besoin, ne permet pas de le gérer de façon optimisée (tu vas devoir mettre un tas de contrôle pour éviter les pb que je cite).
L'évènement "register_user_check" est bien le plus apprioprié.
Un exemple de l'usage de ce trigger :
add_event_handler('register_user_check', 'test_nbc', EVENT_HANDLER_PRIORITY_NEUTRAL, 2); function test_nbc($err, $user) { global $errors; //le contenu de $user = Array('username'=>$login, 'password'=>$password, 'email'=>$mail_address) //te permet de faire tes tests if(testpassword($user['password'])<50) { // si test KO, tu fait un return avec le contenu du message return("ko!!!"); } }
Pour vraiment lever le doute sur l'appel à la fonction testpassword(), je l'ai codée directement dans le fichier où le contrôle de mot de passe a lieu. Ce qui donne :
if (isset($conf_nbc_UserAdvManager[14]) and $conf_nbc_UserAdvManager[14] == 'true' and !empty($conf_nbc_UserAdvManager[15])) { $password = $_POST['password']; // Initialisation des variables - Variables initiation $points = 0; $point_lowercase = 0; $point_uppercase = 0; $point_numbers = 0; $point_characters = 0; // On récupère la longueur du mot de passe - Getting password lengh $length = strlen($password); // On fait une boucle pour lire chaque lettre - Loop to read password characters for($i = 0; $i < $length; $i++) { // On sélectionne une à une chaque lettre - Select each letters // $i étant à 0 lors du premier passage de la boucle - $i is 0 at first turn $letters = $password[$i]; if ($letters>='a' && $letters<='z') { // On ajoute 1 point pour une minuscule - Adding 1 point to score for a lowercase $points = $points + 1; // On rajoute le bonus pour une minuscule - Adding bonus points for lowercase $point_lowercase = 1; } else if ($letters>='A' && $letters <='Z') { // On ajoute 2 points pour une majuscule - Adding 2 points to score for uppercase $points = $points + 2; // On rajoute le bonus pour une majuscule - Adding bonus points for uppercase $point_uppercase = 2; } else if ($letters>='0' && $letters<='9') { // On ajoute 3 points pour un chiffre - Adding 3 points to score for numbers $points = $points + 3; // On rajoute le bonus pour un chiffre - Adding bonus points for numbers $point_numbers = 3; } else { // On ajoute 5 points pour un caractère autre - Adding 5 points to score for special characters $points = $points + 5; // On rajoute le bonus pour un caractère autre - Adding bonus points for special characters $point_characters = 5; } } // Calcul du coefficient points/longueur - calculating the coefficient points / length $step1 = $points / $length; // Calcul du coefficient de la diversité des types de caractères... - Calculation of the diversity of character types... $step2 = $point_lowercase + $point_uppercase + $point_numbers + $point_characters; // Multiplication du coefficient de diversité avec celui de la longueur - Multiplying the coefficient of diversity with that of the length $score = $step1 * $step2; // Multiplication du résultat par la longueur de la chaîne - Multiplying the result by the length of the chain $finalscore = $score * $length; if ($finalscore < $conf_nbc_UserAdvManager[15]) { $lang['reg_err_login1'] = l10n('reg_err_login4')."'".$conf_nbc_UserAdvManager[15]."'"; $_POST['password'] = ''; } }
A la fin, je force $_POST['password'] = '' pour être certain que la variable est bien prise en compte. Dans ce cas, j'obtiens bien un message d'erreur à l'inscription mais dû au fait que le mot de passe ne correspond plus à celui saisi en confirmation (et pour cause : il a été vidé). Donc le script passe bien par la condition "if ($finalscore < $conf_nbc_UserAdvManager[15])".
Si j'enlève $_POST['password'] = '', il n'y a plus de génération d'erreur pourtant $lang['reg_err_login1'] = l10n('reg_err_login4')."'".$conf_nbc_UserAdvManager[15]."'"; devrait s'afficher, non ?
VDigital a écrit:
Sans doute rien avoir avec ton pb mais...
Pourquoi passes-tu $_POST['password'] en argument de ta fonction?
La variable ne serait-elle pas directement accessible par la fonction par hasard (par defaut au besoin)?
function testpassword($psw = $_POST['password'])
Parque cette fonction est aussi utilisée dans le panneau d'admin du plugin. Il permet ainsi à l'admin de tester la fiabilité des mots de passe afin d'en déduire la valeur plancher qu'il souhaite configurer pour ses visiteurs qui voudraient s'inscrire. Bien entendu, dans ce cas, la variable en paramètre ($_POST['PasswordTest']) de la fonction n'est pas la même que celle utilisée pour une inscription ($_POST['Password']).
C'est pourquoi j'ai codé ma fonction :
/** * Returns a password's score for password complexity check * * @param password entered * * Thanx to MathieuGut from http://m-gut.developpez.com */ function testpassword($password) // Le mot de passe passé en paramètre - $password given by user {
Pas bon ?
grum a écrit:
Trucs et astuces
Envie de partager vos connaissances sur Piwigo? C'est ici. On vient donner des astuces, pas poser des questions.J'aurais plutôt la question dans une section dédiées au aux questions ;)
J'ai pensé que cela pourrait servir à d'autre développeur de plugin qui seraient dans le même besoin global que moi. D'où ce post dans "Truc et astuces".
grum a écrit:
Mis à part çà, j'ai du mal à comprendre la question.
Qu'est-ce que tu veux dire par "L'erreur de fiabilité du mot de passe n'est pas considérée alors que je sais que ma fonction testpassword() fonctionne" ?
Si tu mets des traces dans le code,
1/ la fonction est bien appellée ?
2/ $_POST['password'] est bien renseigné ?
3/ que restitue $PasswordCheck après $PasswordCheck = testpassword($_POST['password']); ?
4/ si la réponse à la question t'indique que la valeur restituée est la bonne, au final que dois faire ta fonction à par forcer les valeur de $_POST à "" ?
Je vais essayer de clarifier ma situation ;-)
1/ Oui, la fonction est bien appelée
2/ Oui, $_POST['password'] est renseigné. Sinon, j'aurai une erreur avec la fonction pour paramètre manquant.
3/ $PasswordCheck restitue un entier résultant de la fonction testpassword(). Une valeur pouvant aller de 0 à l'infini (en théorie - Selon mes tests de mots de passe, je n'ai pu atteindre un score supérieur à 500 qu'avec plus de 50 caractères saisis !).
4/ La fonction testpassword() ne fait que calculer un score de fiabilité du mot de passe saisi et retourne ce score dans $PasswordCheck. Après il y a comparaison de ce score calculé avec le score minimal configuré dans le plugin ($conf_nbc_UserAdvManager[15]).
Si le score calculé est inférieur à la valeur plancher définie, je cherche à générer une erreur à l'inscription de l'utilisateur. Une erreur dans le même genre que si l'utilisateur n'avait pas renseigné son username ou si le mot de passe saisi ($_POST['password']) était différent du mot de passe de contrôle ($_POST['password_conf']).
Et c'est bien là que je sèche... Pourtant j'ai activé le traçage des requêtes et des triggers. C'est là que je me suis aperçu que le suivant intervient :
trigger_event('register_user_check', $errors, array( 'username'=>$login, 'password'=>$password, 'email'=>$mail_address, )
Ai-je été plus clair ?
Sans doute rien avoir avec ton pb mais...
Pourquoi passes-tu $_POST['password'] en argument de ta fonction?
La variable ne serait-elle pas directement accessible par la fonction par hasard (par defaut au besoin)?
function testpassword($psw = $_POST['password'])
Trucs et astuces
Envie de partager vos connaissances sur Piwigo? C'est ici. On vient donner des astuces, pas poser des questions.
J'aurais plutôt la question dans une section dédiées au aux questions ;)
Mis à part çà, j'ai du mal à comprendre la question.
Qu'est-ce que tu veux dire par "L'erreur de fiabilité du mot de passe n'est pas considérée alors que je sais que ma fonction testpassword() fonctionne" ?
Si tu mets des traces dans le code,
1/ la fonction est bien appellée ?
2/ $_POST['password'] est bien renseigné ?
3/ que restitue $PasswordCheck après $PasswordCheck = testpassword($_POST['password']); ?
4/ si la réponse à la question t'indique que la valeur restituée est la bonne, au final que dois faire ta fonction à par forcer les valeur de $_POST à "" ?
Bonjour à tous.
Dans le cadre du plugin NBC_UserAdvManager, je cherche à implémenter une fonctionnalité de contrôle de la fiabilité d'un mot de passe saisi par un visiteur qui s'inscrit. La fonction proprement dite est opérationnelle mais je bloque sur l'intégration dans le plugin. Je m'explique :
La fonction de contrôle s'appelle testpassword(). Dans mon fichier main.inc.php, j'ai écrit ceci :
add_event_handler('init', 'UserAdvManager_InitPage'); function UserAdvManager_InitPage() { load_language('plugin.lang', NBC_UserAdvManager_PATH); global $conf, $template, $page, $lang; $PasswordCheck = 0; if (script_basename() == 'register') { /* Mon contrôle de mot de passe */ /* ici les valeurs de configuration du plugin */ if (isset($conf_nbc_UserAdvManager[14]) and $conf_nbc_UserAdvManager[14] == 'true' and !empty($conf_nbc_UserAdvManager[15])) { /* Le mot de passe devient obligatoire */ if empty($_POST['password']) { $errors[] = l10n('password_mandatory'); } /* l'appel à la fonction qui retourne une valeur numérique */ $PasswordCheck = testpassword($_POST['password']); /* si la valeur numérique est inférieure à ce qui a été configuré dans le plugin /* if ($PasswordCheck < $conf_nbc_UserAdvManager[15]) { /* Erreur sur la fiabilité du mot de passe choisi */ $lang['reg_err_login1'] = l10n('reg_err_login4')."'".$conf_nbc_UserAdvManager[15]."'"; /* Et je réinitialise les variables impactées */ $_POST['password'] = ""; $_POST['password_conf'] = ""; $PasswordCheck = 0; } } } }
Problème : Cà ne fonctionne pas... L'erreur de fiabilité du mot de passe n'est pas considérée alors que je sais que ma fonction testpassword() fonctionne (elle est d'ailleurs testable dans le panneau d'admin du plugin).
En cherchant une solution, j'ai trouvé un $errors = trigger_event(...) dans functions_user.inc.php (ligne 96). Je pense que la solution à mon pb se trouve là mais je ne comprend pas le fonctionnement de ce trigger. A mon sens, il permettrait d'ajouter des erreurs supplémentaires à gérer au moment de l'inscription d'un visiteur sur les critères "username", "password" et "email". Me goure-je ?
Une piste à me proposer, svp ?
Peut-être (et çà ne m'étonnerait pas trop) que je me complique encore trop la vie et qu'une approche beaucoup plus simple du pb existe ?
Merci d'avance pour votre aide ;-)