Usuário Samba + LDAP alterando sua senha pelo browser
Publicado por richard giovanni jose bergonzi (última atualização em 19/06/2012)
[ Hits: 10.909 ]
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
<?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>
Geração de senhas e URL de vídeos Youtube e Vimeo
Gravando log de erros gerados em consultas SQL
Sistema competo para autenticação de usuarios.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Secure boot, artigo interessante, nada técnico. (3)
Instalação dualboot Windows 11 e Debian 13 (11)
Preciso recuperar videos *.mp4 corrompidos (11)









