Usuário Samba + LDAP alterando sua senha pelo browser

Publicado por richard giovanni jose bergonzi (última atualização em 19/06/2012)

[ Hits: 10.698 ]

Download 5450.index.php




Estava com dificuldades sobre isso, muitos usuários que usam GNU/Linux sentiam a necessidade de trocar sua senhas, mas  vinham até a mim, que efetuava a alteração manualmente.

Pesquisei na net por vários dias e não encontrava uma solução, então encontrei um script em PHP que faz a troca de senha do usuário LDAP de uma rede implantada com Samba. Fiz as modificações e adequei à minha necessidade.

Segue o script.

Para que ele funcione deve-se editar os seguintes parâmetros:

$server
$port
$dn

Instalar o sudo e dentro do /etc/sudoers adicionar as seguintes linhas:

%sudo ALL=(ALL) ALL
www-data ALL=(ALL)NOPASSWD: /usr/sbin/smbldap-passwd

  



Esconder código-fonte

<?php

$message = array();             
$message_css = "";

function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){
  global $message;
  global $message_css;

  $server = "localhost";
  $port="389"; 
  $dn = "ou=Usuarios,dc=3ciafron,dc=eb,dc=mil,dc=br";
   
  error_reporting(0);
  ldap_connect($server, $port);
  $con = ldap_connect($server, $port);
  ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
  
  // bind anon and find user by uid
  $user_search = ldap_search($con,$dn,"(|(uid=$user)(mail=$user))");
  $user_get = ldap_get_entries($con, $user_search); 
  $user_entry = ldap_first_entry($con, $user_search);
  $user_dn = ldap_get_dn($con, $user_entry);
  $user_id = $user_get[0]["uid"][0];
  $user_givenName = $user_get[0]["givenName"][0];
  $user_search_arry = array( "*", "ou", "uid", "mail", "passwordRetryCount", "passwordhistory" );
  $user_search_filter = "(|(uid=$user_id)(mail=$user))";
  $user_search_opt = ldap_search($con,$user_dn,$user_search_filter,$user_search_arry);
  $user_get_opt = ldap_get_entries($con, $user_search_opt); 
  $passwordRetryCount = $user_get_opt[0]["passwordRetryCount"][0];
  $passwordhistory = $user_get_opt[0]["passwordhistory"][0];
  
  //$message[] = "Username: " . $user_id;
  //$message[] = "DN: " . $user_dn;
  //$message[] = "Current Pass: " . $oldPassword;
  //$message[] = "New Pass: " . $newPassword;
  
  /* Start the testing */
  if ( $passwordRetryCount == 3 ) {
    $message[] = "Erro E101 - Sua conta está bloqueada!!!";
    return false;
  }
  if (ldap_bind($con, $user_dn, $oldPassword) === false) {
    $message[] = "Erro E101 - Nome de usuário ou senha está errado.";
    return false;
  }
  if ($newPassword != $newPasswordCnf ) {
    $message[] = "Erro E102 - Suas novas senhas  não correspondem!";
    return false;
  }
   $encoded_newPassword = "{SSHA}" . base64_encode( pack( "H*", sha1( $newPassword ) ) );
  $history_arr = ldap_get_values($con,$user_dn,"passwordhistory");
  if ( $history_arr ) {
       $message[] ="Erro E102 - Sua senha corresponde a uma  das 10 últimas senhas   que você usou, você deve vir com uma nova senha";
   return false;
  }
  if (strlen($newPassword) < 8 ) {
    $message[] = "Erro E103 - Sua nova senha é muito curta! <br/> Sua senha deve ter pelo menos 8 caracteres.";
    return false;
  }
  if (!preg_match("/[0-9]/",$newPassword)) {
    $message[] = "Erro E104 - Sua nova senha deve conter pelo menos um número.";
    return false;
  }
  if (!preg_match("/[a-zA-Z]/",$newPassword)) {
    $message[] = "Erro E105 - Sua nova senha deve conter pelo menos uma letra.";
    return false;
  }
  if (!preg_match("/[A-Z]/",$newPassword)) {
    $message[] = "Erro E106 - Sua nova senha deve conter pelo menos uma letra maiúscula.";
    return false;
  }
  if (!preg_match("/[a-z]/",$newPassword)) {
    $message[] = "Erro E107 - Sua nova senha deve conter pelo menos uma letra minúscula.";
    return false;
  }
  if (!$user_get) {
    $message[] = "Erro E200 -Unable to connect to server, você näo pode alterar sua senha, neste momento, desculpe.";
    return false; 
  }
 
  $auth_entry = ldap_first_entry($con, $user_search);
  $mail_addresses = ldap_get_values($con, $auth_entry, "mail");
  $given_names = ldap_get_values($con, $auth_entry, "givenName");
  $password_history = ldap_get_values($con, $auth_entry, "passwordhistory");
  $mail_address = $mail_addresses[0];
  $first_name = $given_names[0];
  
  /* And Finally, Change the password */
  $entry = array();
  $entry["userPassword"] = "$newPassword";
  
  if (ldap_modify($con,$user_dn,$entry) === false){
    $error = ldap_error($con);
    $errno = ldap_errno($con);
    $message[] = "E201 - Sua senha não pode ser a mudada entre em contato com o administrador.";
    $message[] = "$errno - $erro";
  } else { 
  $modf= "( echo {$_POST['novasenha1']} ; echo {$_POST['novasenha2']} ) | sudo /usr/sbin/smbldap-passwd {$_POST['usuario']}";
  $cmd_exec = shell_exec($modf);
    $message_css = "yes";
    mail($mail_address,"Aviso de alteracao de senha","caro $first_name"); 
    $message[] = "a senha para $user_id foi alterada.<br/>e já se encontra ativa<br/>"; 
  } 
} 

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>alteraçao senha aquid ldap</title>
  <style type="text/css">
    body { font-family: Verdana,Arial,Courier New; font-size: 0.7em;  }
    th { text-align: right; padding: 0.8em; }
    #container { text-align: center; width: 500px; margin: 5% auto; }
    .msg_yes { margin: 0 auto; text-align: center; color: green; background: #D4EAD4; border: 1px solid green; border-radius: 10px; margin: 2px; }
    .msg_no { margin: 0 auto; text-align: center; color: red; background: #FFF0F0; border: 1px solid red; border-radius: 10px; margin: 2px; }
  </style>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
  <div id="container">
    <h2><span id="result_box"><span title="alteraçao senha aquid ldap" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Página Alterar senha</span></span> usuários ldap</h2>
   <p> <span title="Sua nova senha deve ser de 8 caracteres ou mais e ter pelo menos:" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Sua nova senha deve ser de 8 caracteres ou mais e ter pelo menos: <br />
   </span><span title="uma letra maiúscula, uma letra minúscula, e um número.." onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">uma letra maiúscula, uma letra minúscula, e um número. <br />
   </span><span title="Você deve usar uma nova senha, a senha atual" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Você deve usar uma nova senha, a senha atual <br />
   </span><span title="não pode ser o mesmo que sua nova senha." onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">não pode ser o mesmo que sua nova senha.</span></p>
      <?php
      if (isset($_POST["alterar"])) {
        changePassword($_POST['usuario'],$_POST['antigasenha'],$_POST['novasenha1'],$_POST['novasenha2']);
        global $message_css;
        if ($message_css == "yes") {
          ?><div class="msg_yes"><?php
         } else {
          ?><div class="msg_no"><?php
          $message[] = "Sua senha não foi alterada.";
        }
        foreach ( $message as $one ) { echo "<p>$one</p>"; }
      ?></div><?php
      } ?>
    <form action="<?php print $_SERVER['PHP_SELF']; ?>" name="passwordChange" method="post">
      <table style="width: 400px; margin: 0 auto;">
        <tr>
        <th>nome do usuário:</th><td><input name="usuario" type="text" size="20px" autocomplete="off" /></td></tr>
        <tr>
        <th>senha recente:</th><td><input name="antigasenha" size="20px" type="password" /></td></tr>
        <tr>
        <th>nova senha:</th><td><input name="novasenha1" size="20px" type="password" /></td></tr>
        <tr>
          <th>nova senha  (repita):</th><td><input name="novasenha2" size="20px" type="password" /></td></tr>
        <tr><td colspan="2" style="text-align: center;" >
          <input name="alterar" type="submit" value="Alterar senha"/>
          <button onclick="$('frm').action='index.php';$('frm').submit();">Cancela</button>
        </td></tr>
      </table>
    </form>
  </div>
</body>
</html>

Scripts recomendados

Sistema de Log

Cadastro utilizando a classe PDO com o método prepare()

Sistema de Login

KWEB.SYS - Simples script de login em PHP sem uso de bancos de dados (MySQL)

Gerador simples de hash MD5 em PHP


  

Comentários
[1] Comentário enviado por kelseysantos em 18/09/2014 - 16:06h

vlw guerreiro....

[2] Comentário enviado por cesarbgoncalves em 26/02/2016 - 17:11h

Muito útil... PARABÉNS!!!

[3] Comentário enviado por rodtorres em 29/03/2016 - 09:51h

Muito bom, mas no meu ambiente está gerando um erro quando tentamos realizar alteração da senha.

E201 - Sua senha não pode ser a mudada entre em contato com o administrador.

50 -Sua senha não foi alterada

Poderia ajudar?

[4] Comentário enviado por thaylor.barros em 13/04/2019 - 14:41h

Olá, estou tentando implementar este tutorial mas está dando problema:
- Qual é a versão do samba/ldap do seu servidor?
- Qual é a versão do php para rodar este script?

Pode me dar uma ajuda?

[5] Comentário enviado por diesel em 10/12/2021 - 09:06h

Excelente contribuição.
Eu estava mesmo alterando este mesmo script para fazer exatamente o que você fez: adaptá-lo para o smbldap-password.
Estou colocando em um roteador OpenWRT para gerenciar a rede daqui de casa.

Muito grato!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts